X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fbasic-long.cs;h=11fa4e1b63c5689398c243139bac281091b077aa;hb=45d5758db946270273a2dcfcbacff7da3ea8e212;hp=f66f2f0dff8b316c64d7762a64b37dcc0d153f8a;hpb=6b6435d1b3206b0162c37e5ecce8d9a699fe6467;p=mono.git diff --git a/mono/mini/basic-long.cs b/mono/mini/basic-long.cs index f66f2f0dff8..11fa4e1b63c 100644 --- a/mono/mini/basic-long.cs +++ b/mono/mini/basic-long.cs @@ -6,7 +6,7 @@ using System.Reflection; * * Each test needs to be of the form: * - * static int test__ (); + * public static int test__ (); * * where is an integer (the value that needs to be returned by * the method to make it pass. @@ -23,18 +23,25 @@ using System.Reflection; * the IL code looks. */ -class Tests { +#if MOBILE +class LongTests +#else +class Tests +#endif +{ - static int Main () { - return TestDriver.RunTests (typeof (Tests)); +#if !MOBILE + public static int Main (string[] args) { + return TestDriver.RunTests (typeof (Tests), args); } +#endif - static int test_10_simple_cast () { + public static int test_10_simple_cast () { long a = 10; return (int)a; } - static int test_1_bigmul1 () { + public static int test_1_bigmul1 () { int a; int b; long c; @@ -46,7 +53,7 @@ class Tests { return 0; } - static int test_1_bigmul2 () { + public static int test_1_bigmul2 () { int a = System.Int32.MaxValue, b = System.Int32.MaxValue; long s = System.Int64.MinValue; long c; @@ -56,7 +63,7 @@ class Tests { return 0; } - static int test_1_bigmul3 () { + public static int test_1_bigmul3 () { int a = 10, b = 10; ulong c; c = (ulong) a * (ulong) b; @@ -65,7 +72,7 @@ class Tests { return 0; } - static int test_1_bigmul4 () { + public static int test_1_bigmul4 () { int a = System.Int32.MaxValue, b = System.Int32.MaxValue; ulong c; c = (ulong) a * (ulong) b; @@ -74,7 +81,7 @@ class Tests { return 0; } - static int test_1_bigmul5 () { + public static int test_1_bigmul5 () { int a = System.Int32.MaxValue, b = System.Int32.MinValue; long c; c = (long) a * (long) b; @@ -83,7 +90,7 @@ class Tests { return 0; } - static int test_1_bigmul6 () { + public static int test_1_bigmul6 () { uint a = System.UInt32.MaxValue, b = System.UInt32.MaxValue/(uint)2; ulong c; c = (ulong) a * (ulong) b; @@ -92,75 +99,209 @@ class Tests { return 0; } - static int test_0_beq () { + public static int test_0_beq () { long a = 0xffffffffff; if (a != 0xffffffffff) return 1; return 0; } - static int test_0_bne_un () { + public static int test_0_bne_un () { long a = 0xffffffffff; if (a == 0xfffffffffe) return 1; + if (a == 0xfeffffffff) + return 2; return 0; } - static int test_0_ble () { + public static int test_0_ble () { 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; } - static int test_0_ble_un () { + public static int test_0_ble_un () { 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; } - static int test_0_bge () { + public static int test_0_bge () { 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; } - static int test_0_bge_un () { + public static int test_0_bge_un () { 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; } - static int test_0_blt () { + public static int test_0_blt () { 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; } - static int test_0_blt_un () { + public static int test_0_blt_un () { 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; } - static int test_0_bgt () { + public static int test_0_bgt () { 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; } - static int test_0_conv_to_i4 () { + public static int test_0_conv_to_i4 () { long a = 0; return (int)a; } - static int test_0_conv_from_i4 () { + + 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) return 1; @@ -172,7 +313,7 @@ class Tests { return 0; } - static int test_0_conv_from_i4_negative () { + public static int test_0_conv_from_i4_negative () { long a = -2; if (a != -2) return 1; @@ -185,7 +326,7 @@ class Tests { } /* - static int test_0_conv_from_r8 () { + public static int test_0_conv_from_r8 () { double b = 2.0; long a = (long)b; @@ -194,7 +335,7 @@ class Tests { return 0; } - static int test_0_conv_from_r4 () { + public static int test_0_conv_from_r4 () { float b = 2.0F; long a = (long)b; @@ -204,56 +345,67 @@ class Tests { } */ - static int test_8_and () { + public static int test_8_and () { long a = 0xffffffffff; long b = 8; return (int)(a & b); } - static int test_8_and_imm () { + public static int test_8_and_imm () { long a = 0xffffffffff; return (int)(a & 8); } - static int test_10_or () { + 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; return (int)(a | b); } - static int test_10_or_imm () { + public static int test_10_or_imm () { long a = 8; return (int)(a | 2); } - static int test_5_xor () { + public static int test_5_xor () { long a = 7; long b = 2; return (int)(a ^ b); } - static int test_5_xor_imm () { + public static int test_5_xor_imm () { long a = 7; return (int)(a ^ 2); } - static int test_5_add () { + public static int test_5_add () { long a = 2; long b = 3; return (int)(a + b); } - static int test_5_add_imm () { + public static int test_5_add_imm () { long a = 2; return (int)(a + 3); } - static int test_0_add_imm_carry () { + public static int test_0_add_imm_carry () { long a = -1; return (int)(a + 1); } - static int test_0_add_imm_no_inc () { + public static int test_0_add_imm_no_inc () { // we can't blindly convert an add x, 1 to an inc x long a = 0x1ffffffff; long c; @@ -263,34 +415,185 @@ class Tests { return 1; } - static int test_4_addcc_imm () { + public static int test_4_addcc_imm () { long a = 3; long b = 0; return (int)(a - b + 1); } - static int test_5_sub () { + public static int test_5_sub () { long a = 8; long b = 3; return (int)(a - b); } - static int test_5_sub_imm () { + public static int test_5_sub_imm () { long a = 8; return (int)(a - 3); } - static int test_0_sub_imm_carry () { + public static int test_0_sub_imm_carry () { long a = 0; return (int)((a - 1) + 1); } - static int test_2_neg () { + 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); } - static int test_0_neg_large () { + public static int test_0_neg_large () { long min = -9223372036854775808; unchecked { ulong ul = (ulong)min; @@ -298,28 +601,7 @@ class Tests { } } - static int test_0_shl () { - long a = 9; - int b = 1; - - if ((a >> b) != 4) - return 1; - - - return 0; - } - - static int test_1_rshift () - { - long a = 9; - int b = 1; - a = -9; - if ((a >> b) != -5) - return 0; - return 1; - } - - static int test_5_shift () + public static int test_5_shift () { long a = 9; int b = 1; @@ -349,10 +631,9 @@ class Tests { return count; } - static int test_1_shift_u () + public static int test_1_shift_u () { ulong a; - int b; int count = 0; // The JIT optimizes this @@ -364,7 +645,23 @@ class Tests { return count; } - static int test_1_simple_neg () { + 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; if (-a != -9) @@ -372,7 +669,7 @@ class Tests { return 1; } - static int test_2_compare () { + public static int test_2_compare () { long a = 1; long b = 1; @@ -381,7 +678,7 @@ class Tests { return 2; } - static int test_9_alu () + public static int test_9_alu () { long a = 9, b = 6; int count = 0; @@ -426,13 +723,13 @@ class Tests { return count; } - static int test_24_mul () { + public static int test_24_mul () { long a = 8; long b = 3; return (int)(a * b); } - static int test_24_mul_ovf () { + public static int test_24_mul_ovf () { long a = 8; long b = 3; long res; @@ -443,13 +740,13 @@ class Tests { return (int)res; } - static int test_24_mul_un () { + public static int test_24_mul_un () { ulong a = 8; ulong b = 3; return (int)(a * b); } - static int test_24_mul_ovf_un () { + public static int test_24_mul_ovf_un () { ulong a = 8; ulong b = 3; ulong res; @@ -459,21 +756,108 @@ 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; + } - static int test_4_divun () { + public static int test_4_divun () { uint b = 12; int a = 3; return (int)(b / a); } - static int test_1431655764_bigdivun_imm () { + public static int test_1431655764_bigdivun_imm () { unchecked { uint b = (uint)-2; return (int)(b / 3); } } - static int test_1431655764_bigdivun () { + public static int test_1431655764_bigdivun () { unchecked { uint b = (uint)-2; int a = 3; @@ -481,13 +865,13 @@ class Tests { } } - static int test_1_remun () { + public static int test_1_remun () { uint b = 13; int a = 3; return (int)(b % a); } - static int test_2_bigremun () { + public static int test_2_bigremun () { unchecked { uint b = (uint)-2; int a = 3; @@ -495,7 +879,7 @@ class Tests { } } - static int test_0_ceq () { + public static int test_0_ceq () { long a = 2; long b = 2; long c = 3; @@ -516,7 +900,7 @@ class Tests { return 0; } - static int test_0_ceq_complex () { + public static int test_0_ceq_complex () { long l = 1, ll = 2; if (l < 0 != ll < 0) @@ -525,7 +909,7 @@ class Tests { return 0; } - static int test_0_clt () { + public static int test_0_clt () { long a = 2; long b = 2; long c = 3; @@ -555,7 +939,7 @@ class Tests { return 0; } - static int test_0_clt_un () { + public static int test_0_clt_un () { ulong a = 2; ulong b = 2; ulong c = 3; @@ -581,7 +965,7 @@ class Tests { return 0; } - static int test_0_cgt () { + public static int test_0_cgt () { long a = 2; long b = 2; long c = 3; @@ -611,7 +995,7 @@ class Tests { return 0; } - static int test_0_cgt_un () { + public static int test_0_cgt_un () { ulong a = 2; ulong b = 2; ulong c = 3; @@ -637,27 +1021,7 @@ class Tests { return 0; } - static long return_5low () { - return 5; - } - - static long return_5high () { - return 0x500000000; - } - - static int test_3_long_ret () { - long val = return_5low (); - return (int) (val - 2); - } - - static int test_1_long_ret2 () { - long val = return_5high (); - if (val > 0xffffffff) - return 1; - return 0; - } - - static int test_3_byte_cast () { + public static int test_3_byte_cast () { ulong val = 0xff00ff00f0f0f0f0; byte b; b = (byte) (val & 0xFF); @@ -667,7 +1031,7 @@ class Tests { return 3; } - static int test_4_ushort_cast () { + public static int test_4_ushort_cast () { ulong val = 0xff00ff00f0f0f0f0; ushort b; b = (ushort) (val & 0xFFFF); @@ -676,7 +1040,7 @@ class Tests { return 4; } - static int test_500_mul_div () { + public static int test_500_mul_div () { long val = 1000; long exp = 10; long maxexp = 20; @@ -684,25 +1048,8 @@ class Tests { return (int)res; } - - static long position = 0; - - 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; - } - - static int test_3_checked_cast_un () { + public static int test_3_checked_cast_un () { ulong i = 2; long j; @@ -713,7 +1060,7 @@ class Tests { return 3; } - static int test_4_checked_cast () { + public static int test_4_checked_cast () { long i = 3; ulong j; @@ -724,7 +1071,23 @@ class Tests { return 4; } - static int test_1234_checked_i2_cast () { + public static int test_12_checked_i1_cast () { + long l = 12; + + checked { + return (sbyte)l; + } + } + + public static int test_127_checked_i1_cast_un () { + ulong l = 127; + + checked { + return (sbyte)l; + } + } + + public static int test_1234_checked_i2_cast () { long l = 1234; checked { @@ -732,7 +1095,15 @@ class Tests { } } - static int test_1234_checked_i4_cast () { + public static int test_32767_checked_i2_cast_un () { + ulong l = 32767; + + checked { + return (ushort)l; + } + } + + public static int test_1234_checked_i4_cast () { ulong ul = 1234; checked { @@ -740,7 +1111,7 @@ class Tests { } } - static int test_10_int_uint_compare () { + public static int test_10_int_uint_compare () { uint size = 10; int j = 0; for (int i = 0; i < size; ++i) { @@ -749,70 +1120,19 @@ class Tests { return j; } - static int test_0_ftol_clobber () { - long m; - doit (1.3, out m); - if (m != 1) - return 2; - return 0; - } - - static int test_71_long_shift_right () { - ulong value = 38654838087; - int x = 0; - byte [] buffer = new byte [1]; - buffer [x] = ((byte)(value >> x)); - return buffer [x]; - } - - static int test_0_ulong_regress () { + public static int test_0_ulong_regress () { ulong u = 4257145737; u --; return (u == 4257145736) ? 0 : 1; } - - static long x; - static int test_0_addsub_mem () - { - x = 0; - x += 5; - - if (x != 5) - return 1; - - x -= 10; - - if (x != -5) - return 2; - - return 0; - } - - static ulong y; - static int test_0_sh32_mem () - { - y = 0x0102130405060708; - y >>= 32; - - if (y != 0x01021304) - return 1; - - y = 0x0102130405060708; - y <<= 32; - - if (y != 0x0506070800000000) - return 2; - - x = 0x0102130405060708; - x <<= 32; - - if (x != 0x0506070800000000) - return 2; - - return 0; + + public static int test_0_ulong_regress2 () { + int p2 = 31; + ulong sum_p = 2897079476 + (ulong) (1 << p2); + return (sum_p == 749595828) ? 0 : 1; } - static int test_0_assemble_long () + public static int test_0_assemble_long () { uint a = 5; ulong x = 0x12345678; @@ -827,7 +1147,7 @@ class Tests { return 0; } - static int test_0_hash () + public static int test_0_hash () { ulong x = 0x1234567887654321; int h = (int)(x & 0xffffffff) ^ (int)(x >> 32); @@ -837,12 +1157,51 @@ class Tests { } - static int test_0_shift_regress () { + public static int test_0_shift_regress () { long a = 0; int b = 6; UInt16 c = 3; 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; + } + } + + public static int test_0_lneg_regress_10320 () { + long a = 0x100000000; + ulong c = ((ulong) (-(-a))) >> 32; + return c == 1 ? 0 : 1; + } }