* src/vm/jit/x86_64/codegen.c: Changed the code generator to produce
authortwisti <none@none>
Tue, 23 May 2006 08:51:33 +0000 (08:51 +0000)
committertwisti <none@none>
Tue, 23 May 2006 08:51:33 +0000 (08:51 +0000)
RISC-like code. These are way too much changes to name them.
(createnativestub): Bugfix in argument saving.
* src/vm/jit/x86_64/codegen.h: Likewise.
* src/vm/jit/x86_64/emit.c: Likewise.
* src/vm/jit/x86_64/md-emit.h: Likewise.

src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/codegen.h
src/vm/jit/x86_64/emit.c
src/vm/jit/x86_64/md-emit.h

index 05552636cfc217d2f1e8bf51dd675d4b118203d8..b4a4910bab6aeab479a082b66fe2bd1c0ed8f68c 100644 (file)
@@ -30,7 +30,7 @@
    Changes: Christian Ullrich
             Edwin Steiner
 
-   $Id: codegen.c 4941 2006-05-23 08:25:14Z twisti $
+   $Id: codegen.c 4943 2006-05-23 08:51:33Z twisti $
 
 */
 
@@ -528,10 +528,8 @@ bool codegen(jitdata *jd)
 
                        case ICMD_CHECKNULL: /* ..., objectref  ==> ..., objectref        */
 
-                               if (src->flags & INMEMORY)
-                                       M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8);
-                               else
-                                       M_TEST(src->regoff);
+                               s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                               M_TEST(s1);
                                M_BEQ(0);
                                codegen_add_nullpointerexception_ref(cd);
                                break;
@@ -634,7 +632,22 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_FLOAD:      /* ...  ==> ..., content of local variable      */
-               case ICMD_DLOAD:      /* op1 = local variable                         */
+                                     /* op1 = local variable                         */
+
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
+                       if ((iptr->dst->varkind == LOCALVAR) &&
+                           (iptr->dst->varnum == iptr->op1))
+                               break;
+                       var = &(rd->locals[iptr->op1][iptr->opc - ICMD_ILOAD]);
+                       if (var->flags & INMEMORY)
+                               M_FLD(d, REG_SP, var->regoff * 8);
+                       else
+                               M_FLTMOVE(var->regoff, d);
+                       emit_store(jd, iptr, iptr->dst, d);
+                       break;
+
+               case ICMD_DLOAD:      /* ...  ==> ..., content of local variable      */
+                                     /* op1 = local variable                         */
 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
                        if ((iptr->dst->varkind == LOCALVAR) &&
@@ -679,7 +692,24 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_FSTORE:     /* ..., value  ==> ...                          */
-               case ICMD_DSTORE:     /* op1 = local variable                         */
+                                     /* op1 = local variable                         */
+
+                       if ((src->varkind == LOCALVAR) &&
+                           (src->varnum == iptr->op1)) {
+                               break;
+                       }
+                       var = &(rd->locals[iptr->op1][iptr->opc - ICMD_ISTORE]);
+                       if (var->flags & INMEMORY) {
+                               s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
+                               M_FST(s1, REG_SP, var->regoff * 8);
+                       } else {
+                               s1 = emit_load_s1(jd, iptr, src, var->regoff);
+                               M_FLTMOVE(s1, var->regoff);
+                       }
+                       break;
+
+               case ICMD_DSTORE:     /* ..., value  ==> ...                          */
+                                     /* op1 = local variable                         */
 
                        if ((src->varkind == LOCALVAR) &&
                            (src->varnum == iptr->op1)) {
@@ -757,91 +787,29 @@ bool codegen(jitdata *jd)
 
                /* integer operations *************************************************/
 
-#define RISC_STYLE 1
-
                case ICMD_INEG:       /* ..., value  ==> ..., - value                 */
 
-#if RISC_STYLE
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1); 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
                        M_INTMOVE(s1, d);
                        M_INEG(d);
                        emit_store(jd, iptr, iptr->dst, d);
-#else
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if (src->flags & INMEMORY) {
-                                       if (src->regoff == iptr->dst->regoff)
-                                               M_INEG_MEMBASE(REG_SP, iptr->dst->regoff * 8);
-                                       else {
-                                               M_ILD(REG_ITMP1, REG_SP, src->regoff * 8);
-                                               M_INEG(REG_ITMP1);
-                                               M_IST(REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else {
-                                       M_IST(src->regoff, REG_SP, iptr->dst->regoff * 8);
-                                       M_INEG_MEMBASE(REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if (src->flags & INMEMORY) {
-                                       M_ILD(iptr->dst->regoff, REG_SP, src->regoff * 8);
-                                       M_INEG(iptr->dst->regoff);
-
-                               } else {
-                                       M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                       M_INEG(iptr->dst->regoff);
-                               }
-                       }
-#endif
                        break;
 
                case ICMD_LNEG:       /* ..., value  ==> ..., - value                 */
 
-#if RISC_STYLE
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1); 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
                        M_INTMOVE(s1, d);
                        M_LNEG(d);
                        emit_store(jd, iptr, iptr->dst, d);
-#else
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if (src->flags & INMEMORY) {
-                                       if (src->regoff == iptr->dst->regoff)
-                                               M_LNEG_MEMBASE(REG_SP, iptr->dst->regoff * 8);
-                                       else {
-                                               M_LLD(REG_ITMP1, REG_SP, src->regoff * 8);
-                                               M_LNEG(REG_ITMP1);
-                                               M_LST(REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else {
-                                       M_LST(src->regoff, REG_SP, iptr->dst->regoff * 8);
-                                       M_LNEG_MEMBASE(REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if (src->flags & INMEMORY) {
-                                       M_LLD(iptr->dst->regoff, REG_SP, src->regoff * 8);
-                                       M_LNEG(iptr->dst->regoff);
-
-                               } else {
-                                       M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                       M_LNEG(iptr->dst->regoff);
-                               }
-                       }
-#endif
                        break;
 
                case ICMD_I2L:        /* ..., value  ==> ..., value                   */
 
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP3);
-                       if (src->flags & INMEMORY)
-                               M_ISEXT_MEMBASE(REG_SP, src->regoff * 8, d);
-                       else
-                               M_ISEXT(src->regoff, d);
+                       M_ISEXT(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -855,435 +823,213 @@ bool codegen(jitdata *jd)
 
                case ICMD_INT2BYTE:   /* ..., value  ==> ..., value                   */
 
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP3);
-                       if (src->flags & INMEMORY)
-                               M_BSEXT_MEMBASE(REG_SP, src->regoff * 8, d);
-                       else
-                               M_BSEXT(src->regoff, d);
+                       M_BSEXT(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_INT2CHAR:   /* ..., value  ==> ..., value                   */
 
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP3);
-                       if (src->flags & INMEMORY)
-                               M_CZEXT_MEMBASE(REG_SP, src->regoff * 8, d);
-                       else
-                               M_CZEXT(src->regoff, d);
+                       M_CZEXT(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_INT2SHORT:  /* ..., value  ==> ..., value                   */
 
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP3);
-                       if (src->flags & INMEMORY)
-                               M_SSEXT_MEMBASE(REG_SP, src->regoff * 8, d);
-                       else
-                               M_SSEXT(src->regoff, d);
+                       M_SSEXT(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
 
                case ICMD_IADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
 
-#if RISC_STYLE
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
                        s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
-                       if (s1 == d)
-                               M_IADD(s2, d);
-                       else if (s2 == d)
+                       if (s2 == d)
                                M_IADD(s1, d);
                        else {
                                M_INTMOVE(s1, d);
                                M_IADD(s2, d);
                        }
                        emit_store(jd, iptr, iptr->dst, d);
-#else
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialu(cd, ALU_ADD, src, iptr);
-#endif
                        break;
 
                case ICMD_IADDCONST:  /* ..., value  ==> ..., value + constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialuconst(cd, ALU_ADD, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_IADD_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LADD:       /* ..., val1, val2  ==> ..., val1 + val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lalu(cd, ALU_ADD, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_LADD(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_LADD(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LADDCONST:  /* ..., value  ==> ..., value + constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_laluconst(cd, ALU_ADD, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LADD_IMM(iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LADD(REG_ITMP2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_ISUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       if (src->prev->regoff == iptr->dst->regoff) {
-                                               emit_movl_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                               emit_alul_reg_membase(cd, ALU_SUB, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                                       } else {
-                                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alul_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, REG_ITMP1);
-                                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                                       emit_alul_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       if (src->prev->regoff == iptr->dst->regoff) {
-                                               emit_alul_reg_membase(cd, ALU_SUB, src->regoff, REG_SP, iptr->dst->regoff * 8);
-
-                                       } else {
-                                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alul_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else {
-                                       emit_movl_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
-                                       emit_alul_reg_membase(cd, ALU_SUB, src->regoff, REG_SP, iptr->dst->regoff * 8);
-                               }
-
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d) {
+                               M_INTMOVE(s1, REG_ITMP1);
+                               M_ISUB(s2, REG_ITMP1);
+                               M_INTMOVE(REG_ITMP1, d);
                        } else {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, d);
-                                       emit_alul_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, d);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, d);
-                                       emit_alul_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, d);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       /* workaround for reg alloc */
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alul_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               M_INTMOVE(REG_ITMP1, d);
-
-                                       } else {
-                                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, d);
-                                               emit_alul_reg_reg(cd, ALU_SUB, src->regoff, d);
-                                       }
-
-                               } else {
-                                       /* workaround for reg alloc */
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                                               emit_alul_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               M_INTMOVE(REG_ITMP1, d);
-
-                                       } else {
-                                               M_INTMOVE(src->prev->regoff, d);
-                                               emit_alul_reg_reg(cd, ALU_SUB, src->regoff, d);
-                                       }
-                               }
+                               M_INTMOVE(s1, d);
+                               M_ISUB(s2, d);
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_ISUBCONST:  /* ..., value  ==> ..., value + constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialuconst(cd, ALU_SUB, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_ISUB_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LSUB:       /* ..., val1, val2  ==> ..., val1 - val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       if (src->prev->regoff == iptr->dst->regoff) {
-                                               emit_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                               emit_alu_reg_membase(cd, ALU_SUB, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                                       } else {
-                                               emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alu_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, REG_ITMP1);
-                                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                                       emit_alu_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       if (src->prev->regoff == iptr->dst->regoff) {
-                                               emit_alu_reg_membase(cd, ALU_SUB, src->regoff, REG_SP, iptr->dst->regoff * 8);
-
-                                       } else {
-                                               emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alu_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       }
-
-                               } else {
-                                       emit_mov_reg_membase(cd, src->prev->regoff, REG_SP, iptr->dst->regoff * 8);
-                                       emit_alu_reg_membase(cd, ALU_SUB, src->regoff, REG_SP, iptr->dst->regoff * 8);
-                               }
-
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d) {
+                               M_INTMOVE(s1, REG_ITMP1);
+                               M_LSUB(s2, REG_ITMP1);
+                               M_INTMOVE(REG_ITMP1, d);
                        } else {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, d);
-                                       emit_alu_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, d);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, d);
-                                       emit_alu_membase_reg(cd, ALU_SUB, REG_SP, src->regoff * 8, d);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       /* workaround for reg alloc */
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                               emit_alu_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               M_INTMOVE(REG_ITMP1, d);
-
-                                       } else {
-                                               emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, d);
-                                               emit_alu_reg_reg(cd, ALU_SUB, src->regoff, d);
-                                       }
-
-                               } else {
-                                       /* workaround for reg alloc */
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                                               emit_alu_reg_reg(cd, ALU_SUB, src->regoff, REG_ITMP1);
-                                               M_INTMOVE(REG_ITMP1, d);
-
-                                       } else {
-                                               M_INTMOVE(src->prev->regoff, d);
-                                               emit_alu_reg_reg(cd, ALU_SUB, src->regoff, d);
-                                       }
-                               }
+                               M_INTMOVE(s1, d);
+                               M_LSUB(s2, d);
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LSUBCONST:  /* ..., value  ==> ..., value - constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_laluconst(cd, ALU_SUB, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LSUB_IMM(iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LSUB(REG_ITMP2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IMUL:       /* ..., val1, val2  ==> ..., val1 * val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                       emit_imull_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       emit_movl_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_imull_reg_reg(cd, src->prev->regoff, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                       emit_imull_reg_reg(cd, src->regoff, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else {
-                                       M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                                       emit_imull_reg_reg(cd, src->regoff, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
-                                       emit_imull_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, iptr->dst->regoff);
-                                       emit_imull_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                       emit_imull_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
-
-                               } else {
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               emit_imull_reg_reg(cd, src->prev->regoff, iptr->dst->regoff);
-
-                                       } else {
-                                               M_INTMOVE(src->prev->regoff, iptr->dst->regoff);
-                                               emit_imull_reg_reg(cd, src->regoff, iptr->dst->regoff);
-                                       }
-                               }
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_IMUL(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IMUL(s2, d);
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IMULCONST:  /* ..., value  ==> ..., value * constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if (src->flags & INMEMORY) {
-                                       emit_imull_imm_membase_reg(cd, iptr->val.i, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else {
-                                       emit_imull_imm_reg_reg(cd, iptr->val.i, src->regoff, REG_ITMP1);
-                                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if (src->flags & INMEMORY) {
-                                       emit_imull_imm_membase_reg(cd, iptr->val.i, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                               } else {
-                                       if (iptr->val.i == 2) {
-                                               M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                               emit_alul_reg_reg(cd, ALU_ADD, iptr->dst->regoff, iptr->dst->regoff);
-
-                                       } else {
-                                               emit_imull_imm_reg_reg(cd, iptr->val.i, src->regoff, iptr->dst->regoff);    /* 3 cycles */
-                                       }
-                               }
-                       }
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       if (iptr->val.i == 2) {
+                               M_INTMOVE(s1, d);
+                               M_ISLL_IMM(1, d);
+                       } else
+                               M_IMUL_IMM(s1, iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LMUL:       /* ..., val1, val2  ==> ..., val1 * val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                       emit_imul_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       emit_mov_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       emit_imul_reg_reg(cd, src->prev->regoff, REG_ITMP1);
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, REG_ITMP1);
-                                       emit_imul_reg_reg(cd, src->regoff, REG_ITMP1);
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-
-                               } else {
-                                       emit_mov_reg_reg(cd, src->prev->regoff, REG_ITMP1);
-                                       emit_imul_reg_reg(cd, src->regoff, REG_ITMP1);
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       emit_mov_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
-                                       emit_imul_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->prev->regoff, iptr->dst->regoff);
-                                       emit_imul_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                                       M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                       emit_imul_membase_reg(cd, REG_SP, src->prev->regoff * 8, iptr->dst->regoff);
-
-                               } else {
-                                       if (src->regoff == iptr->dst->regoff) {
-                                               emit_imul_reg_reg(cd, src->prev->regoff, iptr->dst->regoff);
-
-                                       } else {
-                                               M_INTMOVE(src->prev->regoff, iptr->dst->regoff);
-                                               emit_imul_reg_reg(cd, src->regoff, iptr->dst->regoff);
-                                       }
-                               }
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_LMUL(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_LMUL(s2, d);
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LMULCONST:  /* ..., value  ==> ..., value * constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (iptr->dst->flags & INMEMORY) {
-                               if (src->flags & INMEMORY) {
-                                       if (IS_IMM32(iptr->val.l)) {
-                                               emit_imul_imm_membase_reg(cd, iptr->val.l, REG_SP, src->regoff * 8, REG_ITMP1);
-
-                                       } else {
-                                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                                               emit_imul_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP1);
-                                       }
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                                       
-                               } else {
-                                       if (IS_IMM32(iptr->val.l)) {
-                                               emit_imul_imm_reg_reg(cd, iptr->val.l, src->regoff, REG_ITMP1);
-
-                                       } else {
-                                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                                               emit_imul_reg_reg(cd, src->regoff, REG_ITMP1);
-                                       }
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst->regoff * 8);
-                               }
-
-                       } else {
-                               if (src->flags & INMEMORY) {
-                                       if (IS_IMM32(iptr->val.l)) {
-                                               emit_imul_imm_membase_reg(cd, iptr->val.l, REG_SP, src->regoff * 8, iptr->dst->regoff);
-
-                                       } else {
-                                               emit_mov_imm_reg(cd, iptr->val.l, iptr->dst->regoff);
-                                               emit_imul_membase_reg(cd, REG_SP, src->regoff * 8, iptr->dst->regoff);
-                                       }
-
-                               } else {
-                                       /* should match in many cases */
-                                       if (iptr->val.l == 2) {
-                                               M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                               emit_alul_reg_reg(cd, ALU_ADD, iptr->dst->regoff, iptr->dst->regoff);
-
-                                       } else {
-                                               if (IS_IMM32(iptr->val.l)) {
-                                                       emit_imul_imm_reg_reg(cd, iptr->val.l, src->regoff, iptr->dst->regoff);    /* 4 cycles */
-
-                                               } else {
-                                                       emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                                                       M_INTMOVE(src->regoff, iptr->dst->regoff);
-                                                       emit_imul_reg_reg(cd, REG_ITMP1, iptr->dst->regoff);
-                                               }
-                                       }
-                               }
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LMUL_IMM(s1, iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_INTMOVE(s1, d);
+                               M_LMUL(REG_ITMP2, d);
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-               if (src->prev->flags & INMEMORY) {
-                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, RAX);
-
-                       } else {
+               if (src->prev->flags & INMEMORY)
+                               M_ILD(RAX, REG_SP, src->prev->regoff * 8);
+                       else
                                M_INTMOVE(src->prev->regoff, RAX);
-                       }
                        
-                       if (src->flags & INMEMORY) {
-                               emit_movl_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP3);
-
-                       } else {
+                       if (src->flags & INMEMORY)
+                               M_ILD(REG_ITMP3, REG_SP, src->regoff * 8);
+                       else
                                M_INTMOVE(src->regoff, REG_ITMP3);
+
+                       if (checknull) {
+                               M_ITEST(REG_ITMP3);
+                               M_BEQ(0);
+                               codegen_add_arithmeticexception_ref(cd);
                        }
-                       gen_div_check(src);
 
                        emit_alul_imm_reg(cd, ALU_CMP, 0x80000000, RAX); /* check as described in jvm spec */
                        emit_jcc(cd, CC_NE, 4 + 6);
@@ -1308,21 +1054,23 @@ bool codegen(jitdata *jd)
                        break;
 
                case ICMD_IREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (src->prev->flags & INMEMORY) {
-                               emit_movl_membase_reg(cd, REG_SP, src->prev->regoff * 8, RAX);
 
-                       } else {
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
+                       if (src->prev->flags & INMEMORY)
+                               M_ILD(RAX, REG_SP, src->prev->regoff * 8);
+                       else
                                M_INTMOVE(src->prev->regoff, RAX);
-                       }
                        
-                       if (src->flags & INMEMORY) {
-                               emit_movl_membase_reg(cd, REG_SP, src->regoff * 8, REG_ITMP3);
-
-                       } else {
+                       if (src->flags & INMEMORY)
+                               M_ILD(REG_ITMP3, REG_SP, src->regoff * 8);
+                       else
                                M_INTMOVE(src->regoff, REG_ITMP3);
+
+                       if (checknull) {
+                               M_ITEST(REG_ITMP3);
+                               M_BEQ(0);
+                               codegen_add_arithmeticexception_ref(cd);
                        }
-                       gen_div_check(src);
 
                        emit_mov_reg_reg(cd, RDX, REG_ITMP2); /* save %rdx, cause it's an argument register */
 
@@ -1384,26 +1132,27 @@ bool codegen(jitdata *jd)
 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
 
-               if (src->prev->flags & INMEMORY) {
+               if (src->prev->flags & INMEMORY)
                                M_LLD(RAX, REG_SP, src->prev->regoff * 8);
-
-                       } else {
+                       else
                                M_INTMOVE(src->prev->regoff, RAX);
-                       }
                        
-                       if (src->flags & INMEMORY) {
+                       if (src->flags & INMEMORY)
                                M_LLD(REG_ITMP3, REG_SP, src->regoff * 8);
-
-                       } else {
+                       else
                                M_INTMOVE(src->regoff, REG_ITMP3);
+
+                       if (checknull) {
+                               M_TEST(REG_ITMP3);
+                               M_BEQ(0);
+                               codegen_add_arithmeticexception_ref(cd);
                        }
-                       gen_div_check(src);
 
                        /* check as described in jvm spec */
                        disp = dseg_adds8(cd, 0x8000000000000000LL);
-                       M_CMP_MEMBASE(RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, RAX);
+                       M_LCMP_MEMBASE(RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, RAX);
                        M_BNE(4 + 6);
-                       M_CMP_IMM(-1, REG_ITMP3);                              /* 4 bytes */
+                       M_LCMP_IMM(-1, REG_ITMP3);                              /* 4 bytes */
                        M_BEQ(3 + 2 + 3);                                      /* 6 bytes */
 
                        M_MOV(RDX, REG_ITMP2); /* save %rdx, cause it's an argument register */
@@ -1426,33 +1175,34 @@ bool codegen(jitdata *jd)
                case ICMD_LREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
 
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       if (src->prev->flags & INMEMORY) {
+                       if (src->prev->flags & INMEMORY)
                                M_LLD(REG_ITMP1, REG_SP, src->prev->regoff * 8);
-
-                       } else {
+                       else
                                M_INTMOVE(src->prev->regoff, REG_ITMP1);
-                       }
                        
-                       if (src->flags & INMEMORY) {
+                       if (src->flags & INMEMORY)
                                M_LLD(REG_ITMP3, REG_SP, src->regoff * 8);
-
-                       } else {
+                       else
                                M_INTMOVE(src->regoff, REG_ITMP3);
+
+                       if (checknull) {
+                               M_ITEST(REG_ITMP3);
+                               M_BEQ(0);
+                               codegen_add_arithmeticexception_ref(cd);
                        }
-                       gen_div_check(src);
 
                        M_MOV(RDX, REG_ITMP2); /* save %rdx, cause it's an argument register */
 
                        /* check as described in jvm spec */
                        disp = dseg_adds8(cd, 0x8000000000000000LL);
-                       M_CMP_MEMBASE(RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, REG_ITMP1);
+                       M_LCMP_MEMBASE(RIP, -(((ptrint) cd->mcodeptr + 7) - (ptrint) cd->mcodebase) + disp, REG_ITMP1);
                        M_BNE(3 + 4 + 6);
 
 #if 0
                        emit_alul_reg_reg(cd, ALU_XOR, RDX, RDX);         /* 2 bytes */
 #endif
-                       M_XOR(RDX, RDX);                                       /* 3 bytes */
-                       M_CMP_IMM(-1, REG_ITMP3);                              /* 4 bytes */
+                       M_LXOR(RDX, RDX);                                      /* 3 bytes */
+                       M_LCMP_IMM(-1, REG_ITMP3);                              /* 4 bytes */
                        M_BEQ(2 + 3);                                          /* 6 bytes */
 
                        emit_cqto(cd);
@@ -1509,8 +1259,11 @@ bool codegen(jitdata *jd)
                case ICMD_ISHLCONST:  /* ..., value  ==> ..., value << constant       */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ishiftconst(cd, SHIFT_SHL, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_ISLL_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_ISHR:       /* ..., val1, val2  ==> ..., val1 >> val2       */
@@ -1522,8 +1275,11 @@ bool codegen(jitdata *jd)
                case ICMD_ISHRCONST:  /* ..., value  ==> ..., value >> constant       */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ishiftconst(cd, SHIFT_SAR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       M_INTMOVE(s1, d);
+                       M_ISRA_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IUSHR:      /* ..., val1, val2  ==> ..., val1 >>> val2      */
@@ -1535,8 +1291,11 @@ bool codegen(jitdata *jd)
                case ICMD_IUSHRCONST: /* ..., value  ==> ..., value >>> constant      */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ishiftconst(cd, SHIFT_SHR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       M_INTMOVE(s1, d);
+                       M_ISRL_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LSHL:       /* ..., val1, val2  ==> ..., val1 << val2       */
@@ -1548,8 +1307,11 @@ bool codegen(jitdata *jd)
         case ICMD_LSHLCONST:  /* ..., value  ==> ..., value << constant       */
                                          /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lshiftconst(cd, SHIFT_SHL, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_LSLL_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LSHR:       /* ..., val1, val2  ==> ..., val1 >> val2       */
@@ -1561,8 +1323,11 @@ bool codegen(jitdata *jd)
                case ICMD_LSHRCONST:  /* ..., value  ==> ..., value >> constant       */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lshiftconst(cd, SHIFT_SAR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       M_INTMOVE(s1, d);
+                       M_LSRA_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LUSHR:      /* ..., val1, val2  ==> ..., val1 >>> val2      */
@@ -1574,119 +1339,190 @@ bool codegen(jitdata *jd)
                case ICMD_LUSHRCONST: /* ..., value  ==> ..., value >>> constant      */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lshiftconst(cd, SHIFT_SHR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       M_INTMOVE(s1, d);
+                       M_LSRL_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IAND:       /* ..., val1, val2  ==> ..., val1 & val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialu(cd, ALU_AND, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_IAND(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IAND(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IANDCONST:  /* ..., value  ==> ..., value & constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialuconst(cd, ALU_AND, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_IAND_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LAND:       /* ..., val1, val2  ==> ..., val1 & val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lalu(cd, ALU_AND, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_LAND(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_LAND(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LANDCONST:  /* ..., value  ==> ..., value & constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_laluconst(cd, ALU_AND, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LAND_IMM(iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LAND(REG_ITMP2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IOR:        /* ..., val1, val2  ==> ..., val1 | val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialu(cd, ALU_OR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_IOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IOR(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IORCONST:   /* ..., value  ==> ..., value | constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialuconst(cd, ALU_OR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_IOR_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LOR:        /* ..., val1, val2  ==> ..., val1 | val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lalu(cd, ALU_OR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_LOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_LOR(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LORCONST:   /* ..., value  ==> ..., value | constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_laluconst(cd, ALU_OR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LOR_IMM(iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LOR(REG_ITMP2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IXOR:       /* ..., val1, val2  ==> ..., val1 ^ val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialu(cd, ALU_XOR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_IXOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_IXOR(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_IXORCONST:  /* ..., value  ==> ..., value ^ constant        */
                                      /* val.i = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_ialuconst(cd, ALU_XOR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       M_IXOR_IMM(iptr->val.i, d);
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LXOR:       /* ..., val1, val2  ==> ..., val1 ^ val2        */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_lalu(cd, ALU_XOR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                       if (s2 == d)
+                               M_LXOR(s1, d);
+                       else {
+                               M_INTMOVE(s1, d);
+                               M_LXOR(s2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_LXORCONST:  /* ..., value  ==> ..., value ^ constant        */
                                      /* val.l = constant                             */
 
-                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_NULL);
-                       emit_laluconst(cd, ALU_XOR, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
+                       M_INTMOVE(s1, d);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LXOR_IMM(iptr->val.l, d);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LXOR(REG_ITMP2, d);
+                       }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
 
                case ICMD_IINC:       /* ..., value  ==> ..., value + constant        */
                                      /* op1 = variable, val.i = constant             */
 
-                       /* using inc and dec is definitely faster than add -- tested      */
-                       /* with sieve                                                     */
-
                        var = &(rd->locals[iptr->op1][TYPE_INT]);
-                       d = var->regoff;
                        if (var->flags & INMEMORY) {
-                               if (iptr->val.i == 1) {
-                                       emit_incl_membase(cd, REG_SP, d * 8);
-                               } else if (iptr->val.i == -1) {
-                                       emit_decl_membase(cd, REG_SP, d * 8);
+                               s1 = REG_ITMP1;
+                               M_ILD(s1, REG_SP, var->regoff * 8);
+                       } else
+                               s1 = var->regoff;
 
-                               } else {
-                                       emit_alul_imm_membase(cd, ALU_ADD, iptr->val.i, REG_SP, d * 8);
-                               }
+                       /* Using inc and dec is not faster than add (tested with
+                          sieve). */
 
-                       } else {
-                               if (iptr->val.i == 1) {
-                                       emit_incl_reg(cd, d);
-                               } else if (iptr->val.i == -1) {
-                                       emit_decl_reg(cd, d);
+                       M_IADD_IMM(iptr->val.i, s1);
 
-                               } else {
-                                       emit_alul_imm_reg(cd, ALU_ADD, iptr->val.i, d);
-                               }
-                       }
+                       if (var->flags & INMEMORY)
+                               M_IST(s1, REG_SP, var->regoff * 8);
                        break;
 
 
@@ -1719,13 +1555,11 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       if (s1 == d) {
-                               emit_addss_reg_reg(cd, s2, d);
-                       } else if (s2 == d) {
-                               emit_addss_reg_reg(cd, s1, d);
-                       } else {
+                       if (s2 == d)
+                               M_FADD(s1, d);
+                       else {
                                M_FLTMOVE(s1, d);
-                               emit_addss_reg_reg(cd, s2, d);
+                               M_FADD(s2, d);
                        }
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1735,13 +1569,11 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       if (s1 == d) {
-                               emit_addsd_reg_reg(cd, s2, d);
-                       } else if (s2 == d) {
-                               emit_addsd_reg_reg(cd, s1, d);
-                       } else {
+                       if (s2 == d)
+                               M_DADD(s1, d);
+                       else {
                                M_FLTMOVE(s1, d);
-                               emit_addsd_reg_reg(cd, s2, d);
+                               M_DADD(s2, d);
                        }
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1756,7 +1588,7 @@ bool codegen(jitdata *jd)
                                s2 = REG_FTMP2;
                        }
                        M_FLTMOVE(s1, d);
-                       emit_subss_reg_reg(cd, s2, d);
+                       M_FSUB(s2, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1770,7 +1602,7 @@ bool codegen(jitdata *jd)
                                s2 = REG_FTMP2;
                        }
                        M_FLTMOVE(s1, d);
-                       emit_subsd_reg_reg(cd, s2, d);
+                       M_DSUB(s2, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1779,13 +1611,11 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       if (s1 == d) {
-                               emit_mulss_reg_reg(cd, s2, d);
-                       } else if (s2 == d) {
-                               emit_mulss_reg_reg(cd, s1, d);
-                       } else {
+                       if (s2 == d)
+                               M_FMUL(s1, d);
+                       else {
                                M_FLTMOVE(s1, d);
-                               emit_mulss_reg_reg(cd, s2, d);
+                               M_FMUL(s2, d);
                        }
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1795,13 +1625,11 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_FTMP1);
                        s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       if (s1 == d) {
-                               emit_mulsd_reg_reg(cd, s2, d);
-                       } else if (s2 == d) {
-                               emit_mulsd_reg_reg(cd, s1, d);
-                       } else {
+                       if (s2 == d)
+                               M_DMUL(s1, d);
+                       else {
                                M_FLTMOVE(s1, d);
-                               emit_mulsd_reg_reg(cd, s2, d);
+                               M_DMUL(s2, d);
                        }
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1816,7 +1644,7 @@ bool codegen(jitdata *jd)
                                s2 = REG_FTMP2;
                        }
                        M_FLTMOVE(s1, d);
-                       emit_divss_reg_reg(cd, s2, d);
+                       M_FDIV(s2, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1830,7 +1658,7 @@ bool codegen(jitdata *jd)
                                s2 = REG_FTMP2;
                        }
                        M_FLTMOVE(s1, d);
-                       emit_divsd_reg_reg(cd, s2, d);
+                       M_DDIV(s2, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1838,7 +1666,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                       emit_cvtsi2ss_reg_reg(cd, s1, d);
+                       M_CVTIF(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1846,7 +1674,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                       emit_cvtsi2sd_reg_reg(cd, s1, d);
+                       M_CVTID(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1854,7 +1682,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                       emit_cvtsi2ssq_reg_reg(cd, s1, d);
+                       M_CVTLF(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
                        
@@ -1862,7 +1690,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                       emit_cvtsi2sdq_reg_reg(cd, s1, d);
+                       M_CVTLD(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
                        
@@ -1870,13 +1698,14 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                       emit_cvttss2si_reg_reg(cd, s1, d);
-                       emit_alul_imm_reg(cd, ALU_CMP, 0x80000000, d);    /* corner cases */
-                       a = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 + ((REG_RESULT == d) ? 0 : 3);
-                       emit_jcc(cd, CC_NE, a);
+                       M_CVTFI(s1, d);
+                       M_ICMP_IMM(0x80000000, d);                        /* corner cases */
+                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
+                               ((REG_RESULT == d) ? 0 : 3);
+                       M_BNE(disp);
                        M_FLTMOVE(s1, REG_FTMP1);
-                       emit_mov_imm_reg(cd, (ptrint) asm_builtin_f2i, REG_ITMP2);
-                       emit_call_reg(cd, REG_ITMP2);
+                       M_MOV_IMM(asm_builtin_f2i, REG_ITMP2);
+                       M_CALL(REG_ITMP2);
                        M_INTMOVE(REG_RESULT, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1885,13 +1714,14 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                       emit_cvttsd2si_reg_reg(cd, s1, d);
-                       emit_alul_imm_reg(cd, ALU_CMP, 0x80000000, d);    /* corner cases */
-                       a = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 + ((REG_RESULT == d) ? 0 : 3);
-                       emit_jcc(cd, CC_NE, a);
+                       M_CVTDI(s1, d);
+                       M_ICMP_IMM(0x80000000, d);                        /* corner cases */
+                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
+                               ((REG_RESULT == d) ? 0 : 3);
+                       M_BNE(disp);
                        M_FLTMOVE(s1, REG_FTMP1);
-                       emit_mov_imm_reg(cd, (ptrint) asm_builtin_d2i, REG_ITMP2);
-                       emit_call_reg(cd, REG_ITMP2);
+                       M_MOV_IMM(asm_builtin_d2i, REG_ITMP2);
+                       M_CALL(REG_ITMP2);
                        M_INTMOVE(REG_RESULT, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1900,14 +1730,15 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                       emit_cvttss2siq_reg_reg(cd, s1, d);
-                       emit_mov_imm_reg(cd, 0x8000000000000000, REG_ITMP2);
-                       emit_alu_reg_reg(cd, ALU_CMP, REG_ITMP2, d);     /* corner cases */
-                       a = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 + ((REG_RESULT == d) ? 0 : 3);
-                       emit_jcc(cd, CC_NE, a);
+                       M_CVTFL(s1, d);
+                       M_MOV_IMM(0x8000000000000000, REG_ITMP2);
+                       M_LCMP(REG_ITMP2, d);                             /* corner cases */
+                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
+                               ((REG_RESULT == d) ? 0 : 3);
+                       M_BNE(disp);
                        M_FLTMOVE(s1, REG_FTMP1);
-                       emit_mov_imm_reg(cd, (ptrint) asm_builtin_f2l, REG_ITMP2);
-                       emit_call_reg(cd, REG_ITMP2);
+                       M_MOV_IMM(asm_builtin_f2l, REG_ITMP2);
+                       M_CALL(REG_ITMP2);
                        M_INTMOVE(REG_RESULT, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1916,14 +1747,15 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                       emit_cvttsd2siq_reg_reg(cd, s1, d);
-                       emit_mov_imm_reg(cd, 0x8000000000000000, REG_ITMP2);
-                       emit_alu_reg_reg(cd, ALU_CMP, REG_ITMP2, d);     /* corner cases */
-                       a = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 + ((REG_RESULT == d) ? 0 : 3);
-                       emit_jcc(cd, CC_NE, a);
+                       M_CVTDL(s1, d);
+                       M_MOV_IMM(0x8000000000000000, REG_ITMP2);
+                       M_LCMP(REG_ITMP2, d);                             /* corner cases */
+                       disp = ((s1 == REG_FTMP1) ? 0 : 5) + 10 + 3 +
+                               ((REG_RESULT == d) ? 0 : 3);
+                       M_BNE(disp);
                        M_FLTMOVE(s1, REG_FTMP1);
-                       emit_mov_imm_reg(cd, (ptrint) asm_builtin_d2l, REG_ITMP2);
-                       emit_call_reg(cd, REG_ITMP2);
+                       M_MOV_IMM(asm_builtin_d2l, REG_ITMP2);
+                       M_CALL(REG_ITMP2);
                        M_INTMOVE(REG_RESULT, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
@@ -1932,7 +1764,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       emit_cvtss2sd_reg_reg(cd, s1, d);
+                       M_CVTFD(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -1940,7 +1772,7 @@ bool codegen(jitdata *jd)
 
                        s1 = emit_load_s1(jd, iptr, src, REG_FTMP1);
                        d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP3);
-                       emit_cvtsd2ss_reg_reg(cd, s1, d);
+                       M_CVTDF(s1, d);
                        emit_store(jd, iptr, iptr->dst, d);
                        break;
 
@@ -2345,32 +2177,29 @@ bool codegen(jitdata *jd)
                        /* This approach is much faster than moving the field
                           address inline into a register. */
 
-                       M_ALD(REG_ITMP2, RIP, -(((ptrint) cd->mcodeptr + 7) -
+                       M_ALD(REG_ITMP1, RIP, -(((ptrint) cd->mcodeptr + 7) -
                                                                        (ptrint) cd->mcodebase) + disp);
 
                        switch (iptr->op1) {
                        case TYPE_INT:
-                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                               M_ILD(d, REG_ITMP2, 0);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                               M_ILD(d, REG_ITMP1, 0);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
-                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                               M_LLD(d, REG_ITMP2, 0);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP2);
+                               M_LLD(d, REG_ITMP1, 0);
                                break;
                        case TYPE_FLT:
-                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                               emit_movss_membase_reg(cd, REG_ITMP2, 0, d);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
+                               M_FLD(d, REG_ITMP1, 0);
                                break;
                        case TYPE_DBL:                          
-                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
-                               emit_movsd_membase_reg(cd, REG_ITMP2, 0, d);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
+                               M_DLD(d, REG_ITMP1, 0);
                                break;
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_PUTSTATIC:  /* ..., value  ==> ...                          */
@@ -2411,26 +2240,26 @@ bool codegen(jitdata *jd)
                        /* This approach is much faster than moving the field
                           address inline into a register. */
 
-                       M_ALD(REG_ITMP2, RIP, -(((ptrint) cd->mcodeptr + 7) -
+                       M_ALD(REG_ITMP1, RIP, -(((ptrint) cd->mcodeptr + 7) -
                                                                        (ptrint) cd->mcodebase) + disp);
 
                        switch (iptr->op1) {
                        case TYPE_INT:
-                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP1);
-                               M_IST(s2, REG_ITMP2, 0);
+                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                               M_IST(s2, REG_ITMP1, 0);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
-                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP1);
-                               M_LST(s2, REG_ITMP2, 0);
+                               s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                               M_LST(s2, REG_ITMP1, 0);
                                break;
                        case TYPE_FLT:
                                s2 = emit_load_s2(jd, iptr, src, REG_FTMP1);
-                               emit_movss_reg_membase(cd, s2, REG_ITMP2, 0);
+                               M_FST(s2, REG_ITMP1, 0);
                                break;
                        case TYPE_DBL:
                                s2 = emit_load_s2(jd, iptr, src, REG_FTMP1);
-                               emit_movsd_reg_membase(cd, s2, REG_ITMP2, 0);
+                               M_DST(s2, REG_ITMP1, 0);
                                break;
                        }
                        break;
@@ -2486,9 +2315,9 @@ bool codegen(jitdata *jd)
                        case TYPE_LNG:
                        case TYPE_ADR:
                        case TYPE_DBL:
-                               if (IS_IMM32(iptr->val.l)) {
+                               if (IS_IMM32(iptr->val.l))
                                        M_LST_IMM32(iptr->val.l, REG_ITMP1, 0);
-                               else {
+                               else {
                                        M_IST_IMM(iptr->val.l, REG_ITMP1, 0);
                                        M_IST_IMM(iptr->val.l >> 32, REG_ITMP1, 4);
                                }
@@ -2516,33 +2345,29 @@ bool codegen(jitdata *jd)
 
                                disp = 0;
 
-                       } else {
+                       } else
                                disp = INSTRUCTION_RESOLVED_FIELDINFO(iptr)->offset;
-                       }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
                                d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
                                M_ILD32(d, s1, disp);
-                               emit_store(jd, iptr, iptr->dst, d);
                                break;
                        case TYPE_LNG:
                        case TYPE_ADR:
                                d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_ITMP1);
                                M_LLD32(d, s1, disp);
-                               emit_store(jd, iptr, iptr->dst, d);
                                break;
                        case TYPE_FLT:
                                d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                               emit_movss_membase32_reg(cd, s1, disp, d);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               M_FLD32(d, s1, disp);
                                break;
                        case TYPE_DBL:                          
                                d = codegen_reg_of_var(rd, iptr->opc, iptr->dst, REG_FTMP1);
-                               emit_movsd_membase32_reg(cd, s1, disp, d);
-                               emit_store(jd, iptr, iptr->dst, d);
+                               M_DLD32(d, s1, disp);
                                break;
                        }
+                       emit_store(jd, iptr, iptr->dst, d);
                        break;
 
                case ICMD_PUTFIELD:   /* ..., objectref, value  ==> ...               */
@@ -2551,11 +2376,10 @@ bool codegen(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
                        gen_nullptr_check(s1);
 
-                       if (IS_INT_LNG_TYPE(iptr->op1)) {
+                       if (IS_INT_LNG_TYPE(iptr->op1))
                                s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
-                       } else {
+                       else
                                s2 = emit_load_s2(jd, iptr, src, REG_FTMP2);
-                       }
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
 /*                             PROFILE_CYCLE_STOP; */
@@ -2571,9 +2395,8 @@ bool codegen(jitdata *jd)
 
                                disp = 0;
 
-                       } else {
+                       } else
                                disp = INSTRUCTION_RESOLVED_FIELDINFO(iptr)->offset;
-                       }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
@@ -2584,10 +2407,10 @@ bool codegen(jitdata *jd)
                                M_LST32(s2, s1, disp);
                                break;
                        case TYPE_FLT:
-                               emit_movss_reg_membase32(cd, s2, s1, disp);
+                               M_FST32(s2, s1, disp);
                                break;
                        case TYPE_DBL:
-                               emit_movsd_reg_membase32(cd, s2, s1, disp);
+                               M_DST32(s2, s1, disp);
                                break;
                        }
                        break;
@@ -2614,9 +2437,8 @@ bool codegen(jitdata *jd)
 
                                disp = 0;
 
-                       } else {
+                       } else
                                disp = INSTRUCTION_RESOLVED_FIELDINFO(iptr + 1)->offset;
-                       }
 
                        switch (iptr->op1) {
                        case TYPE_INT:
@@ -2688,186 +2510,277 @@ bool codegen(jitdata *jd)
                case ICMD_IFNULL:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc                     */
 
-                       if (src->flags & INMEMORY)
-                               M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8);
-                       else
-                               M_TEST(src->regoff);
-
-                       /* If the conditional branch is part of an if-converted
-                          block, don't generate the actual branch. */
-
-                       if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
-                               M_BEQ(0);
-                               codegen_addreference(cd, (basicblock *) iptr->target);
-                       }
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_TEST(s1);
+                       M_BEQ(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFNONNULL:    /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc                     */
 
-                       if (src->flags & INMEMORY)
-                               M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8);
-                       else
-                               M_TEST(src->regoff);
-
-                       /* If the conditional branch is part of an if-converted
-                          block, don't generate the actual branch. */
-
-                       if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
-                               M_BNE(0);
-                               codegen_addreference(cd, (basicblock *) iptr->target);
-                       }
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_TEST(s1);
+                       M_BNE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFEQ:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-                       emit_ifcc(cd, CC_E, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_ICMP_IMM(iptr->val.i, s1);
+                       M_BEQ(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFLT:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-#if RISC_STYLE
                        s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                        M_ICMP_IMM(iptr->val.i, s1);
                        M_BLT(0);
                        codegen_addreference(cd, (basicblock *) iptr->target);
-#else
-                       emit_ifcc(cd, CC_L, src, iptr);
-#endif
                        break;
 
                case ICMD_IFLE:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-                       emit_ifcc(cd, CC_LE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_ICMP_IMM(iptr->val.i, s1);
+                       M_BLE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFNE:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-                       emit_ifcc(cd, CC_NE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_ICMP_IMM(iptr->val.i, s1);
+                       M_BNE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFGT:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-                       emit_ifcc(cd, CC_G, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_ICMP_IMM(iptr->val.i, s1);
+                       M_BGT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IFGE:         /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.i = constant   */
 
-                       emit_ifcc(cd, CC_GE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       M_ICMP_IMM(iptr->val.i, s1);
+                       M_BGE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LEQ:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_E, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BEQ(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LLT:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_L, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BLT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LLE:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_LE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BLE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LNE:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_NE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BNE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LGT:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_G, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BGT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LGE:       /* ..., value ==> ...                         */
                                        /* op1 = target JavaVM pc, val.l = constant   */
 
-                       emit_if_lcc(cd, CC_GE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+                       if (IS_IMM32(iptr->val.l))
+                               M_LCMP_IMM(iptr->val.l, s1);
+                       else {
+                               M_MOV_IMM(iptr->val.l, REG_ITMP2);
+                               M_LCMP(REG_ITMP2, s1);
+                       }
+                       M_BGE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPEQ:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_E, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BEQ(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPEQ:    /* ..., value, value ==> ...                  */
                case ICMD_IF_ACMPEQ:    /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_E, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BEQ(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPNE:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_NE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BNE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPNE:    /* ..., value, value ==> ...                  */
                case ICMD_IF_ACMPNE:    /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_NE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BNE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPLT:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_L, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BLT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPLT:    /* ..., value, value ==> ...                  */
                                    /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_L, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BLT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPGT:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_G, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BGT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPGT:    /* ..., value, value ==> ...                  */
                                 /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_G, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BGT(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPLE:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_LE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BLE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPLE:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_LE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BLE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_ICMPGE:    /* ..., value, value ==> ...                  */
                                        /* op1 = target JavaVM pc                     */
 
-                       emit_if_icmpcc(cd, CC_GE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_ICMP(s2, s1);
+                       M_BGE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                case ICMD_IF_LCMPGE:    /* ..., value, value ==> ...                  */
                                    /* op1 = target JavaVM pc                     */
 
-                       emit_if_lcmpcc(cd, CC_GE, src, iptr);
+                       s1 = emit_load_s1(jd, iptr, src->prev, REG_ITMP1);
+                       s2 = emit_load_s2(jd, iptr, src, REG_ITMP2);
+                       M_LCMP(s2, s1);
+                       M_BGE(0);
+                       codegen_addreference(cd, (basicblock *) iptr->target);
                        break;
 
                /* (value xx 0) ? IFxx_ICONST : ELSE_ICONST                           */
@@ -3063,14 +2976,15 @@ nowperformreturn:
 
                                s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
                                M_INTMOVE(s1, REG_ITMP1);
-                               if (l != 0) {
-                                       emit_alul_imm_reg(cd, ALU_SUB, l, REG_ITMP1);
-                               }
+
+                               if (l != 0)
+                                       M_ISUB_IMM(l, REG_ITMP1);
+
                                i = i - l + 1;
 
                 /* range check */
-                               emit_alul_imm_reg(cd, ALU_CMP, i - 1, REG_ITMP1);
-                               emit_jcc(cd, CC_A, 0);
+                               M_ICMP_IMM(i - 1, REG_ITMP1);
+                               M_BA(0);
 
                                codegen_addreference(cd, (basicblock *) tptr[0]);
 
@@ -3090,7 +3004,7 @@ nowperformreturn:
                                M_MOV_IMM(0, REG_ITMP2);
                                dseg_adddata(cd);
                                emit_mov_memindex_reg(cd, -(cd->dseglen), REG_ITMP2, REG_ITMP1, 3, REG_ITMP1);
-                               emit_jmp_reg(cd, REG_ITMP1);
+                               M_JMP(REG_ITMP1);
                        }
                        break;
 
@@ -3107,18 +3021,19 @@ nowperformreturn:
                                i = s4ptr[1];                          /* count    */
                        
                                MCODECHECK(8 + ((7 + 6) * i) + 5);
-                               s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);    /* reg compare should always be faster */
+                               s1 = emit_load_s1(jd, iptr, src, REG_ITMP1);
+
                                while (--i >= 0) {
                                        s4ptr += 2;
                                        ++tptr;
 
                                        val = s4ptr[0];
-                                       emit_alul_imm_reg(cd, ALU_CMP, val, s1);
-                                       emit_jcc(cd, CC_E, 0);
+                                       M_ICMP_IMM(val, s1);
+                                       M_BEQ(0);
                                        codegen_addreference(cd, (basicblock *) tptr[0]);
                                }
 
-                               emit_jmp_imm(cd, 0);
+                               M_JMP_IMM(0);
                        
                                tptr = (void **) iptr->target;
                                codegen_addreference(cd, (basicblock *) tptr[0]);
@@ -3176,7 +3091,11 @@ gen_method:
                                                M_FLTMOVE(d, s1);
                                        } else {
                                                d = emit_load_s1(jd, iptr, src, REG_FTMP1);
-                                               M_DST(d, REG_SP, md->params[s3].regoff * 8);
+
+                                               if (IS_2_WORD_TYPE(src->type))
+                                                       M_DST(d, REG_SP, md->params[s3].regoff * 8);
+                                               else
+                                                       M_FST(d, REG_SP, md->params[s3].regoff * 8);
                                        }
                                }
                        }
@@ -3507,7 +3426,7 @@ gen_method:
 #if defined(ENABLE_THREADS)
                                        codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
 #endif
-                                       M_CMP(REG_ITMP3, REG_ITMP2);
+                                       M_LCMP(REG_ITMP3, REG_ITMP2);
                                        M_BA(0);         /* (u) REG_ITMP1 > (u) REG_ITMP2 -> jump */
                                        codegen_add_classcastexception_ref(cd);
                                }
@@ -4122,13 +4041,18 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
        if (opt_verbosecall) {
                /* save integer and float argument registers */
 
-               for (i = 0, j = 0; i < md->paramcount && j < INT_ARG_CNT; i++)
-                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                               M_LST(rd->argintregs[j++], REG_SP, (1 + i) * 8);
+               for (i = 0, j = 1; i < md->paramcount; i++) {
+                       if (!md->params[i].inmemory) {
+                               s1 = md->params[i].regoff;
+
+                               if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
+                                       M_LST(rd->argintregs[s1], REG_SP, j * 8);
+                               else
+                                       M_DST(rd->argfltregs[s1], REG_SP, j * 8);
 
-               for (i = 0, j = 0; i < md->paramcount && j < FLT_ARG_CNT; i++)
-                       if (IS_FLT_DBL_TYPE(md->paramtypes[i].type))
-                               M_DST(rd->argfltregs[j++], REG_SP, (1 + INT_ARG_CNT + i) * 8);
+                               j++;
+                       }
+               }
 
                /* show integer hex code for float arguments */
 
@@ -4152,13 +4076,18 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
                /* restore integer and float argument registers */
 
-               for (i = 0, j = 0; i < md->paramcount && j < INT_ARG_CNT; i++)
-                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                               M_LLD(rd->argintregs[j++], REG_SP, (1 + i) * 8);
+               for (i = 0, j = 1; i < md->paramcount; i++) {
+                       if (!md->params[i].inmemory) {
+                               s1 = md->params[i].regoff;
+
+                               if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
+                                       M_LLD(rd->argintregs[s1], REG_SP, j * 8);
+                               else
+                                       M_DLD(rd->argfltregs[s1], REG_SP, j * 8);
 
-               for (i = 0, j = 0; i < md->paramcount && j < FLT_ARG_CNT; i++)
-                       if (IS_FLT_DBL_TYPE(md->paramtypes[i].type))
-                               M_DLD(rd->argfltregs[j++], REG_SP, (1 + INT_ARG_CNT + i) * 8);
+                               j++;
+                       }
+               }
        }
 #endif /* !defined(NDEBUG) */
 
@@ -4179,13 +4108,18 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        /* save integer and float argument registers */
 
-       for (i = 0, j = 0; i < md->paramcount && j < INT_ARG_CNT; i++)
-               if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                       M_LST(rd->argintregs[j++], REG_SP, i * 8);
+       for (i = 0, j = 0; i < md->paramcount; i++) {
+               if (!md->params[i].inmemory) {
+                       s1 = md->params[i].regoff;
+
+                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
+                               M_LST(rd->argintregs[s1], REG_SP, j * 8);
+                       else
+                               M_DST(rd->argfltregs[s1], REG_SP, j * 8);
 
-       for (i = 0, j = 0; i < md->paramcount && j < FLT_ARG_CNT; i++)
-               if (IS_FLT_DBL_TYPE(md->paramtypes[i].type))
-                       M_DST(rd->argfltregs[j++], REG_SP, (INT_ARG_CNT + i) * 8);
+                       j++;
+               }
+       }
 
        M_AST(REG_ITMP3, REG_SP, (INT_ARG_CNT + FLT_ARG_CNT) * 8);
 
@@ -4200,13 +4134,18 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 
        /* restore integer and float argument registers */
 
-       for (i = 0, j = 0; i < md->paramcount && j < INT_ARG_CNT; i++)
-               if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                       M_LLD(rd->argintregs[j++], REG_SP, i * 8);
+       for (i = 0, j = 0; i < md->paramcount; i++) {
+               if (!md->params[i].inmemory) {
+                       s1 = md->params[i].regoff;
 
-       for (i = 0, j = 0; i < md->paramcount && j < FLT_ARG_CNT; i++)
-               if (IS_FLT_DBL_TYPE(md->paramtypes[i].type))
-                       M_DLD(rd->argfltregs[j++], REG_SP, (INT_ARG_CNT + i) * 8);
+                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
+                               M_LLD(rd->argintregs[s1], REG_SP, j * 8);
+                       else
+                               M_DLD(rd->argfltregs[s1], REG_SP, j * 8);
+
+                       j++;
+               }
+       }
 
        M_ALD(REG_ITMP3, REG_SP, (INT_ARG_CNT + FLT_ARG_CNT) * 8);
 
@@ -4243,8 +4182,14 @@ u1 *createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
                        if (md->params[i].inmemory) {
                                s1 = md->params[i].regoff + stackframesize + 1;   /* + 1 (RA) */
                                s2 = nmd->params[j].regoff;
-                               M_DLD(REG_FTMP1, REG_SP, s1 * 8);
-                               M_DST(REG_FTMP1, REG_SP, s2 * 8);
+
+                               if (IS_2_WORD_TYPE(t)) {
+                                       M_DLD(REG_FTMP1, REG_SP, s1 * 8);
+                                       M_DST(REG_FTMP1, REG_SP, s2 * 8);
+                               } else {
+                                       M_FLD(REG_FTMP1, REG_SP, s1 * 8);
+                                       M_FST(REG_FTMP1, REG_SP, s2 * 8);
+                               }
                        }
                }
        }
index 1be675c64c74d448e9f60a1a34290e087eeea67b..9657b1b6795c973310b87e74f8bdc7c25ba8d249 100644 (file)
@@ -29,7 +29,7 @@
 
    Changes:
 
-   $Id: codegen.h 4941 2006-05-23 08:25:14Z twisti $
+   $Id: codegen.h 4943 2006-05-23 08:51:33Z twisti $
 
 */
 
 
 #define gen_bound_check \
     if (checkbounds) { \
-        M_ICMP_MEMBASE(s1, OFFSET(java_arrayheader, size), s2); \
+        M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));\
+        M_ICMP(REG_ITMP3, s2); \
         M_BAE(0); \
         codegen_add_arrayindexoutofboundsexception_ref(cd, s2); \
     }
 
 
-#define gen_div_check(v) \
-    if (checknull) { \
-        if ((v)->flags & INMEMORY) { \
-            M_CMP_IMM_MEMBASE(0, REG_SP, src->regoff * 8); \
-        } else { \
-            M_TEST(src->regoff); \
-        } \
-        M_BEQ(0); \
-        codegen_add_arithmeticexception_ref(cd); \
-    }
-
-
 /* MCODECHECK(icnt) */
 
 #define MCODECHECK(icnt) \
 #define M_LST32_IMM32(a,b,disp) emit_mov_imm_membase32(cd, (a), (b), (disp))
 
 #define M_IADD(a,b)             emit_alul_reg_reg(cd, ALU_ADD, (a), (b))
-#define M_IADD_IMM(a,b)         emit_alul_reg_reg(cd, ALU_ADD, (a), (b))
+#define M_ISUB(a,b)             emit_alul_reg_reg(cd, ALU_SUB, (a), (b))
+#define M_IMUL(a,b)             emit_imull_reg_reg(cd, (a), (b))
+
+#define M_IADD_IMM(a,b)         emit_alul_imm_reg(cd, ALU_ADD, (a), (b))
+#define M_ISUB_IMM(a,b)         emit_alul_imm_reg(cd, ALU_SUB, (a), (b))
+#define M_IMUL_IMM(a,b,c)       emit_imull_imm_reg_reg(cd, (b), (a), (c))
 
 #define M_LADD(a,b)             emit_alu_reg_reg(cd, ALU_ADD, (a), (b))
-#define M_LADD_IMM(a,b)         emit_alu_imm_reg(cd, ALU_ADD, (a), (b))
 #define M_LSUB(a,b)             emit_alu_reg_reg(cd, ALU_SUB, (a), (b))
-#define M_LSUB_IMM(a,b)         emit_alu_imm_reg(cd, ALU_SUB, (a), (b))
+#define M_LMUL(a,b)             emit_imul_reg_reg(cd, (a), (b))
 
-#define M_IINC_MEMBASE(a,b)     emit_incl_membase(cd, (a), (b))
+#define M_LADD_IMM(a,b)         emit_alu_imm_reg(cd, ALU_ADD, (a), (b))
+#define M_LSUB_IMM(a,b)         emit_alu_imm_reg(cd, ALU_SUB, (a), (b))
+#define M_LMUL_IMM(a,b,c)       emit_imul_imm_reg_reg(cd, (b), (a), (c))
 
-#define M_IADD_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_ADD, (a), (b), (c))
-#define M_IADC_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_ADC, (a), (b), (c))
-#define M_ISUB_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_SUB, (a), (b), (c))
-#define M_ISBB_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_SBB, (a), (b), (c))
+#define M_IINC(a)               emit_incl_reg(cd, (a))
+#define M_IDEC(a)               emit_decl_reg(cd, (a))
 
 #define M_ALD(a,b,disp)         M_LLD(a,b,disp)
 #define M_ALD32(a,b,disp)       M_LLD32(a,b,disp)
 #define M_INEG(a)               emit_negl_reg(cd, (a))
 #define M_LNEG(a)               emit_neg_reg(cd, (a))
 
-#define M_INEG_MEMBASE(a,b)     emit_negl_membase(cd, (a), (b))
-#define M_LNEG_MEMBASE(a,b)     emit_neg_membase(cd, (a), (b))
-
-#define M_AND(a,b)              emit_alu_reg_reg(cd, ALU_AND, (a), (b))
-#define M_XOR(a,b)              emit_alu_reg_reg(cd, ALU_XOR, (a), (b))
-
 #define M_IAND(a,b)             emit_alul_reg_reg(cd, ALU_AND, (a), (b))
-#define M_IAND_IMM(a,b)         emit_alul_imm_reg(cd, ALU_AND, (a), (b))
+#define M_IOR(a,b)              emit_alul_reg_reg(cd, ALU_OR, (a), (b))
 #define M_IXOR(a,b)             emit_alul_reg_reg(cd, ALU_XOR, (a), (b))
 
+#define M_IAND_IMM(a,b)         emit_alul_imm_reg(cd, ALU_AND, (a), (b))
+#define M_IOR_IMM(a,b)          emit_alul_imm_reg(cd, ALU_OR, (a), (b))
+#define M_IXOR_IMM(a,b)         emit_alul_imm_reg(cd, ALU_XOR, (a), (b))
+
+#define M_LAND(a,b)             emit_alu_reg_reg(cd, ALU_AND, (a), (b))
+#define M_LOR(a,b)              emit_alu_reg_reg(cd, ALU_OR, (a), (b))
+#define M_LXOR(a,b)             emit_alu_reg_reg(cd, ALU_XOR, (a), (b))
+
+#define M_LAND_IMM(a,b)         emit_alu_imm_reg(cd, ALU_AND, (a), (b))
+#define M_LOR_IMM(a,b)          emit_alu_imm_reg(cd, ALU_OR, (a), (b))
+#define M_LXOR_IMM(a,b)         emit_alu_imm_reg(cd, ALU_XOR, (a), (b))
+
 #define M_BSEXT(a,b)            emit_movsbq_reg_reg(cd, (a), (b))
 #define M_SSEXT(a,b)            emit_movswq_reg_reg(cd, (a), (b))
 #define M_ISEXT(a,b)            emit_movslq_reg_reg(cd, (a), (b))
 
 #define M_CZEXT(a,b)            emit_movzwq_reg_reg(cd, (a), (b))
 
-#define M_BSEXT_MEMBASE(a,disp,b) emit_movsbq_membase_reg(cd, (a), (disp), (b))
-#define M_SSEXT_MEMBASE(a,disp,b) emit_movswq_membase_reg(cd, (a), (disp), (b))
-#define M_ISEXT_MEMBASE(a,disp,b) emit_movslq_membase_reg(cd, (a), (disp), (b))
+#define M_ISLL_IMM(a,b)         emit_shiftl_imm_reg(cd, SHIFT_SHL, (a), (b))
+#define M_ISRA_IMM(a,b)         emit_shiftl_imm_reg(cd, SHIFT_SAR, (a), (b))
+#define M_ISRL_IMM(a,b)         emit_shiftl_imm_reg(cd, SHIFT_SHR, (a), (b))
 
-#define M_CZEXT_MEMBASE(a,disp,b) emit_movzwq_membase_reg(cd, (a), (disp), (b))
+#define M_LSLL_IMM(a,b)         emit_shift_imm_reg(cd, SHIFT_SHL, (a), (b))
+#define M_LSRA_IMM(a,b)         emit_shift_imm_reg(cd, SHIFT_SAR, (a), (b))
+#define M_LSRL_IMM(a,b)         emit_shift_imm_reg(cd, SHIFT_SHR, (a), (b))
 
 #define M_TEST(a)               emit_test_reg_reg(cd, (a), (a))
 #define M_ITEST(a)              emit_testl_reg_reg(cd, (a), (a))
 
-#define M_CMP(a,b)              emit_alu_reg_reg(cd, ALU_CMP, (a), (b))
-#define M_CMP_IMM(a,b)          emit_alu_imm_reg(cd, ALU_CMP, (a), (b))
-#define M_CMP_IMM_MEMBASE(a,b,c) emit_alu_imm_membase(cd, ALU_CMP, (a), (b), (c))
-#define M_CMP_MEMBASE(a,b,c)    emit_alu_membase_reg(cd, ALU_CMP, (a), (b), (c))
+#define M_LCMP(a,b)             emit_alu_reg_reg(cd, ALU_CMP, (a), (b))
+#define M_LCMP_IMM(a,b)         emit_alu_imm_reg(cd, ALU_CMP, (a), (b))
+#define M_LCMP_IMM_MEMBASE(a,b,c) emit_alu_imm_membase(cd, ALU_CMP, (a), (b), (c))
+#define M_LCMP_MEMBASE(a,b,c)   emit_alu_membase_reg(cd, ALU_CMP, (a), (b), (c))
 
 #define M_ICMP(a,b)             emit_alul_reg_reg(cd, ALU_CMP, (a), (b))
 #define M_ICMP_IMM(a,b)         emit_alul_imm_reg(cd, ALU_CMP, (a), (b))
 #define M_BNE(disp)             emit_jcc(cd, CC_NE, (disp))
 #define M_BLT(disp)             emit_jcc(cd, CC_L, (disp))
 #define M_BLE(disp)             emit_jcc(cd, CC_LE, (disp))
+#define M_BGE(disp)             emit_jcc(cd, CC_GE, (disp))
+#define M_BGT(disp)             emit_jcc(cd, CC_G, (disp))
 #define M_BAE(disp)             emit_jcc(cd, CC_AE, (disp))
 #define M_BA(disp)              emit_jcc(cd, CC_A, (disp))
 
 
 #define M_NOP                   emit_nop(cd)
 
-#define M_CLR(a)                M_XOR(a,a)
+#define M_CLR(a)                M_LXOR(a,a)
+
+
+#define M_FLD(a,b,disp)         emit_movss_membase_reg(cd, (b), (disp), (a))
+#define M_DLD(a,b,disp)         emit_movsd_membase_reg(cd, (b), (disp), (a))
+
+#define M_FLD32(a,b,disp)       emit_movss_membase32_reg(cd, (b), (disp), (a))
+#define M_DLD32(a,b,disp)       emit_movsd_membase32_reg(cd, (b), (disp), (a))
+
+#define M_FST(a,b,disp)         emit_movss_reg_membase(cd, (a), (b), (disp))
+#define M_DST(a,b,disp)         emit_movsd_reg_membase(cd, (a), (b), (disp))
 
+#define M_FST32(a,b,disp)       emit_movss_reg_membase32(cd, (a), (b), (disp))
+#define M_DST32(a,b,disp)       emit_movsd_reg_membase32(cd, (a), (b), (disp))
 
-#if 0
-#define M_FLD(a,b,c)            emit_movlps_membase_reg(cd, (a), (b), (c))
-#define M_DLD(a,b,c)            emit_movlpd_membase_reg(cd, (a), (b), (c))
+#define M_FADD(a,b)             emit_addss_reg_reg(cd, (a), (b))
+#define M_DADD(a,b)             emit_addsd_reg_reg(cd, (a), (b))
+#define M_FSUB(a,b)             emit_subss_reg_reg(cd, (a), (b))
+#define M_DSUB(a,b)             emit_subsd_reg_reg(cd, (a), (b))
+#define M_FMUL(a,b)             emit_mulss_reg_reg(cd, (a), (b))
+#define M_DMUL(a,b)             emit_mulsd_reg_reg(cd, (a), (b))
+#define M_FDIV(a,b)             emit_divss_reg_reg(cd, (a), (b))
+#define M_DDIV(a,b)             emit_divsd_reg_reg(cd, (a), (b))
 
-#define M_FST(a,b,c)            emit_movlps_reg_membase(cd, (a), (b), (c))
-#define M_DST(a,b,c)            emit_movlpd_reg_membase(cd, (a), (b), (c))
-#endif
+#define M_CVTIF(a,b)            emit_cvtsi2ss_reg_reg(cd, (a), (b))
+#define M_CVTID(a,b)            emit_cvtsi2sd_reg_reg(cd, (a), (b))
+#define M_CVTLF(a,b)            emit_cvtsi2ssq_reg_reg(cd, (a), (b))
+#define M_CVTLD(a,b)            emit_cvtsi2sdq_reg_reg(cd, (a), (b))
+#define M_CVTFI(a,b)            emit_cvttss2si_reg_reg(cd, (a), (b))
+#define M_CVTDI(a,b)            emit_cvttsd2si_reg_reg(cd, (a), (b))
+#define M_CVTFL(a,b)            emit_cvttss2siq_reg_reg(cd, (a), (b))
+#define M_CVTDL(a,b)            emit_cvttsd2siq_reg_reg(cd, (a), (b))
 
-#define M_DLD(a,b,disp)         emit_movq_membase_reg(cd, (b), (disp), (a))
-#define M_DST(a,b,disp)         emit_movq_reg_membase(cd, (a), (b), (disp))
+#define M_CVTFD(a,b)            emit_cvtss2sd_reg_reg(cd, (a), (b))
+#define M_CVTDF(a,b)            emit_cvtsd2ss_reg_reg(cd, (a), (b))
 
 
 /* system instructions ********************************************************/
 
 #define M_RDTSC                 emit_rdtsc(cd)
 
+#define M_IINC_MEMBASE(a,b)     emit_incl_membase(cd, (a), (b))
+
+#define M_IADD_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_ADD, (a), (b), (c))
+#define M_IADC_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_ADC, (a), (b), (c))
+#define M_ISUB_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_SUB, (a), (b), (c))
+#define M_ISBB_MEMBASE(a,b,c)   emit_alul_reg_membase(cd, ALU_SBB, (a), (b), (c))
+
+
 #define PROFILE_CYCLE_START \
     do { \
         if (opt_prof) { \
index 17b2cd5a42f9a4f2ac2ee60af4ff2ad4c8d6cdf6..b56c0e33c4ff89e2a6c13b0f110e67886e63351b 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: emit.c 4941 2006-05-23 08:25:14Z twisti $
+   $Id: emit.c 4943 2006-05-23 08:51:33Z twisti $
 
 */
 
@@ -68,7 +68,10 @@ s4 emit_load_s1(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
                disp = src->regoff * 8;
 
                if (IS_FLT_DBL_TYPE(src->type)) {
-                       M_DLD(tempreg, REG_SP, disp);
+                       if (IS_2_WORD_TYPE(src->type))
+                               M_DLD(tempreg, REG_SP, disp);
+                       else
+                               M_FLD(tempreg, REG_SP, disp);
 
                } else {
                        if (IS_INT_TYPE(src->type))
@@ -107,7 +110,10 @@ s4 emit_load_s2(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
                disp = src->regoff * 8;
 
                if (IS_FLT_DBL_TYPE(src->type)) {
-                       M_DLD(tempreg, REG_SP, disp);
+                       if (IS_2_WORD_TYPE(src->type))
+                               M_DLD(tempreg, REG_SP, disp);
+                       else
+                               M_FLD(tempreg, REG_SP, disp);
 
                } else {
                        if (IS_INT_TYPE(src->type))
@@ -146,7 +152,10 @@ s4 emit_load_s3(jitdata *jd, instruction *iptr, stackptr src, s4 tempreg)
                disp = src->regoff * 8;
 
                if (IS_FLT_DBL_TYPE(src->type)) {
-                       M_DLD(tempreg, REG_SP, disp);
+                       if (IS_2_WORD_TYPE(src->type))
+                               M_DLD(tempreg, REG_SP, disp);
+                       else
+                               M_FLD(tempreg, REG_SP, disp);
 
                } else {
                        if (IS_INT_TYPE(src->type))
@@ -211,9 +220,13 @@ void emit_store(jitdata *jd, instruction *iptr, stackptr dst, s4 d)
 
                disp = dst->regoff * 8;
 
-               if (IS_FLT_DBL_TYPE(dst->type))
-                       M_DST(d, REG_SP, disp);
-               else
+               if (IS_FLT_DBL_TYPE(dst->type)) {
+                       if (IS_2_WORD_TYPE(dst->type))
+                               M_DST(d, REG_SP, disp);
+                       else
+                               M_FST(d, REG_SP, disp);
+
+               } else
                        M_LST(d, REG_SP, disp);
        }
 }
@@ -280,290 +293,44 @@ void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d)
 
 /* code generation functions **************************************************/
 
-void emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
+static void emit_membase(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
 {
-       s4 s1 = src->prev->regoff;
-       s4 s2 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if (iptr->dst->flags & INMEMORY) {
-               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       if (s2 == d) {
-                               emit_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-
-                       } else if (s1 == d) {
-                               emit_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_alul_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-
-                       } else {
-                               emit_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       if (s2 == d) {
-                               emit_alul_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
-
-                       } else {
-                               emit_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_alul_reg_reg(cd, alu_op, s1, REG_ITMP1);
-                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
+       if ((basereg == REG_SP) || (basereg == R12)) {
+               if (disp == 0) {
+                       emit_address_byte(0, dreg, REG_SP);
+                       emit_address_byte(0, REG_SP, REG_SP);
 
-               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       if (s1 == d) {
-                               emit_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
-                                               
-                       } else {
-                               emit_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alul_reg_reg(cd, alu_op, s2, REG_ITMP1);
-                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
+               } else if (IS_IMM8(disp)) {
+                       emit_address_byte(1, dreg, REG_SP);
+                       emit_address_byte(0, REG_SP, REG_SP);
+                       emit_imm8(disp);
 
                } else {
-                       emit_movl_reg_membase(cd, s1, REG_SP, d * 8);
-                       emit_alul_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
+                       emit_address_byte(2, dreg, REG_SP);
+                       emit_address_byte(0, REG_SP, REG_SP);
+                       emit_imm32(disp);
                }
 
-       } else {
-               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       emit_movl_membase_reg(cd, REG_SP, s1 * 8, d);
-                       emit_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
-
-               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       M_INTMOVE(s1, d);
-                       emit_alul_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
-
-               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       M_INTMOVE(s2, d);
-                       emit_alul_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
-
-               } else {
-                       if (s2 == d) {
-                               emit_alul_reg_reg(cd, alu_op, s1, d);
-
-                       } else {
-                               M_INTMOVE(s1, d);
-                               emit_alul_reg_reg(cd, alu_op, s2, d);
-                       }
-               }
-       }
-}
-
+       } else if ((disp) == 0 && (basereg) != RBP && (basereg) != R13) {
+               emit_address_byte(0,(dreg),(basereg));
 
-void emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->prev->regoff;
-       s4 s2 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if (iptr->dst->flags & INMEMORY) {
-               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       if (s2 == d) {
-                               emit_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-
-                       } else if (s1 == d) {
-                               emit_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-
-                       } else {
-                               emit_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       if (s2 == d) {
-                               emit_alu_reg_membase(cd, alu_op, s1, REG_SP, d * 8);
-
-                       } else {
-                               emit_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-                               emit_alu_reg_reg(cd, alu_op, s1, REG_ITMP1);
-                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       if (s1 == d) {
-                               emit_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
-                                               
-                       } else {
-                               emit_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alu_reg_reg(cd, alu_op, s2, REG_ITMP1);
-                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else {
-                       emit_mov_reg_membase(cd, s1, REG_SP, d * 8);
-                       emit_alu_reg_membase(cd, alu_op, s2, REG_SP, d * 8);
-               }
+       } else if ((basereg) == RIP) {
+               emit_address_byte(0, dreg, RBP);
+               emit_imm32(disp);
 
        } else {
-               if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       emit_mov_membase_reg(cd, REG_SP, s1 * 8, d);
-                       emit_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
-
-               } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-                       M_INTMOVE(s1, d);
-                       emit_alu_membase_reg(cd, alu_op, REG_SP, s2 * 8, d);
-
-               } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-                       M_INTMOVE(s2, d);
-                       emit_alu_membase_reg(cd, alu_op, REG_SP, s1 * 8, d);
+               if (IS_IMM8(disp)) {
+                       emit_address_byte(1, dreg, basereg);
+                       emit_imm8(disp);
 
                } else {
-                       if (s2 == d) {
-                               emit_alu_reg_reg(cd, alu_op, s1, d);
-
-                       } else {
-                               M_INTMOVE(s1, d);
-                               emit_alu_reg_reg(cd, alu_op, s2, d);
-                       }
+                       emit_address_byte(2, dreg, basereg);
+                       emit_imm32(disp);
                }
        }
 }
 
 
-void emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if (iptr->dst->flags & INMEMORY) {
-               if (src->flags & INMEMORY) {
-                       if (s1 == d) {
-                               emit_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
-
-                       } else {
-                               emit_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                               emit_alul_imm_reg(cd, alu_op, iptr->val.i, REG_ITMP1);
-                               emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else {
-                       emit_movl_reg_membase(cd, s1, REG_SP, d * 8);
-                       emit_alul_imm_membase(cd, alu_op, iptr->val.i, REG_SP, d * 8);
-               }
-
-       } else {
-               if (src->flags & INMEMORY) {
-                       emit_movl_membase_reg(cd, REG_SP, s1 * 8, d);
-                       emit_alul_imm_reg(cd, alu_op, iptr->val.i, d);
-
-               } else {
-#if 0
-                       M_INTMOVE(s1, d);
-                       emit_alul_imm_reg(cd, alu_op, iptr->val.i, d);
-#else
-                       /* lea addition optimization */
-
-                       if ((alu_op == ALU_ADD) && (s1 != d)) {
-                               M_ILEA(s1, iptr->val.i, d);
-
-                       } else {
-                               M_INTMOVE(s1, d);
-                               emit_alul_imm_reg(cd, alu_op, iptr->val.i, d);
-                       }
-#endif
-               }
-       }
-}
-
-
-void emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if (iptr->dst->flags & INMEMORY) {
-               if (src->flags & INMEMORY) {
-                       if (s1 == d) {
-                               if (IS_IMM32(iptr->val.l)) {
-                                       emit_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
-
-                               } else {
-                                       emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                                       emit_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-                               }
-
-                       } else {
-                               emit_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-
-                               if (IS_IMM32(iptr->val.l)) {
-                                       emit_alu_imm_reg(cd, alu_op, iptr->val.l, REG_ITMP1);
-
-                               } else {
-                                       emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP2);
-                                       emit_alu_reg_reg(cd, alu_op, REG_ITMP2, REG_ITMP1);
-                               }
-                               emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-                       }
-
-               } else {
-                       emit_mov_reg_membase(cd, s1, REG_SP, d * 8);
-
-                       if (IS_IMM32(iptr->val.l)) {
-                               emit_alu_imm_membase(cd, alu_op, iptr->val.l, REG_SP, d * 8);
-
-                       } else {
-                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                               emit_alu_reg_membase(cd, alu_op, REG_ITMP1, REG_SP, d * 8);
-                       }
-               }
-
-       } else {
-#if 0
-               if (src->flags & INMEMORY) {
-                       emit_mov_membase_reg(cd, REG_SP, s1 * 8, d);
-
-               } else {
-                       M_INTMOVE(s1, d);
-               }
-
-               if (IS_IMM32(iptr->val.l)) {
-                       emit_alu_imm_reg(cd, alu_op, iptr->val.l, d);
-
-               } else {
-                       emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                       emit_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
-               }
-#else
-               if (src->flags & INMEMORY) {
-                       emit_mov_membase_reg(cd, REG_SP, s1 * 8, d);
-
-                       if (IS_IMM32(iptr->val.l)) {
-                               emit_alu_imm_reg(cd, alu_op, iptr->val.l, d);
-
-                       } else {
-                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                               emit_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
-                       }
-
-               } else {
-                       if (IS_IMM32(iptr->val.l)) {
-                               /* lea addition optimization */
-
-                               if ((alu_op == ALU_ADD) && (s1 != d)) {
-                                       M_LLEA(s1, iptr->val.l, d);
-
-                               } else {
-                                       M_INTMOVE(s1, d);
-                                       emit_alu_imm_reg(cd, alu_op, iptr->val.l, d);
-                               }
-
-                       } else {
-                               M_INTMOVE(s1, d);
-                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                               emit_alu_reg_reg(cd, alu_op, REG_ITMP1, d);
-                       }
-               }
-#endif
-       }
-}
-
-
 void emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
 {
        s4 s1 = src->prev->regoff;
@@ -796,179 +563,6 @@ void emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
 }
 
 
-void emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
-               if (s1 == d) {
-                       emit_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
-
-               } else {
-                       emit_movl_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                       emit_shiftl_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
-                       emit_movl_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-               }
-
-       } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
-               emit_movl_membase_reg(cd, REG_SP, s1 * 8, d);
-               emit_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
-                               
-       } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
-               emit_movl_reg_membase(cd, s1, REG_SP, d * 8);
-               emit_shiftl_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
-
-       } else {
-               M_INTMOVE(s1, d);
-               emit_shiftl_imm_reg(cd, shift_op, iptr->val.i, d);
-       }
-}
-
-
-void emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->regoff;
-       s4 d = iptr->dst->regoff;
-
-       if ((src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
-               if (s1 == d) {
-                       emit_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
-
-               } else {
-                       emit_mov_membase_reg(cd, REG_SP, s1 * 8, REG_ITMP1);
-                       emit_shift_imm_reg(cd, shift_op, iptr->val.i, REG_ITMP1);
-                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, d * 8);
-               }
-
-       } else if ((src->flags & INMEMORY) && !(iptr->dst->flags & INMEMORY)) {
-               emit_mov_membase_reg(cd, REG_SP, s1 * 8, d);
-               emit_shift_imm_reg(cd, shift_op, iptr->val.i, d);
-                               
-       } else if (!(src->flags & INMEMORY) && (iptr->dst->flags & INMEMORY)) {
-               emit_mov_reg_membase(cd, s1, REG_SP, d * 8);
-               emit_shift_imm_membase(cd, shift_op, iptr->val.i, REG_SP, d * 8);
-
-       } else {
-               M_INTMOVE(s1, d);
-               emit_shift_imm_reg(cd, shift_op, iptr->val.i, d);
-       }
-}
-
-
-void emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
-{
-       if (src->flags & INMEMORY)
-               M_ICMP_IMM_MEMBASE(iptr->val.i, REG_SP, src->regoff * 8);
-       else {
-               if (iptr->val.i == 0)
-                       M_ITEST(src->regoff);
-               else
-                       M_ICMP_IMM(iptr->val.i, src->regoff);
-       }
-
-       /* If the conditional branch is part of an if-converted block,
-          don't generate the actual branch. */
-
-       if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
-               emit_jcc(cd, if_op, 0);
-               codegen_addreference(cd, (basicblock *) iptr->target);
-       }
-}
-
-
-void emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->regoff;
-
-       if (src->flags & INMEMORY) {
-               if (IS_IMM32(iptr->val.l)) {
-                       emit_alu_imm_membase(cd, ALU_CMP, iptr->val.l, REG_SP, s1 * 8);
-
-               } else {
-                       emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                       emit_alu_reg_membase(cd, ALU_CMP, REG_ITMP1, REG_SP, s1 * 8);
-               }
-
-       } else {
-               if (iptr->val.l == 0) {
-                       emit_test_reg_reg(cd, s1, s1);
-
-               } else {
-                       if (IS_IMM32(iptr->val.l)) {
-                               emit_alu_imm_reg(cd, ALU_CMP, iptr->val.l, s1);
-
-                       } else {
-                               emit_mov_imm_reg(cd, iptr->val.l, REG_ITMP1);
-                               emit_alu_reg_reg(cd, ALU_CMP, REG_ITMP1, s1);
-                       }
-               }
-       }
-       emit_jcc(cd, if_op, 0);
-       codegen_addreference(cd, (basicblock *) iptr->target);
-}
-
-
-/* emit_if_icmpcc **************************************************************
-
-   Generate ICMD_IF_ICMPxx instructions.
-
-*******************************************************************************/
-
-void emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src,
-                                                  instruction *iptr)
-{
-       s4 s1 = src->prev->regoff;
-       s4 s2 = src->regoff;
-
-       if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-               emit_movl_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-               emit_alul_reg_membase(cd, ALU_CMP, REG_ITMP1, REG_SP, s1 * 8);
-
-       } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-               emit_alul_membase_reg(cd, ALU_CMP, REG_SP, s2 * 8, s1);
-
-       } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-               emit_alul_reg_membase(cd, ALU_CMP, s2, REG_SP, s1 * 8);
-
-       } else {
-               emit_alul_reg_reg(cd, ALU_CMP, s2, s1);
-       }
-
-       
-       /* If the conditional branch is part of an if-converted block,
-          don't generate the actual branch. */
-
-       if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
-               emit_jcc(cd, if_op, 0);
-               codegen_addreference(cd, (basicblock *) iptr->target);
-       }
-}
-
-
-void emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr)
-{
-       s4 s1 = src->prev->regoff;
-       s4 s2 = src->regoff;
-
-       if ((src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-               emit_mov_membase_reg(cd, REG_SP, s2 * 8, REG_ITMP1);
-               emit_alu_reg_membase(cd, ALU_CMP, REG_ITMP1, REG_SP, s1 * 8);
-
-       } else if ((src->flags & INMEMORY) && !(src->prev->flags & INMEMORY)) {
-               emit_alu_membase_reg(cd, ALU_CMP, REG_SP, s2 * 8, s1);
-
-       } else if (!(src->flags & INMEMORY) && (src->prev->flags & INMEMORY)) {
-               emit_alu_reg_membase(cd, ALU_CMP, s2, REG_SP, s1 * 8);
-
-       } else {
-               emit_alu_reg_reg(cd, ALU_CMP, s2, s1);
-       }
-       emit_jcc(cd, if_op, 0);
-       codegen_addreference(cd, (basicblock *) iptr->target);
-}
-
-
 /* low-level code emitter functions *******************************************/
 
 void emit_mov_reg_reg(codegendata *cd, s8 reg, s8 dreg)
@@ -1005,7 +599,7 @@ void emit_movl_imm_reg(codegendata *cd, s8 imm, s8 reg) {
 void emit_mov_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
        emit_rex(1,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8b;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -1024,7 +618,7 @@ void emit_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
 {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8b;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -1041,7 +635,7 @@ void emit_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
 void emit_mov_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(1,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x89;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -1055,7 +649,7 @@ void emit_mov_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
 void emit_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x89;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -1114,7 +708,7 @@ void emit_movb_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 ind
 void emit_mov_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
        emit_rex(1,0,0,(basereg));
        *(cd->mcodeptr++) = 0xc7;
-       emit_membase((basereg),(disp),0);
+       emit_membase(cd, (basereg),(disp),0);
        emit_imm32((imm));
 }
 
@@ -1130,7 +724,7 @@ void emit_mov_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
 void emit_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
        emit_rex(0,0,0,(basereg));
        *(cd->mcodeptr++) = 0xc7;
-       emit_membase((basereg),(disp),0);
+       emit_membase(cd, (basereg),(disp),0);
        emit_imm32((imm));
 }
 
@@ -1145,7 +739,8 @@ void emit_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp) {
 }
 
 
-void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
+void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
        emit_rex(1,(dreg),0,(reg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xbe;
@@ -1154,15 +749,8 @@ void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
 }
 
 
-void emit_movsbq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
-       emit_rex(1,(dreg),0,(basereg));
-       *(cd->mcodeptr++) = 0x0f;
-       *(cd->mcodeptr++) = 0xbe;
-       emit_membase((basereg),(disp),(dreg));
-}
-
-
-void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
+void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
        emit_rex(1,(dreg),0,(reg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xbf;
@@ -1171,15 +759,8 @@ void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
 }
 
 
-void emit_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
-       emit_rex(1,(dreg),0,(basereg));
-       *(cd->mcodeptr++) = 0x0f;
-       *(cd->mcodeptr++) = 0xbf;
-       emit_membase((basereg),(disp),(dreg));
-}
-
-
-void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
+void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
        emit_rex(1,(dreg),0,(reg));
        *(cd->mcodeptr++) = 0x63;
        /* XXX: why do reg and dreg have to be exchanged */
@@ -1187,14 +768,8 @@ void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
 }
 
 
-void emit_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
-       emit_rex(1,(dreg),0,(basereg));
-       *(cd->mcodeptr++) = 0x63;
-       emit_membase((basereg),(disp),(dreg));
-}
-
-
-void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
+void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
        emit_rex(1,(dreg),0,(reg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xb7;
@@ -1203,14 +778,6 @@ void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg) {
 }
 
 
-void emit_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
-       emit_rex(1,(dreg),0,(basereg));
-       *(cd->mcodeptr++) = 0x0f;
-       *(cd->mcodeptr++) = 0xb7;
-       emit_membase((basereg),(disp),(dreg));
-}
-
-
 void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg) {
        emit_rex(1,(reg),(indexreg),(basereg));
        *(cd->mcodeptr++) = 0x0f;
@@ -1291,31 +858,35 @@ void emit_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
 }
 
 
-void emit_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
+void emit_alu_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
+{
        emit_rex(1,(reg),0,(basereg));
        *(cd->mcodeptr++) = (((opc)) << 3) + 1;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
-void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp) {
+void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
+{
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = (((opc)) << 3) + 1;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
-void emit_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
+void emit_alu_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
+{
        emit_rex(1,(reg),0,(basereg));
        *(cd->mcodeptr++) = (((opc)) << 3) + 3;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
-void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg) {
+void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
+{
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = (((opc)) << 3) + 3;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -1361,12 +932,12 @@ void emit_alu_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
        if (IS_IMM8(imm)) {
                emit_rex(1,(basereg),0,0);
                *(cd->mcodeptr++) = 0x83;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm8((imm));
        } else {
                emit_rex(1,(basereg),0,0);
                *(cd->mcodeptr++) = 0x81;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm32((imm));
        }
 }
@@ -1376,12 +947,12 @@ void emit_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
        if (IS_IMM8(imm)) {
                emit_rex(0,(basereg),0,0);
                *(cd->mcodeptr++) = 0x83;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm8((imm));
        } else {
                emit_rex(0,(basereg),0,0);
                *(cd->mcodeptr++) = 0x81;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm32((imm));
        }
 }
@@ -1426,80 +997,26 @@ void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg) {
 void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
        emit_rex(1,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8d;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
 void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x8d;
-       emit_membase((basereg),(disp),(reg));
-}
-
-
-
-/*
- * inc, dec operations
- */
-void emit_inc_reg(codegendata *cd, s8 reg) {
-       emit_rex(1,0,0,(reg));
-       *(cd->mcodeptr++) = 0xff;
-       emit_reg(0,(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
-void emit_incl_reg(codegendata *cd, s8 reg) {
-       emit_rex(0,0,0,(reg));
-       *(cd->mcodeptr++) = 0xff;
-       emit_reg(0,(reg));
-}
-
-
-void emit_inc_membase(codegendata *cd, s8 basereg, s8 disp)
-{
-       emit_rex(1,0,0,(basereg));
-       *(cd->mcodeptr++) = 0xff;
-       emit_membase((basereg),(disp),0);
-}
-
 
 void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp)
 {
        emit_rex(0,0,0,(basereg));
        *(cd->mcodeptr++) = 0xff;
-       emit_membase((basereg),(disp),0);
+       emit_membase(cd, (basereg),(disp),0);
 }
 
 
-void emit_dec_reg(codegendata *cd, s8 reg) {
-       emit_rex(1,0,0,(reg));
-       *(cd->mcodeptr++) = 0xff;
-       emit_reg(1,(reg));
-}
-
-        
-void emit_decl_reg(codegendata *cd, s8 reg) {
-       emit_rex(0,0,0,(reg));
-       *(cd->mcodeptr++) = 0xff;
-       emit_reg(1,(reg));
-}
-
-        
-void emit_dec_membase(codegendata *cd, s8 basereg, s8 disp) {
-       emit_rex(1,(basereg),0,0);
-       *(cd->mcodeptr++) = 0xff;
-       emit_membase((basereg),(disp),1);
-}
-
-
-void emit_decl_membase(codegendata *cd, s8 basereg, s8 disp) {
-       emit_rex(0,(basereg),0,0);
-       *(cd->mcodeptr++) = 0xff;
-       emit_membase((basereg),(disp),1);
-}
-
-
-
 
 void emit_cltd(codegendata *cd) {
     *(cd->mcodeptr++) = 0x99;
@@ -1533,7 +1050,7 @@ void emit_imul_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(1,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xaf;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -1541,7 +1058,7 @@ void emit_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xaf;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -1594,12 +1111,12 @@ void emit_imul_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8
        if (IS_IMM8((imm))) {
                emit_rex(1,(dreg),0,(basereg));
                *(cd->mcodeptr++) = 0x6b;
-               emit_membase((basereg),(disp),(dreg));
+               emit_membase(cd, (basereg),(disp),(dreg));
                emit_imm8((imm));
        } else {
                emit_rex(1,(dreg),0,(basereg));
                *(cd->mcodeptr++) = 0x69;
-               emit_membase((basereg),(disp),(dreg));
+               emit_membase(cd, (basereg),(disp),(dreg));
                emit_imm32((imm));
        }
 }
@@ -1609,12 +1126,12 @@ void emit_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8
        if (IS_IMM8((imm))) {
                emit_rex(0,(dreg),0,(basereg));
                *(cd->mcodeptr++) = 0x6b;
-               emit_membase((basereg),(disp),(dreg));
+               emit_membase(cd, (basereg),(disp),(dreg));
                emit_imm8((imm));
        } else {
                emit_rex(0,(dreg),0,(basereg));
                *(cd->mcodeptr++) = 0x69;
-               emit_membase((basereg),(disp),(dreg));
+               emit_membase(cd, (basereg),(disp),(dreg));
                emit_imm32((imm));
        }
 }
@@ -1661,14 +1178,14 @@ void emit_shiftl_reg(codegendata *cd, s8 opc, s8 reg) {
 void emit_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
        emit_rex(1,0,0,(basereg));
        *(cd->mcodeptr++) = 0xd3;
-       emit_membase((basereg),(disp),(opc));
+       emit_membase(cd, (basereg),(disp),(opc));
 }
 
 
 void emit_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
        emit_rex(0,0,0,(basereg));
        *(cd->mcodeptr++) = 0xd3;
-       emit_membase((basereg),(disp),(opc));
+       emit_membase(cd, (basereg),(disp),(opc));
 }
 
 
@@ -1704,11 +1221,11 @@ void emit_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp
        if ((imm) == 1) {
                emit_rex(1,0,0,(basereg));
                *(cd->mcodeptr++) = 0xd1;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
        } else {
                emit_rex(1,0,0,(basereg));
                *(cd->mcodeptr++) = 0xc1;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm8((imm));
        }
 }
@@ -1718,11 +1235,11 @@ void emit_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 dis
        if ((imm) == 1) {
                emit_rex(0,0,0,(basereg));
                *(cd->mcodeptr++) = 0xd1;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
        } else {
                emit_rex(0,0,0,(basereg));
                *(cd->mcodeptr++) = 0xc1;
-               emit_membase((basereg),(disp),(opc));
+               emit_membase(cd, (basereg),(disp),(opc));
                emit_imm8((imm));
        }
 }
@@ -1771,7 +1288,7 @@ void emit_setcc_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp) {
        *(cd->mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = (0x90 + (opc));
-       emit_membase((basereg),(disp),0);
+       emit_membase(cd, (basereg),(disp),0);
 }
 
 
@@ -1794,34 +1311,22 @@ void emit_cmovccl_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
 
 
 
-void emit_neg_reg(codegendata *cd, s8 reg) {
+void emit_neg_reg(codegendata *cd, s8 reg)
+{
        emit_rex(1,0,0,(reg));
        *(cd->mcodeptr++) = 0xf7;
        emit_reg(3,(reg));
 }
 
 
-void emit_negl_reg(codegendata *cd, s8 reg) {
+void emit_negl_reg(codegendata *cd, s8 reg)
+{
        emit_rex(0,0,0,(reg));
        *(cd->mcodeptr++) = 0xf7;
        emit_reg(3,(reg));
 }
 
 
-void emit_neg_membase(codegendata *cd, s8 basereg, s8 disp) {
-       emit_rex(1,0,0,(basereg));
-       *(cd->mcodeptr++) = 0xf7;
-       emit_membase((basereg),(disp),3);
-}
-
-
-void emit_negl_membase(codegendata *cd, s8 basereg, s8 disp) {
-       emit_rex(0,0,0,(basereg));
-       *(cd->mcodeptr++) = 0xf7;
-       emit_membase((basereg),(disp),3);
-}
-
-
 void emit_push_reg(codegendata *cd, s8 reg) {
        emit_rex(0,0,0,(reg));
        *(cd->mcodeptr++) = 0x50 + (0x07 & (reg));
@@ -2029,7 +1534,7 @@ void emit_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x7e;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2047,7 +1552,7 @@ void emit_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(1,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x6e;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2056,7 +1561,7 @@ void emit_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x6e;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2083,7 +1588,7 @@ void emit_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0xd6;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2092,7 +1597,7 @@ void emit_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x7e;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2119,7 +1624,7 @@ void emit_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x11;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2139,7 +1644,7 @@ void emit_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp) {
        emit_rex(0,(reg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x11;
-       emit_membase((basereg),(disp),(reg));
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2159,7 +1664,7 @@ void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x10;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2174,11 +1679,21 @@ void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
 }
 
 
-void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
+void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
+{
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x12;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
+}
+
+
+void emit_movlps_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
+{
+       emit_rex(0,(reg),0,(basereg));
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0x13;
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2187,7 +1702,7 @@ void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x10;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2202,12 +1717,23 @@ void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
 }
 
 
-void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
+void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
+{
        *(cd->mcodeptr++) = 0x66;
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x12;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
+}
+
+
+void emit_movlpd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
+{
+       *(cd->mcodeptr++) = 0x66;
+       emit_rex(0,(reg),0,(basereg));
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0x13;
+       emit_membase(cd, (basereg),(disp),(reg));
 }
 
 
@@ -2312,7 +1838,7 @@ void emit_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x57;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
@@ -2330,7 +1856,7 @@ void emit_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg) {
        emit_rex(0,(dreg),0,(basereg));
        *(cd->mcodeptr++) = 0x0f;
        *(cd->mcodeptr++) = 0x57;
-       emit_membase((basereg),(disp),(dreg));
+       emit_membase(cd, (basereg),(disp),(dreg));
 }
 
 
index 202ddb7867b66aa03eed81c210ffe2c8b11aba2e..63ee41ddee19374973ad6cb5806de9129ff5adb9 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-emit.h 4853 2006-04-27 12:33:20Z twisti $
+   $Id: md-emit.h 4943 2006-05-23 08:51:33Z twisti $
 
 */
 
@@ -143,44 +143,6 @@ typedef union {
     } while (0)
 
 
-#define emit_membase(basereg,disp,dreg) \
-    do { \
-        if ((basereg) == REG_SP || (basereg) == R12) { \
-            if ((disp) == 0) { \
-                emit_address_byte(0,(dreg),REG_SP); \
-                emit_address_byte(0,REG_SP,REG_SP); \
-            } else if (IS_IMM8((disp))) { \
-                emit_address_byte(1,(dreg),REG_SP); \
-                emit_address_byte(0,REG_SP,REG_SP); \
-                emit_imm8((disp)); \
-            } else { \
-                emit_address_byte(2,(dreg),REG_SP); \
-                emit_address_byte(0,REG_SP,REG_SP); \
-                emit_imm32((disp)); \
-            } \
-            break; \
-        } \
-        if ((disp) == 0 && (basereg) != RBP && (basereg) != R13) { \
-            emit_address_byte(0,(dreg),(basereg)); \
-            break; \
-        } \
-        \
-        if ((basereg) == RIP) { \
-            emit_address_byte(0,(dreg),RBP); \
-            emit_imm32((disp)); \
-            break; \
-        } \
-        \
-        if (IS_IMM8((disp))) { \
-            emit_address_byte(1,(dreg),(basereg)); \
-            emit_imm8((disp)); \
-        } else { \
-            emit_address_byte(2,(dreg),(basereg)); \
-            emit_imm32((disp)); \
-        } \
-    } while (0)
-
-
 #define emit_membase32(basereg,disp,dreg) \
     do { \
         if ((basereg) == REG_SP || (basereg) == R12) { \
@@ -264,18 +226,8 @@ void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d);
 
 /* code generation prototypes */
 
-void emit_ialu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
-void emit_lalu(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
-void emit_ialuconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
-void emit_laluconst(codegendata *cd, s4 alu_op, stackptr src, instruction *iptr);
 void emit_ishift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
 void emit_lshift(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
-void emit_ishiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
-void emit_lshiftconst(codegendata *cd, s4 shift_op, stackptr src, instruction *iptr);
-void emit_ifcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
-void emit_if_lcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
-void emit_if_icmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
-void emit_if_lcmpcc(codegendata *cd, s4 if_op, stackptr src, instruction *iptr);
 
 
 /* integer instructions */
@@ -334,14 +286,9 @@ void emit_testw_imm_reg(codegendata *cd, s8 imm, s8 reg);
 void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg);
 void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
 void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg);
-void emit_inc_reg(codegendata *cd, s8 reg);
-void emit_incl_reg(codegendata *cd, s8 reg);
-void emit_inc_membase(codegendata *cd, s8 basereg, s8 disp);
+
 void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp);
-void emit_dec_reg(codegendata *cd, s8 reg);
-void emit_decl_reg(codegendata *cd, s8 reg);
-void emit_dec_membase(codegendata *cd, s8 basereg, s8 disp);
-void emit_decl_membase(codegendata *cd, s8 basereg, s8 disp);
+
 void emit_cltd(codegendata *cd);
 void emit_cqto(codegendata *cd);
 void emit_imul_reg_reg(codegendata *cd, s8 reg, s8 dreg);
@@ -420,9 +367,11 @@ void emit_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp);
 void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
+void emit_movlps_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
 void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
 void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
+void emit_movlpd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp);
 void emit_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
 void emit_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale);
 void emit_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg);