Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / basic.cs
index 53fe900d5dacc5f6573d9aa89a88e96a4ffbbb2f..984f1ac27f084f91d38bd2616ad1ff7e998d46a3 100644 (file)
@@ -23,11 +23,18 @@ using System.Reflection;
  * the IL code looks.
  */
 
-class Tests {
-
-       static int Main () {
-               return TestDriver.RunTests (typeof (Tests));
-       }
+#if __MOBILE__
+class BasicTests
+#else
+class Tests
+#endif
+{
+
+#if !__MOBILE__
+       public static int Main (string[] args) {
+               return TestDriver.RunTests (typeof (Tests), args);
+       }
+#endif
        
        public static int test_0_return () {
                return 0;
@@ -190,6 +197,16 @@ class Tests {
                return b % 8;
        }
 
+       public static int test_0_rem_imm_0 () {
+               int b = 12;
+               return b % 1;
+       }
+
+       public static int test_0_rem_imm_0_neg () {
+               int b = -2;
+               return b % 1;
+       }
+
        public static int test_4_rem_big_imm () {
                int b = 10004;
                return b % 10000;
@@ -250,7 +267,7 @@ class Tests {
                return (int)res;
        }
 
-       public static int test_0_add_ovf () {
+       public static int test_0_add_ovf1 () {
                int i, j, k;
 
                checked {
@@ -261,6 +278,11 @@ class Tests {
 
                if (k != System.Int32.MinValue)
                        return 1;
+               return 0;
+       }
+
+       public static int test_0_add_ovf2 () {
+               int i, j, k;
 
                checked {
                        i = System.Int32.MaxValue;
@@ -270,6 +292,11 @@ class Tests {
 
                if (k != System.Int32.MaxValue)
                        return 2;
+               return 0;
+       }
+
+       public static int test_0_add_ovf3 () {
+               int i, j, k;
 
                checked {
                        i = System.Int32.MinValue;
@@ -279,6 +306,11 @@ class Tests {
 
                if (k != -1)
                        return 3;
+               return 0;
+       }
+
+       public static int test_0_add_ovf4 () {
+               int i, j, k;
 
                checked {
                        i = System.Int32.MaxValue;
@@ -288,6 +320,11 @@ class Tests {
 
                if (k != -1)
                        return 4;
+               return 0;
+       }
+
+       public static int test_0_add_ovf5 () {
+               int i, j, k;
 
                checked {
                        i = System.Int32.MinValue + 1234;
@@ -297,6 +334,11 @@ class Tests {
 
                if (k != System.Int32.MinValue)
                        return 5;
+               return 0;
+       }
+
+       public static int test_0_add_ovf6 () {
+               int i, j, k;
 
                checked {
                        i = System.Int32.MaxValue - 1234;
@@ -317,7 +359,7 @@ class Tests {
                return number == n ? 0 : 1;
        }
 
-       public static int test_0_sub_ovf () {
+       public static int test_0_sub_ovf1 () {
                int i, j, k;
 
                checked {
@@ -329,6 +371,12 @@ class Tests {
                if (k != System.Int32.MinValue)
                        return 1;
 
+               return 0;
+       }
+
+       public static int test_0_sub_ovf2 () {
+               int i, j, k;
+
                checked {
                        i = System.Int32.MaxValue;
                        j = 0;
@@ -338,6 +386,12 @@ class Tests {
                if (k != System.Int32.MaxValue)
                        return 2;
 
+               return 0;
+       }
+
+       public static int test_0_sub_ovf3 () {
+               int i, j, k;
+
                checked {
                        i = System.Int32.MinValue;
                        j = System.Int32.MinValue + 1234;
@@ -347,6 +401,12 @@ class Tests {
                if (k != -1234)
                        return 3;
 
+               return 0;
+       }
+
+       public static int test_0_sub_ovf4 () {
+               int i, j, k;
+
                checked {
                        i = System.Int32.MaxValue;
                        j = 1234;
@@ -356,6 +416,12 @@ class Tests {
                if (k != System.Int32.MaxValue - 1234)
                        return 4;
 
+               return 0;
+       }
+
+       public static int test_0_sub_ovf5 () {
+               int i, j, k;
+
                checked {
                        i = System.Int32.MaxValue - 1234;
                        j = -1234;
@@ -365,6 +431,12 @@ class Tests {
                if (k != System.Int32.MaxValue)
                        return 5;
 
+               return 0;
+       }
+
+       public static int test_0_sub_ovf6 () {
+               int i, j, k;
+
                checked {
                        i = System.Int32.MinValue + 1234;
                        j = 1234;
@@ -620,7 +692,21 @@ class Tests {
                        return 1;
                else
                        return 0;
-       }               
+       }
+
+       public static int test_127_iconv_to_i1 () {
+               int i = 0x100017f;
+               sbyte s = (sbyte)i;
+
+               return s;
+       }
+
+       public static int test_384_iconv_to_i2 () {
+               int i = 0x1000180;
+               short s = (short)i;
+
+               return s;
+       }
        
        public static int test_15_for_loop () {
                int i;
@@ -1155,4 +1241,230 @@ class Tests {
 
                return (int)(i % j);
        }
+
+       public static int test_0_div_opt () {
+               int i;
+
+               // Avoid cfolding this
+               i = 0;
+               for (int j = 0; j < 567; ++j)
+                       i ++;
+               i += 1234000;
+               if ((i / 2) != 617283)
+                       return 1;
+               if ((i / 4) != 308641)
+                       return 2;
+               if ((i / 8) != 154320)
+                       return 3;
+               if ((i / 16) != 77160)
+                       return 4;
+
+               // Avoid cfolding this
+               i = 0;
+               for (int j = 0; j < 567; ++j)
+                       i --;
+               i -= 1234000;
+               if ((i / 2) != -617283)
+                       return 5;
+               if ((i / 4) != -308641)
+                       return 6;
+               if ((i / 8) != -154320)
+                       return 7;
+               if ((i / 16) != -77160)
+                       return 8;
+
+               return 0;
+       }
+
+       public static int test_0_udiv_opt () {
+               uint i;
+
+               // Avoid cfolding this
+               i = 0;
+               for (int j = 0; j < 567; ++j)
+                       i ++;
+               i += 1234000;
+               if ((i / 2) != 617283)
+                       return 1;
+               if ((i / 4) != 308641)
+                       return 2;
+               if ((i / 8) != 154320)
+                       return 3;
+               if ((i / 16) != 77160)
+                       return 4;
+
+               return 0;
+       }
+
+       public static int test_0_signed_ct_div () {
+               int n = 2147483647;
+               bool divide_by_zero = false;
+               bool overflow = false;
+
+               if ((n / 2147483647) != 1)
+                       return 1;
+               if ((n / -2147483647) != -1)
+                       return 2;
+               n = -n;
+               if ((n / 2147483647) != -1)
+                       return 3;
+               n--; /* MinValue */
+               if ((n / -2147483648) != 1)
+                       return 4;
+               if ((n / 2147483647) != -1)
+                       return 5;
+               if ((n / 1) != n)
+                       return 6;
+
+               try {
+                       int r = n / (-1);
+               } catch (OverflowException) {
+                       overflow = true;
+               }
+               if (!overflow)
+                       return 7;
+
+               try {
+                       int r = n / 0;
+               } catch (DivideByZeroException) {
+                       divide_by_zero = true;
+               }
+               if (!divide_by_zero)
+                       return 8;
+
+               if ((n / 35) != -61356675)
+                       return 9;
+               if ((n / -35) != 61356675)
+                       return 10;
+               n = -(n + 1);  /* MaxValue */
+               if ((n / 35) != 61356675)
+                       return 11;
+               if ((n / -35) != -61356675)
+                       return 12;
+
+               return 0;
+       }
+
+       public static int test_0_unsigned_ct_div () {
+               uint n = 4294967295;
+               bool divide_by_zero = false;
+
+               if ((n / 4294967295) != 1)
+                       return 1;
+               n--;
+               if ((n / 4294967295) != 0)
+                       return 2;
+               n++;
+               if ((n / 4294967294) != 1)
+                       return 3;
+               if ((n / 1) != n)
+                       return 4;
+
+               try {
+                       uint a = n / 0;
+               } catch (DivideByZeroException) {
+                       divide_by_zero = true;
+               }
+
+               if (!divide_by_zero)
+                       return 5;
+
+               if ((n / 35) != 122713351)
+                       return 9;
+
+               return 0;
+       }
+
+       public static int test_0_rem_opt () {
+               int i;
+
+               // Avoid cfolding this
+               i = 0;
+               for (int j = 0; j < 29; ++j)
+                       i ++;
+               if ((i % 2) != 1)
+                       return 1;
+               if ((i % 4) != 1)
+                       return 2;
+               if ((i % 8) != 5)
+                       return 3;
+               if ((i % 16) != 13)
+                       return 4;
+
+               // Avoid cfolding this
+               i = 0;
+               for (int j = 0; j < 29; ++j)
+                       i --;
+               if ((i % 2) != -1)
+                       return 5;
+               if ((i % 4) != -1)
+                       return 6;
+               if ((i % 8) != -5)
+                       return 7;
+               if ((i % 16) != -13)
+                       return 8;
+
+               return 0;
+       }
+
+       public static int cmov (int i) {
+               int j = 0;
+
+               if (i > 0)
+                       j = 1;
+
+               return j;
+       }
+
+       public static int cmov2 (int i) {
+               int j = 0;
+
+               if (i <= 0)
+                       ;
+               else
+                       j = 1;
+
+               return j;
+       }
+               
+       public static int test_0_branch_to_cmov_opt () {
+               if (cmov (0) != 0)
+                       return 1;
+               if (cmov (1) != 1)
+                       return 2;
+               if (cmov2 (0) != 0)
+                       return 1;
+               if (cmov2 (1) != 1)
+                       return 2;
+               return 0;
+       }
+
+       public static unsafe int test_0_ishr_sign_extend () {
+               // Check that ishr does sign extension from bit 31 on 64 bit platforms
+               uint val = 0xF0000000u;
+
+               uint *a = &val;
+               uint ui = (uint)((int)(*a) >> 2);
+
+               if (ui != 0xfc000000)
+                       return 1;
+
+               // Same with non-immediates
+               int amount = 2;
+
+               ui = (uint)((int)(*a) >> amount);
+
+               if (ui != 0xfc000000)
+                       return 2;
+
+               return 0;
+       }
+
+       public static unsafe int test_0_ishr_sign_extend_cfold () {
+               int i = 32768;
+               int j = i << 16;
+               int k = j >> 16;
+
+               return k == -32768 ? 0 : 1;
+       }
 }