X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fbasic-long.cs;h=63fa64db490d83bbfe08690752416ed36f81e487;hb=ef839470ee9e5a5a98980aa80f29ec99428692d9;hp=f16f9f5dcb1c234aa840c10efed3bd2c044c21aa;hpb=7ff8f29ff29fa3f08ef305ac43ef079097323286;p=mono.git diff --git a/mono/mini/basic-long.cs b/mono/mini/basic-long.cs index f16f9f5dcb1..63fa64db490 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. @@ -25,16 +25,16 @@ using System.Reflection; class Tests { - static int Main () { + public static int Main () { return TestDriver.RunTests (typeof (Tests)); } - 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 +46,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 +56,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 +65,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 +74,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 +83,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 +92,88 @@ 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; return 0; } - static int test_0_ble () { + public static int test_0_ble () { long a = 0xffffffffff; if (a > 0xffffffffff) return 1; return 0; } - static int test_0_ble_un () { + public static int test_0_ble_un () { ulong a = 0xffffffffff; if (a > 0xffffffffff) return 1; return 0; } - static int test_0_bge () { + public static int test_0_bge () { long a = 0xffffffffff; if (a < 0xffffffffff) return 1; return 0; } - static int test_0_bge_un () { + public static int test_0_bge_un () { ulong a = 0xffffffffff; if (a < 0xffffffffff) return 1; return 0; } - static int test_0_blt () { + public static int test_0_blt () { long a = 0xfffffffffe; if (a >= 0xffffffffff) return 1; return 0; } - static int test_0_blt_un () { + public static int test_0_blt_un () { ulong a = 0xfffffffffe; if (a >= 0xffffffffff) return 1; return 0; } - static int test_0_bgt () { + public static int test_0_bgt () { long a = 0xffffffffff; if (a <= 0xfffffffffe) return 1; 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 +185,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; @@ -184,8 +197,25 @@ class Tests { return 0; } + public static int test_0_conv_to_r8 () { + long a = 150; + double b = (double) a; + + if (b != 150.0) + return 1; + return 0; + } + + public static int test_0_conv_to_r4 () { + long a = 3000; + float b = (float) a; + + if (b != 3000.0F) + return 1; + return 0; + } /* - 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 +224,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 +234,56 @@ 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 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,28 +293,185 @@ class Tests { return 1; } - static int test_5_sub () { + public static int test_4_addcc_imm () { + long a = 3; + long b = 0; + return (int)(a - b + 1); + } + + 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; @@ -292,28 +479,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; @@ -343,7 +509,37 @@ class Tests { return count; } - static int test_1_simple_neg () { + public static int test_1_shift_u () + { + ulong a; + int count = 0; + + // The JIT optimizes this + a = 8589934592UL; + if ((a >> 32) != 2) + return 0; + count ++; + + 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; if (-a != -9) @@ -351,7 +547,7 @@ class Tests { return 1; } - static int test_2_compare () { + public static int test_2_compare () { long a = 1; long b = 1; @@ -360,7 +556,7 @@ class Tests { return 2; } - static int test_9_alu () + public static int test_9_alu () { long a = 9, b = 6; int count = 0; @@ -405,13 +601,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; @@ -422,13 +618,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; @@ -438,21 +634,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; @@ -460,13 +743,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; @@ -474,7 +757,7 @@ class Tests { } } - static int test_0_ceq () { + public static int test_0_ceq () { long a = 2; long b = 2; long c = 3; @@ -495,7 +778,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) @@ -504,7 +787,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; @@ -534,7 +817,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; @@ -560,7 +843,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; @@ -590,7 +873,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; @@ -624,28 +907,29 @@ class Tests { return 0x500000000; } - static int test_3_long_ret () { + public static int test_3_long_ret () { long val = return_5low (); return (int) (val - 2); } - static int test_1_long_ret2 () { + public 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); if (b != 0xf0) return 1; + return 3; } - - static int test_4_ushort_cast () { + + public static int test_4_ushort_cast () { ulong val = 0xff00ff00f0f0f0f0; ushort b; b = (ushort) (val & 0xFFFF); @@ -654,7 +938,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; @@ -662,25 +946,12 @@ 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; @@ -691,7 +962,7 @@ class Tests { return 3; } - static int test_4_checked_cast () { + public static int test_4_checked_cast () { long i = 3; ulong j; @@ -702,7 +973,47 @@ class Tests { return 4; } - static int test_10_int_uint_compare () { + 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 { + return (short)l; + } + } + + 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 { + return (int)ul; + } + } + + public static int test_10_int_uint_compare () { uint size = 10; int j = 0; for (int i = 0; i < size; ++i) { @@ -711,7 +1022,7 @@ class Tests { return j; } - static int test_0_ftol_clobber () { + public static int test_0_ftol_clobber () { long m; doit (1.3, out m); if (m != 1) @@ -719,18 +1030,52 @@ class Tests { 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; } + + public static int test_0_assemble_long () + { + uint a = 5; + ulong x = 0x12345678; + ulong y = 1; + + + ulong z = ((x - y) << 32) | a; + + if (z != 0x1234567700000005) + return 1; + + return 0; + } + + public static int test_0_hash () + { + ulong x = 0x1234567887654321; + int h = (int)(x & 0xffffffff) ^ (int)(x >> 32); + if (h != unchecked ((int)(0x87654321 ^ 0x12345678))) + return h; + return 0; + + } + + 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; + } + } }