* src/vm/jit/s390/codegen.c,
authorpm <none@none>
Thu, 15 Mar 2007 07:07:51 +0000 (07:07 +0000)
committerpm <none@none>
Thu, 15 Mar 2007 07:07:51 +0000 (07:07 +0000)
src/vm/jit/s390/codegen.h: Changed a lot.
* src/vm/jit/s390/tests,
src/vm/jit/s390/tests/tests.java.pp,
src/vm/jit/s390/tests/Makefile: Added opcode tests in java.

src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/tests/Makefile [new file with mode: 0644]
src/vm/jit/s390/tests/tests.java.pp [new file with mode: 0644]

index 0f3a8c25ad414127bcc06b7b6ce00199e01a62cb..706a87013db0ef39945c589eb2097888fdf74c18 100644 (file)
@@ -29,7 +29,7 @@
             Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 7486 2007-03-08 13:50:07Z twisti $
+   $Id: codegen.c 7524 2007-03-15 07:07:51Z pm $
 
 */
 
@@ -525,12 +525,10 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_LCONST:     /* ...  ==> ..., constant                       */
-                       OOPS();
-#if 0
+
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
                        LCONST(d, iptr->sx.val.l);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_FCONST:     /* ...  ==> ..., constant                       */
@@ -541,13 +539,10 @@ bool codegen(jitdata *jd)
                        break;
                
                case ICMD_DCONST:     /* ...  ==> ..., constant                       */
-                       OOPS();
-#if 0
                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
                        disp = dseg_add_double(cd, iptr->sx.val.d);
-                       emit_movd_membase_reg(cd, RIP, -((cd->mcodeptr + 9) - cd->mcodebase) + disp, d);
+                       M_DLDN(d, REG_PV, disp, REG_ITMP1);
                        emit_store_dst(jd, iptr, d);
-#endif
                        break;
 
                case ICMD_ACONST:     /* ...  ==> ..., constant                       */
@@ -759,7 +754,13 @@ bool codegen(jitdata *jd)
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
                        M_INTMOVE(s1, d);
                        /* TODO range */
-                       M_ISUB_IMM(iptr->sx.val.i, d);
+                       if (N_VALID_IMM(iptr->sx.val.i)) {
+                               M_ISUB_IMM(iptr->sx.val.i, d);
+                       } else {
+                               disp = dseg_add_s4(cd, iptr->sx.val.i);
+                               M_ILD(REG_ITMP2, REG_PV, disp);
+                               M_ISUB(REG_ITMP2, d);
+                       }
                        emit_store_dst(jd, iptr, d);
 
                        break;
@@ -874,13 +875,13 @@ bool codegen(jitdata *jd)
 
                        M_INTMOVE(R0, REG_ITMP3);
 
+                       s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+
                        s1 = emit_load_s1(jd, iptr, R0);
                        M_INTMOVE(s1, R0);
                        N_LHI(REG_ITMP1, 0);
                        N_SRDA(R0, 32, RN);
 
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP2);
-
                        N_DR(R0, s2);
 
                        if (iptr->opc == ICMD_IREM) {
@@ -1650,24 +1651,46 @@ bool codegen(jitdata *jd)
 
                case ICMD_FCMPL:      /* ..., val1, val2  ==> ..., val1 fcmpl val2    */
                                          /* == => 0, < => 1, > => -1 */
+               case ICMD_DCMPL:
 
 
                case ICMD_FCMPG:      /* ..., val1, val2  ==> ..., val1 fcmpg val2    */
                                          /* == => 0, < => 1, > => -1 */
+               case ICMD_DCMPG:
 
                        s1 = emit_load_s1(jd, iptr, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, REG_FTMP2);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
 
-                       N_CEBR(s1, s2);
+                       switch (iptr->opc) {
+                               case ICMD_FCMPG:
+                               case ICMD_FCMPL:
+                                       N_CEBR(s1, s2);
+                                       break;
+                               case ICMD_DCMPG:
+                               case ICMD_DCMPL:
+                                       N_CDBR(s1, s2);
+                                       break;  
+                       }
+
+                       N_BRC( /* load 1 */
+                               DD_H | (iptr->opc == ICMD_FCMPG || iptr->opc == ICMD_DCMPG ? DD_O : 0),
+                               SZ_BRC + SZ_BRC + SZ_BRC
+                       );
+
+                       N_BRC( /* load -1 */
+                               DD_L | (iptr->opc == ICMD_FCMPL || iptr->opc == ICMD_DCMPL ? DD_O : 0),
+                               SZ_BRC + SZ_BRC + SZ_LHI + SZ_BRC
+                       );
 
-                       M_BGT(SZ_BRC + SZ_BRC + SZ_BRC);
-                       M_BLT(SZ_BRC + SZ_BRC + SZ_LHI + SZ_BRC);
-                       M_BEQ(SZ_BRC + SZ_LHI + SZ_BRC + SZ_LHI + SZ_BRC);
+                       N_BRC( /* load 0 */
+                               DD_E,
+                               SZ_BRC + SZ_LHI + SZ_BRC + SZ_LHI + SZ_BRC
+                       );
 
-                       N_LHI(d, iptr->opc == ICMD_FCMPL ? 1 : -1); /* GT */
+                       N_LHI(d, 1); /* GT */
                        M_BR(SZ_BRC + SZ_LHI + SZ_BRC + SZ_LHI);
-                       N_LHI(d, iptr->opc == ICMD_FCMPL ? -1 : 1); /* LT */
+                       N_LHI(d, -1); /* LT */
                        M_BR(SZ_BRC + SZ_LHI);
                        N_LHI(d, 0); /* EQ */
 
@@ -1675,42 +1698,6 @@ bool codegen(jitdata *jd)
 
                        break;
 
-               case ICMD_DCMPL:      /* ..., val1, val2  ==> ..., val1 fcmpl val2    */
-                                         /* == => 0, < => 1, > => -1 */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_CLR(d);
-                       M_MOV_IMM(1, REG_ITMP1);
-                       M_MOV_IMM(-1, REG_ITMP2);
-                       emit_ucomisd_reg_reg(cd, s1, s2);
-                       M_CMOVB(REG_ITMP1, d);
-                       M_CMOVA(REG_ITMP2, d);
-                       M_CMOVP(REG_ITMP2, d);                   /* treat unordered as GT */
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
-               case ICMD_DCMPG:      /* ..., val1, val2  ==> ..., val1 fcmpg val2    */
-                                         /* == => 0, < => 1, > => -1 */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_FTMP1);
-                       s2 = emit_load_s2(jd, iptr, REG_FTMP2);
-                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
-                       M_CLR(d);
-                       M_MOV_IMM(1, REG_ITMP1);
-                       M_MOV_IMM(-1, REG_ITMP2);
-                       emit_ucomisd_reg_reg(cd, s1, s2);
-                       M_CMOVB(REG_ITMP1, d);
-                       M_CMOVA(REG_ITMP2, d);
-                       M_CMOVP(REG_ITMP1, d);                   /* treat unordered as LT */
-                       emit_store_dst(jd, iptr, d);
-#endif
-                       break;
-
 
                /* memory operations **************************************************/
 
@@ -2418,7 +2405,7 @@ bool codegen(jitdata *jd)
                        else {
                                disp = dseg_add_s4(cd, iptr->sx.val.i);
                                N_LHI(REG_ITMP2, disp);
-                               N_CL(s1, 0, REG_ITMP2, REG_PV);
+                               N_C(s1, 0, REG_ITMP2, REG_PV);
                        }
 
                        switch (iptr->opc) {
@@ -2445,99 +2432,72 @@ bool codegen(jitdata *jd)
 
                        break;
 
-               case ICMD_IF_LEQ:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
-                       }
-                       M_BEQ(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
-                       break;
-
                case ICMD_IF_LLT:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
+               case ICMD_IF_LLE:       /* op1 = target JavaVM pc, val.l = constant   */
+               case ICMD_IF_LGT:
+               case ICMD_IF_LGE:
+               case ICMD_IF_LEQ:
+               case ICMD_IF_LNE:
 
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
-                       }
-                       M_BLT(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
-                       break;
+                       /* ATTENTION: compare high words signed and low words unsigned */
 
-               case ICMD_IF_LLE:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
+                       s1 = emit_load_s1_high(jd, iptr, REG_ITMP1);
 
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
+                       if (N_VALID_IMM(iptr->sx.val.l >> 32))
+                               N_CHI(s1, iptr->sx.val.l >> 32);
                        else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
+                               disp = dseg_add_s4(cd, iptr->sx.val.l >> 32);
+                               N_LHI(REG_ITMP2, disp);
+                               N_C(s1, 0, REG_ITMP2, REG_PV);
                        }
-                       M_BLE(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
-                       break;
 
-               case ICMD_IF_LNE:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
-
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
+                       switch(iptr->opc) {
+                       case ICMD_IF_LLT:
+                       case ICMD_IF_LLE:
+                               M_BLT(0);
+                               codegen_addreference(cd, iptr->dst.block);
+                               break;
+                       case ICMD_IF_LGT:
+                       case ICMD_IF_LGE:
+                               M_BGT(0);
+                               codegen_addreference(cd, iptr->dst.block);
+                               break;
+                       case ICMD_IF_LEQ: /* EQ and NE are the same for unsigned */
+                       case ICMD_IF_LNE:
+                               break;
+                       default:
+                               assert(0);
                        }
-                       M_BNE(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
-                       break;
-
-               case ICMD_IF_LGT:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
 
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
-                       }
-                       M_BGT(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
-                       break;
+                       s1 = emit_load_s1_low(jd, iptr, REG_ITMP1);
 
-               case ICMD_IF_LGE:       /* ..., value ==> ...                         */
-                       OOPS();
-#if 0
+                       disp = dseg_add_s4(cd, (s4)(iptr->sx.val.l & 0xffffffff));
+                       N_LHI(REG_ITMP2, disp);
+                       N_CL(s1, 0, REG_ITMP2, REG_PV);
 
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP1);
-                       if (IS_IMM32(iptr->sx.val.l))
-                               M_LCMP_IMM(iptr->sx.val.l, s1);
-                       else {
-                               M_MOV_IMM(iptr->sx.val.l, REG_ITMP2);
-                               M_LCMP(REG_ITMP2, s1);
+                       switch(iptr->opc) {
+                       case ICMD_IF_LLT:
+                               M_BLT(0);
+                               break;
+                       case ICMD_IF_LLE:
+                               M_BLE(0);
+                               break;
+                       case ICMD_IF_LGT:
+                               M_BGT(0);
+                               break;
+                       case ICMD_IF_LGE:
+                               M_BGE(0);
+                               break;
+                       case ICMD_IF_LEQ:
+                               M_BEQ(0);
+                               break;
+                       case ICMD_IF_LNE:
+                               M_BNE(0);
+                               break;
+                       default:
+                               assert(0);
                        }
-                       M_BGE(0);
-                       codegen_add_branch_ref(cd, iptr->dst.block);
-#endif
+                       codegen_addreference(cd, iptr->dst.block);
                        break;
 
                case ICMD_IF_ICMPEQ:    /* ..., value, value ==> ...                  */
index 1861fdffa0aa88f42cdf1c4a6995f33221381283..9cd4c8bde2c9b9777ee1faa5bf23e571bd6bdd5f 100644 (file)
@@ -27,7 +27,7 @@
    Authors: Andreas Krall
             Christian Thalinger
 
-   $Id: codegen.h 7486 2007-03-08 13:50:07Z twisti $
+   $Id: codegen.h 7524 2007-03-15 07:07:51Z pm $
 
 */
 
 #define M_BGT(off) N_BRC(DD_H, off)
 #define M_BLT(off) N_BRC(DD_L, off)
 #define M_BGE(off) N_BRC(DD_HE, off)
+#define M_BO(off) N_BRC(DD_O, off)
 
 #define M_CMP(r1, r2) N_CR(r1, r2)
 #define M_CLR(r) N_LHI(r, 0)
 #define M_ISRL_IMM(imm,reg) N_SRL(reg, imm, RN)
 
 #define M_IMUL_IMM(val, reg) N_MHI(reg, val)
-#define M_IMUL(a, dest) N_MR(dest, a)
+#define M_IMUL(a, dest) N_MSR(dest, a)
 
 #define ICONST(reg, i) \
        do { \
                } \
        } while (0) 
 
+#define LCONST(reg,c) \
+       do { \
+           ICONST(GET_HIGH_REG((reg)), (s4) ((s8) (c) >> 32)); \
+           ICONST(GET_LOW_REG((reg)), (s4) ((s8) (c))); \
+       } while (0)
+
 /* M_INTMOVE:
     generates an integer-move from register a to b.
     if a and b are the same int-register, no code will be generated.
diff --git a/src/vm/jit/s390/tests/Makefile b/src/vm/jit/s390/tests/Makefile
new file mode 100644 (file)
index 0000000..bb11652
--- /dev/null
@@ -0,0 +1,7 @@
+all: tests.class
+
+tests.java: tests.java.pp
+       cpp tests.java.pp | grep -v '^#' > tests.java
+
+tests.class: tests.java
+       ecj -bootclasspath /home/peter/cacao-dev/cldc-classes $<
diff --git a/src/vm/jit/s390/tests/tests.java.pp b/src/vm/jit/s390/tests/tests.java.pp
new file mode 100644 (file)
index 0000000..91f2837
--- /dev/null
@@ -0,0 +1,475 @@
+#define TEST(cond) test(#cond, (cond), __LINE__)
+#define TODO() test("TODO: Implement", false, __LINE__)
+
+class tests {
+
+       static int s_i, s_i1, s_i2;
+       static float s_f, s_f1, s_f2;
+       static char s_c, s_c1;
+       static short s_s, s_s1;
+       static long s_l, s_l1;
+       static double s_d, s_d1;
+       static boolean s_b;
+       static Object s_a;
+       static final char[] s_ca = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
+       static char[] s_ca2 = { '0', '1', '2' };
+       static String s_a0 = "s0", s_a1 = "s1", s_a2 = "s2";
+       static Object[] s_aa = { s_a0, s_a1, s_a2 };
+       static Object[] s_aa2 = { null, null, null };
+
+       static int s_testsOk = 0, s_testsFailure = 0;
+
+       static void test(String description, boolean success, int line) {
+               String code = 
+                       success ? 
+                       "[OK]      " : 
+                       "[FAILURE] " ;
+               System.out.println(code + description + " (at line " + line + ")");
+               if (success) {
+                       s_testsOk ++;
+               } else {
+                       s_testsFailure ++;
+               }
+       }
+
+       static void summary() {
+               System.out.println(
+                       "Summary>  " + 
+                       (s_testsOk + s_testsFailure) + " tests, OK: " +
+                       s_testsOk + ", FAILURE: " + s_testsFailure + "."
+               );
+       }
+
+       static void test_ICONST() {
+
+               // load some constant
+
+               s_i = 23;
+
+               TEST(s_i == 23);
+               TEST(s_i != 22);
+
+               // load corner values
+
+               s_i = 0x7fffffff;
+               TEST(s_i == 0x7fffffff);
+               TEST(s_i != 0x7ffffffe);
+
+               s_i = 0xffffffff;
+               TEST(s_i == 0xffffffff);
+               TEST(s_i != 0x7fffffff);
+       }
+
+       static void test_FCONST() {
+
+               // load some float constant
+
+               s_f = 12.3f;
+
+               TEST(s_f == 12.3f);
+               TEST(s_f != 12.4f);
+       }
+
+       static void test_INEG() {
+
+               // negate (+) value
+
+               s_i = 99;
+               s_i = -s_i;
+               TEST(s_i == -99);
+
+               // negate corner (-) value
+
+               s_i = -0x7fffffff;
+               s_i = -s_i;
+               TEST(s_i == 0x7fffffff);
+       }
+
+       static void test_INT2CHAR() {
+               s_i = 97;
+               s_c = (char)s_i;
+               TEST(s_c == 'a');
+       }
+
+       static void test_IADD() {
+
+               // add 2 (+) values
+               
+               s_i1 = 1983;
+               s_i2 = 2000;
+               s_i  = s_i1 + s_i2;
+               TEST(s_i == 3983);
+
+               // add 2 (-) values
+
+               s_i1 = -1983;
+               s_i2 = -2000;
+               s_i  = s_i1 + s_i2;
+               TEST(s_i == -3983);
+       }
+
+       static void test_IADDCONST() {
+       
+               // valid (+) immediate
+
+               s_i = 1983;
+               s_i += 2000;
+               TEST(s_i == 3983);
+
+               // increment
+
+               s_i = 1983;
+               ++s_i;
+               TEST(s_i == 1984);
+
+               // valid (-) immediate
+
+               s_i = -1983;
+               s_i += -2000;
+               TEST(s_i == -3983);
+
+               // big (+) immediate (datasegment)
+
+               s_i = 1983;
+               s_i += 1000000;
+               TEST(s_i == 1001983);
+
+               // big (-) immediate (datasegment)
+
+               s_i = 1983;
+               s_i += -20001983;
+               TEST(s_i == -20000000);
+
+       }
+
+       static void test_ISUB() {
+
+               // substract 2 (+) values
+
+               s_i1 = 33987;
+               s_i2 = 9455325;
+               s_i = s_i1 - s_i2;
+               TEST(s_i == -9421338);
+
+               // substract 2 (-) values
+
+               s_i1 = -33987;
+               s_i2 = -9455325;
+               s_i = s_i1 - s_i2;
+               TEST(s_i == 9421338);
+       }
+
+       static void test_ISUBCONST() {
+
+               // substract valid immediate
+
+               s_i = 32000;
+               s_i -= 2000;
+               TEST(s_i == 30000);
+
+               // substract big (+) immediate (datasegment)
+
+               s_i = 33987;
+               s_i -= 9455325;
+               TEST(s_i == -9421338);
+
+               // decrement
+
+               s_i = 33987;
+               --s_i;
+               TEST(s_i == 33986);
+
+               // substract big (-) immediate (datasegment)
+
+               s_i = -33987;
+               s_i -= -9455325;
+               TEST(s_i == 9421338);
+       }
+
+       static void test_IMULCONST() {
+
+               // by 2 (will shift)
+
+               s_i = 2000;
+               s_i *= 2;
+               TEST(s_i == 4000);
+
+               // valid immediate
+
+               s_i = 200;
+               s_i *= 10000;
+               TEST(s_i == 2000000);
+
+               // big immediate (datasegment)
+
+               s_i = 20;
+               s_i *= 100000;
+               TEST(s_i == 2000000);
+       }
+
+       static void test_IDIV() {
+               s_i1 = 33;
+               s_i2 = 3;
+               s_i = s_i1 / s_i2;
+               TEST(s_i == 11);
+
+               s_i1 = 5570000;
+               s_i2 = 10000;
+               s_i = s_i1 / s_i2;
+               TEST(s_i == 557);
+       }
+
+       static void test_IREM() {
+               s_i1 = 5570664;
+               s_i2 = 10000;
+               s_i = s_i1 % s_i2;
+               TEST(s_i == 664);
+       }
+
+       static void test_FMUL() {
+               s_f1 = 1.1337f;
+               s_f2 = 100.0f;
+               s_f = s_f1 * s_f2;
+               TEST(s_f == 113.37f);
+       }
+
+       static void test_I2F() {
+               s_i = 1234567;
+               s_f = (float)s_i;
+               TEST(s_f == 1234567.0f);
+               s_i = 0;
+               s_f = (float)s_i;
+               TEST(s_f == 0.0f);
+       }
+
+       static void test_I2D() {
+               TODO();
+       }
+
+       static void test_F2I() {
+               s_f = 1337.1337f;
+               s_i = (int)s_f;
+               TEST(s_i == 1337);
+               s_f = 0.0f;
+               s_i = (int)s_f;
+               TEST(s_i == 0);
+       }
+
+       static void test_FCMP() {
+
+               // tests FCMPL and FCMPG
+
+               s_f1 = 1000.0f;
+               s_f2 = 2000.0f;
+
+               // With ecj, FCMPG is generated for < and reverse !
+
+               s_b = (s_f1 < s_f2);
+               TEST(s_b);
+
+               s_b = (s_f2 < s_f1);
+               TEST(! s_b);
+
+               s_b = (s_f1 > s_f2);
+               TEST(! s_b);
+
+               s_b = (s_f2 > s_f1);
+               TEST(s_b);
+
+               s_b = (s_f2 == s_f1);
+               TEST(! s_b);
+
+               s_f2 = s_f1;
+               s_b = (s_f2 == s_f1);
+               TEST(s_b);
+
+               // Corner cases
+               // This might not work with compilers other than ecj
+
+               s_f2 = Float.NaN;
+               s_b = (s_f1 < s_f2); // this generates FCMPG with NaN -> GT
+               TEST(! s_b);
+
+               s_b = (s_f1 > s_f2); // this generates FCMPL whith NAN -> LT
+               TEST(! s_b);
+
+               s_b = (s_f1 == s_f2); // this generates FCMPXX with NAN -> XX
+               TEST(! s_b);
+
+               // Infinity
+
+               s_f1 = Float.NEGATIVE_INFINITY;
+               s_f2 = Float.POSITIVE_INFINITY;
+
+               s_b = (s_f1 < s_f2);
+               TEST(s_b);
+               s_b = (s_f1 > s_f2);
+               TEST(! s_b);
+               s_b = (s_f1 == s_f2);
+               TEST(! s_b);
+       
+               s_f1 = Float.NEGATIVE_INFINITY;
+               s_f2 = -9887.33f;
+
+               s_b = (s_f1 < s_f2);
+               TEST(s_b);
+               s_b = (s_f1 > s_f2);
+               TEST(! s_b);
+               s_b = (s_f1 == s_f2);
+               TEST(! s_b);
+
+               s_f1 = 9999877.44f;
+               s_f2 = Float.POSITIVE_INFINITY;
+
+               s_b = (s_f1 < s_f2);
+               TEST(s_b);
+               s_b = (s_f1 > s_f2);
+               TEST(! s_b);
+               s_b = (s_f1 == s_f2);
+               TEST(! s_b);
+       }
+
+       static void test_ARRAYLENGTH() {
+               TEST(s_ca.length == 10);
+               TEST(s_ca.length != 11);
+       }
+
+       static void test_CALOAD() {
+               s_c = s_ca[4];
+               TEST(s_c == '4');
+       }
+
+       static void test_AALOAD() {
+               s_a = s_aa[1];
+               TEST(s_a != s_a0);
+               TEST(s_a == s_a1);
+       }
+
+       static void test_CASTORE() {
+               s_ca2[1] = 'X';
+               s_c = s_ca2[1];
+               TEST(s_c == 'X');
+       }
+
+       static void test_AASTORE() {
+               s_aa2[1] = s_a1;
+               s_a = s_aa2[1];
+               TEST(s_a == s_a1);
+       }
+
+       static void test_GETPUTSTATIC() {
+               s_c1 = 'X';
+               s_c = s_c1;
+               TEST(s_c == 'X');
+
+               s_s1 = -34;
+               s_s = s_s1;
+               TEST(s_s == -34);
+
+               s_i1 = 987;
+               s_i = s_i1;
+               TEST(s_i == 987);
+
+               s_a = s_a1;
+               TEST(s_a == s_a1);
+
+               s_l1 = 987l;
+               s_l = s_l1;
+               TEST(s_l == 987l);
+
+               s_f1 = 98.12f;
+               s_f = s_f1;
+               TEST(s_f == 98.12f);
+
+               s_d1 = 98.12;
+               s_d = s_d1;
+               TEST(s_d == 98.12);
+       }
+
+       static void test_IF_LXX() {
+               // the tests generated are the negated tests
+               // (witj ecj)
+
+               // short long (one long long)
+
+               s_l = 0xffffl;
+
+               s_i = (s_l < 0xfffffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l <= 0xfffffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l > 0xfffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l >= 0xfffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l == 0xffffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l != 0xffffl ? 10 : 20);
+               TEST(s_i == 20);
+
+               s_i = (s_l != 0xfffl ? 10 : 20);
+               TEST(s_i == 10);
+
+               // long long (two words long)
+
+               s_l = 0xffFFFFFFFFl;
+
+               s_i = (s_l < 0xfffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10); //
+
+               s_i = (s_l <= 0xfffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l > 0xfffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10); //
+
+               s_i = (s_l >= 0xfffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10); //
+
+               s_i = (s_l == 0xffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10);
+
+               s_i = (s_l != 0xffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 20);
+
+               s_i = (s_l != 0xfffFFFFFFFFl ? 10 : 20);
+               TEST(s_i == 10); //
+       }
+       
+       static void main(String[] args) {
+               test_ICONST();
+               test_FCONST();
+               test_INEG();
+               test_INT2CHAR();
+               test_IADD();
+               test_IADDCONST();
+               test_ISUB();
+               test_ISUBCONST();
+               test_IMULCONST();
+               test_IDIV();
+               test_IREM();
+               test_FMUL();
+               test_I2F();
+               test_I2D();
+               test_F2I();
+               test_FCMP();
+               test_ARRAYLENGTH();
+               test_CALOAD();
+               test_AALOAD();
+               test_CASTORE();
+               test_AASTORE();
+               test_GETPUTSTATIC();
+               test_IF_LXX();
+
+               summary();
+       }
+
+
+};
+
+// vim: syntax=java