2 using System.Reflection;
5 * Regression tests for the mono JIT.
7 * Each test needs to be of the form:
9 * static int test_<result>_<name> ();
11 * where <result> is an integer (the value that needs to be returned by
12 * the method to make it pass.
13 * <name> is a user-displayed name used to identify the test.
15 * The tests can be driven in two ways:
16 * *) running the program directly: Main() uses reflection to find and invoke
17 * the test methods (this is useful mostly to check that the tests are correct)
18 * *) with the --regression switch of the jit (this is the preferred way since
19 * all the tests will be run with optimizations on and off)
21 * The reflection logic could be moved to a .dll since we need at least another
22 * regression test file written in IL code to have better control on how
29 return TestDriver.RunTests (typeof (Tests));
32 static int test_10_simple_cast () {
37 static int test_1_bigmul1 () {
43 c = (long)a * (long)b;
49 static int test_1_bigmul2 () {
50 int a = System.Int32.MaxValue, b = System.Int32.MaxValue;
51 long s = System.Int64.MinValue;
53 c = s + (long) a * (long) b;
54 if (c == -4611686022722355199)
59 static int test_1_bigmul3 () {
62 c = (ulong) a * (ulong) b;
68 static int test_1_bigmul4 () {
69 int a = System.Int32.MaxValue, b = System.Int32.MaxValue;
71 c = (ulong) a * (ulong) b;
72 if (c == 4611686014132420609)
77 static int test_1_bigmul5 () {
78 int a = System.Int32.MaxValue, b = System.Int32.MinValue;
80 c = (long) a * (long) b;
81 if (c == -4611686016279904256)
86 static int test_1_bigmul6 () {
87 uint a = System.UInt32.MaxValue, b = System.UInt32.MaxValue/(uint)2;
89 c = (ulong) a * (ulong) b;
90 if (c == 9223372030412324865)
95 static int test_0_beq () {
96 long a = 0xffffffffff;
97 if (a != 0xffffffffff)
102 static int test_0_bne_un () {
103 long a = 0xffffffffff;
104 if (a == 0xfffffffffe)
109 static int test_0_ble () {
110 long a = 0xffffffffff;
111 if (a > 0xffffffffff)
116 static int test_0_ble_un () {
117 ulong a = 0xffffffffff;
118 if (a > 0xffffffffff)
123 static int test_0_bge () {
124 long a = 0xffffffffff;
125 if (a < 0xffffffffff)
130 static int test_0_bge_un () {
131 ulong a = 0xffffffffff;
132 if (a < 0xffffffffff)
137 static int test_0_blt () {
138 long a = 0xfffffffffe;
139 if (a >= 0xffffffffff)
144 static int test_0_blt_un () {
145 ulong a = 0xfffffffffe;
146 if (a >= 0xffffffffff)
151 static int test_0_bgt () {
152 long a = 0xffffffffff;
153 if (a <= 0xfffffffffe)
158 static int test_0_conv_to_i4 () {
163 static int test_0_conv_from_i4 () {
175 static int test_0_conv_from_i4_negative () {
188 static int test_0_conv_from_r8 () {
197 static int test_0_conv_from_r4 () {
207 static int test_8_and () {
208 long a = 0xffffffffff;
213 static int test_8_and_imm () {
214 long a = 0xffffffffff;
218 static int test_10_or () {
224 static int test_10_or_imm () {
229 static int test_5_xor () {
235 static int test_5_xor_imm () {
240 static int test_5_add () {
246 static int test_5_add_imm () {
251 static int test_0_add_imm_carry () {
256 static int test_0_add_imm_no_inc () {
257 // we can't blindly convert an add x, 1 to an inc x
258 long a = 0x1ffffffff;
261 if (c == ((a + 1) + 1))
266 static int test_5_sub () {
272 static int test_5_sub_imm () {
277 static int test_0_sub_imm_carry () {
279 return (int)((a - 1) + 1);
282 static int test_2_neg () {
287 static int test_0_neg_large () {
288 long min = -9223372036854775808;
290 ulong ul = (ulong)min;
291 return (min == -(long)ul) ? 0 : 1;
295 static int test_0_shl () {
306 static int test_1_rshift ()
316 static int test_5_shift ()
346 static int test_1_simple_neg () {
354 static int test_2_compare () {
363 static int test_9_alu ()
408 static int test_24_mul () {
414 static int test_24_mul_ovf () {
425 static int test_24_mul_un () {
431 static int test_24_mul_ovf_un () {
442 static int test_4_divun () {
448 static int test_1431655764_bigdivun_imm () {
455 static int test_1431655764_bigdivun () {
463 static int test_1_remun () {
469 static int test_2_bigremun () {
477 static int test_0_ceq () {
481 long d = 0xff00000002;
483 bool val = (a == b); // this should produce a ceq
487 val = (a == c); // this should produce a ceq
491 val = (a == d); // this should produce a ceq
498 static int test_0_ceq_complex () {
507 static int test_0_clt () {
511 long d = 0xff00000002L;
514 bool val = (a < b); // this should produce a clt
518 val = (a < c); // this should produce a clt
522 val = (c < a); // this should produce a clt
526 val = (e < d); // this should produce a clt
530 val = (d < e); // this should produce a clt
537 static int test_0_clt_un () {
541 ulong d = 0xff00000002;
542 ulong e = 0xffffffffffffffff;
544 bool val = (a < b); // this should produce a clt_un
548 val = (a < c); // this should produce a clt_un
552 val = (d < e); // this should produce a clt_un
556 val = (e < d); // this should produce a clt_un
563 static int test_0_cgt () {
567 long d = 0xff00000002L;
570 bool val = (a > b); // this should produce a cgt
574 val = (a > c); // this should produce a cgt
578 val = (c > a); // this should produce a cgt
582 val = (e > d); // this should produce a cgt
586 val = (d > e); // this should produce a cgt
593 static int test_0_cgt_un () {
597 ulong d = 0xff00000002;
598 ulong e = 0xffffffffffffffff;
600 bool val = (a > b); // this should produce a cgt_un
604 val = (a > c); // this should produce a cgt_un
608 val = (d > e); // this should produce a cgt_un
612 val = (e > d); // this should produce a cgt_un
619 static long return_5low () {
623 static long return_5high () {
627 static int test_3_long_ret () {
628 long val = return_5low ();
629 return (int) (val - 2);
632 static int test_1_long_ret2 () {
633 long val = return_5high ();
634 if (val > 0xffffffff)
639 static int test_3_byte_cast () {
640 ulong val = 0xff00ff00f0f0f0f0;
642 b = (byte) (val & 0xFF);
648 static int test_4_ushort_cast () {
649 ulong val = 0xff00ff00f0f0f0f0;
651 b = (ushort) (val & 0xFFFF);
657 static int test_500_mul_div () {
661 long res = val * exp / maxexp;
666 static long position = 0;
668 static int test_4_static_inc_long () {
676 return (int)position;
679 static void doit (double value, out long m) {
683 static int test_3_checked_cast_un () {
687 checked { j = (long)i; }
694 static int test_4_checked_cast () {
698 checked { j = (ulong)i; }
705 static int test_10_int_uint_compare () {
708 for (int i = 0; i < size; ++i) {
714 static int test_0_ftol_clobber () {
722 static int test_71_long_shift_right () {
723 ulong value = 38654838087;
725 byte [] buffer = new byte [1];
726 buffer [x] = ((byte)(value >> x));
730 static int test_0_ulong_regress () {
731 ulong u = 4257145737;
733 return (u == 4257145736) ? 0 : 1;