X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fbasic.cs;h=984f1ac27f084f91d38bd2616ad1ff7e998d46a3;hb=4accf0d718c238b3efcd50eed6fc6f86b9ae43cd;hp=53fe900d5dacc5f6573d9aa89a88e96a4ffbbb2f;hpb=a8b22e0e864c03b8cfd2f2cb5a8075b6611c5553;p=mono.git diff --git a/mono/mini/basic.cs b/mono/mini/basic.cs index 53fe900d5da..984f1ac27f0 100644 --- a/mono/mini/basic.cs +++ b/mono/mini/basic.cs @@ -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; + } }