* src/vm/builtin.h (builtin_fast_new): Added.
[cacao.git] / src / vm / jit / s390 / tests / tests.java.pp
1 package tests;
2
3 #define TEST(cond) test(#cond, (cond), __LINE__)
4 #define TODO() test("TODO: Implement", false, __LINE__)
5
6 class tests {
7
8         static int s_i, s_i1, s_i2;
9         static float s_f, s_f1, s_f2;
10         static char s_c, s_c1;
11         static short s_s, s_s1;
12         static long s_l, s_l1, s_l2;
13         static double s_d, s_d1, s_d2;
14         static boolean s_b;
15         static Object s_a;
16         static final char[] s_ca = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
17         static char[] s_ca2 = { '0', '1', '2' };
18         static String s_as0 = "s0", s_as1 = "s1", s_as2 = "s2";
19         static Object s_a0 = s_as0, s_a1 = s_as1, s_a2 = s_as2;
20         static Object[] s_aa = { s_a0, s_a1, s_a2 };
21         static Object[] s_aa2 = { null, null, null };
22         static byte[] s_bya = { 10, 11, 12, 13, 14, 15 };
23         static byte[] s_bya2 = { 0, 1, 2, 3};
24         static byte s_by, s_by1;
25         static short[] s_sa2 = { 0, 1, 2, 3};
26         static short[] s_sa = { 10, 11, 12, 13, 14, 15 };
27         static int[] s_ia2 = { 0, 1, 2, 3 };
28         static int[] s_ia = { 10, 11, 12, 13, 14, 15 };
29
30         static class members {
31                 char c;
32                 short s;
33                 int i;
34                 Object a;
35                 long l;
36                 float f;
37                 double d;
38         };
39
40         static class exception extends Exception {
41                 int line;
42                 exception(int line) {
43                         this.line = line;
44                 }
45         };
46
47         static char s_cm() { return s_c; }
48         static short s_sm() { return s_s; }
49         static int s_im() { return s_i; }
50         static long s_lm() { return s_l; }
51         static Object s_am() { return s_a; }
52         static float s_fm() { return s_f; }
53         static double s_dm() { return s_d; }
54
55         static int s_testsOk = 0, s_testsFailure = 0;
56
57         static void test(String description, boolean success, int line) {
58                 String code = 
59                         success ? 
60                         "[OK]      " : 
61                         "[FAILURE] " ;
62                 System.out.println(code + description + " (at line " + line + ")");
63                 if (success) {
64                         s_testsOk ++;
65                 } else {
66                         s_testsFailure ++;
67                 }
68         }
69
70         static void summary() {
71                 System.out.println(
72                         "Summary>  " + 
73                         (s_testsOk + s_testsFailure) + " tests, OK: " +
74                         s_testsOk + ", FAILURE: " + s_testsFailure + "."
75                 );
76         }
77
78         static void test_ICONST() {
79
80                 // load some constant
81
82                 s_i = 23;
83
84                 TEST(s_i == 23);
85                 TEST(s_i != 22);
86
87                 // load corner values
88
89                 s_i = 0x7fffffff;
90                 TEST(s_i == 0x7fffffff);
91                 TEST(s_i != 0x7ffffffe);
92
93                 s_i = 0xffffffff;
94                 TEST(s_i == 0xffffffff);
95                 TEST(s_i != 0x7fffffff);
96         }
97
98         static void test_FCONST() {
99
100                 // load some float constant
101
102                 s_f = 12.3f;
103
104                 TEST(s_f == 12.3f);
105                 TEST(s_f != 12.4f);
106         }
107
108         static void test_INEG() {
109
110                 // negate (+) value
111
112                 s_i = 99;
113                 s_i = -s_i;
114                 TEST(s_i == -99);
115
116                 // negate corner (-) value
117
118                 s_i = -0x7fffffff;
119                 s_i = -s_i;
120                 TEST(s_i == 0x7fffffff);
121         }
122
123         static void test_INT2CHAR() {
124                 // Normal test
125                 s_i = 97;
126                 s_c = (char)s_i;
127                 TEST(s_c == 'a');
128                 // Negative values
129                 s_i = -1;
130                 s_c = (char)s_i;
131                 TEST(s_c == (char)-1);
132                 s_i = -3;
133                 s_c = (char)s_i;
134                 TEST(s_c == (char)-3);
135         }
136
137         static void test_IADD() {
138
139                 // add 2 (+) values
140                 
141                 s_i1 = 1983;
142                 s_i2 = 2000;
143                 s_i  = s_i1 + s_i2;
144                 TEST(s_i == 3983);
145
146                 // add 2 (-) values
147
148                 s_i1 = -1983;
149                 s_i2 = -2000;
150                 s_i  = s_i1 + s_i2;
151                 TEST(s_i == -3983);
152         }
153
154         static void test_IADDCONST() {
155         
156                 // valid (+) immediate
157
158                 s_i = 1983;
159                 s_i += 2000;
160                 TEST(s_i == 3983);
161
162                 // increment
163
164                 s_i = 1983;
165                 ++s_i;
166                 TEST(s_i == 1984);
167
168                 // valid (-) immediate
169
170                 s_i = -1983;
171                 s_i += -2000;
172                 TEST(s_i == -3983);
173
174                 // big (+) immediate (datasegment)
175
176                 s_i = 1983;
177                 s_i += 1000000;
178                 TEST(s_i == 1001983);
179
180                 // big (-) immediate (datasegment)
181
182                 s_i = 1983;
183                 s_i += -20001983;
184                 TEST(s_i == -20000000);
185
186         }
187
188         static void test_ISUB() {
189
190                 // substract 2 (+) values
191
192                 s_i1 = 33987;
193                 s_i2 = 9455325;
194                 s_i = s_i1 - s_i2;
195                 TEST(s_i == -9421338);
196
197                 // substract 2 (-) values
198
199                 s_i1 = -33987;
200                 s_i2 = -9455325;
201                 s_i = s_i1 - s_i2;
202                 TEST(s_i == 9421338);
203         }
204
205         static void test_ISUBCONST() {
206
207                 // substract valid immediate
208
209                 s_i = 32000;
210                 s_i -= 2000;
211                 TEST(s_i == 30000);
212
213                 // substract big (+) immediate (datasegment)
214
215                 s_i = 33987;
216                 s_i -= 9455325;
217                 TEST(s_i == -9421338);
218
219                 // decrement
220
221                 s_i = 33987;
222                 --s_i;
223                 TEST(s_i == 33986);
224
225                 // substract big (-) immediate (datasegment)
226
227                 s_i = -33987;
228                 s_i -= -9455325;
229                 TEST(s_i == 9421338);
230         }
231
232         static void test_IMULCONST() {
233
234                 // by 2 (will shift)
235
236                 s_i = 2000;
237                 s_i *= 2;
238                 TEST(s_i == 4000);
239
240                 // valid immediate
241
242                 s_i = 200;
243                 s_i *= 10000;
244                 TEST(s_i == 2000000);
245
246                 // big immediate (datasegment)
247
248                 s_i = 20;
249                 s_i *= 100000;
250                 TEST(s_i == 2000000);
251         }
252
253         static void test_IDIV() {
254                 s_i1 = 33;
255                 s_i2 = 3;
256                 s_i = s_i1 / s_i2;
257                 TEST(s_i == 11);
258
259                 s_i1 = 5570000;
260                 s_i2 = 10000;
261                 s_i = s_i1 / s_i2;
262                 TEST(s_i == 557);
263         }
264
265         static void test_IREM() {
266                 s_i1 = 5570664;
267                 s_i2 = 10000;
268                 s_i = s_i1 % s_i2;
269                 TEST(s_i == 664);
270         }
271
272         static void test_FMUL() {
273                 s_f1 = 1.1337f;
274                 s_f2 = 100.0f;
275                 s_f = s_f1 * s_f2;
276                 TEST(s_f == 113.37f);
277         }
278
279         static void test_DMUL() {
280                 s_d1 = 1.1337;
281                 s_d2 = 100.0;
282                 s_d = s_d1 * s_d2;
283                 TEST(s_d == 113.37);
284                 System.out.println(s_d);
285         }
286
287         static void test_FDIV() {
288                 s_f1 = 113.37f;
289                 s_f2 = 100.0f;
290                 s_f = s_f1 / s_f2;
291                 TEST(s_f == 1.1337f);
292         }
293
294         static void test_DDIV() {
295                 s_d1 = 113.37;
296                 s_d2 = 100.0;
297                 s_d = s_d1 / s_d2;
298                 TEST(s_d == 1.1337);
299         }
300
301         static void test_FSUB() {
302                 s_f1 = 1.1337f;
303                 s_f2 = 0.033f;
304                 s_f = s_f1 - s_f2;
305                 TEST(s_f == 1.1007f);
306         }
307
308         static void test_DSUB() {
309                 s_d1 = 1.1337;
310                 s_d2 = 0.033;
311                 s_d = s_d1 - s_d2;
312                 TEST(s_d == 1.1007);
313         }
314
315         static void test_FADD() {
316                 s_f1 = 1.1006f;
317                 s_f2 = 0.0331f;
318                 s_f = s_f1 + s_f2;
319                 TEST(s_f == 1.1337f);
320         }
321
322         static void test_DADD() {
323                 s_d1 = 1007.1;
324                 s_d2 = 0330.0;
325                 s_d = s_d1 + s_d2;
326                 TEST(s_d == 1337.1);
327         }
328
329         static void test_I2F() {
330                 s_i = 1234567;
331                 s_f = (float)s_i;
332                 TEST(s_f == 1234567.0f);
333                 s_i = 0;
334                 s_f = (float)s_i;
335                 TEST(s_f == 0.0f);
336         }
337
338         static void test_I2D() {
339                 TODO();
340         }
341
342         static void test_F2I() {
343                 s_f = 1337.1337f;
344                 s_i = (int)s_f;
345                 TEST(s_i == 1337);
346                 s_f = 0.0f;
347                 s_i = (int)s_f;
348                 TEST(s_i == 0);
349         }
350
351         static void test_FCMP() {
352
353                 // tests FCMPL and FCMPG
354
355                 s_f1 = 1000.0f;
356                 s_f2 = 2000.0f;
357
358                 // With ecj, FCMPG is generated for < and reverse !
359
360                 s_b = (s_f1 < s_f2);
361                 TEST(s_b);
362
363                 s_b = (s_f2 < s_f1);
364                 TEST(! s_b);
365
366                 s_b = (s_f1 > s_f2);
367                 TEST(! s_b);
368
369                 s_b = (s_f2 > s_f1);
370                 TEST(s_b);
371
372                 s_b = (s_f2 == s_f1);
373                 TEST(! s_b);
374
375                 s_f2 = s_f1;
376                 s_b = (s_f2 == s_f1);
377                 TEST(s_b);
378
379                 // Corner cases
380                 // This might not work with compilers other than ecj
381
382                 s_f2 = Float.NaN;
383                 s_b = (s_f1 < s_f2); // this generates FCMPG with NaN -> GT
384                 TEST(! s_b);
385
386                 s_b = (s_f1 > s_f2); // this generates FCMPL whith NAN -> LT
387                 TEST(! s_b);
388
389                 s_b = (s_f1 == s_f2); // this generates FCMPXX with NAN -> XX
390                 TEST(! s_b);
391
392                 // Infinity
393
394                 s_f1 = Float.NEGATIVE_INFINITY;
395                 s_f2 = Float.POSITIVE_INFINITY;
396
397                 s_b = (s_f1 < s_f2);
398                 TEST(s_b);
399                 s_b = (s_f1 > s_f2);
400                 TEST(! s_b);
401                 s_b = (s_f1 == s_f2);
402                 TEST(! s_b);
403         
404                 s_f1 = Float.NEGATIVE_INFINITY;
405                 s_f2 = -9887.33f;
406
407                 s_b = (s_f1 < s_f2);
408                 TEST(s_b);
409                 s_b = (s_f1 > s_f2);
410                 TEST(! s_b);
411                 s_b = (s_f1 == s_f2);
412                 TEST(! s_b);
413
414                 s_f1 = 9999877.44f;
415                 s_f2 = Float.POSITIVE_INFINITY;
416
417                 s_b = (s_f1 < s_f2);
418                 TEST(s_b);
419                 s_b = (s_f1 > s_f2);
420                 TEST(! s_b);
421                 s_b = (s_f1 == s_f2);
422                 TEST(! s_b);
423         }
424
425         static void test_ARRAYLENGTH() {
426                 TEST(s_ca.length == 10);
427                 TEST(s_ca.length != 11);
428         }
429
430         static void test_CALOAD() {
431                 s_c = s_ca[4];
432                 TEST(s_c == '4');
433         }
434
435         static void test_BALOAD() {
436                 s_by = s_bya[3];
437                 TEST(s_by == 13);
438         }
439
440         static void test_SALOAD() {
441                 s_s = s_sa[4];
442                 TEST(s_s == 14);
443         }
444
445         static void test_IALOAD() {
446                 s_i = s_ia[4];
447                 TEST(s_i == 14);
448         }
449
450         static void test_AALOAD() {
451                 s_a = s_aa[1];
452                 TEST(s_a != s_a0);
453                 TEST(s_a == s_a1);
454         }
455
456         static void test_CASTORE() {
457                 s_ca2[1] = 'X';
458                 s_c = s_ca2[1];
459                 TEST(s_c == 'X');
460         }
461
462         static void test_BASTORE() {
463                 s_by1 = 77;
464                 s_bya2[1] = s_by1;
465                 s_by = s_bya2[1];
466                 TEST(s_by == 77);
467         }
468
469         static void test_SASTORE() {
470                 s_s1 = (short)0xbcde;
471                 s_sa2[2] = s_s1;
472                 s_s = s_sa2[2];
473                 TEST(s_s == (short)0xbcde);
474         }
475
476         static void test_IASTORE() {
477                 s_i1 = 0xbcde1234;
478                 s_ia2[2] = s_i1;
479                 s_i = s_ia2[2];
480                 TEST(s_i == 0xbcde1234);
481         }
482
483         static void test_AASTORE() {
484                 s_aa2[1] = s_a1;
485                 s_a = s_aa2[1];
486                 TEST(s_a == s_a1);
487         }
488
489         static void test_GETPUTSTATIC() {
490                 s_c1 = 'X';
491                 s_c = s_c1;
492                 TEST(s_c == 'X');
493
494                 s_s1 = -34;
495                 s_s = s_s1;
496                 TEST(s_s == -34);
497
498                 s_i1 = 987;
499                 s_i = s_i1;
500                 TEST(s_i == 987);
501
502                 s_a = s_a1;
503                 TEST(s_a == s_a1);
504
505                 s_l1 = 0x987AABBCCDDl;
506                 s_l = s_l1;
507                 TEST(s_l == 0x987AABBCCDDl);
508
509                 s_f1 = 98.12f;
510                 s_f = s_f1;
511                 TEST(s_f == 98.12f);
512
513                 s_d1 = 98.12;
514                 s_d = s_d1;
515                 TEST(s_d == 98.12);
516         }
517
518         static void test_IF_LXX_LCMPXX() {
519                 // the tests generated are the negated tests
520                 // (witj ecj)
521
522 #               define YES 10
523 #               define NO 20
524 #               define LTEST(val1, op, val2, expect) \
525                         s_l = val1; \
526                         s_i = (s_l op val2 ? YES : NO); \
527                         TEST(s_i == expect); \
528                         s_l1 = val1; \
529                         s_l2 = val2; \
530                         s_i = (s_l1 op s_l2 ? YES : NO); \
531                         TEST(s_i == expect); 
532
533                 // HIGH words equal
534
535                 LTEST(0xffABCDl, <,  0xffABCDl, NO);
536                 LTEST(0xffABCDl, <=, 0xffABCDl, YES);
537                 LTEST(0xffABCDl, >,  0xffABCDl, NO);
538                 LTEST(0xffABCDl, >=, 0xffABCDl, YES);
539                 LTEST(0xffABCDl, ==, 0xffABCDl, YES);
540                 LTEST(0xffABCDl, !=, 0xffABCDl, NO);
541
542                 LTEST(0xffABCDl, <,  0xfffABCDl, YES);
543                 LTEST(0xffABCDl, <=, 0xfffABCDl, YES);
544                 LTEST(0xffABCDl, >,  0xfffABCDl, NO);
545                 LTEST(0xffABCDl, >=, 0xfffABCDl, NO);
546                 LTEST(0xffABCDl, ==, 0xfffABCDl, NO);
547                 LTEST(0xffABCDl, !=, 0xfffABCDl, YES);
548
549                 LTEST(0xffABCDl, <,  0xfABCDl, NO);
550                 LTEST(0xffABCDl, <=, 0xfABCDl, NO);
551                 LTEST(0xffABCDl, >,  0xfABCDl, YES);
552                 LTEST(0xffABCDl, >=, 0xfABCDl, YES);
553                 LTEST(0xffABCDl, ==, 0xfABCDl, NO);
554                 LTEST(0xffABCDl, !=, 0xfABCDl, YES);
555
556                 // LOW words equal
557
558                 LTEST(0xffAABBCCDDl, <,  0xffAABBCCDDl, NO);
559                 LTEST(0xffAABBCCDDl, <=, 0xffAABBCCDDl, YES);
560                 LTEST(0xffAABBCCDDl, >,  0xffAABBCCDDl, NO);
561                 LTEST(0xffAABBCCDDl, >=, 0xffAABBCCDDl, YES);
562                 LTEST(0xffAABBCCDDl, ==, 0xffAABBCCDDl, YES);
563                 LTEST(0xffAABBCCDDl, !=, 0xffAABBCCDDl, NO);
564
565                 LTEST(0xffAABBCCDDl, <,  0xfffAABBCCDDl, YES);
566                 LTEST(0xffAABBCCDDl, <=, 0xfffAABBCCDDl, YES);
567                 LTEST(0xffAABBCCDDl, >,  0xfffAABBCCDDl, NO);
568                 LTEST(0xffAABBCCDDl, >=, 0xfffAABBCCDDl, NO);
569                 LTEST(0xffAABBCCDDl, ==, 0xfffAABBCCDDl, NO);
570                 LTEST(0xffAABBCCDDl, !=, 0xfffAABBCCDDl, YES);
571
572                 LTEST(0xffAABBCCDDl, <,  0xfAABBCCDDl, NO);
573                 LTEST(0xffAABBCCDDl, <=, 0xfAABBCCDDl, NO);
574                 LTEST(0xffAABBCCDDl, >,  0xfAABBCCDDl, YES);
575                 LTEST(0xffAABBCCDDl, >=, 0xfAABBCCDDl, YES);
576                 LTEST(0xffAABBCCDDl, ==, 0xfAABBCCDDl, NO);
577                 LTEST(0xffAABBCCDDl, !=, 0xfAABBCCDDl, YES);
578
579                 // Greater in absolute value is negative
580
581                 LTEST(0xffABCDl, <,  -0xfffABCDl, NO);
582                 LTEST(0xffABCDl, <=, -0xfffABCDl, NO);
583                 LTEST(0xffABCDl, >,  -0xfffABCDl, YES);
584                 LTEST(0xffABCDl, >=, -0xfffABCDl, YES);
585                 LTEST(0xffABCDl, ==, -0xfffABCDl, NO);
586                 LTEST(0xffABCDl, !=, -0xfffABCDl, YES);
587
588                 LTEST(-0xffABCDl, <,  0xfABCDl, YES);
589                 LTEST(-0xffABCDl, <=, 0xfABCDl, YES);
590                 LTEST(-0xffABCDl, >,  0xfABCDl, NO);
591                 LTEST(-0xffABCDl, >=, 0xfABCDl, NO);
592                 LTEST(-0xffABCDl, ==, 0xfABCDl, NO);
593                 LTEST(-0xffABCDl, !=, 0xfABCDl, YES);
594
595 #               undef LTEST
596 #               undef YES
597 #               undef NO
598         }
599
600         static void test_GETPUTFIELD() {
601                 members m = new members();
602
603                 s_c1 = 'X';
604                 m.c = s_c1;
605                 TEST(m.c == 'X');
606
607                 s_s1 = -34;
608                 m.s = s_s1;
609                 TEST(m.s == -34);
610
611                 s_i1 = 987;
612                 m.i = s_i1;
613                 TEST(m.i == 987);
614
615                 m.a = s_a1;
616                 TEST(m.a == s_a1);
617
618                 s_l1 = 0x987AABBCCDDl;
619                 m.l = s_l1;
620                 TEST(m.l == 0x987AABBCCDDl);
621
622                 s_f1 = 98.12f;
623                 m.f = s_f1;
624                 TEST(m.f == 98.12f);
625
626                 s_d1 = 98.12;
627                 m.d = s_d1;
628                 TEST(m.d == 98.12);
629         }
630
631         static void doThrow(int line) throws exception {
632                 throw new exception(line);
633         }
634
635         static void test_ATHROW() {
636                 s_b = false;
637                 try {
638                         /* Propagate line in java source with exception.
639                          * Then compare with line provided by exception stack trace.
640                          */
641                         s_i =
642                         __JAVA_LINE__
643                         ;
644                         throw new exception(s_i + 2);
645                 } catch (exception e) {
646                         s_b = true;
647                         TODO();
648                         //TEST(e.line == e.getStackTrace()[0].getLineNumber());
649                 }
650                 TEST(s_b); /* exception catched ? */
651         }
652
653         static void test_IFNULL() {
654                 TODO();
655         }
656
657         static void test_IFNONNULL() {
658                 TODO();
659         }
660
661         static void test_IFXX_ICMPXX() {
662 #               define YES 10
663 #               define NO 20
664 #               define ITEST(val1, op, val2, expect) \
665                         s_i1 = val1; \
666                         s_i = (s_i1 op val2 ? YES: NO); \
667                         TEST(s_i == expect); \
668                         s_i1 = val1; \
669                         s_i2 = val2; \
670                         s_i = (s_i1 op s_i2 ? YES: NO); \
671                         TEST(s_i == expect); 
672
673                 ITEST(0xffABCD, <,  0xffABCD, NO);
674                 ITEST(0xffABCD, <=, 0xffABCD, YES);
675                 ITEST(0xffABCD, >,  0xffABCD, NO);
676                 ITEST(0xffABCD, >=, 0xffABCD, YES);
677                 ITEST(0xffABCD, ==, 0xffABCD, YES);
678                 ITEST(0xffABCD, !=, 0xffABCD, NO);
679
680                 ITEST(0xffABCD, <,  0xfffABCD, YES);
681                 ITEST(0xffABCD, <=, 0xfffABCD, YES);
682                 ITEST(0xffABCD, >,  0xfffABCD, NO);
683                 ITEST(0xffABCD, >=, 0xfffABCD, NO);
684                 ITEST(0xffABCD, ==, 0xfffABCD, NO);
685                 ITEST(0xffABCD, !=, 0xfffABCD, YES);
686
687                 ITEST(0xffABCD, <,  0xfABCD, NO);
688                 ITEST(0xffABCD, <=, 0xfABCD, NO);
689                 ITEST(0xffABCD, >,  0xfABCD, YES);
690                 ITEST(0xffABCD, >=, 0xfABCD, YES);
691                 ITEST(0xffABCD, ==, 0xfABCD, NO);
692                 ITEST(0xffABCD, !=, 0xfABCD, YES);
693
694                 // Greater in absolute value is negative
695
696                 ITEST(0xffABCD, <,  -0xfffABCD, NO);
697                 ITEST(0xffABCD, <=, -0xfffABCD, NO);
698                 ITEST(0xffABCD, >,  -0xfffABCD, YES);
699                 ITEST(0xffABCD, >=, -0xfffABCD, YES);
700                 ITEST(0xffABCD, ==, -0xfffABCD, NO);
701                 ITEST(0xffABCD, !=, -0xfffABCD, YES);
702
703                 ITEST(-0xffABCD, <,  0xfABCD, YES);
704                 ITEST(-0xffABCD, <=, 0xfABCD, YES);
705                 ITEST(-0xffABCD, >,  0xfABCD, NO);
706                 ITEST(-0xffABCD, >=, 0xfABCD, NO);
707                 ITEST(-0xffABCD, ==, 0xfABCD, NO);
708                 ITEST(-0xffABCD, !=, 0xfABCD, YES);
709
710 #               undef YES
711 #               undef NO
712 #               undef ITEST
713         }
714
715         static void test_IF_ACMPXX() {
716                 s_i = (s_a1 == s_a1 ? 10 : 20);
717                 TEST(s_i == 10);
718                 s_i = (s_a1 != s_a1 ? 10 : 20);
719                 TEST(s_i == 20);
720                 s_i = (s_a1 == s_a2 ? 10 : 20);
721                 TEST(s_i == 20);
722                 s_i = (s_a1 != s_a2 ? 10 : 20);
723                 TEST(s_i == 10);
724         }
725
726         static void test_XRETURN() {
727 #               define RTEST(type, value) \
728                         s_##type = value; \
729                         s_##type##1 = s_##type##m(); \
730                         TEST(s_##type##1 == value);
731
732                 RTEST(c, 'a');
733                 RTEST(s, 99);
734                 RTEST(i, 0xFFEEDDCC);
735                 RTEST(l, 0xAABBCCDD11223344l);
736                 RTEST(a, s_a2);
737                 RTEST(f, 1337.1f);
738                 RTEST(d, 1983.1975);
739
740 #               undef RTEST
741         }
742
743         static interface i1 { };
744         static interface i2 { };
745         static interface i3 extends i2 { };
746         static interface i4 extends i3 { };
747         static interface i5 { };
748         static class c1 { };
749         static class c2 extends c1 implements i1 { };
750         static class c3 extends c2 implements i4 { };
751         static class c4 { };
752
753         static void test_INSTANCEOF() {
754                 Object x = new c3();
755                 TEST(x instanceof i1);
756                 TEST(x instanceof i2);
757                 TEST(x instanceof i3);
758                 TEST(x instanceof i4);
759                 TEST(! (x instanceof i5));
760                 TEST(! (x instanceof java.lang.Runnable));
761                 TEST(x instanceof c1);
762                 TEST(x instanceof c2);
763                 TEST(x instanceof c3);
764                 TEST(! (x instanceof c4));
765                 TEST(! (x instanceof java.lang.String));
766                 TEST(x instanceof java.lang.Object);
767         }
768
769         static void test_CHECKCAST() {
770                 Object x = new c3();
771
772 #               define TESTCAST(klass, res) \
773                         s_b = true; \
774                         try { \
775                                 klass y = (klass)x; \
776                         } catch (ClassCastException e) { \
777                                 s_b = false; \
778                         } \
779                         TEST(s_b == res);
780
781                 TESTCAST(i1, true);
782                 TESTCAST(i2, true);
783                 TESTCAST(i3, true);
784                 TESTCAST(i4, true);
785                 TESTCAST(i5, false);
786                 TESTCAST(java.lang.Runnable, false);
787                 TESTCAST(c1, true);
788                 TESTCAST(c2, true);
789                 TESTCAST(c3, true);
790                 TESTCAST(c4, false);
791                 TESTCAST(java.lang.String, false);
792                 TESTCAST(java.lang.Object, true);
793
794 #               undef TESTCAST
795         }
796         
797
798         static void test_emit_exception_stubs() {
799                 s_b = false;
800                 try {
801                         s_c = s_ca[10]; 
802                 } catch (ArrayIndexOutOfBoundsException e) {
803                         s_b = true;
804                 }
805                 TEST(s_b);
806                 s_b = false;
807                 try {
808                         s_a = s_aa[10];
809                 } catch (ArrayIndexOutOfBoundsException e) {
810                         s_b = true;
811                 }
812                 TEST(s_b);
813         }
814
815         static void test_IAND() {
816                 s_i1 =      0xcccccccc;
817                 s_i2 =      0x0f080400;
818                 s_i = s_i1 & s_i2;
819                 TEST(s_i == 0x0c080400);
820         }
821         static void test_IOR() {
822                 s_i1 =      0x0a0b0c1d;
823                 s_i2 =      0x10203040;
824                 s_i = s_i1 | s_i2;
825                 TEST(s_i == 0x1a2b3c5d);
826         }
827         static void test_IXOR() {
828                 s_i1 =      0x0f0f1700;
829                 s_i2 =      0xf00f3300;
830                 s_i = s_i1 ^ s_i2;
831                 TEST(s_i == 0xff002400);
832
833                 // xor swapping algorithm
834
835                 s_i1 = 0xa75bced8;
836                 s_i2 = 0x1458aa56;
837
838                 s_i1 ^= s_i2;
839                 s_i2 ^= s_i1;
840                 s_i1 ^= s_i2;
841
842                 TEST(s_i2 == 0xa75bced8);
843                 TEST(s_i1 == 0x1458aa56);
844         }
845
846         static void main(String[] args) {
847                 /*
848                 test_ICONST();
849                 test_FCONST();
850                 test_INEG();
851                 test_INT2CHAR();
852                 test_IADD();
853                 test_IADDCONST();
854                 test_ISUB();
855                 test_ISUBCONST();
856                 test_IMULCONST();
857                 test_IDIV();
858                 test_IREM();
859                 test_I2F();
860                 test_I2D();
861                 test_F2I();
862                 test_FCMP();
863                 test_ARRAYLENGTH();
864                 test_CALOAD();
865                 test_AALOAD();
866                 test_CASTORE();
867                 test_AASTORE();
868                 test_GETPUTSTATIC();
869                 test_IF_LXX_LCMPXX();
870                 test_GETPUTFIELD();
871                 test_ATHROW();
872                 test_IFNULL();
873                 test_IFNONNULL();
874                 test_IFXX_ICMPXX();
875                 test_IF_ACMPXX();
876                 test_XRETURN();
877                 test_INSTANCEOF();
878                 test_emit_exception_stubs();
879                 test_CHECKCAST();
880                 test_IAND();
881                 test_IOR();
882                 test_IXOR();
883                 test_BASTORE();
884                 test_BALOAD();
885                 test_SASTORE();
886                 test_SALOAD();
887                 test_IALOAD();
888                 test_IASTORE();
889                 */
890                 test_FADD();
891                 test_FMUL();
892                 test_FSUB();
893                 test_FDIV();
894                 test_DADD();
895                 test_DMUL();
896                 test_DSUB();
897                 test_DDIV();
898
899                 summary();
900         }
901
902
903 };
904
905 // vim: syntax=java