2010-02-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / basic-long.cs
index 2bd866ed1669c533d1691f9db6c0cddf0c13643f..5373a5ed92dd3f602f53b305fb96a9fa1d595e94 100644 (file)
@@ -103,6 +103,8 @@ class Tests {
                long a = 0xffffffffff;
                if (a == 0xfffffffffe)
                        return 1;
+               if (a == 0xfeffffffff)
+                       return 2;
                return 0;
        }
 
@@ -110,6 +112,20 @@ class Tests {
                long a = 0xffffffffff;
                if (a > 0xffffffffff)
                        return 1;
+
+               if (a > 0x1ffffffffff)
+                       return 2;
+
+               if (a > 0xff00000000) {} else
+                       return 3;
+
+               if (a > 0xfeffffffff) {} else
+                       return 4;
+
+               a = 0xff00000000;
+               if (a > 0xffffffffff)
+                       return 5;
+
                return 0;
        }
 
@@ -117,6 +133,20 @@ class Tests {
                ulong a = 0xffffffffff;
                if (a > 0xffffffffff)
                        return 1;
+
+               if (a > 0x1ffffffffff)
+                       return 2;
+
+               if (a > 0xff00000000) {} else
+                       return 3;
+
+               if (a > 0xfeffffffff) {} else
+                       return 4;
+
+               a = 0xff00000000;
+               if (a > 0xffffffffff)
+                       return 5;
+
                return 0;
        }
 
@@ -124,6 +154,20 @@ class Tests {
                long a = 0xffffffffff;
                if (a < 0xffffffffff)
                        return 1;
+
+               if (a < 0x1ffffffffff) {} else
+                       return 2;
+
+               if (a < 0xff00000000)
+                       return 3;
+
+               if (a < 0xfeffffffff)
+                       return 4;
+
+               a = 0xff00000000;
+               if (a < 0xffffffffff) {} else
+                       return 5;
+
                return 0;
        }
 
@@ -131,6 +175,20 @@ class Tests {
                ulong a = 0xffffffffff;
                if (a < 0xffffffffff)
                        return 1;
+
+               if (a < 0x1ffffffffff) {} else
+                       return 2;
+
+               if (a < 0xff00000000)
+                       return 3;
+
+               if (a < 0xfeffffffff)
+                       return 4;
+
+               a = 0xff00000000;
+               if (a < 0xffffffffff) {} else
+                       return 5;
+
                return 0;
        }
 
@@ -138,6 +196,20 @@ class Tests {
                long a = 0xfffffffffe;
                if (a >= 0xffffffffff)
                        return 1;
+
+               if (a >= 0x1fffffffffe)
+                       return 2;
+
+               if (a >= 0xff00000000) {} else
+                       return 3;
+
+               if (a >= 0xfefffffffe) {} else
+                       return 4;
+
+               a = 0xff00000000;
+               if (a >= 0xffffffffff)
+                       return 5;
+
                return 0;
        }
 
@@ -145,6 +217,20 @@ class Tests {
                ulong a = 0xfffffffffe;
                if (a >= 0xffffffffff)
                        return 1;
+
+               if (a >= 0x1fffffffffe)
+                       return 2;
+
+               if (a >= 0xff00000000) {} else
+                       return 3;
+
+               if (a >= 0xfefffffffe) {} else
+                       return 4;
+
+               a = 0xff00000000;
+               if (a >= 0xffffffffff)
+                       return 5;
+
                return 0;
        }
 
@@ -152,6 +238,41 @@ class Tests {
                long a = 0xffffffffff;
                if (a <= 0xfffffffffe)
                        return 1;
+
+               if (a <= 0x1ffffffffff) {} else
+                       return 2;
+
+               if (a <= 0xff00000000)
+                       return 3;
+
+               if (a <= 0xfeffffffff)
+                       return 4;
+
+               a = 0xff00000000;
+               if (a <= 0xffffffffff) {} else
+                       return 5;
+
+               return 0;
+       }
+
+       public static int test_0_bgt_un () {
+               ulong a = 0xffffffffff;
+               if (a <= 0xfffffffffe)
+                       return 1;
+
+               if (a <= 0x1ffffffffff) {} else
+                       return 2;
+
+               if (a <= 0xff00000000)
+                       return 3;
+
+               if (a <= 0xfeffffffff)
+                       return 4;
+
+               a = 0xff00000000;
+               if (a <= 0xffffffffff) {} else
+                       return 5;
+
                return 0;
        }
 
@@ -160,6 +281,19 @@ class Tests {
 
                return (int)a;
        }
+
+       public static int test_32_conv_to_u4 () {
+               long a = 32;
+
+               return (int)(uint)a;
+       }
+
+       public static int test_15_conv_to_u4_2 () {
+               long a = 0x10000000f;
+
+               return (int)(uint)a;
+       }
+
        public static int test_0_conv_from_i4 () {
                long a = 2;
                if (a != 2)
@@ -215,6 +349,17 @@ class Tests {
                return (int)(a & 8);
        }
 
+       public static int get_high_bit (ulong a) {
+               if ((a & 0x8000000000000000) != 0)
+                       return 1;
+               return 0;
+       }
+
+       public static int test_1_and () {
+               ulong a = 0xabcd1234deadbeef;
+               return get_high_bit (a);
+       }
+
        public static int test_10_or () {
                long a = 8;
                long b = 2;             
@@ -285,6 +430,157 @@ class Tests {
                return (int)((a - 1) + 1);
        }
 
+       public static int test_0_add_ovf () {
+               long i, j, k;
+
+               checked {
+                       i = System.Int64.MinValue;
+                       j = 0;
+                       k = i + j;
+               }
+
+               if (k != System.Int64.MinValue)
+                       return 1;
+
+               checked {
+                       i = System.Int64.MaxValue;
+                       j = 0;
+                       k = i + j;
+               }
+
+               if (k != System.Int64.MaxValue)
+                       return 2;
+
+               checked {
+                       i = System.Int64.MinValue;
+                       j = System.Int64.MaxValue;
+                       k = i + j;
+               }
+
+               if (k != -1)
+                       return 3;
+
+               checked {
+                       i = System.Int64.MaxValue;
+                       j = System.Int64.MinValue;
+                       k = i + j;
+               }
+
+               if (k != -1)
+                       return 4;
+
+               checked {
+                       i = System.Int64.MinValue + 1234;
+                       j = -1234;
+                       k = i + j;
+               }
+
+               if (k != System.Int64.MinValue)
+                       return 5;
+
+               checked {
+                       i = System.Int64.MaxValue - 1234;
+                       j = 1234;
+                       k = i + j;
+               }
+
+               if (k != System.Int64.MaxValue)
+                       return 6;
+
+               return 0;
+       }
+
+       public static int test_0_add_un_ovf () {
+               ulong n = (ulong)134217728 * 16;
+               ulong number = checked (n + (uint)0);
+
+               return number == n ? 0 : 1;
+       }
+
+       public static int test_0_sub_ovf () {
+               long i, j, k;
+
+               checked {
+                       i = System.Int64.MinValue;
+                       j = 0;
+                       k = i - j;
+               }
+
+               if (k != System.Int64.MinValue)
+                       return 1;
+
+               checked {
+                       i = System.Int64.MaxValue;
+                       j = 0;
+                       k = i - j;
+               }
+
+               if (k != System.Int64.MaxValue)
+                       return 2;
+
+               checked {
+                       i = System.Int64.MinValue;
+                       j = System.Int64.MinValue + 1234;
+                       k = i - j;
+               }
+
+               if (k != -1234)
+                       return 3;
+
+               checked {
+                       i = System.Int64.MaxValue;
+                       j = 1234;
+                       k = i - j;
+               }
+
+               if (k != System.Int64.MaxValue - 1234)
+                       return 4;
+
+               checked {
+                       i = System.Int64.MaxValue - 1234;
+                       j = -1234;
+                       k = i - j;
+               }
+
+               if (k != System.Int64.MaxValue)
+                       return 5;
+
+               checked {
+                       i = System.Int64.MinValue + 1234;
+                       j = 1234;
+                       k = i - j;
+               }
+
+               if (k != System.Int64.MinValue)
+                       return 6;
+
+               return 0;
+       }
+
+       public static int test_0_sub_ovf_un () {
+               ulong i, j, k;
+
+               checked {
+                       i = System.UInt64.MaxValue;
+                       j = 0;
+                       k = i - j;
+               }
+
+               if (k != System.UInt64.MaxValue)
+                       return 1;
+
+               checked {
+                       i = System.UInt64.MaxValue;
+                       j = System.UInt64.MaxValue;
+                       k = i - j;
+               }
+
+               if (k != 0)
+                       return 2;
+
+               return 0;
+       }
+
        public static int test_2_neg () {
                long a = -2;            
                return (int)(-a);
@@ -298,27 +594,6 @@ class Tests {
                }
        }       
 
-       public static int test_0_shl () {
-               long a = 9;
-               int b = 1;
-               
-               if ((a >> b) != 4)
-                       return 1;
-
-
-               return 0;
-       }
-       
-       public static int test_1_rshift ()
-       {
-               long a = 9;
-               int b = 1;
-               a = -9;
-               if ((a >> b) != -5)
-                       return 0;
-               return 1;
-       }
-
        public static int test_5_shift ()
        {
                long a = 9;
@@ -363,6 +638,22 @@ class Tests {
                return count;
        }
 
+       public static int test_1_shift_u_32 ()
+       {
+               ulong a;
+               int count = 0;
+
+               a = UInt64.MaxValue;
+               // Avoid constant folding
+               for (int i = 0; i < 32; ++i)
+                       count ++;
+
+               if ((a >> count) != 0xFFFFFFFFUL)
+                       return 0;
+               else
+                       return 1;
+       }
+
        public static int test_1_simple_neg () {
                long a = 9;
                
@@ -458,6 +749,93 @@ class Tests {
                }
                return (int)res;
        }       
+
+       public static int test_0_mul_imm () {
+           long i = 4;
+
+               if ((i * 0) != 0)
+                       return 1;
+               if ((i * 1) != 4)
+                       return 2;
+               if ((i * 2) != 8)
+                       return 3;
+               if ((i * 3) != 12)
+                       return 4;
+               if ((i * 1234) != 4936)
+                       return 5;
+               if ((i * -1) != -4)
+                       return 6;
+               if ((i * -2) != -8)
+                       return 7;
+               if ((i * -3) != -12)
+                       return 8;
+               if ((i * -1234) != -4936)
+                       return 9;
+
+               return 0;
+       }
+
+       public static int test_0_mul_imm_opt ()
+       {
+               long i;
+
+               i = 1;
+               if ((i * 2) != 2)
+                       return 1;
+               i = -1;
+               if ((i * 2) != -2)
+                       return 2;
+               i = 1;
+               if ((i * 3) != 3)
+                       return 3;
+               i = -1;
+               if ((i * 3) != -3)
+                       return 4;
+               i = 1;
+               if ((i * 5) != 5)
+                       return 5;
+               i = -1;
+               if ((i * 5) != -5)
+                       return 6;
+               i = 1;
+               if ((i * 6) != 6)
+                       return 7;
+               i = -1;
+               if ((i * 6) != -6)
+                       return 8;
+               i = 1;
+               if ((i * 9) != 9)
+                       return 9;
+               i = -1;
+               if ((i * 9) != -9)
+                       return 10;
+               i = 1;
+               if ((i * 10) != 10)
+                       return 11;
+               i = -1;
+               if ((i * 10) != -10)
+                       return 12;
+               i = 1;
+               if ((i * 12) != 12)
+                       return 13;
+               i = -1;
+               if ((i * 12) != -12)
+                       return 14;
+               i = 1;
+               if ((i * 25) != 25)
+                       return 15;
+               i = -1;
+               if ((i * 25) != -25)
+                       return 16;
+               i = 1;
+               if ((i * 100) != 100)
+                       return 17;
+               i = -1;
+               if ((i * 100) != -100)
+                       return 18;
+               
+               return 0;
+       }
        
        public static int test_4_divun () {
                uint b = 12;
@@ -636,26 +1014,6 @@ class Tests {
                return 0;
        }
 
-       static long return_5low () {
-               return 5;
-       }
-       
-       static long return_5high () {
-               return 0x500000000;
-       }
-
-       public static int test_3_long_ret () {
-               long val = return_5low ();
-               return (int) (val - 2);
-       }
-
-       public static int test_1_long_ret2 () {
-               long val = return_5high ();
-               if (val > 0xffffffff)
-                       return 1;
-               return 0;
-       }
-
        public static int test_3_byte_cast () {
                ulong val = 0xff00ff00f0f0f0f0;
                byte b;
@@ -683,23 +1041,6 @@ class Tests {
 
                return (int)res;
        }
-
-       static long position = 0;
-
-       public static int test_4_static_inc_long () {
-
-               int count = 4;
-
-               position = 0;
-
-               position += count;
-
-               return (int)position;
-       }
-       
-       static void doit (double value, out long m) {
-               m = (long) value;
-       }
        
        public static int test_3_checked_cast_un () {
                 ulong i = 2;
@@ -772,19 +1113,17 @@ class Tests {
                return j;
        }
 
-       public static int test_0_ftol_clobber () {
-               long m;
-               doit (1.3, out m);
-               if (m != 1)
-                       return 2;
-               return 0;
-       }
-
        public static int test_0_ulong_regress () {
                ulong u = 4257145737;
                u --;
                return (u == 4257145736) ? 0 : 1;
        }
+
+       public static int test_0_ulong_regress2 () {
+               int p2 = 31;
+               ulong sum_p = 2897079476 + (ulong) (1 << p2);
+               return (sum_p == 749595828) ? 0 : 1;
+       }
        
        public static int test_0_assemble_long ()
        {
@@ -818,5 +1157,38 @@ class Tests {
 
                return ((a >> (b - c)) == 0) ? 0 : 1;
        }
+
+       public static int test_1234_conv_ovf_u8 () {
+               int i = 1234;
+
+               checked {
+                       ulong l = (ulong)i;
+                       return (int)l;
+               }
+       }
+
+       public static int test_0_regress_cprop_80738 () {
+               int hours = Int32.MinValue;
+               int hrssec = (hours * 3600);
+               long t = ((long)(hrssec) * 1000L);
+
+               return t == 0 ? 0 : 1;
+       }
+
+       public static int test_0_conv_u () {
+               unsafe {
+                       int** dead = (int**) 0xdeadbeaf;
+                       long i = (long)dead;
+                       return (i == 0xdeadbeaf) ? 0 : 1;
+               }
+       }
+
+       public static int test_0_lconv_to_u2 () {
+               unchecked { 
+                       ulong value = (ulong)(short)-10;
+                       value = (ushort)value;
+                   return (value == 65526) ? 0 : 1;
+               }
+       }
 }