x86 mterp: reduce x86/x86-atom differences

To ease future x86 development, elminate unnecessary differences
between x86 and x86-atom targets.

1.  Macros instead of defines (cosmetic change)
2.  Register naming convention (cosmetic change)
3.  Register usage convention
    - Drop rIBASE, freeing %edx for general usage
    - use %edi for rPC (callee-save) & eliminate spills
4.  Spill & temp frame layout
5.  rGLUE usage 0(%ebp) instead of -24(%ebp)
6.  Jump table transition between instruction interpretations
    instead of computed goto.
7.  Change entry convention for instruction handlers:
    Previously:
       %bl contains 8-bit Dalvik opcode
       %bh contains 2nd half of 16-bit Dalvik insn (usually AA or BA)
       upper 16 bits of %ebx are zero
    Now:
       %bl contains 2nd half of 16-bit Dalvik insn (usually AA or BA)
       upper 24 bits of %ebx are zero
8.  Include copies of x86-atom macros and defines into x86 build.  This
    allows the x86 build to mix-and-match x86 and x86-atom handlers
    via the normal config mechanism.  [Note - only for non-control-flow
    instructions.  There are still some conflicts in the footer.S
    main loop re-entry points].

Change-Id: Ib9d549b56f7ffd7420f9dbf97b2169f65603ee83
diff --git a/vm/mterp/out/InterpAsm-x86.S b/vm/mterp/out/InterpAsm-x86.S
index 2325708..3f3bef4 100644
--- a/vm/mterp/out/InterpAsm-x86.S
+++ b/vm/mterp/out/InterpAsm-x86.S
@@ -59,46 +59,45 @@
 to callee save registers).
 
   nick     reg   purpose
-  rPC      edx   interpreted program counter, used for fetching instructions
+  rPC      edi   interpreted program counter, used for fetching instructions
   rFP      esi   interpreted frame pointer, used for accessing locals and args
-  rIBASE   edi   Base pointer for instruction dispatch computed goto
-  rINST    bx    first 16-bit code of current instruction
-  rOPCODE  bl    opcode portion of instruction word
-  rINST_HI bh    high byte of instruction word, usually contains src/tgt reg names
+  rINSTw   bx    first 16-bit code of current instruction
+  rINSTbl  bl    opcode portion of instruction word
+  rINSTbh  bh    high byte of inst word, usually contains src/tgt reg names
 
 Notes:
    o High order 16 bits of ebx must be zero on entry to handler
-   o rPC, rFP, rIBASE, rINST/rOPCODE valid on handler entry and exit
-   o eax and ecx are scratch, rINST/ebx sometimes scratch
+   o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit
+   o eax, edx and ecx are scratch, rINSTw/ebx sometimes scratch
    o rPC is in the caller save set, and will be killed across external calls. Don't
      forget to SPILL/UNSPILL it around call points
 
 */
 
-#define rPC      %edx
-#define rFP      %esi
-#define rIBASE   %edi
-#define rINST_FULL %ebx
-#define rINST    %bx
-#define rINST_HI %bh
-#define rINST_LO %bl
-#define rOPCODE  %bl
+#define rGLUE    (%ebp)
+#define rPC      %esi
+#define rFP      %edi
+#define rINST    %ebx
+#define rINSTw   %bx
+#define rINSTbh  %bh
+#define rINSTbl  %bl
 
 
 /* Frame diagram while executing dvmMterpStdRun, high to low addresses */
-#define IN_ARG0        (  8)
-#define CALLER_RP      (  4)
-#define PREV_FP        (  0) /* <- dvmMterpStdRun ebp */
+#define IN_ARG0        ( 12)
+#define CALLER_RP      (  8)
+#define PREV_FP        (  4)
+#define rGLUE_SPILL    (  0) /* <- dvmMterpStdRun ebp */
 /* Spill offsets relative to %ebp */
 #define EDI_SPILL      ( -4)
 #define ESI_SPILL      ( -8)
-#define EDX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
+#define EBX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
 #define rPC_SPILL      (-16)
 #define rFP_SPILL      (-20)
-#define rGLUE_SPILL    (-24)
-#define rIBASE_SPILL   (-28)
-#define rINST_FULL_SPILL    (-32)
-#define TMP_SPILL      (-36)
+#define rINST_SPILL    (-24)
+#define TMP_SPILL1     (-28)
+#define TMP_SPILL2     (-32)
+#define TMP_SPILL3     (-36)
 #define LOCAL0_OFFSET  (-40)
 #define LOCAL1_OFFSET  (-44)
 #define LOCAL2_OFFSET  (-48)
@@ -109,20 +108,29 @@
 #define OUT_ARG2       (  8)
 #define OUT_ARG1       (  4)
 #define OUT_ARG0       (  0)  /* <- dvmMterpStdRun esp */
+#define FRAME_SIZE     80
 
 #define SPILL(reg) movl reg##,reg##_SPILL(%ebp)
 #define UNSPILL(reg) movl reg##_SPILL(%ebp),reg
-#define SPILL_TMP(reg) movl reg,TMP_SPILL(%ebp)
-#define UNSPILL_TMP(reg) movl TMP_SPILL(%ebp),reg
-
+#define SPILL_TMP1(reg) movl reg,TMP_SPILL1(%ebp)
+#define UNSPILL_TMP1(reg) movl TMP_SPILL1(%ebp),reg
+#define SPILL_TMP2(reg) movl reg,TMP_SPILL2(%ebp)
+#define UNSPILL_TMP2(reg) movl TMP_SPILL2(%ebp),reg
+#define SPILL_TMP3(reg) movl reg,TMP_SPILL3(%ebp)
+#define UNSPILL_TMP3(reg) movl TMP_SPILL3(%ebp),reg
 
 /* save/restore the PC and/or FP from the glue struct */
-#define LOAD_PC_FROM_GLUE(_glu)     movl    offGlue_pc(_glu),rPC
-#define SAVE_PC_TO_GLUE(_glu)       movl    rPC,offGlue_pc(_glu)
-#define LOAD_FP_FROM_GLUE(_glu)     movl    offGlue_fp(_glu),rFP
-#define SAVE_FP_TO_GLUE(_glu)       movl    rFP,offGlue_fp(_glu)
+.macro SAVE_PC_FP_TO_GLUE _reg
+    movl     rGLUE,\_reg
+    movl     rPC,offGlue_pc(\_reg)
+    movl     rFP,offGlue_fp(\_reg)
+.endm
 
-#define GET_GLUE(_reg)     movl   rGLUE_SPILL(%ebp),_reg
+.macro LOAD_PC_FP_FROM_GLUE
+    movl    rGLUE,rFP
+    movl    offGlue_pc(rFP),rPC
+    movl    offGlue_fp(rFP),rFP
+.endm
 
 /* The interpreter assumes a properly aligned stack on entry, and
  * will preserve 16-byte alignment.
@@ -137,76 +145,447 @@
  *
  * It's okay to do this more than once.
  */
-#define EXPORT_PC() \
+.macro EXPORT_PC
     movl     rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
+.endm
 
 /*
  * Given a frame pointer, find the stack save area.
  *
  * In C this is "((StackSaveArea*)(_fp) -1)".
  */
-#define SAVEAREA_FROM_FP(_reg, _fpreg) \
-    leal    -sizeofStackSaveArea(_fpreg),_reg
+.macro SAVEAREA_FROM_FP _reg
+    leal    -sizeofStackSaveArea(rFP), \_reg
+.endm
 
 /*
- * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
+ * Fetch the next instruction from rPC into rINSTw.  Does not advance rPC.
  */
-#define FETCH_INST()            movzwl    (rPC),rINST_FULL
+.macro FETCH_INST
+    movzwl    (rPC),rINST
+.endm
 
 /*
- * Fetch the nth instruction word from rPC into rINST.  Does not advance
+ * Fetch the opcode byte and zero-extend it into _reg.  Must be used
+ * in conjunction with GOTO_NEXT_R
+ */
+.macro FETCH_INST_R _reg
+    movzbl    (rPC),\_reg
+.endm
+
+/*
+ * Fetch the opcode byte at _count words offset from rPC and zero-extend
+ * it into _reg.  Must be used in conjunction with GOTO_NEXT_R
+ */
+.macro FETCH_INST_OPCODE _count _reg
+    movzbl  \_count*2(rPC),\_reg
+.endm
+
+/*
+ * Fetch the nth instruction word from rPC into rINSTw.  Does not advance
  * rPC, and _count is in words
  */
-#define FETCH_INST_WORD(_count)  movzwl  _count*2(rPC),rINST_FULL
+.macro FETCH_INST_WORD _count
+    movzwl  \_count*2(rPC),rINST
+.endm
 
 /*
  * Fetch instruction word indexed (used for branching).
  * Index is in instruction word units.
  */
-#define FETCH_INST_INDEXED(_reg) movzwl  (rPC,_reg,2),rINST_FULL
-
-/*
- * Extract the opcode of the instruction in rINST
- */
-#define EXTRACT_OPCODE(_reg)   movzx rOPCODE,_reg
+.macro FETCH_INST_INDEXED _reg
+    movzwl  (rPC,\_reg,2),rINST
+.endm
 
 /*
  * Advance rPC by instruction count
  */
-#define ADVANCE_PC(_count)    leal  2*_count(rPC),rPC
+.macro ADVANCE_PC _count
+    leal  2*\_count(rPC),rPC
+.endm
 
 /*
  * Advance rPC by branch offset in register
  */
-#define ADVANCE_PC_INDEXED(_reg) leal (rPC,_reg,2),rPC
+.macro ADVANCE_PC_INDEXED _reg
+    leal (rPC,\_reg,2),rPC
+.endm
 
-/*
- * Note: assumes opcode previously fetched and in rINST, and
- *       %eax is killable at this point.
- */
-#if 1
 .macro GOTO_NEXT
-    /* For computed next version */
-     movzx    rOPCODE,%eax
-     sall     $6,%eax
-     addl     rIBASE,%eax
-     jmp      *%eax
+     movzx   rINSTbl,%eax
+     movzbl  rINSTbh,rINST
+     jmp     *dvmAsmInstructionJmpTable(,%eax,4)
 .endm
-#else
-   /* For jump table version */
-.macro GOTO_NEXT
-     movzx   rOPCODE,%eax
-     jmp     *(rIBASE,%eax,4)
+
+   /*
+    * Version of GOTO_NEXT that assumes _reg preloaded with opcode.
+    * Should be paired with FETCH_INST_R
+    */
+.macro GOTO_NEXT_R _reg
+     movzbl  1(rPC),rINST
+     jmp     *dvmAsmInstructionJmpTable(,\_reg,4)
 .endm
-#endif
 
 /*
  * Get/set the 32-bit value from a Dalvik register.
  */
-#define GET_VREG(_reg, _vreg)   movl     (rFP,_vreg,4),_reg
-#define SET_VREG(_reg, _vreg)   movl     _reg,(rFP,_vreg,4)
-#define GET_VREG_WORD(_reg, _vreg, _offset)   movl     4*(_offset)(rFP,_vreg,4),_reg
-#define SET_VREG_WORD(_reg, _vreg, _offset)   movl     _reg,4*(_offset)(rFP,_vreg,4)
+.macro GET_VREG_R _reg _vreg
+    movl     (rFP,\_vreg,4),\_reg
+.endm
+
+.macro SET_VREG _reg _vreg
+    movl     \_reg,(rFP,\_vreg,4)
+.endm
+
+.macro GET_VREG_WORD _reg _vreg _offset
+    movl     4*(\_offset)(rFP,\_vreg,4),\_reg
+.endm
+
+.macro SET_VREG_WORD _reg _vreg _offset
+    movl     \_reg,4*(\_offset)(rFP,\_vreg,4)
+.endm
+
+#if 1
+
+#define rFinish %edx
+
+/* Macros for x86-atom handlers */
+    /*
+    * Get the 32-bit value from a dalvik register.
+    */
+
+    .macro      GET_VREG _vreg
+    movl        (rFP,\_vreg, 4), \_vreg
+    .endm
+
+   /*
+    * Fetch the next instruction from the specified offset. Advances rPC
+    * to point to the next instruction. "_count" is in 16-bit code units.
+    *
+    * This must come AFTER anything that can throw an exception, or the
+    * exception catch may miss. (This also implies that it must come after
+    * EXPORT_PC())
+    */
+
+    .macro      FETCH_ADVANCE_INST _count
+    add         $(\_count*2), rPC
+    movzwl      (rPC), rINST
+    .endm
+
+   /*
+    * Fetch the next instruction from an offset specified by _reg. Updates
+    * rPC to point to the next instruction. "_reg" must specify the distance
+    * in bytes, *not* 16-bit code units, and may be a signed value.
+    */
+
+    .macro      FETCH_ADVANCE_INST_RB _reg
+    addl        \_reg, rPC
+    movzwl      (rPC), rINST
+    .endm
+
+   /*
+    * Fetch a half-word code unit from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op BBBB, it
+    * fetches BBBB.
+    */
+
+    .macro      FETCH _count _reg
+    movzwl      (\_count*2)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch a half-word code unit from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * This variant treats the value as signed.
+    */
+
+    .macro      FETCHs _count _reg
+    movswl      (\_count*2)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch the first byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op CC|BB, it
+    * fetches BB.
+    */
+
+    .macro      FETCH_BB _count _reg
+    movzbl      (\_count*2)(rPC), \_reg
+    .endm
+
+    /*
+    * Fetch the second byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op CC|BB, it
+    * fetches CC.
+    */
+
+    .macro      FETCH_CC _count _reg
+    movzbl      (\_count*2 + 1)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch the second byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * This variant treats the value as signed.
+    */
+
+    .macro      FETCH_CCs _count _reg
+    movsbl      (\_count*2 + 1)(rPC), \_reg
+    .endm
+
+
+   /*
+    * Fetch one byte from an offset past the current PC.  Pass in the same
+    * "_count" as you would for FETCH, and an additional 0/1 indicating which
+    * byte of the halfword you want (lo/hi).
+    */
+
+    .macro      FETCH_B _reg  _count  _byte
+    movzbl      (\_count*2+\_byte)(rPC), \_reg
+    .endm
+
+   /*
+    * Put the instruction's opcode field into the specified register.
+    */
+
+    .macro      GET_INST_OPCODE _reg
+    movzbl      rINSTbl, \_reg
+    .endm
+
+   /*
+    * Begin executing the opcode in _reg.
+    */
+
+    .macro      GOTO_OPCODE _reg
+    shl         $6, \_reg
+    addl        $dvmAsmInstructionStart,\_reg
+    jmp         *\_reg
+    .endm
+
+
+
+   /*
+    * Macros pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH _rFinish
+    movzbl      (rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_JMPa _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish and _count should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH_ADV _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_JMP _count _rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $(\_count*2), rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+    .macro      FGETOP_JMP2 _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+    .macro      OLD_JMP_1 _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    shl         $6, \_rFinish
+    .endm
+
+    .macro      OLD_JMP_2 _rFinish
+    addl        $dvmAsmInstructionStart,\_rFinish
+    .endm
+
+    .macro      OLD_JMP_3 _count
+    addl        $(\_count*2), rPC
+    .endm
+
+    .macro      OLD_JMP_4 _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *\_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_1 _reg _rFinish
+    movzbl      (rPC, \_reg), \_rFinish
+    shl         $6, \_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_2 _rFinish
+    addl        $dvmAsmInstructionStart,\_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_3 _reg _rFinish
+    addl        \_reg, rPC
+    movzbl      1(rPC, \_reg), rINST
+    jmp         *\_rFinish
+    .endm
+
+   /*
+    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish and _reg should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH_ADV_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_RB_JMP _reg _rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_INST, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH _rFinish
+    movzbl      (rPC), \_rFinish
+    movzbl      1(rPC), rINST
+    .endm
+
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH_ADVANCE _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $(\_count*2), rPC
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH_ADVANCE_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    .endm
+
+   /*
+    * Attempts to speed up GOTO_OPCODE using a jump table. This macro should
+    * be called after a FINISH_FETCH* instruction where rFinish should be the
+    * same register containing the opcode value. This is an attempt to split up
+    * FINISH in order to reduce or remove potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_JMP _rFinish
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_INST, GET_INST_OPCODE, GOTO_OPCODE by using
+    * a jump table. Uses a single macro - but it should be faster if we
+    * split up the fetch for rFinish and the jump using rFinish.
+    */
+
+    .macro      FINISH_A
+    movzbl      (rPC), rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE,
+    * GOTO_OPCODE by using a jump table. Uses a single macro -
+    * but it should be faster if we split up the fetch for rFinish
+    * and the jump using rFinish.
+    */
+
+    .macro      FINISH _count
+    movzbl      (\_count*2)(rPC), rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $(\_count*2), rPC
+    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE,
+    * GOTO_OPCODE by using a jump table. Uses a single macro -
+    * but it should be faster if we split up the fetch for rFinish
+    * and the jump using rFinish.
+    */
+
+    .macro      FINISH_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+#define sReg0 LOCAL0_OFFSET(%ebp)
+#define sReg1 LOCAL1_OFFSET(%ebp)
+#define sReg2 LOCAL2_OFFSET(%ebp)
+#define sReg3 LOCAL3_OFFSET(%ebp)
+
+   /*
+    * Hard coded helper values.
+    */
+
+.balign 16
+
+.LdoubNeg:
+    .quad       0x8000000000000000
+
+.L64bits:
+    .quad       0xFFFFFFFFFFFFFFFF
+
+.LshiftMask2:
+    .quad       0x0000000000000000
+.LshiftMask:
+    .quad       0x000000000000003F
+
+.Lvalue64:
+    .quad       0x0000000000000040
+
+.LvaluePosInfLong:
+    .quad       0x7FFFFFFFFFFFFFFF
+
+.LvalueNegInfLong:
+    .quad       0x8000000000000000
+
+.LvalueNanLong:
+    .quad       0x0000000000000000
+
+.LintMin:
+.long   0x80000000
+
+.LintMax:
+.long   0x7FFFFFFF
+#endif
+
 
 /*
  * This is a #include, not a %include, because we want the C pre-processor
@@ -224,9 +603,9 @@
     .balign 64
 .L_OP_NOP: /* 0x00 */
 /* File: x86/OP_NOP.S */
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -234,14 +613,14 @@
 /* File: x86/OP_MOVE.S */
     /* for move, move-object, long-to-int */
     /* op vA, vB */
-    movzbl rINST_HI,%eax         # eax<- BA
+    movzbl rINSTbl,%eax          # eax<- BA
     andb   $0xf,%al             # eax<- A
-    shrl   $12,rINST_FULL       # rINST_FULL<- B
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
-    GOTO_NEXT
+    shrl   $4,rINST            # rINST<- B
+    GET_VREG_R %ecx rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG %ecx %eax           # fp[A]<-fp[B]
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -249,13 +628,13 @@
 /* File: x86/OP_MOVE_FROM16.S */
     /* for: move/from16, move-object/from16 */
     /* op vAA, vBBBB */
-    movzx    rINST_HI,%eax            # eax <= AA
-    movw     2(rPC),rINST             # rINST <= BBBB
-    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
-    GOTO_NEXT
+    movzx    rINSTbl,%eax              # eax <= AA
+    movw     2(rPC),rINSTw             # rINSTw <= BBBB
+    GET_VREG_R %ecx rINST              # ecx<- fp[BBBB]
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %ecx %eax                # fp[AA]<- ecx]
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -265,11 +644,11 @@
     /* op vAAAA, vBBBB */
     movzwl    4(rPC),%ecx              # ecx<- BBBB
     movzwl    2(rPC),%eax              # eax<- AAAA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG(%ecx,%eax)
-    GOTO_NEXT
+    GET_VREG_R  %ecx %ecx
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    SET_VREG  %ecx %eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -277,16 +656,16 @@
 /* File: x86/OP_MOVE_WIDE.S */
     /* move-wide vA, vB */
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
-    movzbl    rINST_HI,%ecx                # ecx <- BA
-    sarl      $12,rINST_FULL              # rinst_FULL<- B
-    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[B+0]
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[B+1]
-    andb      $0xf,%cl                    # ecx <- A
-    SET_VREG_WORD(rINST_FULL,%ecx,1)       # v[A+1]<- rINST_FULL
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG_WORD(%eax,%ecx,0)             # v[A+0]<- eax
-    GOTO_NEXT
+    movzbl    rINSTbl,%ecx                # ecx <- BA
+    sarl      $4,rINST                   # rINST<- B
+    GET_VREG_WORD %eax rINST 0            # eax<- v[B+0]
+    GET_VREG_WORD rINST rINST 1           # rINST<- v[B+1]
+    andb      $0xf,%cl                   # ecx <- A
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD rINST %ecx 1            # v[A+1]<- rINST
+    ADVANCE_PC 1
+    SET_VREG_WORD %eax %ecx 0             # v[A+0]<- eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -295,14 +674,14 @@
     /* move-wide/from16 vAA, vBBBB */
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
     movzwl    2(rPC),%ecx              # ecx<- BBBB
-    movzbl    rINST_HI,%eax            # eax<- AAAA
-    GET_VREG_WORD(rINST_FULL,%ecx,0)   # rINST_FULL<- v[BBBB+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[BBBB+1]
-    SET_VREG_WORD(rINST_FULL,%eax,0)   # v[AAAA+0]<- rINST_FULL
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG_WORD(%ecx,%eax,1)         # v[AAAA+1]<- eax
-    GOTO_NEXT
+    movzbl    rINSTbl,%eax             # eax<- AAAA
+    GET_VREG_WORD rINST %ecx 0         # rINST<- v[BBBB+0]
+    GET_VREG_WORD %ecx %ecx 1          # ecx<- v[BBBB+1]
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG_WORD rINST %eax 0         # v[AAAA+0]<- rINST
+    SET_VREG_WORD %ecx %eax 1          # v[AAAA+1]<- eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -312,13 +691,13 @@
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
     movzwl    4(rPC),%ecx            # ecx<- BBBB
     movzwl    2(rPC),%eax            # eax<- AAAA
-    GET_VREG_WORD(rINST_FULL,%ecx,0) # rINST_WORD<- v[BBBB+0]
-    GET_VREG_WORD(%ecx,%ecx,1)       # ecx<- v[BBBB+1]
-    SET_VREG_WORD(rINST_FULL,%eax,0) # v[AAAA+0]<- rINST_FULL
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG_WORD(%ecx,%eax,1)       # v[AAAA+1]<- ecx
-    GOTO_NEXT
+    GET_VREG_WORD rINST %ecx 0       # rINSTw_WORD<- v[BBBB+0]
+    GET_VREG_WORD %ecx %ecx 1        # ecx<- v[BBBB+1]
+    FETCH_INST_OPCODE 3 %edx
+    SET_VREG_WORD rINST %eax 0       # v[AAAA+0]<- rINST
+    ADVANCE_PC 3
+    SET_VREG_WORD %ecx %eax 1        # v[AAAA+1]<- ecx
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -327,14 +706,14 @@
 /* File: x86/OP_MOVE.S */
     /* for move, move-object, long-to-int */
     /* op vA, vB */
-    movzbl rINST_HI,%eax         # eax<- BA
+    movzbl rINSTbl,%eax          # eax<- BA
     andb   $0xf,%al             # eax<- A
-    shrl   $12,rINST_FULL       # rINST_FULL<- B
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
-    GOTO_NEXT
+    shrl   $4,rINST            # rINST<- B
+    GET_VREG_R %ecx rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG %ecx %eax           # fp[A]<-fp[B]
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -344,13 +723,13 @@
 /* File: x86/OP_MOVE_FROM16.S */
     /* for: move/from16, move-object/from16 */
     /* op vAA, vBBBB */
-    movzx    rINST_HI,%eax            # eax <= AA
-    movw     2(rPC),rINST             # rINST <= BBBB
-    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
-    GOTO_NEXT
+    movzx    rINSTbl,%eax              # eax <= AA
+    movw     2(rPC),rINSTw             # rINSTw <= BBBB
+    GET_VREG_R %ecx rINST              # ecx<- fp[BBBB]
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %ecx %eax                # fp[AA]<- ecx]
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -362,11 +741,11 @@
     /* op vAAAA, vBBBB */
     movzwl    4(rPC),%ecx              # ecx<- BBBB
     movzwl    2(rPC),%eax              # eax<- AAAA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG(%ecx,%eax)
-    GOTO_NEXT
+    GET_VREG_R  %ecx %ecx
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    SET_VREG  %ecx %eax
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -375,28 +754,27 @@
 /* File: x86/OP_MOVE_RESULT.S */
     /* for: move-result, move-result-object */
     /* op vAA */
-    GET_GLUE(%eax)                         # eax<- rGLUE
-    movzx    rINST_HI,%ecx                 # ecx<- AA
+    movl     rGLUE,%eax                    # eax<- rGLUE
+    movzx    rINSTbl,%ecx                  # ecx<- AA
     movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG  %eax %ecx                    # fp[AA]<- retval.l
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
 .L_OP_MOVE_RESULT_WIDE: /* 0x0b */
 /* File: x86/OP_MOVE_RESULT_WIDE.S */
     /* move-result-wide vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
+    movl    rGLUE,%ecx
     movl    offGlue_retval(%ecx),%eax
     movl    4+offGlue_retval(%ecx),%ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)    # v[AA+0] <- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)    # v[AA+1] <- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0     # v[AA+0] <- eax
+    SET_VREG_WORD %ecx rINST 1     # v[AA+1] <- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -405,13 +783,13 @@
 /* File: x86/OP_MOVE_RESULT.S */
     /* for: move-result, move-result-object */
     /* op vAA */
-    GET_GLUE(%eax)                         # eax<- rGLUE
-    movzx    rINST_HI,%ecx                 # ecx<- AA
+    movl     rGLUE,%eax                    # eax<- rGLUE
+    movzx    rINSTbl,%ecx                  # ecx<- AA
     movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG  %eax %ecx                    # fp[AA]<- retval.l
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -419,15 +797,14 @@
 .L_OP_MOVE_EXCEPTION: /* 0x0d */
 /* File: x86/OP_MOVE_EXCEPTION.S */
     /* move-exception vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
+    movl    rGLUE,%ecx
     movl    offGlue_self(%ecx),%ecx    # ecx<- glue->self
     movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
-    SET_VREG(%eax,rINST_FULL)          # fp[AA]<- exception object
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    SET_VREG %eax rINST                # fp[AA]<- exception object
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     movl    $0,offThread_exception(%ecx) # dvmClearException bypass
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -446,9 +823,8 @@
      * for: return, return-object
      */
     /* op vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
+    movl    rGLUE,%ecx
+    GET_VREG_R %eax rINST               # eax<- vAA
     movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
     jmp     common_returnFromMethod
 
@@ -461,12 +837,11 @@
      * structure, then jumps to the return handler.
      */
     /* return-wide vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL            # rINST_FULL<- AA
-    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[AA+0]
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[AA+1]
+    movl    rGLUE,%ecx
+    GET_VREG_WORD %eax rINST 0       # eax<- v[AA+0]
+    GET_VREG_WORD rINST rINST 1      # rINST<- v[AA+1]
     movl    %eax,offGlue_retval(%ecx)
-    movl    rINST_FULL,4+offGlue_retval(%ecx)
+    movl    rINST,4+offGlue_retval(%ecx)
     jmp     common_returnFromMethod
 
 /* ------------------------------ */
@@ -481,9 +856,8 @@
      * for: return, return-object
      */
     /* op vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
+    movl    rGLUE,%ecx
+    GET_VREG_R %eax rINST               # eax<- vAA
     movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
     jmp     common_returnFromMethod
 
@@ -493,14 +867,14 @@
 .L_OP_CONST_4: /* 0x12 */
 /* File: x86/OP_CONST_4.S */
     /* const/4 vA, #+B */
-    movsx   rINST_HI,%eax              # eax<-ssssssBx
+    movsx   rINSTbl,%eax              # eax<-ssssssBx
     movl    $0xf,%ecx
-    andl    %eax,%ecx                  # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    andl    %eax,%ecx                 # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     sarl    $4,%eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -508,23 +882,23 @@
 /* File: x86/OP_CONST_16.S */
     /* const/16 vAA, #+BBBB */
     movswl  2(rPC),%ecx                # ecx<- ssssBBBB
-    movzx   rINST_HI,%eax              # eax<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%ecx,%eax)                # vAA<- ssssBBBB
-    GOTO_NEXT
+    movl    rINST,%eax                 # eax<- AA
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %ecx %eax                 # vAA<- ssssBBBB
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
 .L_OP_CONST: /* 0x14 */
 /* File: x86/OP_CONST.S */
     /* const vAA, #+BBBBbbbb */
-    movzbl    rINST_HI,%ecx           # ecx<- AA
-    movl      2(rPC),%eax               # grab all 32 bits at once
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG(%eax,%ecx)                 # vAA<- eax
-    GOTO_NEXT
+    movl      2(rPC),%eax             # grab all 32 bits at once
+    movl      rINST,%ecx              # ecx<- AA
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    SET_VREG %eax %ecx                # vAA<- eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -532,12 +906,12 @@
 /* File: x86/OP_CONST_HIGH16.S */
     /* const/high16 vAA, #+BBBB0000 */
     movzwl     2(rPC),%eax                # eax<- 0000BBBB
-    movzbl     rINST_HI,%ecx              # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
+    movl       rINST,%ecx                 # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     sall       $16,%eax                  # eax<- BBBB0000
-    SET_VREG(%eax,%ecx)                   # vAA<- eax
-    GOTO_NEXT
+    SET_VREG %eax %ecx                    # vAA<- eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -545,31 +919,25 @@
 /* File: x86/OP_CONST_WIDE_16.S */
     /* const-wide/16 vAA, #+BBBB */
     movswl    2(rPC),%eax               # eax<- ssssBBBB
-    SPILL(rPC)
-    movzbl    rINST_HI,%ecx             # ecx<- AA
-    FETCH_INST_WORD(2)
     cltd                                # rPC:eax<- ssssssssssssBBBB
-    SET_VREG_WORD(rPC,%ecx,1)           # store msw
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1          # store msw
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 0          # store lsw
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
 .L_OP_CONST_WIDE_32: /* 0x17 */
 /* File: x86/OP_CONST_WIDE_32.S */
     /* const-wide/32 vAA, #+BBBBbbbb */
-    movl     2(rPC),%eax               # eax<- BBBBbbbb
-    SPILL(rPC)
-    movzbl    rINST_HI,%ecx             # ecx<- AA
-    FETCH_INST_WORD(3)
+    movl     2(rPC),%eax                # eax<- BBBBbbbb
     cltd                                # rPC:eax<- ssssssssssssBBBB
-    SET_VREG_WORD(rPC,%ecx,1)           # store msw
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST,1          # store msw
+    FETCH_INST_OPCODE 3 %edx
+    SET_VREG_WORD %eax rINST 0          # store lsw
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -577,14 +945,14 @@
 /* File: x86/OP_CONST_WIDE.S */
     /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
     movl      2(rPC),%eax         # eax<- lsw
-    movzbl    rINST_HI,%ecx       # ecx <- AA
-    movl      6(rPC),rINST_FULL   # rINST_FULL<- msw
+    movzbl    rINSTbl,%ecx        # ecx<- AA
+    movl      6(rPC),rINST        # rINST<- msw
     leal      (rFP,%ecx,4),%ecx   # dst addr
-    movl      rINST_FULL,4(%ecx)
-    FETCH_INST_WORD(5)
+    movl      rINST,4(%ecx)
+    FETCH_INST_OPCODE 5 %edx
     movl      %eax,(%ecx)
-    ADVANCE_PC(5)
-    GOTO_NEXT
+    ADVANCE_PC 5
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -592,14 +960,13 @@
 /* File: x86/OP_CONST_WIDE_HIGH16.S */
     /* const-wide/high16 vAA, #+BBBB000000000000 */
     movzwl     2(rPC),%eax                # eax<- 0000BBBB
-    movzbl     rINST_HI,%ecx              # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     sall       $16,%eax                  # eax<- BBBB0000
-    SET_VREG_WORD(%eax,%ecx,1)            # v[AA+1]<- eax
+    SET_VREG_WORD %eax rINST 1            # v[AA+1]<- eax
     xorl       %eax,%eax
-    SET_VREG_WORD(%eax,%ecx,0)            # v[AA+0]<- eax
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0            # v[AA+0]<- eax
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -607,19 +974,18 @@
 /* File: x86/OP_CONST_STRING.S */
 
     /* const/string vAA, String@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 2 %edx
     testl     %eax,%eax                # resolved yet?
     je        .LOP_CONST_STRING_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResString[BBBB]
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -627,19 +993,18 @@
 /* File: x86/OP_CONST_STRING_JUMBO.S */
 
     /* const/string vAA, String@BBBBBBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movl      2(rPC),%eax              # eax<- BBBBBBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(3)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 3 %edx
     testl     %eax,%eax                # resolved yet?
     je        .LOP_CONST_STRING_JUMBO_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResString[BBBB]
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -647,19 +1012,18 @@
 /* File: x86/OP_CONST_CLASS.S */
 
     /* const/class vAA, Class@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
     movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 2 %edx
     testl     %eax,%eax                # resolved yet?
     je        .LOP_CONST_CLASS_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResClasses[BBBB]
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResClasses[BBBB]
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -669,13 +1033,12 @@
      * Synchronize on an object.
      */
     /* monitor-enter vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
+    movl    rGLUE,%ecx
+    GET_VREG_R %eax rINST               # eax<- vAA
     movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
-    FETCH_INST_WORD(1)
+    FETCH_INST_WORD 1
     testl   %eax,%eax                   # null object?
-    EXPORT_PC()                         # need for precise GC, MONITOR_TRACKING
+    EXPORT_PC                           # need for precise GC, MONITOR_TRACKING
     jne     .LOP_MONITOR_ENTER_continue
     jmp     common_errNullObject
 
@@ -691,15 +1054,13 @@
      * instruction spec.
      */
     /* monitor-exit vAA */
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    GET_VREG_R %eax rINST
+    movl    rGLUE,%ecx
+    EXPORT_PC
     testl   %eax,%eax                   # null object?
     je      .LOP_MONITOR_EXIT_errNullObject   # go if so
     movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     movl    %ecx,OUT_ARG0(%esp)
     jmp     .LOP_MONITOR_EXIT_continue
 
@@ -711,25 +1072,24 @@
      * Check to see if a cast from one class to another is allowed.
      */
     /* check-cast vAA, class@BBBB */
-    GET_GLUE(%ecx)
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA (object)
+    movl      rGLUE,%ecx
+    GET_VREG_R  rINST,rINST             # rINST<- vAA (object)
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    testl     rINST_FULL,rINST_FULL     # is oject null?
+    testl     rINST,rINST               # is oject null?
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
     je        .LOP_CHECK_CAST_okay          # null obj, cast always succeeds
     movl      (%ecx,%eax,4),%eax        # eax<- resolved class
-    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+    movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
     testl     %eax,%eax                 # have we resolved this before?
     je        .LOP_CHECK_CAST_resolve       # no, go do it now
 .LOP_CHECK_CAST_resolved:
     cmpl      %eax,%ecx                 # same class (trivial success)?
     jne       .LOP_CHECK_CAST_fullcheck     # no, do full check
 .LOP_CHECK_CAST_okay:
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -742,17 +1102,16 @@
      * an already-resolved class.
      */
     /* instance-of vA, vB, class@CCCC */
-    movzbl  rINST_HI,%eax               # eax<- BA
+    movl    rINST,%eax                # eax<- BA
     sarl    $4,%eax                    # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
-    GET_GLUE(%ecx)
+    GET_VREG_R %eax %eax                # eax<- vB (obj)
+    movl    rGLUE,%ecx
     testl   %eax,%eax                   # object null?
     movl    offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
-    SPILL(rPC)
     je      .LOP_INSTANCE_OF_store           # null obj, not instance, store it
-    movzwl  2(rPC),rPC                  # rPC<- CCCC
+    movzwl  2(rPC),%edx                 # edx<- CCCC
     movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
-    movl    (%ecx,rPC,4),%ecx           # ecx<- resolved class
+    movl    (%ecx,%edx,4),%ecx          # ecx<- resolved class
     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
     testl   %ecx,%ecx                   # have we resolved this before?
     je      .LOP_INSTANCE_OF_resolve         # not resolved, do it now
@@ -768,17 +1127,17 @@
     /*
      * Return the length of an array.
      */
-   movzbl   rINST_HI,%eax              # eax<- BA
-   sarl     $12,rINST_FULL            # rINST_FULL<- B
-   GET_VREG(%ecx,rINST_FULL)           # ecx<- vB (object ref)
-   andb     $0xf,%al                  # eax<- A
-   testl    %ecx,%ecx                  # is null?
+   mov      rINST,%eax                # eax<- BA
+   sarl     $4,rINST                 # rINST<- B
+   GET_VREG_R %ecx rINST              # ecx<- vB (object ref)
+   andb     $0xf,%al                 # eax<- A
+   testl    %ecx,%ecx                 # is null?
    je       common_errNullObject
-   FETCH_INST_WORD(1)
+   FETCH_INST_OPCODE 1 %edx
    movl     offArrayObject_length(%ecx),%ecx
-   ADVANCE_PC(1)
-   SET_VREG(%ecx,%eax)
-   GOTO_NEXT
+   ADVANCE_PC 1
+   SET_VREG %ecx %eax
+   GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -788,14 +1147,12 @@
      * Create a new instance of a class.
      */
     /* new-instance vAA, class@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
-    EXPORT_PC()
+    EXPORT_PC
     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
-    SPILL(rPC)
     testl     %ecx,%ecx                 # resolved?
     je        .LOP_NEW_INSTANCE_resolve       # no, go do it
 .LOP_NEW_INSTANCE_resolved:  # on entry, ecx<- class
@@ -815,17 +1172,16 @@
      * check for it here.
      */
     /* new-array vA, vB, class@CCCC */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl    rGLUE,%ecx
+    EXPORT_PC
     movl    offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
     movzwl  2(rPC),%eax                       # eax<- CCCC
     movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
     movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
-    movzbl  rINST_HI,%eax
+    movzbl  rINSTbl,%eax
     sarl    $4,%eax                          # eax<- B
-    GET_VREG(%eax,%eax)                       # eax<- vB (array length)
-    movzbl  rINST_HI,rINST_FULL
-    andb    $0xf,rINST_LO                    # rINST_FULL<- A
+    GET_VREG_R %eax %eax                      # eax<- vB (array length)
+    andb    $0xf,rINSTbl                     # rINST<- A
     testl   %eax,%eax
     js      common_errNegativeArraySize       # bail
     testl   %ecx,%ecx                         # already resolved?
@@ -843,18 +1199,16 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
-    GET_GLUE(%eax)
-    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
+    movl    rGLUE,%eax
     movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
     movzwl  2(rPC),%ecx                       # ecx<- BBBB
     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
-    SPILL(rPC)
     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
-    EXPORT_PC()
+    EXPORT_PC
     testl   %eax,%eax                         # already resolved?
     jne     .LOP_FILLED_NEW_ARRAY_continue              # yes, continue
     # less frequent path, so we'll redo some work
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     movl    $0,OUT_ARG2(%esp)                # arg2<- false
     movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
     movl    offGlue_method(%eax),%eax         # eax<- glue->method
@@ -872,18 +1226,16 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
-    GET_GLUE(%eax)
-    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
+    movl    rGLUE,%eax
     movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
     movzwl  2(rPC),%ecx                       # ecx<- BBBB
     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
-    SPILL(rPC)
     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
-    EXPORT_PC()
+    EXPORT_PC
     testl   %eax,%eax                         # already resolved?
     jne     .LOP_FILLED_NEW_ARRAY_RANGE_continue              # yes, continue
     # less frequent path, so we'll redo some work
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     movl    $0,OUT_ARG2(%esp)                # arg2<- false
     movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
     movl    offGlue_method(%eax),%eax         # eax<- glue->method
@@ -896,20 +1248,17 @@
 /* File: x86/OP_FILL_ARRAY_DATA.S */
     /* fill-array-data vAA, +BBBBBBBB */
     movl    2(rPC),%ecx                # ecx<- BBBBbbbb
-    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
     leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
-    GET_VREG(%eax,rINST_FULL)
-    SPILL(rPC)
-    EXPORT_PC()
+    GET_VREG_R %eax rINST
+    EXPORT_PC
     movl    %eax,OUT_ARG0(%esp)
     movl    %ecx,OUT_ARG1(%esp)
     call    dvmInterpHandleFillArrayData
-    UNSPILL(rPC)
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     testl   %eax,%eax                   # exception thrown?
     je      common_exceptionThrown
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -919,10 +1268,9 @@
      * Throw an exception object in the current thread.
      */
     /* throw vAA */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
-    movzbl   rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)          # eax<- exception object
+    movl     rGLUE,%ecx
+    EXPORT_PC
+    GET_VREG_R %eax rINST              # eax<- exception object
     movl     offGlue_self(%ecx),%ecx   # ecx<- glue->self
     testl    %eax,%eax                 # null object?
     je       common_errNullObject
@@ -940,12 +1288,12 @@
      * double to get a byte offset.
      */
     /* goto +AA */
-    movsbl  rINST_HI,rINST_FULL         # ebx<- ssssssAA
-    testl   rINST_FULL,rINST_FULL       # test for <0
+    movsbl  rINSTbl,rINST         # ebx<- ssssssAA
+    testl   rINST,rINST           # test for <0
     js      common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 /* ------------------------------ */
@@ -958,12 +1306,12 @@
      * The branch distance is a signed code-unit offset
      */
     /* goto/16 +AAAA */
-    movswl  2(rPC),rINST_FULL           # rINST_FULL<- ssssAAAA
-    testl   rINST_FULL,rINST_FULL       # test for <0
+    movswl  2(rPC),rINST           # rINST<- ssssAAAA
+    testl   rINST,rINST            # test for <0
     js      common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 /* ------------------------------ */
@@ -979,12 +1327,12 @@
      * our "backward branch" test must be "<=0" instead of "<0".
      */
     /* goto/32 AAAAAAAA */
-    movl    2(rPC),rINST_FULL           # rINST_FULL<- AAAAAAAA
-    cmpl    $0,rINST_FULL              # test for <= 0
+    movl    2(rPC),rINST           # rINST<- AAAAAAAA
+    cmpl    $0,rINST              # test for <= 0
     jle     common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 /* ------------------------------ */
@@ -1001,20 +1349,17 @@
      * for: packed-switch, sparse-switch
      */
     /* op vAA, +BBBB */
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
-    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
-    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
-    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
-    SPILL(rPC)
+    movl    2(rPC),%ecx           # ecx<- BBBBbbbb
+    GET_VREG_R %eax rINST         # eax<- vAA
+    leal    (rPC,%ecx,2),%ecx     # ecx<- PC + BBBBbbbb*2
+    movl    %eax,OUT_ARG1(%esp)   # ARG1<- vAA
+    movl    %ecx,OUT_ARG0(%esp)   # ARG0<- switchData
     call    dvmInterpHandlePackedSwitch
-    UNSPILL(rPC)
     testl   %eax,%eax
-    movl    %eax,rINST_FULL             # set up word offset
-    jle     common_backwardBranch       # check on special actions
-    ADVANCE_PC_INDEXED(rINST_FULL)
-    FETCH_INST()
+    movl    %eax,rINST            # set up word offset
+    jle     common_backwardBranch # check on special actions
+    ADVANCE_PC_INDEXED rINST
+    FETCH_INST
     GOTO_NEXT
 
 /* ------------------------------ */
@@ -1032,20 +1377,17 @@
      * for: packed-switch, sparse-switch
      */
     /* op vAA, +BBBB */
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
-    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
-    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
-    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
-    SPILL(rPC)
+    movl    2(rPC),%ecx           # ecx<- BBBBbbbb
+    GET_VREG_R %eax rINST         # eax<- vAA
+    leal    (rPC,%ecx,2),%ecx     # ecx<- PC + BBBBbbbb*2
+    movl    %eax,OUT_ARG1(%esp)   # ARG1<- vAA
+    movl    %ecx,OUT_ARG0(%esp)   # ARG0<- switchData
     call    dvmInterpHandleSparseSwitch
-    UNSPILL(rPC)
     testl   %eax,%eax
-    movl    %eax,rINST_FULL             # set up word offset
-    jle     common_backwardBranch       # check on special actions
-    ADVANCE_PC_INDEXED(rINST_FULL)
-    FETCH_INST()
+    movl    %eax,rINST            # set up word offset
+    jle     common_backwardBranch # check on special actions
+    ADVANCE_PC_INDEXED rINST
+    FETCH_INST
     GOTO_NEXT
 
 
@@ -1064,22 +1406,21 @@
     flds     (rFP,%eax,4)
     flds     (rFP,%ecx,4)
     .endif
-    movzbl   rINST_HI,rINST_FULL
     xorl     %ecx,%ecx
     fucompp     # z if equal, p set if NaN, c set if st0 < st1
     fnstsw   %ax
     sahf
-    movl      rINST_FULL,%eax
-    FETCH_INST_WORD(2)
+    movl      rINST,%eax
+    FETCH_INST_OPCODE 2 %edx
     jp       .LOP_CMPL_FLOAT_isNaN
     je       .LOP_CMPL_FLOAT_finish
     sbbl     %ecx,%ecx
     jb       .LOP_CMPL_FLOAT_finish
     incl     %ecx
 .LOP_CMPL_FLOAT_finish:
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1097,22 +1438,21 @@
     flds     (rFP,%eax,4)
     flds     (rFP,%ecx,4)
     .endif
-    movzbl   rINST_HI,rINST_FULL
     xorl     %ecx,%ecx
     fucompp     # z if equal, p set if NaN, c set if st0 < st1
     fnstsw   %ax
     sahf
-    movl      rINST_FULL,%eax
-    FETCH_INST_WORD(2)
+    movl      rINST,%eax
+    FETCH_INST_OPCODE 2 %edx
     jp       .LOP_CMPG_FLOAT_isNaN
     je       .LOP_CMPG_FLOAT_finish
     sbbl     %ecx,%ecx
     jb       .LOP_CMPG_FLOAT_finish
     incl     %ecx
 .LOP_CMPG_FLOAT_finish:
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1130,22 +1470,21 @@
     flds     (rFP,%eax,4)
     flds     (rFP,%ecx,4)
     .endif
-    movzbl   rINST_HI,rINST_FULL
     xorl     %ecx,%ecx
     fucompp     # z if equal, p set if NaN, c set if st0 < st1
     fnstsw   %ax
     sahf
-    movl      rINST_FULL,%eax
-    FETCH_INST_WORD(2)
+    movl      rINST,%eax
+    FETCH_INST_OPCODE 2 %edx
     jp       .LOP_CMPL_DOUBLE_isNaN
     je       .LOP_CMPL_DOUBLE_finish
     sbbl     %ecx,%ecx
     jb       .LOP_CMPL_DOUBLE_finish
     incl     %ecx
 .LOP_CMPL_DOUBLE_finish:
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1162,22 +1501,21 @@
     flds     (rFP,%eax,4)
     flds     (rFP,%ecx,4)
     .endif
-    movzbl   rINST_HI,rINST_FULL
     xorl     %ecx,%ecx
     fucompp     # z if equal, p set if NaN, c set if st0 < st1
     fnstsw   %ax
     sahf
-    movl      rINST_FULL,%eax
-    FETCH_INST_WORD(2)
+    movl      rINST,%eax
+    FETCH_INST_OPCODE 2 %edx
     jp       .LOP_CMPG_DOUBLE_isNaN
     je       .LOP_CMPG_DOUBLE_finish
     sbbl     %ecx,%ecx
     jb       .LOP_CMPG_DOUBLE_finish
     incl     %ecx
 .LOP_CMPG_DOUBLE_finish:
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -1189,18 +1527,15 @@
      */
     /* cmp-long vAA, vBB, vCC */
     movzbl    2(rPC),%ecx              # ecx<- BB
-    SPILL(rPC)
-    movzbl    3(rPC),rPC               # rPC<- CC
-    GET_VREG_WORD(%eax,%ecx,1)         # eax<- v[BB+1]
-    GET_VREG_WORD(%ecx,%ecx,0)         # ecx<- v[BB+0]
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    cmpl      4(rFP,rPC,4),%eax
+    movzbl    3(rPC),%edx              # edx<- CC
+    GET_VREG_WORD %eax %ecx,1          # eax<- v[BB+1]
+    GET_VREG_WORD %ecx %ecx 0          # ecx<- v[BB+0]
+    cmpl      4(rFP,%edx,4),%eax
     jl        .LOP_CMP_LONG_smaller
     jg        .LOP_CMP_LONG_bigger
-    sub       (rFP,rPC,4),%ecx
+    sub       (rFP,%edx,4),%ecx
     ja        .LOP_CMP_LONG_bigger
     jb        .LOP_CMP_LONG_smaller
-    UNSPILL(rPC)
     jmp       .LOP_CMP_LONG_finish
 
 /* ------------------------------ */
@@ -1216,21 +1551,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     jne   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1247,21 +1581,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     je   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1278,21 +1611,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     jge   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1309,21 +1641,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     jl   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1340,21 +1671,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     jle   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1371,21 +1701,20 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $2,%eax              # assume not taken
     jg   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1402,17 +1731,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     jne   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1429,17 +1757,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     je   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1456,17 +1783,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     jge   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1483,17 +1809,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     jl   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1510,17 +1835,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     jle   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1537,17 +1861,16 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $2,%eax                  # assume branch not taken
+    cmpl     $0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $2,%eax             # assume branch not taken
     jg   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
 
 
@@ -1611,19 +1934,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movl     offArrayObject_contents(%eax,%ecx,4),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -1636,9 +1958,8 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -1658,19 +1979,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movl     offArrayObject_contents(%eax,%ecx,4),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_OBJECT_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1686,19 +2006,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movzbl     offArrayObject_contents(%eax,%ecx,1),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_BOOLEAN_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1714,19 +2033,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movsbl     offArrayObject_contents(%eax,%ecx,1),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_BYTE_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1742,19 +2060,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movzwl     offArrayObject_contents(%eax,%ecx,2),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_CHAR_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1770,19 +2087,18 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     movswl     offArrayObject_contents(%eax,%ecx,2),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.LOP_AGET_SHORT_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1797,19 +2113,19 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,4),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.LOP_APUT_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     movl     %ecx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -1822,9 +2138,8 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -1843,10 +2158,9 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
+    GET_VREG_R  rINST rINST             # rINST<- vAA
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -1866,19 +2180,19 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,1),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.LOP_APUT_BOOLEAN_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     movb     %cl,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1894,19 +2208,19 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,1),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.LOP_APUT_BYTE_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     movb     %cl,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1922,19 +2236,19 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,2),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.LOP_APUT_CHAR_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     movw     %cx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1950,19 +2264,19 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,2),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.LOP_APUT_SHORT_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     movw     %cx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -1975,21 +2289,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_resolve
 
 /* ------------------------------ */
@@ -2001,21 +2313,19 @@
      *
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_WIDE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_WIDE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # for dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_WIDE_resolve
 
 /* ------------------------------ */
@@ -2029,21 +2339,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_OBJECT_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_OBJECT_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_OBJECT_resolve
 
 
@@ -2058,21 +2366,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_BOOLEAN_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_BOOLEAN_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_BOOLEAN_resolve
 
 
@@ -2087,21 +2393,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_BYTE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_BYTE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_BYTE_resolve
 
 
@@ -2116,21 +2420,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_CHAR_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_CHAR_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_CHAR_resolve
 
 
@@ -2145,21 +2447,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_SHORT_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_SHORT_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_SHORT_resolve
 
 
@@ -2174,21 +2474,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_resolve
 
 /* ------------------------------ */
@@ -2200,21 +2498,19 @@
      *
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_WIDE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_WIDE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_WIDE_resolve
 
 /* ------------------------------ */
@@ -2227,21 +2523,19 @@
      * for: iput-object
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_OBJECT_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_OBJECT_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_OBJECT_resolve
 
 /* ------------------------------ */
@@ -2256,21 +2550,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_BOOLEAN_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_BOOLEAN_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_BOOLEAN_resolve
 
 
@@ -2286,21 +2578,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_BYTE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_BYTE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_BYTE_resolve
 
 
@@ -2316,21 +2606,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_CHAR_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_CHAR_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_CHAR_resolve
 
 
@@ -2346,21 +2634,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_SHORT_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_SHORT_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_SHORT_resolve
 
 
@@ -2374,7 +2660,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2383,11 +2669,10 @@
     je        .LOP_SGET_resolve                # if not, make it so
 .LOP_SGET_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -2398,7 +2683,7 @@
      *
      */
     /* sget-wide vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2408,12 +2693,11 @@
 .LOP_SGET_WIDE_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
     movl      4+offStaticField_value(%eax),%eax  # eax<- msw
-    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -2426,7 +2710,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2435,11 +2719,10 @@
     je        .LOP_SGET_OBJECT_resolve                # if not, make it so
 .LOP_SGET_OBJECT_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2453,7 +2736,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2462,11 +2745,10 @@
     je        .LOP_SGET_BOOLEAN_resolve                # if not, make it so
 .LOP_SGET_BOOLEAN_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2480,7 +2762,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2489,11 +2771,10 @@
     je        .LOP_SGET_BYTE_resolve                # if not, make it so
 .LOP_SGET_BYTE_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2507,7 +2788,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2516,11 +2797,10 @@
     je        .LOP_SGET_CHAR_resolve                # if not, make it so
 .LOP_SGET_CHAR_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2534,7 +2814,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2543,11 +2823,10 @@
     je        .LOP_SGET_SHORT_resolve                # if not, make it so
 .LOP_SGET_SHORT_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2560,7 +2839,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2568,12 +2847,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_resolve                # if not, make it so
 .LOP_SPUT_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -2585,7 +2863,7 @@
      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2593,14 +2871,13 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_WIDE_resolve                # if not, make it so
 .LOP_SPUT_WIDE_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
-    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
-    movl      rINST_FULL,offStaticField_value(%eax)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    movl      %ecx,4+offStaticField_value(%eax)
-    GOTO_NEXT
+    GET_VREG_WORD %ecx rINST 0                  # rINST<- lsw
+    GET_VREG_WORD rINST rINST 1                 # ecx<- msw
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    movl      %ecx,offStaticField_value(%eax)
+    movl      rINST,4+offStaticField_value(%eax)
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -2610,7 +2887,7 @@
      * SPUT object handler.
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2618,8 +2895,8 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_OBJECT_resolve                # if not, make it so
 .LOP_SPUT_OBJECT_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
+    movzbl    rINSTbl,%ecx                       # ecx<- AA
+    GET_VREG_R  %ecx %ecx
     jmp       .LOP_SPUT_OBJECT_continue
 
 /* ------------------------------ */
@@ -2633,7 +2910,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2641,12 +2918,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_BOOLEAN_resolve                # if not, make it so
 .LOP_SPUT_BOOLEAN_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2660,7 +2936,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2668,12 +2944,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_BYTE_resolve                # if not, make it so
 .LOP_SPUT_BYTE_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2687,7 +2962,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2695,12 +2970,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_CHAR_resolve                # if not, make it so
 .LOP_SPUT_CHAR_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2714,7 +2988,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -2722,12 +2996,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_SHORT_resolve                # if not, make it so
 .LOP_SPUT_SHORT_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -2742,18 +3015,17 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movzwl    2(rPC),%ecx                 # ecx<- BBBB
     movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
     testl     %eax,%eax                   # already resolved?
     jne       .LOP_INVOKE_VIRTUAL_continue        # yes, continue
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
     movl      offGlue_method(%eax),%eax   # eax<- glue->method
-    SPILL(rPC)
     jmp       .LOP_INVOKE_VIRTUAL_more
 
 /* ------------------------------ */
@@ -2767,19 +3039,19 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(rINST_FULL)
+    movl      rGLUE,rINST
     movzwl    2(rPC),%eax               # eax<- BBBB
-    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    movl      offGlue_methodClassDex(rINST),%ecx # ecx<- pDvmDex
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
-    movl      offGlue_method(rINST_FULL),%eax # eax<- method
-    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
+    movl      offGlue_method(rINST),%eax # eax<- method
+    movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
     .if       (!0)
-    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
+    andl      $0xf,rINST               # rINST<- D (or stays CCCC)
     .endif
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
-    testl     rINST_FULL,rINST_FULL     # null "this"?
+    GET_VREG_R  rINST rINST             # rINST<- "this" ptr
+    testl     rINST,rINST               # null "this"?
     je        common_errNullObject      # yes, throw
     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
     testl     %ecx,%ecx                 # already resolved?
@@ -2802,22 +3074,20 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
-    SPILL(rPC)
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
-    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
+    movzwl    4(rPC),%edx              # edx<- GFED or CCCC
     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
     .if       (!0)
-    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
+    andl      $0xf,%edx               # edx<- D (or stays CCCC)
     .endif
     testl     %eax,%eax                # already resolved?
-    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
+    GET_VREG_R  %ecx %edx              # ecx<- "this" ptr
     je        .LOP_INVOKE_DIRECT_resolve      # not resolved, do it now
 .LOP_INVOKE_DIRECT_finish:
-    UNSPILL(rPC)
     testl     %ecx,%ecx                # null "this"?
     jne       common_invokeMethodNoRange  # no, continue on
     jmp       common_errNullObject
@@ -2833,15 +3103,15 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
     testl     %eax,%eax
     jne       common_invokeMethodNoRange
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
     movzwl    2(rPC),%eax
     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
@@ -2861,12 +3131,12 @@
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
     movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
-    GET_GLUE(%ecx)
+    movl       rGLUE,%ecx
     .if        (!0)
     andl       $0xf,%eax               # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- "this"
-    EXPORT_PC()
+    GET_VREG_R   %eax %eax              # eax<- "this"
+    EXPORT_PC
     testl      %eax,%eax                # null this?
     je         common_errNullObject     # yes, fail
     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
@@ -2877,7 +3147,6 @@
     movzwl     2(rPC),%eax                         # eax<- BBBB
     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
     movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
-    SPILL(rPC)
     jmp        .LOP_INVOKE_INTERFACE_continue
 
 /* ------------------------------ */
@@ -2901,18 +3170,17 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movzwl    2(rPC),%ecx                 # ecx<- BBBB
     movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
     testl     %eax,%eax                   # already resolved?
     jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # yes, continue
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
     movl      offGlue_method(%eax),%eax   # eax<- glue->method
-    SPILL(rPC)
     jmp       .LOP_INVOKE_VIRTUAL_RANGE_more
 
 
@@ -2928,19 +3196,19 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(rINST_FULL)
+    movl      rGLUE,rINST
     movzwl    2(rPC),%eax               # eax<- BBBB
-    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    movl      offGlue_methodClassDex(rINST),%ecx # ecx<- pDvmDex
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
-    movl      offGlue_method(rINST_FULL),%eax # eax<- method
-    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
+    movl      offGlue_method(rINST),%eax # eax<- method
+    movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
     .if       (!1)
-    andl      $0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
+    andl      $0xf,rINST               # rINST<- D (or stays CCCC)
     .endif
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
-    testl     rINST_FULL,rINST_FULL     # null "this"?
+    GET_VREG_R  rINST rINST             # rINST<- "this" ptr
+    testl     rINST,rINST               # null "this"?
     je        common_errNullObject      # yes, throw
     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
     testl     %ecx,%ecx                 # already resolved?
@@ -2965,22 +3233,20 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
-    SPILL(rPC)
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
-    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
+    movzwl    4(rPC),%edx              # edx<- GFED or CCCC
     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
     .if       (!1)
-    andl      $0xf,rPC                # rPC<- D (or stays CCCC)
+    andl      $0xf,%edx               # edx<- D (or stays CCCC)
     .endif
     testl     %eax,%eax                # already resolved?
-    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
+    GET_VREG_R  %ecx %edx              # ecx<- "this" ptr
     je        .LOP_INVOKE_DIRECT_RANGE_resolve      # not resolved, do it now
 .LOP_INVOKE_DIRECT_RANGE_finish:
-    UNSPILL(rPC)
     testl     %ecx,%ecx                # null "this"?
     jne       common_invokeMethodRange  # no, continue on
     jmp       common_errNullObject
@@ -2998,15 +3264,15 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
     testl     %eax,%eax
     jne       common_invokeMethodRange
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
     movzwl    2(rPC),%eax
     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
@@ -3028,12 +3294,12 @@
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
     movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
-    GET_GLUE(%ecx)
+    movl       rGLUE,%ecx
     .if        (!1)
     andl       $0xf,%eax               # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- "this"
-    EXPORT_PC()
+    GET_VREG_R   %eax %eax              # eax<- "this"
+    EXPORT_PC
     testl      %eax,%eax                # null this?
     je         common_errNullObject     # yes, fail
     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
@@ -3044,7 +3310,6 @@
     movzwl     2(rPC),%eax                         # eax<- BBBB
     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
     movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
-    SPILL(rPC)
     jmp        .LOP_INVOKE_INTERFACE_RANGE_continue
 
 
@@ -3074,17 +3339,17 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
     
     negl %eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3097,17 +3362,17 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
     
     notl %eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3115,39 +3380,37 @@
 .L_OP_NEG_LONG: /* 0x7d */
 /* File: x86/OP_NEG_LONG.S */
     /* unop vA, vB */
-    movzbl    rINST_HI,%ecx            # ecx<- BA
-    sarl      $4,%ecx                 # ecx<- B
-    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
-    andb      $0xf,rINST_LO           # rINST_FULL<- A
-    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
+    movzbl    rINSTbl,%ecx        # ecx<- BA
+    sarl      $4,%ecx            # ecx<- B
+    andb      $0xf,rINSTbl       # rINST<- A
+    GET_VREG_WORD %eax %ecx 0     # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1     # ecx<- v[B+1]
     negl      %eax
     adcl      $0,%ecx
     negl      %ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0    # v[A+0]<- eax
+    SET_VREG_WORD %ecx rINST 1    # v[A+1]<- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
 .L_OP_NOT_LONG: /* 0x7e */
 /* File: x86/OP_NOT_LONG.S */
     /* unop vA, vB */
-    movzbl    rINST_HI,%ecx            # ecx<- BA
-    sarl      $4,%ecx                 # ecx<- B
-    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
-    andb      $0xf,rINST_LO           # rINST_FULL<- A
-    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
+    movzbl    rINSTbl,%ecx       # ecx<- BA
+    sarl      $4,%ecx           # ecx<- B
+    andb      $0xf,rINSTbl      # rINST<- A
+    GET_VREG_WORD %eax %ecx 0    # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1    # ecx<- v[B+1]
+    FETCH_INST_OPCODE 1 %edx
     notl      %eax
     notl      %ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0   # v[A+0]<- eax
+    SET_VREG_WORD %ecx rINST 1   # v[A+1]<- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -3158,15 +3421,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    flds    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    flds    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     fchs
-    fstps  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstps  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3178,15 +3441,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fldl    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     fchs
-    fstpl  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstpl  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3194,18 +3457,16 @@
 .L_OP_INT_TO_LONG: /* 0x81 */
 /* File: x86/OP_INT_TO_LONG.S */
     /* int to long vA, vB */
-    movzbl  rINST_HI,%ecx               # ecx<- +A
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    SPILL(rPC)                          # will step on edx later
-    andb    $0xf,%cl                   # ecx<- A
+    movzbl  rINSTbl,%eax                # eax<- +A
+    sarl    $4,%eax                    # eax<- B
+    GET_VREG_R %eax %eax                # eax<- vB
+    andb    $0xf,rINSTbl               # rINST<- A
     cltd                                # edx:eax<- sssssssBBBBBBBB
-    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1          # v[A+1]<- edx/rPC
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0          # v[A+0]<- %eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -3216,15 +3477,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fildl    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstps  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstps  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3236,15 +3497,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fildl    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fildl    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstpl  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstpl  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3255,14 +3516,14 @@
 /* File: x86/OP_MOVE.S */
     /* for move, move-object, long-to-int */
     /* op vA, vB */
-    movzbl rINST_HI,%eax         # eax<- BA
+    movzbl rINSTbl,%eax          # eax<- BA
     andb   $0xf,%al             # eax<- A
-    shrl   $12,rINST_FULL       # rINST_FULL<- B
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
-    GOTO_NEXT
+    shrl   $4,rINST            # rINST<- B
+    GET_VREG_R %ecx rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG %ecx %eax           # fp[A]<-fp[B]
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3274,15 +3535,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fildll    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstps  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstps  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3294,15 +3555,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fildll    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fildll    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstpl  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstpl  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3318,20 +3579,20 @@
  * to play some games.
  */
     /* float/double to int/long vA, vB */
-    movzbl    rINST_HI,%ecx           # ecx<- A+
-    sarl      $12,rINST_FULL         # rINST_FULL<- B
+    movzbl    rINSTbl,%ecx       # ecx<- A+
+    sarl      $4,rINST         # rINST<- B
     .if 0
-    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
+    fldl     (rFP,rINST,4)       # %st0<- vB
     .else
-    flds     (rFP,rINST_FULL,4)       # %st0<- vB
+    flds     (rFP,rINST,4)       # %st0<- vB
     .endif
     ftst
     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
     movzwl   LOCAL0_OFFSET(%ebp),%eax
     movb     $0xc,%ah
     movw     %ax,LOCAL0_OFFSET+2(%ebp)
-    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
-    FETCH_INST_WORD(1)
+    fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
+    FETCH_INST_OPCODE 1 %edx
     andb     $0xf,%cl                # ecx<- A
     .if 0
     fistpll  (rFP,%ecx,4)             # convert and store
@@ -3355,20 +3616,20 @@
  * to play some games.
  */
     /* float/double to int/long vA, vB */
-    movzbl    rINST_HI,%ecx           # ecx<- A+
-    sarl      $12,rINST_FULL         # rINST_FULL<- B
+    movzbl    rINSTbl,%ecx       # ecx<- A+
+    sarl      $4,rINST         # rINST<- B
     .if 0
-    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
+    fldl     (rFP,rINST,4)       # %st0<- vB
     .else
-    flds     (rFP,rINST_FULL,4)       # %st0<- vB
+    flds     (rFP,rINST,4)       # %st0<- vB
     .endif
     ftst
     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
     movzwl   LOCAL0_OFFSET(%ebp),%eax
     movb     $0xc,%ah
     movw     %ax,LOCAL0_OFFSET+2(%ebp)
-    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
-    FETCH_INST_WORD(1)
+    fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
+    FETCH_INST_OPCODE 1 %edx
     andb     $0xf,%cl                # ecx<- A
     .if 1
     fistpll  (rFP,%ecx,4)             # convert and store
@@ -3388,15 +3649,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    flds    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    flds    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstpl  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstpl  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3412,20 +3673,20 @@
  * to play some games.
  */
     /* float/double to int/long vA, vB */
-    movzbl    rINST_HI,%ecx           # ecx<- A+
-    sarl      $12,rINST_FULL         # rINST_FULL<- B
+    movzbl    rINSTbl,%ecx       # ecx<- A+
+    sarl      $4,rINST         # rINST<- B
     .if 1
-    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
+    fldl     (rFP,rINST,4)       # %st0<- vB
     .else
-    flds     (rFP,rINST_FULL,4)       # %st0<- vB
+    flds     (rFP,rINST,4)       # %st0<- vB
     .endif
     ftst
     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
     movzwl   LOCAL0_OFFSET(%ebp),%eax
     movb     $0xc,%ah
     movw     %ax,LOCAL0_OFFSET+2(%ebp)
-    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
-    FETCH_INST_WORD(1)
+    fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
+    FETCH_INST_OPCODE 1 %edx
     andb     $0xf,%cl                # ecx<- A
     .if 0
     fistpll  (rFP,%ecx,4)             # convert and store
@@ -3449,20 +3710,20 @@
  * to play some games.
  */
     /* float/double to int/long vA, vB */
-    movzbl    rINST_HI,%ecx           # ecx<- A+
-    sarl      $12,rINST_FULL         # rINST_FULL<- B
+    movzbl    rINSTbl,%ecx       # ecx<- A+
+    sarl      $4,rINST         # rINST<- B
     .if 1
-    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
+    fldl     (rFP,rINST,4)       # %st0<- vB
     .else
-    flds     (rFP,rINST_FULL,4)       # %st0<- vB
+    flds     (rFP,rINST,4)       # %st0<- vB
     .endif
     ftst
     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
     movzwl   LOCAL0_OFFSET(%ebp),%eax
     movb     $0xc,%ah
     movw     %ax,LOCAL0_OFFSET+2(%ebp)
-    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
-    FETCH_INST_WORD(1)
+    fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
+    FETCH_INST_OPCODE 1 %edx
     andb     $0xf,%cl                # ecx<- A
     .if 1
     fistpll  (rFP,%ecx,4)             # convert and store
@@ -3482,15 +3743,15 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    fldl    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $4,rINST         # rINST<- B
+    fldl    (rFP,rINST,4)      # %st0<- vB
+    andb     $0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
-    fstps  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    fstps  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3503,17 +3764,17 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
     
     movsbl %al,%eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3526,17 +3787,17 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
     
     movzwl %ax,%eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3549,17 +3810,17 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     
     
     movswl %ax,%eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3577,15 +3838,14 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    addl (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    addl (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3603,15 +3863,14 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    subl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    subl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3624,15 +3883,12 @@
     /* mul vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    SPILL(rPC)
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
-    UNSPILL(rPC)
-    movzbl   rINST_HI,%ecx          # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    GET_VREG_R %eax %eax            # eax<- vBB
+    imull    (rFP,%ecx,4),%eax      # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -3647,9 +3903,8 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    SPILL(rPC)
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -3674,9 +3929,8 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    SPILL(rPC)
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -3703,15 +3957,14 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    andl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    andl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3729,15 +3982,14 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    orl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    orl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3755,15 +4007,14 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    xorl   (rFP,%ecx,4),%eax              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    xorl   (rFP,%ecx,4),%eax                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3778,14 +4029,13 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     sall    %cl,%eax                          # ex: addl    %ecx,%eax
-    movzbl   rINST_HI,%ecx          # tmp<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3800,14 +4050,13 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     sarl    %cl,%eax                          # ex: addl    %ecx,%eax
-    movzbl   rINST_HI,%ecx          # tmp<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3822,14 +4071,13 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     shrl    %cl,%eax                          # ex: addl    %ecx,%eax
-    movzbl   rINST_HI,%ecx          # tmp<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3844,18 +4092,15 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    addl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    addl (rFP,%ecx,4),%edx         # ex: addl   (rFP,%ecx,4),%edx
     adcl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3870,18 +4115,15 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    subl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    subl (rFP,%ecx,4),%edx         # ex: addl   (rFP,%ecx,4),%edx
     sbbl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -3892,30 +4134,28 @@
      * Signed 64-bit integer multiply.
      *
      * We could definately use more free registers for
-     * this code.  We must spill rPC (edx) because it
-     * is used by imul.  We'll also spill rINST (ebx),
+     * this code.   We spill rINSTw (ebx),
      * giving us eax, ebc, ecx and edx as computational
-     * temps.  On top of that, we'll spill rIBASE (edi)
-     * for use as the vB pointer and rFP (esi) for use
+     * temps.  On top of that, we'll spill edi (rFP)
+     * for use as the vB pointer and esi for use
      * as the vC pointer.  Yuck.
      */
     /* mul-long vAA, vBB, vCC */
     movzbl    2(rPC),%eax              # eax<- B
     movzbl    3(rPC),%ecx              # ecx<- C
-    SPILL(rPC)
-    SPILL(rIBASE)
+    SPILL_TMP2(%esi)
     SPILL(rFP)
-    SPILL(rINST_FULL)
-    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
+    SPILL(rINST)
+    leal      (rFP,%eax,4),%esi        # esi<- &v[B]
     leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
-    movl      4(rIBASE),%ecx      # ecx<- Bmsw
-    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
-    movl      4(rFP),%eax         # eax<- Cmsw
-    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
-    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
-    movl      (rFP),%eax          # eax<- Clsw
-    mull      (rIBASE)            # eax<- (Clsw*Alsw)
-    UNSPILL(rINST_FULL)
+    movl      4(%esi),%ecx             # ecx<- Bmsw
+    imull     (rFP),%ecx               # ecx<- (Bmsw*Clsw)
+    movl      4(rFP),%eax              # eax<- Cmsw
+    imull     (%esi),%eax              # eax<- (Cmsw*Blsw)
+    addl      %eax,%ecx                # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
+    movl      (rFP),%eax               # eax<- Clsw
+    mull      (%esi)                   # eax<- (Clsw*Alsw)
+    UNSPILL(rINST)
     UNSPILL(rFP)
     jmp       .LOP_MUL_LONG_continue
 
@@ -3926,20 +4166,19 @@
     /* div vAA, vBB, vCC */
     movzbl    3(rPC),%eax              # eax<- CC
     movzbl    2(rPC),%ecx              # ecx<- BB
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .LOP_DIV_LONG_check_zero
     cmpl     $-1,%eax
     je       .LOP_DIV_LONG_check_neg1
 .LOP_DIV_LONG_notSpecial:
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
 .LOP_DIV_LONG_notSpecial1:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     jmp      .LOP_DIV_LONG_continue
 
@@ -3951,20 +4190,19 @@
     /* div vAA, vBB, vCC */
     movzbl    3(rPC),%eax              # eax<- CC
     movzbl    2(rPC),%ecx              # ecx<- BB
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .LOP_REM_LONG_check_zero
     cmpl     $-1,%eax
     je       .LOP_REM_LONG_check_neg1
 .LOP_REM_LONG_notSpecial:
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
 .LOP_REM_LONG_notSpecial1:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     jmp      .LOP_REM_LONG_continue
 
@@ -3981,18 +4219,15 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    andl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    andl (rFP,%ecx,4),%edx         # ex: addl   (rFP,%ecx,4),%edx
     andl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4007,18 +4242,15 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    orl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    orl (rFP,%ecx,4),%edx         # ex: addl   (rFP,%ecx,4),%edx
     orl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4033,18 +4265,15 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    xorl (rFP,%ecx,4),rPC         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    xorl (rFP,%ecx,4),%edx         # ex: addl   (rFP,%ecx,4),%edx
     xorl 4(rFP,%ecx,4),%eax         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4062,13 +4291,12 @@
     /* shl-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # ecx<- v[BB+1]
+    GET_VREG_R   %ecx %ecx              # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shldl     %eax,%edx
     sall      %cl,%eax
     testb     $32,%cl
@@ -4076,10 +4304,8 @@
     movl      %eax,%edx
     xorl      %eax,%eax
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
+    SET_VREG_WORD %edx rINST 1          # v[AA+1]<- %edx
+    FETCH_INST_OPCODE 2 %edx
     jmp       .LOP_SHL_LONG_finish
 
 /* ------------------------------ */
@@ -4097,13 +4323,12 @@
     /* shr-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # edx<- v[BB+1]
+    GET_VREG_R   %ecx %ecx              # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shrdl     %edx,%eax
     sarl      %cl,%edx
     testb     $32,%cl
@@ -4111,10 +4336,8 @@
     movl      %edx,%eax
     sarl      $31,%edx
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
+    SET_VREG_WORD %edx rINST 1          # v[AA+1]<- edx
+    FETCH_INST_OPCODE 2 %edx
     jmp       .LOP_SHR_LONG_finish
 
 /* ------------------------------ */
@@ -4132,13 +4355,12 @@
     /* shr-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # edx<- v[BB+1]
+    GET_VREG_R  %ecx %ecx               # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shrdl     %edx,%eax
     shrl      %cl,%edx
     testb     $32,%cl
@@ -4146,9 +4368,8 @@
     movl      %edx,%eax
     xorl      %edx,%edx
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
-    UNSPILL(rPC)
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %edx rINST 1          # v[BB+1]<- edx
     jmp       .LOP_USHR_LONG_finish
 
 /* ------------------------------ */
@@ -4162,15 +4383,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    flds    (rFP,%eax,4)           # vCC to fp stack
-    fadds   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstps   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    flds    (rFP,%eax,4)         # vCC to fp stack
+    fadds   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstps   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4184,15 +4404,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    flds    (rFP,%eax,4)           # vCC to fp stack
-    fsubs   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstps   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    flds    (rFP,%eax,4)         # vCC to fp stack
+    fsubs   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstps   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4206,15 +4425,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    flds    (rFP,%eax,4)           # vCC to fp stack
-    fmuls   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstps   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    flds    (rFP,%eax,4)         # vCC to fp stack
+    fmuls   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstps   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4228,15 +4446,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    flds    (rFP,%eax,4)           # vCC to fp stack
-    fdivs   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstps   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    flds    (rFP,%eax,4)         # vCC to fp stack
+    fdivs   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstps   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4248,17 +4465,17 @@
     movzbl   2(rPC),%eax            # eax<- CC
     flds     (rFP,%ecx,4)           # vCC to fp stack
     flds     (rFP,%eax,4)           # vCC to fp stack
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
+    movzbl   rINSTbl,%ecx           # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(2)
+    ADVANCE_PC 2
     fstps    (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -4271,15 +4488,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    fldl    (rFP,%eax,4)           # vCC to fp stack
-    faddl   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstpl   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    fldl    (rFP,%eax,4)         # vCC to fp stack
+    faddl   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstpl   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4293,15 +4509,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    fldl    (rFP,%eax,4)           # vCC to fp stack
-    fsubl   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstpl   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    fldl    (rFP,%eax,4)         # vCC to fp stack
+    fsubl   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstpl   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4315,15 +4530,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    fldl    (rFP,%eax,4)           # vCC to fp stack
-    fmull   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstpl   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    fldl    (rFP,%eax,4)         # vCC to fp stack
+    fmull   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstpl   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4337,15 +4551,14 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    fldl    (rFP,%eax,4)           # vCC to fp stack
-    fdivl   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    fstpl   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    fldl    (rFP,%eax,4)         # vCC to fp stack
+    fdivl   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    fstpl   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4357,17 +4570,17 @@
     movzbl   2(rPC),%eax            # eax<- CC
     fldl     (rFP,%ecx,4)           # vCC to fp stack
     fldl     (rFP,%eax,4)           # vCC to fp stack
-    movzbl   rINST_HI,%ecx          # ecx<- AA
-    FETCH_INST_WORD(2)
+    movzbl   rINSTbl,%ecx           # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(2)
+    ADVANCE_PC 2
     fstpl    (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -4389,14 +4602,14 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $0xf,%cl                   # ecx<- A
-    addl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $0xf,%cl                  # ecx<- A
+    addl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4419,14 +4632,14 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $0xf,%cl                   # ecx<- A
-    subl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $0xf,%cl                  # ecx<- A
+    subl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4434,17 +4647,15 @@
 .L_OP_MUL_INT_2ADDR: /* 0xb2 */
 /* File: x86/OP_MUL_INT_2ADDR.S */
     /* mul vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    andb    $0xf,%cl                   # ecx<- A
-    SPILL(rPC)
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    andb    $0xf,%cl                  # ecx<- A
     imull   (rFP,%ecx,4),%eax
-    UNSPILL(rPC)
-    SET_VREG(%eax,%ecx)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG %eax %ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -4456,13 +4667,11 @@
      * op1=-1.
      */
     /* div/rem/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
-    sarl     $4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
-    SPILL(rPC)
+    movzx    rINSTbl,%ecx          # eax<- BA
+    sarl     $4,%ecx              # ecx<- B
+    GET_VREG_R %ecx %ecx           # eax<- vBB
+    andb     $0xf,rINSTbl         # rINST<- A
+    GET_VREG_R %eax rINST          # eax<- vBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -4484,13 +4693,11 @@
      * op1=-1.
      */
     /* div/rem/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
-    sarl     $4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
-    SPILL(rPC)
+    movzx    rINSTbl,%ecx          # eax<- BA
+    sarl     $4,%ecx              # ecx<- B
+    GET_VREG_R %ecx %ecx           # eax<- vBB
+    andb     $0xf,rINSTbl         # rINST<- A
+    GET_VREG_R %eax rINST          # eax<- vBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -4522,14 +4729,14 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $0xf,%cl                   # ecx<- A
-    andl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $0xf,%cl                  # ecx<- A
+    andl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4552,14 +4759,14 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $0xf,%cl                   # ecx<- A
-    orl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $0xf,%cl                  # ecx<- A
+    orl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4582,14 +4789,14 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $0xf,%cl                   # ecx<- A
-    xorl     %eax,(rFP,%ecx,4)                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $0xf,%cl                  # ecx<- A
+    xorl     %eax,(rFP,%ecx,4)                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4601,17 +4808,16 @@
      * Generic 32-bit "shift/2addr" operation.
      */
     /* shift/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
+    movzx    rINSTbl,%ecx           # eax<- BA
     sarl     $4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
+    GET_VREG_R %ecx %ecx            # eax<- vBB
+    andb     $0xf,rINSTbl          # rINST<- A
+    GET_VREG_R %eax rINST           # eax<- vAA
     sall    %cl,%eax                          # ex: sarl %cl,%eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG %eax rINST
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4623,17 +4829,16 @@
      * Generic 32-bit "shift/2addr" operation.
      */
     /* shift/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
+    movzx    rINSTbl,%ecx           # eax<- BA
     sarl     $4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
+    GET_VREG_R %ecx %ecx            # eax<- vBB
+    andb     $0xf,rINSTbl          # rINST<- A
+    GET_VREG_R %eax rINST           # eax<- vAA
     sarl    %cl,%eax                          # ex: sarl %cl,%eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG %eax rINST
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4645,17 +4850,16 @@
      * Generic 32-bit "shift/2addr" operation.
      */
     /* shift/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
+    movzx    rINSTbl,%ecx           # eax<- BA
     sarl     $4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
+    GET_VREG_R %ecx %ecx            # eax<- vBB
+    andb     $0xf,rINSTbl          # rINST<- A
+    GET_VREG_R %eax rINST           # eax<- vAA
     shrl    %cl,%eax                          # ex: sarl %cl,%eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG %eax rINST
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4667,17 +4871,16 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $0xF,rINST_LO            # rINST_FULL<- A
-    addl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
-    adcl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $0xF,rINSTbl             # rINST<- A
+    addl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
+    adcl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4689,17 +4892,16 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $0xF,rINST_LO            # rINST_FULL<- A
-    subl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
-    sbbl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $0xF,rINSTbl             # rINST<- A
+    subl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
+    sbbl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4710,29 +4912,28 @@
      * Signed 64-bit integer multiply, 2-addr version
      *
      * We could definately use more free registers for
-     * this code.  We must spill rPC (edx) because it
+     * this code.  We must spill %edx (edx) because it
      * is used by imul.  We'll also spill rINST (ebx),
      * giving us eax, ebc, ecx and edx as computational
-     * temps.  On top of that, we'll spill rIBASE (edi)
+     * temps.  On top of that, we'll spill %esi (edi)
      * for use as the vA pointer and rFP (esi) for use
      * as the vB pointer.  Yuck.
      */
     /* mul-long/2addr vA, vB */
-    movzbl    rINST_HI,%eax            # eax<- BA
+    movzbl    rINSTbl,%eax             # eax<- BA
     andb      $0xf,%al                # eax<- A
-    sarl      $12,rINST_FULL          # rINST_FULL<- B
-    SPILL(rPC)
-    SPILL(rIBASE)
+    sarl      $4,rINST                # rINST<- B
+    SPILL_TMP2(%esi)
     SPILL(rFP)
-    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
-    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
-    movl      4(rIBASE),%ecx      # ecx<- Amsw
-    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
-    movl      4(rFP),%eax         # eax<- Bmsw
-    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
-    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
-    movl      (rFP),%eax          # eax<- Blsw
-    mull      (rIBASE)            # eax<- (Blsw*Alsw)
+    leal      (rFP,%eax,4),%esi        # %esi<- &v[A]
+    leal      (rFP,rINST,4),rFP        # rFP<- &v[B]
+    movl      4(%esi),%ecx             # ecx<- Amsw
+    imull     (rFP),%ecx               # ecx<- (Amsw*Blsw)
+    movl      4(rFP),%eax              # eax<- Bmsw
+    imull     (%esi),%eax              # eax<- (Bmsw*Alsw)
+    addl      %eax,%ecx                # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
+    movl      (rFP),%eax               # eax<- Blsw
+    mull      (%esi)                   # eax<- (Blsw*Alsw)
     jmp       .LOP_MUL_LONG_2ADDR_continue
 
 /* ------------------------------ */
@@ -4740,21 +4941,19 @@
 .L_OP_DIV_LONG_2ADDR: /* 0xbe */
 /* File: x86/OP_DIV_LONG_2ADDR.S */
     /* div/2addr vA, vB */
-    movzbl    rINST_HI,%eax
+    movzbl    rINSTbl,%eax
     shrl      $4,%eax                  # eax<- B
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    andb      $0xf,rINSTbl             # rINST<- A
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .LOP_DIV_LONG_2ADDR_check_zero
     cmpl     $-1,%eax
     je       .LOP_DIV_LONG_2ADDR_check_neg1
 .LOP_DIV_LONG_2ADDR_notSpecial:
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
 .LOP_DIV_LONG_2ADDR_notSpecial1:
     jmp      .LOP_DIV_LONG_2ADDR_continue
 
@@ -4764,21 +4963,19 @@
 /* File: x86/OP_REM_LONG_2ADDR.S */
 /* File: x86/OP_DIV_LONG_2ADDR.S */
     /* div/2addr vA, vB */
-    movzbl    rINST_HI,%eax
+    movzbl    rINSTbl,%eax
     shrl      $4,%eax                  # eax<- B
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    andb      $0xf,rINSTbl             # rINST<- A
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .LOP_REM_LONG_2ADDR_check_zero
     cmpl     $-1,%eax
     je       .LOP_REM_LONG_2ADDR_check_neg1
 .LOP_REM_LONG_2ADDR_notSpecial:
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
 .LOP_REM_LONG_2ADDR_notSpecial1:
     jmp      .LOP_REM_LONG_2ADDR_continue
 
@@ -4792,17 +4989,16 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $0xF,rINST_LO            # rINST_FULL<- A
-    andl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
-    andl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $0xF,rINSTbl             # rINST<- A
+    andl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
+    andl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4814,17 +5010,16 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $0xF,rINST_LO            # rINST_FULL<- A
-    orl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
-    orl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $0xF,rINSTbl             # rINST<- A
+    orl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
+    orl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4836,17 +5031,16 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $0xF,rINST_LO            # rINST_FULL<- A
-    xorl %eax,(rFP,rINST_FULL,4)         # example: addl   %eax,(rFP,rINST_FULL,4)
-    xorl %ecx,4(rFP,rINST_FULL,4)         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $0xF,rINSTbl             # rINST<- A
+    xorl %eax,(rFP,rINST,4)         # example: addl   %eax,(rFP,rINST,4)
+    xorl %ecx,4(rFP,rINST,4)         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4860,15 +5054,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx             # ecx<- BA
+    andb      $0xf,rINSTbl            # rINST<- A
+    GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
+    sarl      $4,%ecx                 # ecx<- B
+    GET_VREG_WORD %edx rINST 1         # edx<- v[AA+1]
+    GET_VREG_R  %ecx %ecx              # ecx<- vBB
     shldl     %eax,%edx
     sall      %cl,%eax
     testb     $32,%cl
@@ -4876,8 +5068,7 @@
     movl      %eax,%edx
     xorl      %eax,%eax
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1         # v[AA+1]<- edx
     jmp       .LOP_SHL_LONG_2ADDR_finish
 
 /* ------------------------------ */
@@ -4891,15 +5082,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx         # ecx<- BA
+    andb      $0xf,rINSTbl        # rINST<- A
+    GET_VREG_WORD %eax rINST 0     # eax<- v[AA+0]
+    sarl      $4,%ecx             # ecx<- B
+    GET_VREG_WORD %edx rINST 1     # edx<- v[AA+1]
+    GET_VREG_R %ecx %ecx           # ecx<- vBB
     shrdl     %edx,%eax
     sarl      %cl,%edx
     testb     $32,%cl
@@ -4907,8 +5096,7 @@
     movl      %edx,%eax
     sarl      $31,%edx
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1     # v[AA+1]<- edx
     jmp       .LOP_SHR_LONG_2ADDR_finish
 
 /* ------------------------------ */
@@ -4922,15 +5110,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx             # ecx<- BA
+    andb      $0xf,rINSTbl            # rINST<- A
+    GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
+    sarl      $4,%ecx                 # ecx<- B
+    GET_VREG_WORD %edx rINST 1         # edx<- v[AA+1]
+    GET_VREG_R %ecx %ecx               # ecx<- vBB
     shrdl     %edx,%eax
     shrl      %cl,%edx
     testb     $32,%cl
@@ -4938,8 +5124,7 @@
     movl      %edx,%eax
     xorl      %edx,%edx
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1         # v[AA+1]<- edx
     jmp       .LOP_USHR_LONG_2ADDR_finish
 
 /* ------------------------------ */
@@ -4954,15 +5139,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    flds    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fadds   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstps    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    flds    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fadds   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstps    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -4977,15 +5162,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    flds    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fsubs   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstps    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    flds    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fsubs   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstps    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5000,15 +5185,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    flds    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fmuls   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstps    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    flds    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fmuls   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstps    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5023,15 +5208,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    flds    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fdivs   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstps    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    flds    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fdivs   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstps    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5039,21 +5224,21 @@
 .L_OP_REM_FLOAT_2ADDR: /* 0xca */
 /* File: x86/OP_REM_FLOAT_2ADDR.S */
     /* rem_float/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
+    movzx   rINSTbl,%ecx                # ecx<- A+
+    sarl    $4,rINST                  # rINST<- B
+    flds     (rFP,rINST,4)              # vBB to fp stack
     andb    $0xf,%cl                   # ecx<- A
     flds     (rFP,%ecx,4)               # vAA to fp stack
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     fstps    (rFP,%ecx,4)               # %st to vA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -5067,15 +5252,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    fldl    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    faddl   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstpl    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    fldl    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    faddl   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstpl    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5090,15 +5275,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    fldl    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fsubl   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstpl    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    fldl    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fsubl   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstpl    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5113,15 +5298,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    fldl    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fmull   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstpl    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    fldl    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fmull   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstpl    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5136,15 +5321,15 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $0xf,%cl                   # ecx<- A
-    fldl    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fdivl   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    fstpl    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $0xf,%cl              # ecx<- A
+    fldl    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $4,rINST             # rINST<- B
+    fdivl   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    fstpl    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5152,21 +5337,21 @@
 .L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
 /* File: x86/OP_REM_DOUBLE_2ADDR.S */
     /* rem_float/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $12,rINST_FULL             # rINST_FULL<- B
-    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
+    movzx   rINSTbl,%ecx                # ecx<- A+
+    sarl    $4,rINST                  # rINST<- B
+    fldl     (rFP,rINST,4)              # vBB to fp stack
     andb    $0xf,%cl                   # ecx<- A
     fldl     (rFP,%ecx,4)               # vAA to fp stack
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     fstpl    (rFP,%ecx,4)               # %st to vA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -5183,17 +5368,16 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
+    andb     $0xf,rINSTbl              # rINST<- A
     addl %ecx,%eax                              # for example: addl %ecx, %eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5211,17 +5395,16 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
+    andb     $0xf,rINSTbl              # rINST<- A
     subl %eax,%ecx                              # for example: addl %ecx, %eax
-    SET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5229,20 +5412,17 @@
 .L_OP_MUL_INT_LIT16: /* 0xd2 */
 /* File: x86/OP_MUL_INT_LIT16.S */
     /* mul/lit16 vA, vB, #+CCCC */
-    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    SPILL(rPC)
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
-    imull     %ecx,%eax                 # trashes rPC
-    UNSPILL(rPC)
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    andb     $0xf,rINSTbl              # rINST<- A
+    imull     %ecx,%eax                 # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -5254,14 +5434,12 @@
      * op1=-1.
      */
     /* div/rem/lit16 vA, vB, #+CCCC */
-    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
-    sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
-    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
-    SPILL(rPC)
+    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
+    movzbl   rINSTbl,%eax         # eax<- 000000BA
+    sarl     $4,%eax             # eax<- B
+    GET_VREG_R %eax %eax          # eax<- vB
+    movswl   2(rPC),%ecx          # ecx<- ssssCCCC
+    andb     $0xf,rINSTbl        # rINST<- A
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -5283,14 +5461,12 @@
      * op1=-1.
      */
     /* div/rem/lit16 vA, vB, #+CCCC */
-    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
-    sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
-    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
-    SPILL(rPC)
+    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
+    movzbl   rINSTbl,%eax         # eax<- 000000BA
+    sarl     $4,%eax             # eax<- B
+    GET_VREG_R %eax %eax          # eax<- vB
+    movswl   2(rPC),%ecx          # ecx<- ssssCCCC
+    andb     $0xf,rINSTbl        # rINST<- A
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $-1,%ecx
@@ -5317,17 +5493,16 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
+    andb     $0xf,rINSTbl              # rINST<- A
     andl %ecx,%eax                              # for example: addl %ecx, %eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5345,17 +5520,16 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
+    andb     $0xf,rINSTbl              # rINST<- A
     orl     %ecx,%eax                              # for example: addl %ecx, %eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5373,17 +5547,16 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $0xf,rINST_LO             # rINST_FULL<- A
+    andb     $0xf,rINSTbl              # rINST<- A
     xor    %ecx,%eax                              # for example: addl %ecx, %eax
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5404,13 +5577,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     addl %ecx,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5431,13 +5603,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     subl  %eax,%ecx                             # ex: addl %ecx,%eax
-    SET_VREG  (%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %ecx rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5447,15 +5618,12 @@
     /* mul/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    SPILL(rPC)
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
-    imull     %ecx,%eax                # trashes rPC
-    UNSPILL(rPC)
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GET_VREG_R   %eax %eax             # eax<- rBB
+    imull     %ecx,%eax                # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG  %eax rINST
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -5467,11 +5635,9 @@
      * op0=minint & op1=-1
      */
     /* div/rem/lit8 vAA, vBB, #+CC */
-    movzbl    2(rPC),%eax              # eax<- BB
-    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    GET_VREG  (%eax,%eax)              # eax<- rBB
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    SPILL(rPC)
+    movzbl    2(rPC),%eax        # eax<- BB
+    movsbl    3(rPC),%ecx        # ecx<- ssssssCC
+    GET_VREG_R  %eax %eax        # eax<- rBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $0x80000000,%eax
@@ -5493,11 +5659,9 @@
      * op0=minint & op1=-1
      */
     /* div/rem/lit8 vAA, vBB, #+CC */
-    movzbl    2(rPC),%eax              # eax<- BB
-    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    GET_VREG  (%eax,%eax)              # eax<- rBB
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    SPILL(rPC)
+    movzbl    2(rPC),%eax        # eax<- BB
+    movsbl    3(rPC),%ecx        # ecx<- ssssssCC
+    GET_VREG_R  %eax %eax        # eax<- rBB
     cmpl     $0,%ecx
     je       common_errDivideByZero
     cmpl     $0x80000000,%eax
@@ -5527,13 +5691,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     andl %ecx,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5554,13 +5717,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     orl     %ecx,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5581,13 +5743,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     xor    %ecx,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5608,13 +5769,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     sall  %cl,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5635,13 +5795,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     sarl    %cl,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5662,13 +5821,12 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     shrl     %cl,%eax                             # ex: addl %ecx,%eax
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5682,21 +5840,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_VOLATILE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_VOLATILE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_VOLATILE_resolve
 
 
@@ -5712,21 +5868,19 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_VOLATILE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_VOLATILE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_VOLATILE_resolve
 
 
@@ -5741,7 +5895,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -5750,11 +5904,10 @@
     je        .LOP_SGET_VOLATILE_resolve                # if not, make it so
 .LOP_SGET_VOLATILE_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5768,7 +5921,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -5776,12 +5929,11 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_VOLATILE_resolve                # if not, make it so
 .LOP_SPUT_VOLATILE_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -5795,21 +5947,19 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IGET_OBJECT_VOLATILE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IGET_OBJECT_VOLATILE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .LOP_IGET_OBJECT_VOLATILE_resolve
 
 
@@ -5817,57 +5967,45 @@
     .balign 64
 .L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_IGET_WIDE_VOLATILE     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
 .L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_IPUT_WIDE_VOLATILE     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
 .L_OP_SGET_WIDE_VOLATILE: /* 0xea */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_SGET_WIDE_VOLATILE     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
 .L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_SPUT_WIDE_VOLATILE     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
@@ -5887,17 +6025,14 @@
      * exception is indicated by AA, with some detail provided by BBBB.
      */
     /* op AA, ref@BBBB */
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                     # eax<- BBBB
     movl     offGlue_method(%ecx),%ecx       # ecx<- glue->method
-    EXPORT_PC()
-    movzbl   rINST_HI,rINST_FULL             # rINST_FULL<- AA
+    EXPORT_PC
     movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
-    movl     rINST_FULL,OUT_ARG1(%esp)       # arg1<- AA
+    movl     rINST,OUT_ARG1(%esp)            # arg1<- AA
     movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
-    SPILL(rPC)
     call     dvmThrowVerificationError       # call(method, kind, ref)
-    UNSPILL(rPC)
     jmp      common_exceptionThrown          # handle exception
 
 /* ------------------------------ */
@@ -5911,36 +6046,32 @@
      *
      * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
      *
+     * Ignores argument count - always loads 4.
+     *
      */
     /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl      rGLUE,%ecx
+    EXPORT_PC
     movzwl    2(rPC),%eax               # eax<- BBBB
     leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
     movl      %ecx,OUT_ARG4(%esp)
-    sarl      $12,rINST_FULL           # rINST_FULL<- arg count (0-4)
-    SPILL(rPC)
     call      .LOP_EXECUTE_INLINE_continue      # make call; will return after
-    UNSPILL(rPC)
     testl     %eax,%eax                 # successful?
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     je        common_exceptionThrown    # no, handle exception
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
 .L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_EXECUTE_INLINE_RANGE     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
@@ -5949,23 +6080,20 @@
     /*
      * invoke-direct-empty is a no-op in a "standard" interpreter.
      */
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
+    FETCH_INST_WORD 3
+    ADVANCE_PC 3
     GOTO_NEXT
 
 /* ------------------------------ */
     .balign 64
 .L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_OP_RETURN_VOID_BARRIER     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
 /* ------------------------------ */
     .balign 64
@@ -5973,19 +6101,18 @@
 /* File: x86/OP_IGET_QUICK.S */
     /* For: iget-quick, iget-object-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     cmpl      $0,%ecx                  # is object null?
     je        common_errNullObject
     movl      (%ecx,%eax,1),%eax
-    movzbl    rINST_HI,%ecx
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    andb      $0xf,%cl                 # rINST_FULL<- A
-    SET_VREG  (%eax,%ecx)               # fp[A]<- result
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    andb      $0xf,rINSTbl             # rINST<- A
+    SET_VREG  %eax rINST                # fp[A]<- result
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -5993,22 +6120,21 @@
 /* File: x86/OP_IGET_WIDE_QUICK.S */
     /* For: iget-wide-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     cmpl      $0,%ecx                  # is object null?
     je        common_errNullObject
     leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
     movl      (%eax),%ecx               # ecx<- lsw
-    movl      4(%eax),%eax               # eax<- msw
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      4(%eax),%eax              # eax<- msw
+    andb      $0xf,rINSTbl             # rINST<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %ecx rINST 0          # v[A+0]<- lsw
+    SET_VREG_WORD %eax rINST 1          # v[A+1]<- msw
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -6017,19 +6143,18 @@
 /* File: x86/OP_IGET_QUICK.S */
     /* For: iget-quick, iget-object-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     cmpl      $0,%ecx                  # is object null?
     je        common_errNullObject
     movl      (%ecx,%eax,1),%eax
-    movzbl    rINST_HI,%ecx
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    andb      $0xf,%cl                 # rINST_FULL<- A
-    SET_VREG  (%eax,%ecx)               # fp[A]<- result
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    andb      $0xf,rINSTbl             # rINST<- A
+    SET_VREG  %eax rINST                # fp[A]<- result
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -6038,19 +6163,18 @@
 /* File: x86/OP_IPUT_QUICK.S */
     /* For: iput-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
+    andb      $0xf,rINSTbl             # rINST<- A
+    GET_VREG_R  rINST,rINST             # rINST<- v[A]
     movzwl    2(rPC),%eax               # eax<- field byte offset
-    testl     %ecx,%ecx                  # is object null?
+    testl     %ecx,%ecx                 # is object null?
+    FETCH_INST_OPCODE 2 %edx
     je        common_errNullObject
-    movl      rINST_FULL,(%ecx,%eax,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,(%ecx,%eax,1)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -6058,22 +6182,21 @@
 /* File: x86/OP_IPUT_WIDE_QUICK.S */
     /* For: iput-wide-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     testl      %ecx,%ecx                # is object null?
     je        common_errNullObject
     leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
+    andb      $0xf,rINSTbl             # rINST<- A
+    GET_VREG_WORD %eax rINST 0          # eax<- lsw
+    GET_VREG_WORD rINST rINST 1         # rINST<- msw
+    FETCH_INST_OPCODE 2 %edx
     movl      %eax,(%ecx)
-    movl      rINST_FULL,4(%ecx)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,4(%ecx)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* ------------------------------ */
     .balign 64
@@ -6081,17 +6204,16 @@
 /* File: x86/OP_IPUT_OBJECT_QUICK.S */
     /* For: iput-object-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
-    movzbl    rINST_HI,rINST_FULL
-    andb      $0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
+    andb      $0xf,rINSTbl             # rINST<- A
+    GET_VREG_R  rINST rINST             # rINST<- v[A]
     movzwl    2(rPC),%eax               # eax<- field byte offset
     testl     %ecx,%ecx                 # is object null?
     je        common_errNullObject
-    movl      rINST_FULL,(%ecx,%eax,1)
-    GET_GLUE(%eax)
+    movl      rINST,(%ecx,%eax,1)
+    movl      rGLUE,%eax
     jmp       .LOP_IPUT_OBJECT_QUICK_finish
 
 /* ------------------------------ */
@@ -6110,12 +6232,12 @@
     .if     (!0)
     andl      $0xf,%eax                # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
+    GET_VREG_R  %eax %eax               # eax<- vC ("this" ptr)
     testl     %eax,%eax                 # null?
     je        common_errNullObject      # yep, throw exception
     movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
     movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
-    EXPORT_PC()                         # might throw later - get ready
+    EXPORT_PC                           # might throw later - get ready
     movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
     jmp       common_invokeMethodNoRange
 
@@ -6136,12 +6258,12 @@
     .if     (!1)
     andl      $0xf,%eax                # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
+    GET_VREG_R  %eax %eax               # eax<- vC ("this" ptr)
     testl     %eax,%eax                 # null?
     je        common_errNullObject      # yep, throw exception
     movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
     movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
-    EXPORT_PC()                         # might throw later - get ready
+    EXPORT_PC                           # might throw later - get ready
     movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
     jmp       common_invokeMethodRange
 
@@ -6157,20 +6279,20 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    4(rPC),%eax               # eax<- GFED or CCCC
     movl      offGlue_method(%ecx),%ecx # ecx<- current method
     .if       (!0)
     andl      $0xf,%eax                # eax<- D (or stays CCCC)
     .endif
     movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
-    GET_VREG(%eax,%eax)                 # eax<- "this"
+    GET_VREG_R  %eax %eax               # eax<- "this"
     movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
     testl     %eax,%eax                 # null "this"?
     je        common_errNullObject      # "this" is null, throw exception
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
-    EXPORT_PC()
+    EXPORT_PC
     movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
     jmp       common_invokeMethodNoRange
 
@@ -6186,20 +6308,20 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    4(rPC),%eax               # eax<- GFED or CCCC
     movl      offGlue_method(%ecx),%ecx # ecx<- current method
     .if       (!1)
     andl      $0xf,%eax                # eax<- D (or stays CCCC)
     .endif
     movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
-    GET_VREG(%eax,%eax)                 # eax<- "this"
+    GET_VREG_R  %eax %eax               # eax<- "this"
     movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
     testl     %eax,%eax                 # null "this"?
     je        common_errNullObject      # "this" is null, throw exception
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
-    EXPORT_PC()
+    EXPORT_PC
     movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
     jmp       common_invokeMethodRange
 
@@ -6215,21 +6337,19 @@
      * for: iput-object
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .LOP_IPUT_OBJECT_VOLATILE_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .LOP_IPUT_OBJECT_VOLATILE_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .LOP_IPUT_OBJECT_VOLATILE_resolve
 
 
@@ -6244,7 +6364,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -6253,11 +6373,10 @@
     je        .LOP_SGET_OBJECT_VOLATILE_resolve                # if not, make it so
 .LOP_SGET_OBJECT_VOLATILE_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 
 
 /* ------------------------------ */
@@ -6269,7 +6388,7 @@
      * SPUT object handler.
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -6277,8 +6396,8 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .LOP_SPUT_OBJECT_VOLATILE_resolve                # if not, make it so
 .LOP_SPUT_OBJECT_VOLATILE_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
+    movzbl    rINSTbl,%ecx                       # ecx<- AA
+    GET_VREG_R  %ecx %ecx
     jmp       .LOP_SPUT_OBJECT_VOLATILE_continue
 
 
@@ -6312,101 +6431,92 @@
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .LOP_CONST_STRING_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movzwl   2(rPC),%ecx               # ecx<- BBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveString          # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_CONST_STRING_JUMBO */
 
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .LOP_CONST_STRING_JUMBO_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movl     2(rPC),%ecx               # ecx<- BBBBBBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveString          # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_CONST_CLASS */
 
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .LOP_CONST_CLASS_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movl     $1,OUT_ARG2(%esp)        # true
     movzwl   2(rPC),%ecx               # ecx<- BBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveClass           # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_MONITOR_ENTER */
 
 .LOP_MONITOR_ENTER_continue:
-    SPILL(rPC)                          # have to - caller save
     movl    %ecx,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     call    dvmLockObject               # dvmLockObject(self,object)
-    UNSPILL(rPC)
 #ifdef WITH_DEADLOCK_PREDICTION
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
     movl    offThread_exception(%ecx),%eax
     testl   %eax,%eax
     jne     common_exceptionThrown
 #endif
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     GOTO_NEXT
 
 /* continuation for OP_MONITOR_EXIT */
 
 .LOP_MONITOR_EXIT_continue:
     call    dvmUnlockObject             # unlock(self,obj)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
     testl   %eax,%eax                   # success?
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     je      common_exceptionThrown      # no, exception pending
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 .LOP_MONITOR_EXIT_errNullObject:
-    ADVANCE_PC(1)                       # advance before throw
+    ADVANCE_PC 1                        # advance before throw
     jmp     common_errNullObject
 
 /* continuation for OP_CHECK_CAST */
@@ -6415,51 +6525,45 @@
      * Trivial test failed, need to perform full check.  This is common.
      *  ecx holds obj->clazz
      *  eax holds class resolved from BBBB
-     *  rINST_FULL holds object
+     *  rINST holds object
      */
 .LOP_CHECK_CAST_fullcheck:
     movl    %eax,OUT_ARG1(%esp)
     movl    %ecx,OUT_ARG0(%esp)
-    SPILL(rPC)
     call    dvmInstanceofNonTrivial     # eax<- boolean result
-    UNSPILL(rPC)
     testl   %eax,%eax                   # failed?
     jne     .LOP_CHECK_CAST_okay            # no, success
 
     # A cast has failed.  We need to throw a ClassCastException with the
     # class of the object that failed to be cast.
-    EXPORT_PC()
-    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
+    EXPORT_PC
+    movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
     movl    $.LstrClassCastException,%eax
     movl    offClassObject_descriptor(%ecx),%ecx
     movl    %eax,OUT_ARG0(%esp)     # arg0<- message
     movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
-    SPILL(rPC)
     call    dvmThrowExceptionWithClassMessage
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
     /*
      * Resolution required.  This is the least-likely path, and we're
      * going to have to recreate some data.
      *
-     *  rINST_FULL holds object
+     *  rINST holds object
      */
 .LOP_CHECK_CAST_resolve:
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl    rGLUE,%ecx
+    EXPORT_PC
     movzwl  2(rPC),%eax                # eax<- BBBB
     movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
     movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
     movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
     movl    $0,OUT_ARG2(%esp)         # arg2<- false
     movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
-    SPILL(rPC)
     call    dvmResolveClass            # eax<- resolved ClassObject ptr
-    UNSPILL(rPC)
     testl   %eax,%eax                  # got null?
     je      common_exceptionThrown     # yes, handle exception
-    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
+    movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
     jmp     .LOP_CHECK_CAST_resolved       # pick up where we left off
 
 /* continuation for OP_INSTANCE_OF */
@@ -6468,8 +6572,7 @@
      * Trivial test failed, need to perform full check.  This is common.
      *  eax holds obj->clazz
      *  ecx holds class resolved from BBBB
-     *  rINST_HI has BA
-     *  rPC already spilled
+     *  rINST has BA
      */
 .LOP_INSTANCE_OF_fullcheck:
     movl    %eax,OUT_ARG0(%esp)
@@ -6479,57 +6582,51 @@
 
     /*
      * eax holds boolean result
-     * rINST_HI holds BA
+     * rINST holds BA
      */
 .LOP_INSTANCE_OF_store:
-    UNSPILL(rPC)
-    movzbl  rINST_HI,%ecx               # ecx<- BA
-    FETCH_INST_WORD(2)
-    andb    $0xf,%cl                   # ecl<- A
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)                 # vA<- eax
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    andb    $0xf,rINSTbl               # <- A
+    ADVANCE_PC 2
+    SET_VREG %eax rINST                 # vA<- eax
+    GOTO_NEXT_R %edx
 
     /*
      * Trivial test succeeded, save and bail.
      *  r9 holds A
      */
 .LOP_INSTANCE_OF_trivial:
-    UNSPILL(rPC)
-    movzbl  rINST_HI,%ecx               # ecx<- BA
-    FETCH_INST_WORD(2)
-    andb    $0xf,%cl                   # ecl<- A
-    ADVANCE_PC(2)
+    FETCH_INST_OPCODE 2 %edx
+    andb    $0xf,rINSTbl               # <- A
+    ADVANCE_PC 2
     movl    $1,%eax
-    SET_VREG(%eax,%ecx)                  # vA<- true
-    GOTO_NEXT
+    SET_VREG %eax rINST                 # vA<- true
+    GOTO_NEXT_R %edx
 
     /*
      * Resolution required.  This is the least-likely path.
      *
-     *  rPC holds BBBB
-     *  rINST_HI holds BA
+     *  edx holds BBBB
+     *  rINST holds BA
      */
 .LOP_INSTANCE_OF_resolve:
-    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
-    GET_GLUE(%ecx)
-    UNSPILL(rPC)
+    movl    %edx,OUT_ARG1(%esp)         # arg1<- BBBB
+    movl    rGLUE,%ecx
     movl    offGlue_method(%ecx),%ecx
     movl    $1,OUT_ARG2(%esp)          # arg2<- true
     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
-    EXPORT_PC()
+    EXPORT_PC
     movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
     call    dvmResolveClass             # eax<- resolved ClassObject ptr
-    UNSPILL(rPC)
     testl   %eax,%eax                   # success?
     je      common_exceptionThrown      # no, handle exception
 /* Now, we need to sync up with fast path.  We need eax to
  * hold the obj->clazz, and ecx to hold the resolved class
  */
     movl    %eax,%ecx                   # ecx<- resolved class
-    movzbl  rINST_HI,%eax               # eax<- BA
+    movl    rINST,%eax                # eax<- BA
     sarl    $4,%eax                    # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
+    GET_VREG_R %eax %eax                # eax<- vB (obj)
     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
     jmp     .LOP_INSTANCE_OF_resolved
 
@@ -6543,14 +6640,12 @@
 .LOP_NEW_INSTANCE_finish: # ecx=class
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmAllocObject             # eax<- new object
-    UNSPILL(rPC)
-    movl     rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    FETCH_INST_OPCODE 2 %edx
     testl    %eax,%eax                  # success?
     je       common_exceptionThrown     # no, bail out
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
     /*
      * Class initialization required.
@@ -6558,13 +6653,12 @@
      *  ecx holds class object
      */
 .LOP_NEW_INSTANCE_needinit:
-    SPILL_TMP(%ecx)                     # save object
+    SPILL_TMP1(%ecx)                    # save object
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmInitClass                # initialize class
-    UNSPILL_TMP(%ecx)                   # restore object
+    UNSPILL_TMP1(%ecx)                  # restore object
     testl   %eax,%eax                   # success?
     jne     .LOP_NEW_INSTANCE_initialized     # success, continue
-    UNSPILL(rPC)                        # failed, restore PC
     jmp     common_exceptionThrown      # go deal with init exception
 
     /*
@@ -6572,7 +6666,7 @@
      *
      */
 .LOP_NEW_INSTANCE_resolve:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     movzwl  2(rPC),%eax
     movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
     movl    %eax,OUT_ARG1(%esp)
@@ -6583,7 +6677,6 @@
     movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
     testl   %ecx,%ecx                   # success?
     jne     .LOP_NEW_INSTANCE_resolved        # good to go
-    UNSPILL(rPC)
     jmp     common_exceptionThrown      # no, handle exception
 
     /*
@@ -6598,7 +6691,6 @@
     movl    $.LstrInstantiationError,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     call    dvmThrowExceptionWithClassMessage
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /* continuation for OP_NEW_ARRAY */
@@ -6609,19 +6701,17 @@
      *  eax holds array length (vB)
      */
 .LOP_NEW_ARRAY_resolve:
-    GET_GLUE(%ecx)
-    SPILL_TMP(%eax)                    # save array length
+    movl    rGLUE,%ecx
+    SPILL_TMP1(%eax)                   # save array length
     movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
     movzwl  2(rPC),%eax                # eax<- CCCC
     movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
     movl    %eax,OUT_ARG1(%esp)
     movl    $0,OUT_ARG2(%esp)
     movl    %ecx,OUT_ARG0(%esp)
-    SPILL(rPC)
     call    dvmResolveClass            # eax<- call(clazz,ref,flag)
-    UNSPILL(rPC)
     movl    %eax,%ecx
-    UNSPILL_TMP(%eax)
+    UNSPILL_TMP1(%eax)
     testl   %ecx,%ecx                  # successful resolution?
     je      common_exceptionThrown     # no, bail.
 # fall through to OP_NEW_ARRAY_finish
@@ -6636,16 +6726,13 @@
     movl    %ecx,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)
-    SPILL(rPC)
     call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
-    UNSPILL(rPC)
+    FETCH_INST_OPCODE 2 %edx
     testl   %eax,%eax               # failed?
     je      common_exceptionThrown  # yup - go handle
-    movl    rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_FILLED_NEW_ARRAY */
 
@@ -6653,7 +6740,6 @@
     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
-    UNSPILL(rPC)
     testl   %eax,%eax                         # null?
     je      common_exceptionThrown            # yes, handle it
 
@@ -6662,16 +6748,15 @@
     /*
      * On entry:
      *    eax holds array class [r0]
-     *    rINST_FULL holds AA or BB [r10]
+     *    rINST holds AA or BB [r10]
      *    ecx is scratch
-     *    rPC is valid, but has been spilled
      */
 .LOP_FILLED_NEW_ARRAY_continue:
     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     cmpb    $'I',%cl                             # supported?
     je      1f
     cmpb    $'L',%cl
@@ -6681,13 +6766,12 @@
 1:
     movl    %ecx,offGlue_retval+4(%eax)           # save type
     .if      (!0)
-    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
-    sarl    $4,rINST_FULL
+    SPILL_TMP1(rINST)                              # save copy, need "B" later
+    sarl    $4,rINST
     .endif
-    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
-    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
-    UNSPILL(rPC)
-    GET_GLUE(%ecx)
+    movl    rINST,OUT_ARG1(%esp)                  # arg1<- A or AA (length)
+    call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
+    movl    rGLUE,%ecx
     testl   %eax,%eax                             # alloc successful?
     je      common_exceptionThrown                # no, handle exception
     movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
@@ -6696,48 +6780,45 @@
 
 /* at this point:
  *     eax is pointer to tgt
- *     rINST_FULL is length
+ *     rINST is length
  *     ecx is FEDC or CCCC
  *     TMP_SPILL is BA
- *     rPC is valid, but spilled
  *  We now need to copy values from registers into the array
  */
 
     .if 0
     # set up src pointer
-    SPILL(rFP)     # esi
-    SPILL(rIBASE)   # edi
+    SPILL_TMP2(%esi)
+    SPILL_TMP3(%edi)
     movl    %eax,%edi         # set up dst ptr
     leal    (rFP,%ecx,4),%esi # set up src ptr
-    movl    rINST_FULL,%ecx   # load count register
-    FETCH_INST_WORD(3)
+    movl    rINST,%ecx        # load count register
     rep
     movsd
-    GET_GLUE(%ecx)
-    UNSPILL(rIBASE)
+    UNSPILL_TMP2(%esi)
+    UNSPILL_TMP3(%edi)
+    movl    rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    UNSPILL(rFP)
+    FETCH_INST_OPCODE 3 %edx
     .else
-    testl  rINST_FULL,rINST_FULL
+    testl  rINST,rINST
     je     4f
-    UNSPILL_TMP(rPC)
-    andl   $0x0f,rPC            # rPC<- 0000000A
-    sall   $16,rPC              # rPC<- 000A0000
-    orl    %ecx,rPC              # rpc<- 000AFEDC
+    andl   $0x0f,%edx        # edx<- 0000000A
+    sall   $16,%edx          # edx<- 000A0000
+    orl    %ecx,%edx          # edx<- 000AFEDC
 3:
     movl   $0xf,%ecx
-    andl   rPC,%ecx           # ecx<- next reg to load
-    GET_VREG(%ecx,%ecx)
-    shrl   $4,rPC
+    andl   %edx,%ecx          # ecx<- next reg to load
+    GET_VREG_R %ecx %ecx
+    shrl   $4,%edx
     leal   4(%eax),%eax
     movl   %ecx,-4(%eax)
-    sub    $1,rINST_FULL
+    sub    $1,rINST
     jne    3b
 4:
-    GET_GLUE(%ecx)
-    UNSPILL(rPC)
+    movl   rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     .endif
 
     cmpb    $'I',%al                        # Int array?
@@ -6747,8 +6828,8 @@
     shrl    $GC_CARD_SHIFT,%eax             # convert to card num
     movb    %cl,(%ecx,%eax)                  # mark card
 5:
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 
     /*
@@ -6756,12 +6837,11 @@
      * mode of filled-new-array.
      */
 .LOP_FILLED_NEW_ARRAY_notimpl:
-    movl    $.LstrInternalError,%eax
+    movl    $.LstrInternalErrorA,%eax
     movl    %eax,OUT_ARG0(%esp)
-    movl    $.LstrFilledNewArrayNotImpl,%eax
+    movl    $.LstrFilledNewArrayNotImplA,%eax
     movl    %eax,OUT_ARG1(%esp)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /* continuation for OP_FILLED_NEW_ARRAY_RANGE */
@@ -6770,7 +6850,6 @@
     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
-    UNSPILL(rPC)
     testl   %eax,%eax                         # null?
     je      common_exceptionThrown            # yes, handle it
 
@@ -6779,16 +6858,15 @@
     /*
      * On entry:
      *    eax holds array class [r0]
-     *    rINST_FULL holds AA or BB [r10]
+     *    rINST holds AA or BB [r10]
      *    ecx is scratch
-     *    rPC is valid, but has been spilled
      */
 .LOP_FILLED_NEW_ARRAY_RANGE_continue:
     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
     movl    $ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     cmpb    $'I',%cl                             # supported?
     je      1f
     cmpb    $'L',%cl
@@ -6798,13 +6876,12 @@
 1:
     movl    %ecx,offGlue_retval+4(%eax)           # save type
     .if      (!1)
-    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
-    sarl    $4,rINST_FULL
+    SPILL_TMP1(rINST)                              # save copy, need "B" later
+    sarl    $4,rINST
     .endif
-    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
-    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
-    UNSPILL(rPC)
-    GET_GLUE(%ecx)
+    movl    rINST,OUT_ARG1(%esp)                  # arg1<- A or AA (length)
+    call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
+    movl    rGLUE,%ecx
     testl   %eax,%eax                             # alloc successful?
     je      common_exceptionThrown                # no, handle exception
     movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
@@ -6813,48 +6890,45 @@
 
 /* at this point:
  *     eax is pointer to tgt
- *     rINST_FULL is length
+ *     rINST is length
  *     ecx is FEDC or CCCC
  *     TMP_SPILL is BA
- *     rPC is valid, but spilled
  *  We now need to copy values from registers into the array
  */
 
     .if 1
     # set up src pointer
-    SPILL(rFP)     # esi
-    SPILL(rIBASE)   # edi
+    SPILL_TMP2(%esi)
+    SPILL_TMP3(%edi)
     movl    %eax,%edi         # set up dst ptr
     leal    (rFP,%ecx,4),%esi # set up src ptr
-    movl    rINST_FULL,%ecx   # load count register
-    FETCH_INST_WORD(3)
+    movl    rINST,%ecx        # load count register
     rep
     movsd
-    GET_GLUE(%ecx)
-    UNSPILL(rIBASE)
+    UNSPILL_TMP2(%esi)
+    UNSPILL_TMP3(%edi)
+    movl    rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    UNSPILL(rFP)
+    FETCH_INST_OPCODE 3 %edx
     .else
-    testl  rINST_FULL,rINST_FULL
+    testl  rINST,rINST
     je     4f
-    UNSPILL_TMP(rPC)
-    andl   $0x0f,rPC            # rPC<- 0000000A
-    sall   $16,rPC              # rPC<- 000A0000
-    orl    %ecx,rPC              # rpc<- 000AFEDC
+    andl   $0x0f,%edx        # edx<- 0000000A
+    sall   $16,%edx          # edx<- 000A0000
+    orl    %ecx,%edx          # edx<- 000AFEDC
 3:
     movl   $0xf,%ecx
-    andl   rPC,%ecx           # ecx<- next reg to load
-    GET_VREG(%ecx,%ecx)
-    shrl   $4,rPC
+    andl   %edx,%ecx          # ecx<- next reg to load
+    GET_VREG_R %ecx %ecx
+    shrl   $4,%edx
     leal   4(%eax),%eax
     movl   %ecx,-4(%eax)
-    sub    $1,rINST_FULL
+    sub    $1,rINST
     jne    3b
 4:
-    GET_GLUE(%ecx)
-    UNSPILL(rPC)
+    movl   rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     .endif
 
     cmpb    $'I',%al                        # Int array?
@@ -6864,8 +6938,8 @@
     shrl    $GC_CARD_SHIFT,%eax             # convert to card num
     movb    %cl,(%ecx,%eax)                  # mark card
 5:
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 
     /*
@@ -6873,12 +6947,11 @@
      * mode of filled-new-array.
      */
 .LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
-    movl    $.LstrInternalError,%eax
+    movl    $.LstrInternalErrorA,%eax
     movl    %eax,OUT_ARG0(%esp)
-    movl    $.LstrFilledNewArrayNotImpl,%eax
+    movl    $.LstrFilledNewArrayNotImplA,%eax
     movl    %eax,OUT_ARG1(%esp)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /* continuation for OP_CMPL_FLOAT */
@@ -6908,17 +6981,15 @@
 /* continuation for OP_CMP_LONG */
 
 .LOP_CMP_LONG_bigger:
-    UNSPILL(rPC)
     movl      $1,%ecx
     jmp       .LOP_CMP_LONG_finish
 .LOP_CMP_LONG_smaller:
-    UNSPILL(rPC)
     movl      $-1,%ecx
 .LOP_CMP_LONG_finish:
-    SET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_AGET_WIDE */
 
@@ -6926,76 +6997,71 @@
     leal      offArrayObject_contents(%eax,%ecx,8),%eax
     movl      (%eax),%ecx
     movl      4(%eax),%eax
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_APUT_WIDE */
 
 .LOP_APUT_WIDE_finish:
     leal      offArrayObject_contents(%eax,%ecx,8),%eax
-    GET_VREG_WORD(%ecx,rINST_FULL,0)
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
-    movl      rINST_FULL,4(%eax)
-    FETCH_INST_WORD(2)
+    GET_VREG_WORD %ecx rINST 0
+    GET_VREG_WORD rINST rINST 1
+    movl      rINST,4(%eax)
+    FETCH_INST_OPCODE 2 %edx
     movl      %ecx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_APUT_OBJECT */
 
     /* On entry:
      *   eax<- array object
      *   ecx<- index
-     *   rINST_FULL<- vAA
+     *   rINST<- vAA
      */
 .LOP_APUT_OBJECT_continue:
     leal      offArrayObject_contents(%eax,%ecx,4),%ecx
-    testl     rINST_FULL,rINST_FULL     # storing null reference?
+    testl     rINST,rINST     # storing null reference?
     je        .LOP_APUT_OBJECT_skip_check
-    SPILL(rPC)
-    SPILL_TMP(%ecx)
+    SPILL_TMP1(%ecx)
     movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
-    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+    movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
     movl      %eax,OUT_ARG1(%esp)
     movl      %ecx,OUT_ARG0(%esp)
     call      dvmCanPutArrayElement     # test object type vs. array type
-    UNSPILL(rPC)
-    UNSPILL_TMP(%ecx)
+    UNSPILL_TMP1(%ecx)
     testl     %eax,%eax
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     je        common_errArrayStore
     movl      offGlue_cardTable(%eax),%eax   # get card table base
-    movl      rINST_FULL,(%ecx)
-    FETCH_INST_WORD(2)
+    movl      rINST,(%ecx)
+    FETCH_INST_OPCODE 2 %edx
     shrl      $GC_CARD_SHIFT,%ecx           # convert addr to card number
     movb      %al,(%eax,%ecx)                # mark card
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .LOP_APUT_OBJECT_skip_check:
-    movl      rINST_FULL,(%ecx)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,(%ecx)
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET */
 
 
 .LOP_IGET_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_finish
     jmp     common_exceptionThrown
 
@@ -7004,35 +7070,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_WIDE */
 
 
 .LOP_IGET_WIDE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save objpointer across call
+    movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IGET_WIDE_finish
     jmp     common_exceptionThrown
 
@@ -7041,37 +7102,32 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
-    movl    (%eax),%ecx                          # ecx<- lsw
-    movl    4(%eax),%eax                         # eax<- msw
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    leal    (%ecx,%eax,1),%eax                  # eax<- address of field
+    movl    (%eax),%ecx                         # ecx<- lsw
+    movl    4(%eax),%eax                        # eax<- msw
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_OBJECT */
 
 
 .LOP_IGET_OBJECT_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_OBJECT_finish
     jmp     common_exceptionThrown
 
@@ -7080,35 +7136,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_BOOLEAN */
 
 
 .LOP_IGET_BOOLEAN_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_BOOLEAN_finish
     jmp     common_exceptionThrown
 
@@ -7117,35 +7168,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movzbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movzbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_BYTE */
 
 
 .LOP_IGET_BYTE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_BYTE_finish
     jmp     common_exceptionThrown
 
@@ -7154,35 +7200,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movsbl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movsbl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_CHAR */
 
 
 .LOP_IGET_CHAR_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_CHAR_finish
     jmp     common_exceptionThrown
 
@@ -7191,35 +7232,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movzwl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movzwl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_SHORT */
 
 
 .LOP_IGET_SHORT_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_SHORT_finish
     jmp     common_exceptionThrown
 
@@ -7228,35 +7264,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movswl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movswl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT */
 
 
 .LOP_IPUT_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_finish
     jmp     common_exceptionThrown
 
@@ -7265,34 +7296,29 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movl   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_WIDE */
 
 
 .LOP_IPUT_WIDE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  ... which returns InstrField ptr
     jne     .LOP_IPUT_WIDE_finish
     jmp     common_exceptionThrown
 
@@ -7301,37 +7327,33 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   %edx is scratch, but needs to be unspilled
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
-    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
-    movl    rINST_FULL,4(%eax)
-    FETCH_INST_WORD(2)
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    leal    (%ecx,%eax,1),%eax                  # eax<- address of field
+    GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
+    GET_VREG_WORD rINST rINST 1                 # rINST<- msw
+    FETCH_INST_OPCODE 2 %edx
+    movl    rINST,4(%eax)
     movl    %ecx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_OBJECT */
 
 
 .LOP_IPUT_OBJECT_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_OBJECT_finish
     jmp     common_exceptionThrown
 
@@ -7340,41 +7362,37 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   %edx is scratch, but needs to be unspilled
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl    rINST_FULL,(%ecx,%eax)          # obj.field <- v[A](8/16/32 bits)
-    GET_GLUE(%eax)
-    testl   rINST_FULL,rINST_FULL                # stored a NULL?
-    movl    offGlue_cardTable(%eax),%eax         # get card table base
-    FETCH_INST_WORD(2)
-    je      1f                                   # skip card mark if null store
-    shrl    $GC_CARD_SHIFT,%ecx                 # object head to card number
-    movb    %al,(%eax,%ecx)                      # mark card
+    GET_VREG_R rINST rINST                      # rINST<- v[A]
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl    rINST,(%ecx,%eax)      # obj.field <- v[A](8/16/32 bits)
+    movl    rGLUE,%eax
+    testl   rINST,rINST                         # stored a NULL?
+    movl    offGlue_cardTable(%eax),%eax        # get card table base
+    FETCH_INST_OPCODE 2 %edx
+    je      1f                                  # skip card mark if null store
+    shrl    $GC_CARD_SHIFT,%ecx                # object head to card number
+    movb    %al,(%eax,%ecx)                     # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_BOOLEAN */
 
 
 .LOP_IPUT_BOOLEAN_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_BOOLEAN_finish
     jmp     common_exceptionThrown
 
@@ -7383,34 +7401,29 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_BYTE */
 
 
 .LOP_IPUT_BYTE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_BYTE_finish
     jmp     common_exceptionThrown
 
@@ -7419,34 +7432,29 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movb   rINST_LO,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movb   rINSTbl,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_CHAR */
 
 
 .LOP_IPUT_CHAR_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_CHAR_finish
     jmp     common_exceptionThrown
 
@@ -7455,34 +7463,29 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_SHORT */
 
 
 .LOP_IPUT_SHORT_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_SHORT_finish
     jmp     common_exceptionThrown
 
@@ -7491,18 +7494,16 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movw   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movw   rINSTw,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_SGET */
 
@@ -7510,16 +7511,14 @@
      * Go resolve the field
      */
 .LOP_SGET_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7530,16 +7529,14 @@
      * Go resolve the field
      */
 .LOP_SGET_WIDE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_WIDE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7550,16 +7547,14 @@
      * Go resolve the field
      */
 .LOP_SGET_OBJECT_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_OBJECT_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7570,16 +7565,14 @@
      * Go resolve the field
      */
 .LOP_SGET_BOOLEAN_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_BOOLEAN_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7590,16 +7583,14 @@
      * Go resolve the field
      */
 .LOP_SGET_BYTE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_BYTE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7610,16 +7601,14 @@
      * Go resolve the field
      */
 .LOP_SGET_CHAR_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_CHAR_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7630,16 +7619,14 @@
      * Go resolve the field
      */
 .LOP_SGET_SHORT_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_SHORT_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7650,16 +7637,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7670,16 +7655,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_WIDE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_WIDE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7690,27 +7673,25 @@
 .LOP_SPUT_OBJECT_continue:
     movl      %ecx,offStaticField_value(%eax)
     testl     %ecx,%ecx
-    GET_GLUE(%ecx)
-    FETCH_INST_WORD(2)
+    movl      rGLUE,%ecx
+    FETCH_INST_OPCODE 2 %edx
     je        1f
     movl      offGlue_cardTable(%ecx),%ecx       # get card table base
     shrl      $GC_CARD_SHIFT,%eax               # head to card number
     movb      %cl,(%ecx,%eax)                    # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .LOP_SPUT_OBJECT_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_OBJECT_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7721,16 +7702,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_BOOLEAN_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_BOOLEAN_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7741,16 +7720,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_BYTE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_BYTE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7761,16 +7738,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_CHAR_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_CHAR_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7781,16 +7756,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_SHORT_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_SHORT_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -7803,7 +7776,6 @@
     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
     movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                   # got null?
     jne       .LOP_INVOKE_VIRTUAL_continue        # no, continue
     jmp       common_exceptionThrown      # yes, handle exception
@@ -7817,7 +7789,7 @@
     .if       (!0)
     andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
     .endif
-    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
+    GET_VREG_R  %ecx %ecx               # ecx<- "this"
     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
     testl     %ecx,%ecx                 # null this?
     je        common_errNullObject      # go if so
@@ -7848,17 +7820,15 @@
      * eax = method->clazz
     */
 .LOP_INVOKE_SUPER_resolve:
-    SPILL_TMP(%eax)                     # method->clazz
+    SPILL_TMP1(%eax)                    # method->clazz
     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
     movzwl  2(rPC),%ecx                 # ecx<- BBBB
     movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
-    SPILL(rPC)
     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl   %eax,%eax                   # got null?
     movl    %eax,%ecx                   # ecx<- resolved base method
-    UNSPILL_TMP(%eax)                   # restore method->clazz
+    UNSPILL_TMP1(%eax)                  # restore method->clazz
     jne     .LOP_INVOKE_SUPER_continue        # good to go - continue
     jmp     common_exceptionThrown      # handle exception
 
@@ -7880,9 +7850,8 @@
      * frequent one.  We'll have to do some reloading.
      */
 .LOP_INVOKE_DIRECT_resolve:
-     SPILL_TMP(%ecx)
-     GET_GLUE(%ecx)
-     UNSPILL(rPC)
+     SPILL_TMP1(%ecx)
+     movl     rGLUE,%ecx
      movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
      movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
@@ -7890,10 +7859,9 @@
      movl     %eax,OUT_ARG1(%esp)
      movl     %ecx,OUT_ARG0(%esp)
      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
-     UNSPILL_TMP(%ecx)
+     UNSPILL_TMP1(%ecx)
      testl    %eax,%eax
      jne      .LOP_INVOKE_DIRECT_finish
-     UNSPILL(rPC)
      jmp      common_exceptionThrown
 
 /* continuation for OP_INVOKE_STATIC */
@@ -7901,9 +7869,7 @@
 .LOP_INVOKE_STATIC_continue:
     movl      $METHOD_STATIC,%eax
     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
-    SPILL(rPC)
     call      dvmResolveMethod          # call(clazz,ref,flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                 # got null?
     jne       common_invokeMethodNoRange
     jmp       common_exceptionThrown
@@ -7912,7 +7878,6 @@
 
 .LOP_INVOKE_INTERFACE_continue:
     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
-    UNSPILL(rPC)
     testl      %eax,%eax
     je         common_exceptionThrown
     jmp        common_invokeMethodNoRange
@@ -7925,7 +7890,6 @@
     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
     movl      $METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                   # got null?
     jne       .LOP_INVOKE_VIRTUAL_RANGE_continue        # no, continue
     jmp       common_exceptionThrown      # yes, handle exception
@@ -7939,7 +7903,7 @@
     .if       (!1)
     andl      $0xf,%ecx                # ecx<- D (or stays CCCC)
     .endif
-    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
+    GET_VREG_R  %ecx %ecx               # ecx<- "this"
     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
     testl     %ecx,%ecx                 # null this?
     je        common_errNullObject      # go if so
@@ -7970,17 +7934,15 @@
      * eax = method->clazz
     */
 .LOP_INVOKE_SUPER_RANGE_resolve:
-    SPILL_TMP(%eax)                     # method->clazz
+    SPILL_TMP1(%eax)                    # method->clazz
     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
     movzwl  2(rPC),%ecx                 # ecx<- BBBB
     movl    $METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
-    SPILL(rPC)
     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl   %eax,%eax                   # got null?
     movl    %eax,%ecx                   # ecx<- resolved base method
-    UNSPILL_TMP(%eax)                   # restore method->clazz
+    UNSPILL_TMP1(%eax)                  # restore method->clazz
     jne     .LOP_INVOKE_SUPER_RANGE_continue        # good to go - continue
     jmp     common_exceptionThrown      # handle exception
 
@@ -8002,9 +7964,8 @@
      * frequent one.  We'll have to do some reloading.
      */
 .LOP_INVOKE_DIRECT_RANGE_resolve:
-     SPILL_TMP(%ecx)
-     GET_GLUE(%ecx)
-     UNSPILL(rPC)
+     SPILL_TMP1(%ecx)
+     movl     rGLUE,%ecx
      movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
      movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
@@ -8012,10 +7973,9 @@
      movl     %eax,OUT_ARG1(%esp)
      movl     %ecx,OUT_ARG0(%esp)
      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
-     UNSPILL_TMP(%ecx)
+     UNSPILL_TMP1(%ecx)
      testl    %eax,%eax
      jne      .LOP_INVOKE_DIRECT_RANGE_finish
-     UNSPILL(rPC)
      jmp      common_exceptionThrown
 
 /* continuation for OP_INVOKE_STATIC_RANGE */
@@ -8023,9 +7983,7 @@
 .LOP_INVOKE_STATIC_RANGE_continue:
     movl      $METHOD_STATIC,%eax
     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
-    SPILL(rPC)
     call      dvmResolveMethod          # call(clazz,ref,flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                 # got null?
     jne       common_invokeMethodRange
     jmp       common_exceptionThrown
@@ -8034,7 +7992,6 @@
 
 .LOP_INVOKE_INTERFACE_RANGE_continue:
     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
-    UNSPILL(rPC)
     testl      %eax,%eax
     je         common_exceptionThrown
     jmp        common_invokeMethodRange
@@ -8053,8 +8010,8 @@
     je       .LOP_FLOAT_TO_INT_special_case # fix up result
 
 .LOP_FLOAT_TO_INT_finish:
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_FLOAT_TO_INT_special_case:
     fnstsw   %ax
@@ -8086,8 +8043,8 @@
     je       .LOP_FLOAT_TO_LONG_special_case # fix up result
 
 .LOP_FLOAT_TO_LONG_finish:
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_FLOAT_TO_LONG_special_case:
     fnstsw   %ax
@@ -8119,8 +8076,8 @@
     je       .LOP_DOUBLE_TO_INT_special_case # fix up result
 
 .LOP_DOUBLE_TO_INT_finish:
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_DOUBLE_TO_INT_special_case:
     fnstsw   %ax
@@ -8152,8 +8109,8 @@
     je       .LOP_DOUBLE_TO_LONG_special_case # fix up result
 
 .LOP_DOUBLE_TO_LONG_finish:
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_DOUBLE_TO_LONG_special_case:
     fnstsw   %ax
@@ -8176,62 +8133,53 @@
     cltd
     idivl   %ecx
 .LOP_DIV_INT_finish_div:
-    movzbl   rINST_HI,%ecx         # ecl<- AA
-    SET_VREG(%eax,%ecx)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_REM_INT */
 .LOP_REM_INT_continue_div:
     cltd
     idivl   %ecx
 .LOP_REM_INT_finish_div:
-    movzbl   rINST_HI,%ecx         # ecl<- AA
-    SET_VREG(%edx,%ecx)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %edx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_MUL_LONG */
 
 .LOP_MUL_LONG_continue:
     leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
-    movzbl    rINST_HI,%ecx       # ecx<- A
-    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
-    UNSPILL(rPC)                  # restore rPC/%edx
-    FETCH_INST_WORD(2)
-    UNSPILL(rIBASE)
-    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %ecx
+    UNSPILL_TMP2(%esi)
+    movl      %edx,4(rFP,rINST,4)  # v[B+1]<- %edx
+    movl      %eax,(rFP,rINST,4)   # v[B]<- %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %ecx
 
 /* continuation for OP_DIV_LONG */
 
 .LOP_DIV_LONG_continue:
     call     __divdi3
 .LOP_DIV_LONG_finish:
-    movzbl   rINST_HI,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .LOP_DIV_LONG_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .LOP_DIV_LONG_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .LOP_DIV_LONG_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .LOP_DIV_LONG_notSpecial
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
+    testl    %edx,%edx
     jne      .LOP_DIV_LONG_notSpecial1
     cmpl     $0x80000000,%ecx
     jne      .LOP_DIV_LONG_notSpecial1
@@ -8245,25 +8193,22 @@
 .LOP_REM_LONG_continue:
     call     __moddi3
 .LOP_REM_LONG_finish:
-    movzbl   rINST_HI,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .LOP_REM_LONG_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .LOP_REM_LONG_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .LOP_REM_LONG_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .LOP_REM_LONG_notSpecial
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
+    testl    %edx,%edx
     jne      .LOP_REM_LONG_notSpecial1
     cmpl     $0x80000000,%ecx
     jne      .LOP_REM_LONG_notSpecial1
@@ -8275,89 +8220,82 @@
 /* continuation for OP_SHL_LONG */
 
 .LOP_SHL_LONG_finish:
-    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0          # v[AA+0]<- %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_SHR_LONG */
 
 
 .LOP_SHR_LONG_finish:
-    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0          # v[AA+0]<- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_USHR_LONG */
 
 
 .LOP_USHR_LONG_finish:
-    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0         # v[BB+0]<- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_DIV_INT_2ADDR */
 .LOP_DIV_INT_2ADDR_continue_div2addr:
     cltd
     idivl   %ecx
 .LOP_DIV_INT_2ADDR_finish_div2addr:
-    SET_VREG(%eax,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_REM_INT_2ADDR */
 .LOP_REM_INT_2ADDR_continue_div2addr:
     cltd
     idivl   %ecx
 .LOP_REM_INT_2ADDR_finish_div2addr:
-    SET_VREG(%edx,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG %edx rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_MUL_LONG_2ADDR */
 
 .LOP_MUL_LONG_2ADDR_continue:
-    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
-    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
-    UNSPILL(rPC)                  # restore rPC/%edx
-    FETCH_INST_WORD(1)
-    movl      %eax,(rIBASE)       # v[A]<- %eax
+    leal      (%ecx,%edx),%edx         # full result now in %edx:%eax
+    movl      %edx,4(%esi)             # v[A+1]<- %edx
+    movl      %eax,(%esi)              # v[A]<- %eax
+    UNSPILL_TMP2(%esi)
+    FETCH_INST_OPCODE 1 %ecx
     UNSPILL(rFP)
-    UNSPILL(rIBASE)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %ecx
 
 /* continuation for OP_DIV_LONG_2ADDR */
 
 .LOP_DIV_LONG_2ADDR_continue:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     call     __divdi3
 .LOP_DIV_LONG_2ADDR_finish:
-    movl     rINST_FULL,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_DIV_LONG_2ADDR_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .LOP_DIV_LONG_2ADDR_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .LOP_DIV_LONG_2ADDR_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .LOP_DIV_LONG_2ADDR_notSpecial
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
+    testl    %edx,%edx
     jne      .LOP_DIV_LONG_2ADDR_notSpecial1
     cmpl     $0x80000000,%ecx
     jne      .LOP_DIV_LONG_2ADDR_notSpecial1
@@ -8370,29 +8308,26 @@
 
 .LOP_REM_LONG_2ADDR_continue:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     call     __moddi3
 .LOP_REM_LONG_2ADDR_finish:
-    movl     rINST_FULL,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .LOP_REM_LONG_2ADDR_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .LOP_REM_LONG_2ADDR_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .LOP_REM_LONG_2ADDR_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .LOP_REM_LONG_2ADDR_notSpecial
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
+    testl    %edx,%edx
     jne      .LOP_REM_LONG_2ADDR_notSpecial1
     cmpl     $0x80000000,%ecx
     jne      .LOP_REM_LONG_2ADDR_notSpecial1
@@ -8405,88 +8340,81 @@
 
 
 .LOP_SHL_LONG_2ADDR_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_SHR_LONG_2ADDR */
 
 
 .LOP_SHR_LONG_2ADDR_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0    # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_USHR_LONG_2ADDR */
 
 
 .LOP_USHR_LONG_2ADDR_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_DIV_INT_LIT16 */
 .LOP_DIV_INT_LIT16_continue_div:
     cltd
     idivl   %ecx
 .LOP_DIV_INT_LIT16_finish_div:
-    SET_VREG(%eax,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_REM_INT_LIT16 */
 .LOP_REM_INT_LIT16_continue_div:
     cltd
     idivl   %ecx
 .LOP_REM_INT_LIT16_finish_div:
-    SET_VREG(%edx,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %edx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_DIV_INT_LIT8 */
 .LOP_DIV_INT_LIT8_continue_div:
     cltd
     idivl   %ecx
 .LOP_DIV_INT_LIT8_finish_div:
-    SET_VREG(%eax,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_REM_INT_LIT8 */
 .LOP_REM_INT_LIT8_continue_div:
     cltd
     idivl   %ecx
 .LOP_REM_INT_LIT8_finish_div:
-    SET_VREG(%edx,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %edx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IGET_VOLATILE */
 
 
 .LOP_IGET_VOLATILE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_VOLATILE_finish
     jmp     common_exceptionThrown
 
@@ -8495,35 +8423,30 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_VOLATILE */
 
 
 .LOP_IPUT_VOLATILE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_VOLATILE_finish
     jmp     common_exceptionThrown
 
@@ -8532,18 +8455,16 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
-    movl   rINST_FULL,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    movl   rINST,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_SGET_VOLATILE */
 
@@ -8551,16 +8472,14 @@
      * Go resolve the field
      */
 .LOP_SGET_VOLATILE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_VOLATILE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -8571,16 +8490,14 @@
      * Go resolve the field
      */
 .LOP_SPUT_VOLATILE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_VOLATILE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -8589,17 +8506,14 @@
 
 
 .LOP_IGET_OBJECT_VOLATILE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .LOP_IGET_OBJECT_VOLATILE_finish
     jmp     common_exceptionThrown
 
@@ -8608,19 +8522,17 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_EXECUTE_INLINE */
 
@@ -8634,30 +8546,30 @@
      *
      *  Go ahead and load all 4 args, even if not used.
      */
-    movzwl    4(rPC),rPC
+    movzwl    4(rPC),%edx
 
     movl      $0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $4,%edx
     movl      %ecx,4+OUT_ARG0(%esp)
 
     movl      $0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $4,%edx
     movl      %ecx,4+OUT_ARG1(%esp)
 
     movl      $0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $4,%edx
     movl      %ecx,4+OUT_ARG2(%esp)
 
     movl      $0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $4,%edx
     movl      %ecx,4+OUT_ARG3(%esp)
 
     sall      $4,%eax      # index *= sizeof(table entry)
@@ -8667,31 +8579,28 @@
 /* continuation for OP_IPUT_OBJECT_QUICK */
 
 .LOP_IPUT_OBJECT_QUICK_finish:
-    testl     rINST_FULL,rINST_FULL         # did we store null?
-    FETCH_INST_WORD(2)
+    testl     rINST,rINST               # did we store null?
+    FETCH_INST_OPCODE 2 %edx
     movl      offGlue_cardTable(%eax),%eax  # get card table base
     je        1f                            # skip card mark if null store
     shrl      $GC_CARD_SHIFT,%ecx          # object head to card number
     movb      %al,(%eax,%ecx)               # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_IPUT_OBJECT_VOLATILE */
 
 
 .LOP_IPUT_OBJECT_VOLATILE_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .LOP_IPUT_OBJECT_VOLATILE_finish
     jmp     common_exceptionThrown
 
@@ -8700,25 +8609,24 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   %edx is scratch, but needs to be unspilled
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl    rINST_FULL,(%ecx,%eax)          # obj.field <- v[A](8/16/32 bits)
-    GET_GLUE(%eax)
-    testl   rINST_FULL,rINST_FULL                # stored a NULL?
-    movl    offGlue_cardTable(%eax),%eax         # get card table base
-    FETCH_INST_WORD(2)
-    je      1f                                   # skip card mark if null store
-    shrl    $GC_CARD_SHIFT,%ecx                 # object head to card number
-    movb    %al,(%eax,%ecx)                      # mark card
+    GET_VREG_R rINST rINST                      # rINST<- v[A]
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl    rINST,(%ecx,%eax)      # obj.field <- v[A](8/16/32 bits)
+    movl    rGLUE,%eax
+    testl   rINST,rINST                         # stored a NULL?
+    movl    offGlue_cardTable(%eax),%eax        # get card table base
+    FETCH_INST_OPCODE 2 %edx
+    je      1f                                  # skip card mark if null store
+    shrl    $GC_CARD_SHIFT,%ecx                # object head to card number
+    movb    %al,(%eax,%ecx)                     # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 /* continuation for OP_SGET_OBJECT_VOLATILE */
 
@@ -8726,16 +8634,14 @@
      * Go resolve the field
      */
 .LOP_SGET_OBJECT_VOLATILE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SGET_OBJECT_VOLATILE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -8746,27 +8652,25 @@
 .LOP_SPUT_OBJECT_VOLATILE_continue:
     movl      %ecx,offStaticField_value(%eax)
     testl     %ecx,%ecx
-    GET_GLUE(%ecx)
-    FETCH_INST_WORD(2)
+    movl      rGLUE,%ecx
+    FETCH_INST_OPCODE 2 %edx
     je        1f
     movl      offGlue_cardTable(%ecx),%ecx       # get card table base
     shrl      $GC_CARD_SHIFT,%eax               # head to card number
     movb      %cl,(%ecx,%eax)                    # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .LOP_SPUT_OBJECT_VOLATILE_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .LOP_SPUT_OBJECT_VOLATILE_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
@@ -8803,26 +8707,26 @@
  *
  */
 dvmMterpStdRun:
-    push    %ebp
-    movl    %esp,%ebp
-    push    %edi
-    push    %esi
-    push    %ebx
+    movl    4(%esp), %ecx        # get incoming rGLUE
+    push    %ebp                 # save caller base pointer
+    push    %ecx                 # save rGLUE at (%ebp)
+    movl    %esp, %ebp           # set our %ebp
+/*
+ * At this point we've allocated two slots on the stack
+ * via push and stack is 8-byte aligned.  Allocate space
+ * for 8 spill slots, 3 local slots, 5 arg slots + 2 slots for
+ * padding to bring us to 16-byte alignment
+ */
+    subl    $(FRAME_SIZE-8), %esp
 
-/* at this point, stack is misaligned by 1 word
-   We're allocating spill space for 6 words, plus
-   outgoing argument (5 words) and local variables
-   (4 words) - 15 words or 60 bytes total. See
-   diagram in header.S
-*/
-    subl   $60,%esp
+/* Spill callee save regs */
+    movl    %edi,EDI_SPILL(%ebp)
+    movl    %esi,ESI_SPILL(%ebp)
+    movl    %ebx,EBX_SPILL(%ebp)
 
 /* Set up "named" registers */
-    movl    IN_ARG0(%ebp),%ecx
-    movl    %ecx,rGLUE_SPILL(%ebp)
-    LOAD_PC_FROM_GLUE(%ecx)
-    LOAD_FP_FROM_GLUE(%ecx)
-    movl    $dvmAsmInstructionStart,rIBASE
+    movl    offGlue_pc(%ecx),rPC
+    movl    offGlue_fp(%ecx),rFP
 
 /* Remember %esp for future "longjmp" */
     movl    %esp,offGlue_bailPtr(%ecx)
@@ -8835,7 +8739,7 @@
     jne     .Lnot_instr
 
    /* Normal case: start executing the instruction at rPC */
-    FETCH_INST()
+    FETCH_INST
     GOTO_NEXT
 
 .Lnot_instr:
@@ -8872,12 +8776,13 @@
 dvmMterpStdBail:
     movl    4(%esp),%ecx                 # grab glue
     movl    8(%esp),%eax                 # changeInterp to return reg
-    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
-    addl    $60,%esp                    # Strip dvmMterpStdRun's frame
-    pop     %ebx
-    pop     %esi
-    pop     %edi
-    pop     %ebp
+    movl    offGlue_bailPtr(%ecx),%esp   # Restore "setjmp" esp
+    movl    (FRAME_SIZE-8)(%esp), %ebp   # Restore %ebp at point of setjmp
+    movl    EDI_SPILL(%ebp),%edi
+    movl    ESI_SPILL(%ebp),%esi
+    movl    EBX_SPILL(%ebp),%ebx
+    movl    PREV_FP(%ebp),%ebp           # restore caller's ebp
+    addl    $FRAME_SIZE,%esp                    # strip frame
     ret                                  # return to dvmMterpStdRun's caller
 
 
@@ -8888,6 +8793,273 @@
 .LstrBadEntryPoint:
     .asciz  "Bad entry point %d\n"
 
+
+/*
+ * FIXME: Should have the config/rebuild mechanism generate this
+ * for targets that need it.
+ */
+
+/* Jump table */
+dvmAsmInstructionJmpTable = .LdvmAsmInstructionJmpTable
+.LdvmAsmInstructionJmpTable:
+.long .L_OP_NOP
+.long .L_OP_MOVE
+.long .L_OP_MOVE_FROM16
+.long .L_OP_MOVE_16
+.long .L_OP_MOVE_WIDE
+.long .L_OP_MOVE_WIDE_FROM16
+.long .L_OP_MOVE_WIDE_16
+.long .L_OP_MOVE_OBJECT
+.long .L_OP_MOVE_OBJECT_FROM16
+.long .L_OP_MOVE_OBJECT_16
+.long .L_OP_MOVE_RESULT
+.long .L_OP_MOVE_RESULT_WIDE
+.long .L_OP_MOVE_RESULT_OBJECT
+.long .L_OP_MOVE_EXCEPTION
+.long .L_OP_RETURN_VOID
+.long .L_OP_RETURN
+.long .L_OP_RETURN_WIDE
+.long .L_OP_RETURN_OBJECT
+.long .L_OP_CONST_4
+.long .L_OP_CONST_16
+.long .L_OP_CONST
+.long .L_OP_CONST_HIGH16
+.long .L_OP_CONST_WIDE_16
+.long .L_OP_CONST_WIDE_32
+.long .L_OP_CONST_WIDE
+.long .L_OP_CONST_WIDE_HIGH16
+.long .L_OP_CONST_STRING
+.long .L_OP_CONST_STRING_JUMBO
+.long .L_OP_CONST_CLASS
+.long .L_OP_MONITOR_ENTER
+.long .L_OP_MONITOR_EXIT
+.long .L_OP_CHECK_CAST
+.long .L_OP_INSTANCE_OF
+.long .L_OP_ARRAY_LENGTH
+.long .L_OP_NEW_INSTANCE
+.long .L_OP_NEW_ARRAY
+.long .L_OP_FILLED_NEW_ARRAY
+.long .L_OP_FILLED_NEW_ARRAY_RANGE
+.long .L_OP_FILL_ARRAY_DATA
+.long .L_OP_THROW
+.long .L_OP_GOTO
+.long .L_OP_GOTO_16
+.long .L_OP_GOTO_32
+.long .L_OP_PACKED_SWITCH
+.long .L_OP_SPARSE_SWITCH
+.long .L_OP_CMPL_FLOAT
+.long .L_OP_CMPG_FLOAT
+.long .L_OP_CMPL_DOUBLE
+.long .L_OP_CMPG_DOUBLE
+.long .L_OP_CMP_LONG
+.long .L_OP_IF_EQ
+.long .L_OP_IF_NE
+.long .L_OP_IF_LT
+.long .L_OP_IF_GE
+.long .L_OP_IF_GT
+.long .L_OP_IF_LE
+.long .L_OP_IF_EQZ
+.long .L_OP_IF_NEZ
+.long .L_OP_IF_LTZ
+.long .L_OP_IF_GEZ
+.long .L_OP_IF_GTZ
+.long .L_OP_IF_LEZ
+.long .L_OP_UNUSED_3E
+.long .L_OP_UNUSED_3F
+.long .L_OP_UNUSED_40
+.long .L_OP_UNUSED_41
+.long .L_OP_UNUSED_42
+.long .L_OP_UNUSED_43
+.long .L_OP_AGET
+.long .L_OP_AGET_WIDE
+.long .L_OP_AGET_OBJECT
+.long .L_OP_AGET_BOOLEAN
+.long .L_OP_AGET_BYTE
+.long .L_OP_AGET_CHAR
+.long .L_OP_AGET_SHORT
+.long .L_OP_APUT
+.long .L_OP_APUT_WIDE
+.long .L_OP_APUT_OBJECT
+.long .L_OP_APUT_BOOLEAN
+.long .L_OP_APUT_BYTE
+.long .L_OP_APUT_CHAR
+.long .L_OP_APUT_SHORT
+.long .L_OP_IGET
+.long .L_OP_IGET_WIDE
+.long .L_OP_IGET_OBJECT
+.long .L_OP_IGET_BOOLEAN
+.long .L_OP_IGET_BYTE
+.long .L_OP_IGET_CHAR
+.long .L_OP_IGET_SHORT
+.long .L_OP_IPUT
+.long .L_OP_IPUT_WIDE
+.long .L_OP_IPUT_OBJECT
+.long .L_OP_IPUT_BOOLEAN
+.long .L_OP_IPUT_BYTE
+.long .L_OP_IPUT_CHAR
+.long .L_OP_IPUT_SHORT
+.long .L_OP_SGET
+.long .L_OP_SGET_WIDE
+.long .L_OP_SGET_OBJECT
+.long .L_OP_SGET_BOOLEAN
+.long .L_OP_SGET_BYTE
+.long .L_OP_SGET_CHAR
+.long .L_OP_SGET_SHORT
+.long .L_OP_SPUT
+.long .L_OP_SPUT_WIDE
+.long .L_OP_SPUT_OBJECT
+.long .L_OP_SPUT_BOOLEAN
+.long .L_OP_SPUT_BYTE
+.long .L_OP_SPUT_CHAR
+.long .L_OP_SPUT_SHORT
+.long .L_OP_INVOKE_VIRTUAL
+.long .L_OP_INVOKE_SUPER
+.long .L_OP_INVOKE_DIRECT
+.long .L_OP_INVOKE_STATIC
+.long .L_OP_INVOKE_INTERFACE
+.long .L_OP_UNUSED_73
+.long .L_OP_INVOKE_VIRTUAL_RANGE
+.long .L_OP_INVOKE_SUPER_RANGE
+.long .L_OP_INVOKE_DIRECT_RANGE
+.long .L_OP_INVOKE_STATIC_RANGE
+.long .L_OP_INVOKE_INTERFACE_RANGE
+.long .L_OP_UNUSED_79
+.long .L_OP_UNUSED_7A
+.long .L_OP_NEG_INT
+.long .L_OP_NOT_INT
+.long .L_OP_NEG_LONG
+.long .L_OP_NOT_LONG
+.long .L_OP_NEG_FLOAT
+.long .L_OP_NEG_DOUBLE
+.long .L_OP_INT_TO_LONG
+.long .L_OP_INT_TO_FLOAT
+.long .L_OP_INT_TO_DOUBLE
+.long .L_OP_LONG_TO_INT
+.long .L_OP_LONG_TO_FLOAT
+.long .L_OP_LONG_TO_DOUBLE
+.long .L_OP_FLOAT_TO_INT
+.long .L_OP_FLOAT_TO_LONG
+.long .L_OP_FLOAT_TO_DOUBLE
+.long .L_OP_DOUBLE_TO_INT
+.long .L_OP_DOUBLE_TO_LONG
+.long .L_OP_DOUBLE_TO_FLOAT
+.long .L_OP_INT_TO_BYTE
+.long .L_OP_INT_TO_CHAR
+.long .L_OP_INT_TO_SHORT
+.long .L_OP_ADD_INT
+.long .L_OP_SUB_INT
+.long .L_OP_MUL_INT
+.long .L_OP_DIV_INT
+.long .L_OP_REM_INT
+.long .L_OP_AND_INT
+.long .L_OP_OR_INT
+.long .L_OP_XOR_INT
+.long .L_OP_SHL_INT
+.long .L_OP_SHR_INT
+.long .L_OP_USHR_INT
+.long .L_OP_ADD_LONG
+.long .L_OP_SUB_LONG
+.long .L_OP_MUL_LONG
+.long .L_OP_DIV_LONG
+.long .L_OP_REM_LONG
+.long .L_OP_AND_LONG
+.long .L_OP_OR_LONG
+.long .L_OP_XOR_LONG
+.long .L_OP_SHL_LONG
+.long .L_OP_SHR_LONG
+.long .L_OP_USHR_LONG
+.long .L_OP_ADD_FLOAT
+.long .L_OP_SUB_FLOAT
+.long .L_OP_MUL_FLOAT
+.long .L_OP_DIV_FLOAT
+.long .L_OP_REM_FLOAT
+.long .L_OP_ADD_DOUBLE
+.long .L_OP_SUB_DOUBLE
+.long .L_OP_MUL_DOUBLE
+.long .L_OP_DIV_DOUBLE
+.long .L_OP_REM_DOUBLE
+.long .L_OP_ADD_INT_2ADDR
+.long .L_OP_SUB_INT_2ADDR
+.long .L_OP_MUL_INT_2ADDR
+.long .L_OP_DIV_INT_2ADDR
+.long .L_OP_REM_INT_2ADDR
+.long .L_OP_AND_INT_2ADDR
+.long .L_OP_OR_INT_2ADDR
+.long .L_OP_XOR_INT_2ADDR
+.long .L_OP_SHL_INT_2ADDR
+.long .L_OP_SHR_INT_2ADDR
+.long .L_OP_USHR_INT_2ADDR
+.long .L_OP_ADD_LONG_2ADDR
+.long .L_OP_SUB_LONG_2ADDR
+.long .L_OP_MUL_LONG_2ADDR
+.long .L_OP_DIV_LONG_2ADDR
+.long .L_OP_REM_LONG_2ADDR
+.long .L_OP_AND_LONG_2ADDR
+.long .L_OP_OR_LONG_2ADDR
+.long .L_OP_XOR_LONG_2ADDR
+.long .L_OP_SHL_LONG_2ADDR
+.long .L_OP_SHR_LONG_2ADDR
+.long .L_OP_USHR_LONG_2ADDR
+.long .L_OP_ADD_FLOAT_2ADDR
+.long .L_OP_SUB_FLOAT_2ADDR
+.long .L_OP_MUL_FLOAT_2ADDR
+.long .L_OP_DIV_FLOAT_2ADDR
+.long .L_OP_REM_FLOAT_2ADDR
+.long .L_OP_ADD_DOUBLE_2ADDR
+.long .L_OP_SUB_DOUBLE_2ADDR
+.long .L_OP_MUL_DOUBLE_2ADDR
+.long .L_OP_DIV_DOUBLE_2ADDR
+.long .L_OP_REM_DOUBLE_2ADDR
+.long .L_OP_ADD_INT_LIT16
+.long .L_OP_RSUB_INT
+.long .L_OP_MUL_INT_LIT16
+.long .L_OP_DIV_INT_LIT16
+.long .L_OP_REM_INT_LIT16
+.long .L_OP_AND_INT_LIT16
+.long .L_OP_OR_INT_LIT16
+.long .L_OP_XOR_INT_LIT16
+.long .L_OP_ADD_INT_LIT8
+.long .L_OP_RSUB_INT_LIT8
+.long .L_OP_MUL_INT_LIT8
+.long .L_OP_DIV_INT_LIT8
+.long .L_OP_REM_INT_LIT8
+.long .L_OP_AND_INT_LIT8
+.long .L_OP_OR_INT_LIT8
+.long .L_OP_XOR_INT_LIT8
+.long .L_OP_SHL_INT_LIT8
+.long .L_OP_SHR_INT_LIT8
+.long .L_OP_USHR_INT_LIT8
+.long .L_OP_IGET_VOLATILE
+.long .L_OP_IPUT_VOLATILE
+.long .L_OP_SGET_VOLATILE
+.long .L_OP_SPUT_VOLATILE
+.long .L_OP_IGET_OBJECT_VOLATILE
+.long .L_OP_IGET_WIDE_VOLATILE
+.long .L_OP_IPUT_WIDE_VOLATILE
+.long .L_OP_SGET_WIDE_VOLATILE
+.long .L_OP_SPUT_WIDE_VOLATILE
+.long .L_OP_BREAKPOINT
+.long .L_OP_THROW_VERIFICATION_ERROR
+.long .L_OP_EXECUTE_INLINE
+.long .L_OP_EXECUTE_INLINE_RANGE
+.long .L_OP_INVOKE_DIRECT_EMPTY
+.long .L_OP_RETURN_VOID_BARRIER
+.long .L_OP_IGET_QUICK
+.long .L_OP_IGET_WIDE_QUICK
+.long .L_OP_IGET_OBJECT_QUICK
+.long .L_OP_IPUT_QUICK
+.long .L_OP_IPUT_WIDE_QUICK
+.long .L_OP_IPUT_OBJECT_QUICK
+.long .L_OP_INVOKE_VIRTUAL_QUICK
+.long .L_OP_INVOKE_VIRTUAL_QUICK_RANGE
+.long .L_OP_INVOKE_SUPER_QUICK
+.long .L_OP_INVOKE_SUPER_QUICK_RANGE
+.long .L_OP_IPUT_OBJECT_VOLATILE
+.long .L_OP_SGET_OBJECT_VOLATILE
+.long .L_OP_SPUT_OBJECT_VOLATILE
+.long .L_OP_UNUSED_FF
+
+
 /* File: x86/footer.S */
 /*
  * Copyright (C) 2008 The Android Open Source Project
@@ -8935,13 +9107,13 @@
  * Common code when a backwards branch is taken
  *
  * On entry:
- *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
+ *   ebx (a.k.a. rINST) -> PC adjustment in 16-bit words
  */
 common_backwardBranch:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     call   common_periodicChecks  # Note: expects rPC to be preserved
-    ADVANCE_PC_INDEXED(rINST_FULL)
-    FETCH_INST()
+    ADVANCE_PC_INDEXED rINST
+    FETCH_INST
     GOTO_NEXT
 
 
@@ -8951,7 +9123,7 @@
  *
  * On entry:
  *   eax = Method* methodToCall
- *   rINST trashed, must reload
+ *   rINSTw trashed, must reload
  */
 
 common_invokeMethodRange:
@@ -8961,12 +9133,11 @@
     * prepare to copy args to "outs" area of current frame
     */
 
-    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
+    movzbl      1(rPC),rINST       # rINST<- AA
     movzwl      4(rPC), %ecx            # %ecx<- CCCC
-    SPILL(rPC)
-    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
-    test        rINST_FULL, rINST_FULL
-    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
+    SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
+    test        rINST, rINST
+    movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
     jz          .LinvokeArgsDone        # no args; jump to args done
 
 
@@ -8997,13 +9168,12 @@
 
 common_invokeMethodNoRange:
 .LinvokeNewNoRange:
-    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
-    SPILL(rPC)
-    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
+    movzbl      1(rPC),rINST       # rINST<- BA
+    movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
     shrl        $4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
     je          .LinvokeArgsDone        # no args; jump to args done
     movzwl      4(rPC), %ecx            # %ecx<- GFED
-    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
+    SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
 
    /*
     * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
@@ -9018,9 +9188,9 @@
     jl          3f                      # handle 3 args
     je          4f                      # handle 4 args
 5:
-    andl        $15, rINST_FULL        # rINST<- A
+    andl        $15, rINST             # rINSTw<- A
     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
-    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
+    movl        (rFP, rINST, 4), %ecx   # %ecx<- vA
     movl        %ecx, (%edx)            # *outs<- vA
     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
 4:
@@ -9059,9 +9229,9 @@
     movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
     movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
     shl         $2, %edx               # %edx<- update offset
-    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
+    SAVEAREA_FROM_FP %eax               # %eax<- &StackSaveArea
     subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
-    GET_GLUE(%edx)                      # %edx<- pMterpGlue
+    movl        rGLUE,%edx              # %edx<- pMterpGlue
     movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
     subl        $sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
     movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
@@ -9078,12 +9248,11 @@
     */
 
 #ifdef EASY_GDB
-    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
+    SAVEAREA_FROM_FP %ecx               # %ecx<- &StackSaveArea
     movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
 #endif
     movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
-    movl        rPC_SPILL(%ebp), %ecx
-    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
+    movl        rPC, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
     testl       $ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
     movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
     jne         .LinvokeNative          # handle native call
@@ -9094,7 +9263,7 @@
     */
 
     movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx                  # %ecx<- pMterpGlue
     movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
     movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
     movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
@@ -9102,7 +9271,7 @@
     movl        offGlue_self(%ecx), %eax # %eax<- glue->self
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
     movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
-    FETCH_INST()
+    FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
 
    /*
@@ -9111,7 +9280,7 @@
     */
 
 .LinvokeNative:
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx              # %ecx<- pMterpGlue
     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
     movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
     movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
@@ -9121,7 +9290,7 @@
     movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
     movl        %ecx, OUT_ARG3(%esp)    # save glue->self
     movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx              # %ecx<- pMterpGlue
     movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
     lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
     movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
@@ -9135,48 +9304,21 @@
     cmp         $0, offThread_exception(%eax) # check for exception
     movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
-    UNSPILL(rPC)
     jne         common_exceptionThrown  # handle exception
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    GOTO_NEXT                           # jump to next instruction
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx                    # jump to next instruction
 
 .LstackOverflow:    # eax=methodToCall
     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
-    GET_GLUE(%eax)                      # %eax<- pMterpGlue
+    movl        rGLUE,%eax              # %eax<- pMterpGlue
     movl        offGlue_self(%eax), %eax # %eax<- glue->self
     movl        %eax, OUT_ARG0(%esp)    # push parameter self
     call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
-    UNSPILL(rPC)                        # return: void
     jmp         common_exceptionThrown  # handle exception
 
 
 /*
- * Common invoke code (old-style).
- * TUNING:  Rewrite along lines of new armv5 code?
- *
- * On entry:
- *   eax = Method* methodToCall
- *   ecx = bool methodCallRange
- *   rINST trashed, must reload
- */
-common_invokeOld:
-    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
-    GET_GLUE(%ecx)
-    movzwl  (rPC),rINST_FULL         # recover rINST
-    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
-    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
-    SAVE_PC_TO_GLUE(%ecx)
-    SAVE_FP_TO_GLUE(%ecx)
-    movzbl   rINST_HI,rINST_FULL
-    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
-    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
-    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
-    call     dvmMterp_invokeMethod
-    jmp      common_resumeAfterGlueCall
-
-
-/*
  * Do we need the thread to be suspended or have debugger/profiling activity?
  *
  * On entry:
@@ -9184,8 +9326,8 @@
  *   ecx  -> GLUE pointer
  *   reentry type, e.g. kInterpEntryInstr stored in rGLUE->entryPoint
  *
- * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
- *       streamline the normal case, this routine will preserve rPC and
+ * Note: A call will normally kill %eax and %ecx.  To
+ *       streamline the normal case, this routine will preserve
  *       %ecx in addition to the normal caller save regs.  The save/restore
  *       is a bit ugly, but will happen in the relatively uncommon path.
  * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
@@ -9204,7 +9346,7 @@
     movzbl (%eax),%eax             # get active count
 2:
     orl    (%ecx),%eax             # eax <- debuggerActive | activeProfilers
-    GET_GLUE(%ecx)                 # restore rGLUE
+    movl   rGLUE,%ecx              # restore rGLUE
     jne    3f                      # one or both active - switch interp
 
 5:
@@ -9214,14 +9356,13 @@
 1:
     /*  At this point, the return pointer to the caller of
      *  common_periodicChecks is on the top of stack.  We need to preserve
-     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
+     *  GLUE(ecx).
      *  The outgoing profile is:
      *      bool dvmCheckSuspendPending(Thread* self)
      *  Because we reached here via a call, go ahead and build a new frame.
      */
-    EXPORT_PC()                         # need for precise GC
+    EXPORT_PC                         # need for precise GC
     movl    offGlue_self(%ecx),%eax      # eax<- glue->self
-    SPILL(rPC)                      # save edx
     push    %ebp
     movl    %esp,%ebp
     subl    $24,%esp
@@ -9229,8 +9370,7 @@
     call    dvmCheckSuspendPending
     addl    $24,%esp
     pop     %ebp
-    UNSPILL(rPC)
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
 
     /*
      * Need to check to see if debugger or profiler flags got set
@@ -9250,8 +9390,8 @@
      */
 3:
     leal    (rPC,%ebx,2),rPC       # adjust pc to show target
-    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
-    movl    $1,rINST_FULL         # set changeInterp to true
+    movl    rGLUE,%ecx             # bail expect GLUE already loaded
+    movl    $1,rINST              # set changeInterp to true
     jmp     common_gotoBail
 
 
@@ -9259,47 +9399,47 @@
  * Common code for handling a return instruction
  */
 common_returnFromMethod:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     /* Set entry mode in case we bail */
     movb    $kInterpEntryReturn,offGlue_entryPoint(%ecx)
-    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
+    xorl    rINST,rINST   # zero offset in case we switch interps
     call    common_periodicChecks   # Note: expects %ecx to be preserved
 
-    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
+    SAVEAREA_FROM_FP %eax                         # eax<- saveArea (old)
     movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
-    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
-    cmpl    $0,rINST_FULL                        # break?
+    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST
+    cmpl    $0,rINST                             # break?
     je      common_gotoBail    # break frame, bail out completely
 
     movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
     movl    offGlue_self(%ecx),%eax               # eax<- self
-    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
+    movl    rINST,offGlue_method(%ecx)  # glue->method = newSave->meethod
     movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
-    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
-    FETCH_INST_WORD(3)
+    movl    offMethod_clazz(rINST),%eax      # eax<- method->clazz
+    FETCH_INST_OPCODE 3 %edx
     movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
-    ADVANCE_PC(3)
+    ADVANCE_PC 3
     movl    %eax,offGlue_methodClassDex(%ecx)
     /* not bailing - restore entry mode to default */
     movb    $kInterpEntryInstr,offGlue_entryPoint(%ecx)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /*
  * Prepare to strip the current frame and "longjump" back to caller of
  * dvmMterpStdRun.
  *
  * on entry:
- *    rINST_FULL holds changeInterp
+ *    rINST holds changeInterp
  *    ecx holds glue pointer
  *
  * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
  */
 common_gotoBail:
-    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
-    SAVE_FP_TO_GLUE(%ecx)
-    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
-    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
-    call    dvmMterpStdBail              # bail out....
+    movl   rPC,offGlue_pc(%ecx)     # export state to glue
+    movl   rFP,offGlue_fp(%ecx)
+    movl   %ecx,OUT_ARG0(%esp)      # glue in arg0
+    movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
+    call   dvmMterpStdBail          # bail out....
 
 
 /*
@@ -9307,38 +9447,32 @@
  * and start executing at the next instruction.
  */
  common_resumeAfterGlueCall:
-     GET_GLUE(%ecx)
-     LOAD_PC_FROM_GLUE(%ecx)
-     LOAD_FP_FROM_GLUE(%ecx)
-     FETCH_INST()
+     LOAD_PC_FP_FROM_GLUE
+     FETCH_INST
      GOTO_NEXT
 
 /*
  * Integer divide or mod by zero
  */
 common_errDivideByZero:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrArithmeticException,%eax
     movl    %eax,OUT_ARG0(%esp)
     movl    $.LstrDivideByZero,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
  * Attempt to allocate an array with a negative size.
  */
 common_errNegativeArraySize:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrNegativeArraySizeException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -9346,14 +9480,12 @@
  */
 common_errNoSuchMethod:
 
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrNoSuchMethodError,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -9361,41 +9493,35 @@
  * NullPointerException and goto the exception processing code.
  */
 common_errNullObject:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrNullPointerException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
  * Array index exceeds max.
  */
 common_errArrayIndex:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrArrayIndexException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 /*
  * Invalid array value.
  */
 common_errArrayStore:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $.LstrArrayStoreException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -9408,9 +9534,9 @@
  * This does not return.
  */
 common_exceptionThrown:
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)
-    SAVE_FP_TO_GLUE(%ecx)
+    movl    rGLUE,%ecx
+    movl    rPC,offGlue_pc(%ecx)
+    movl    rFP,offGlue_fp(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
@@ -9443,8 +9569,8 @@
     .asciz  "Ljava/lang/ClassCastException;"
 .LstrNoSuchMethodError:
     .asciz  "Ljava/lang/NoSuchMethodError;"
-.LstrInternalError:
+.LstrInternalErrorA:
     .asciz  "Ljava/lang/InternalError;"
-.LstrFilledNewArrayNotImpl:
+.LstrFilledNewArrayNotImplA:
     .asciz  "filled-new-array only implemented for 'int'"
 
diff --git a/vm/mterp/x86/OP_ADD_LONG.S b/vm/mterp/x86/OP_ADD_LONG.S
index 861cf01..b1edd3d 100644
--- a/vm/mterp/x86/OP_ADD_LONG.S
+++ b/vm/mterp/x86/OP_ADD_LONG.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide.S" {"instr1":"addl (rFP,%ecx,4),rPC", "instr2":"adcl 4(rFP,%ecx,4),%eax"}
+%include "x86/binopWide.S" {"instr1":"addl (rFP,%ecx,4),%edx", "instr2":"adcl 4(rFP,%ecx,4),%eax"}
diff --git a/vm/mterp/x86/OP_ADD_LONG_2ADDR.S b/vm/mterp/x86/OP_ADD_LONG_2ADDR.S
index 775802f..1f9d97e 100644
--- a/vm/mterp/x86/OP_ADD_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_ADD_LONG_2ADDR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide2addr.S" {"instr1":"addl %eax,(rFP,rINST_FULL,4)","instr2":"adcl %ecx,4(rFP,rINST_FULL,4)"}
+%include "x86/binopWide2addr.S" {"instr1":"addl %eax,(rFP,rINST,4)","instr2":"adcl %ecx,4(rFP,rINST,4)"}
diff --git a/vm/mterp/x86/OP_AGET.S b/vm/mterp/x86/OP_AGET.S
index fe87037..adcd403 100644
--- a/vm/mterp/x86/OP_AGET.S
+++ b/vm/mterp/x86/OP_AGET.S
@@ -8,16 +8,15 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     $load     offArrayObject_contents(%eax,%ecx,$shift),%eax
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+.L${opcode}_finish:
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG  %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_AGET_WIDE.S b/vm/mterp/x86/OP_AGET_WIDE.S
index c050156..008aab1 100644
--- a/vm/mterp/x86/OP_AGET_WIDE.S
+++ b/vm/mterp/x86/OP_AGET_WIDE.S
@@ -6,9 +6,8 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -20,8 +19,8 @@
     leal      offArrayObject_contents(%eax,%ecx,8),%eax
     movl      (%eax),%ecx
     movl      4(%eax),%eax
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_AND_LONG.S b/vm/mterp/x86/OP_AND_LONG.S
index 0feaead..8a1152e 100644
--- a/vm/mterp/x86/OP_AND_LONG.S
+++ b/vm/mterp/x86/OP_AND_LONG.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide.S" {"instr1":"andl (rFP,%ecx,4),rPC", "instr2":"andl 4(rFP,%ecx,4),%eax"}
+%include "x86/binopWide.S" {"instr1":"andl (rFP,%ecx,4),%edx", "instr2":"andl 4(rFP,%ecx,4),%eax"}
diff --git a/vm/mterp/x86/OP_AND_LONG_2ADDR.S b/vm/mterp/x86/OP_AND_LONG_2ADDR.S
index 47d99d9..419850e 100644
--- a/vm/mterp/x86/OP_AND_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_AND_LONG_2ADDR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide2addr.S" {"instr1":"andl %eax,(rFP,rINST_FULL,4)","instr2":"andl %ecx,4(rFP,rINST_FULL,4)"}
+%include "x86/binopWide2addr.S" {"instr1":"andl %eax,(rFP,rINST,4)","instr2":"andl %ecx,4(rFP,rINST,4)"}
diff --git a/vm/mterp/x86/OP_APUT.S b/vm/mterp/x86/OP_APUT.S
index b9a660f..93be490 100644
--- a/vm/mterp/x86/OP_APUT.S
+++ b/vm/mterp/x86/OP_APUT.S
@@ -8,16 +8,16 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
     jae       common_errArrayIndex      # index >= length, bail
     leal      offArrayObject_contents(%eax,%ecx,$shift),%eax
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
+.L${opcode}_finish:
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
     $store     $reg,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_APUT_OBJECT.S b/vm/mterp/x86/OP_APUT_OBJECT.S
index d2ec565..8ffbb03 100644
--- a/vm/mterp/x86/OP_APUT_OBJECT.S
+++ b/vm/mterp/x86/OP_APUT_OBJECT.S
@@ -7,10 +7,9 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
+    GET_VREG_R  rINST rINST             # rINST<- vAA
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -21,34 +20,32 @@
     /* On entry:
      *   eax<- array object
      *   ecx<- index
-     *   rINST_FULL<- vAA
+     *   rINST<- vAA
      */
 .L${opcode}_continue:
     leal      offArrayObject_contents(%eax,%ecx,4),%ecx
-    testl     rINST_FULL,rINST_FULL     # storing null reference?
+    testl     rINST,rINST     # storing null reference?
     je        .L${opcode}_skip_check
-    SPILL(rPC)
-    SPILL_TMP(%ecx)
+    SPILL_TMP1(%ecx)
     movl      offObject_clazz(%eax),%eax # eax<- arrayObj->clazz
-    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+    movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
     movl      %eax,OUT_ARG1(%esp)
     movl      %ecx,OUT_ARG0(%esp)
     call      dvmCanPutArrayElement     # test object type vs. array type
-    UNSPILL(rPC)
-    UNSPILL_TMP(%ecx)
+    UNSPILL_TMP1(%ecx)
     testl     %eax,%eax
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     je        common_errArrayStore
     movl      offGlue_cardTable(%eax),%eax   # get card table base
-    movl      rINST_FULL,(%ecx)
-    FETCH_INST_WORD(2)
+    movl      rINST,(%ecx)
+    FETCH_INST_OPCODE 2 %edx
     shrl      $$GC_CARD_SHIFT,%ecx           # convert addr to card number
     movb      %al,(%eax,%ecx)                # mark card
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .L${opcode}_skip_check:
-    movl      rINST_FULL,(%ecx)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,(%ecx)
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_APUT_WIDE.S b/vm/mterp/x86/OP_APUT_WIDE.S
index 658ca7c..95b7151 100644
--- a/vm/mterp/x86/OP_APUT_WIDE.S
+++ b/vm/mterp/x86/OP_APUT_WIDE.S
@@ -6,9 +6,8 @@
     /* op vAA, vBB, vCC */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,%eax)                 # eax<- vBB (array object)
-    GET_VREG(%ecx,%ecx)                 # ecs<- vCC (requested index)
+    GET_VREG_R  %eax %eax               # eax<- vBB (array object)
+    GET_VREG_R  %ecx %ecx               # ecs<- vCC (requested index)
     testl     %eax,%eax                 # null array object?
     je        common_errNullObject      # bail if so
     cmpl      offArrayObject_length(%eax),%ecx
@@ -18,10 +17,10 @@
 
 .L${opcode}_finish:
     leal      offArrayObject_contents(%eax,%ecx,8),%eax
-    GET_VREG_WORD(%ecx,rINST_FULL,0)
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)
-    movl      rINST_FULL,4(%eax)
-    FETCH_INST_WORD(2)
+    GET_VREG_WORD %ecx rINST 0
+    GET_VREG_WORD rINST rINST 1
+    movl      rINST,4(%eax)
+    FETCH_INST_OPCODE 2 %edx
     movl      %ecx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_ARRAY_LENGTH.S b/vm/mterp/x86/OP_ARRAY_LENGTH.S
index 8d2a5a2..1666d0e 100644
--- a/vm/mterp/x86/OP_ARRAY_LENGTH.S
+++ b/vm/mterp/x86/OP_ARRAY_LENGTH.S
@@ -2,14 +2,14 @@
     /*
      * Return the length of an array.
      */
-   movzbl   rINST_HI,%eax              # eax<- BA
-   sarl     $$12,rINST_FULL            # rINST_FULL<- B
-   GET_VREG(%ecx,rINST_FULL)           # ecx<- vB (object ref)
-   andb     $$0xf,%al                  # eax<- A
-   testl    %ecx,%ecx                  # is null?
+   mov      rINST,%eax                # eax<- BA
+   sarl     $$4,rINST                 # rINST<- B
+   GET_VREG_R %ecx rINST              # ecx<- vB (object ref)
+   andb     $$0xf,%al                 # eax<- A
+   testl    %ecx,%ecx                 # is null?
    je       common_errNullObject
-   FETCH_INST_WORD(1)
+   FETCH_INST_OPCODE 1 %edx
    movl     offArrayObject_length(%ecx),%ecx
-   ADVANCE_PC(1)
-   SET_VREG(%ecx,%eax)
-   GOTO_NEXT
+   ADVANCE_PC 1
+   SET_VREG %ecx %eax
+   GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CHECK_CAST.S b/vm/mterp/x86/OP_CHECK_CAST.S
index b9d651c..176dc57 100644
--- a/vm/mterp/x86/OP_CHECK_CAST.S
+++ b/vm/mterp/x86/OP_CHECK_CAST.S
@@ -9,74 +9,67 @@
      * Check to see if a cast from one class to another is allowed.
      */
     /* check-cast vAA, class@BBBB */
-    GET_GLUE(%ecx)
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- vAA (object)
+    movl      rGLUE,%ecx
+    GET_VREG_R  rINST,rINST             # rINST<- vAA (object)
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    testl     rINST_FULL,rINST_FULL     # is oject null?
+    testl     rINST,rINST               # is oject null?
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
     je        .L${opcode}_okay          # null obj, cast always succeeds
     movl      (%ecx,%eax,4),%eax        # eax<- resolved class
-    movl      offObject_clazz(rINST_FULL),%ecx # ecx<- obj->clazz
+    movl      offObject_clazz(rINST),%ecx # ecx<- obj->clazz
     testl     %eax,%eax                 # have we resolved this before?
     je        .L${opcode}_resolve       # no, go do it now
 .L${opcode}_resolved:
     cmpl      %eax,%ecx                 # same class (trivial success)?
     jne       .L${opcode}_fullcheck     # no, do full check
 .L${opcode}_okay:
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 %break
 
     /*
      * Trivial test failed, need to perform full check.  This is common.
      *  ecx holds obj->clazz
      *  eax holds class resolved from BBBB
-     *  rINST_FULL holds object
+     *  rINST holds object
      */
 .L${opcode}_fullcheck:
     movl    %eax,OUT_ARG1(%esp)
     movl    %ecx,OUT_ARG0(%esp)
-    SPILL(rPC)
     call    dvmInstanceofNonTrivial     # eax<- boolean result
-    UNSPILL(rPC)
     testl   %eax,%eax                   # failed?
     jne     .L${opcode}_okay            # no, success
 
     # A cast has failed.  We need to throw a ClassCastException with the
     # class of the object that failed to be cast.
-    EXPORT_PC()
-    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
+    EXPORT_PC
+    movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
     movl    $$.LstrClassCastException,%eax
     movl    offClassObject_descriptor(%ecx),%ecx
     movl    %eax,OUT_ARG0(%esp)     # arg0<- message
     movl    %ecx,OUT_ARG1(%esp)     # arg1<- obj->clazz->descriptor
-    SPILL(rPC)
     call    dvmThrowExceptionWithClassMessage
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
     /*
      * Resolution required.  This is the least-likely path, and we're
      * going to have to recreate some data.
      *
-     *  rINST_FULL holds object
+     *  rINST holds object
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl    rGLUE,%ecx
+    EXPORT_PC
     movzwl  2(rPC),%eax                # eax<- BBBB
     movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
     movl    %eax,OUT_ARG1(%esp)        # arg1<- BBBB
     movl    offMethod_clazz(%ecx),%ecx # ecx<- metho->clazz
     movl    $$0,OUT_ARG2(%esp)         # arg2<- false
     movl    %ecx,OUT_ARG0(%esp)        # arg0<- method->clazz
-    SPILL(rPC)
     call    dvmResolveClass            # eax<- resolved ClassObject ptr
-    UNSPILL(rPC)
     testl   %eax,%eax                  # got null?
     je      common_exceptionThrown     # yes, handle exception
-    movl    offObject_clazz(rINST_FULL),%ecx  # ecx<- obj->clazz
+    movl    offObject_clazz(rINST),%ecx  # ecx<- obj->clazz
     jmp     .L${opcode}_resolved       # pick up where we left off
diff --git a/vm/mterp/x86/OP_CMPG_DOUBLE.S b/vm/mterp/x86/OP_CMPG_DOUBLE.S
index 0eb1ac2..e50f0d6 100644
--- a/vm/mterp/x86/OP_CMPG_DOUBLE.S
+++ b/vm/mterp/x86/OP_CMPG_DOUBLE.S
@@ -13,22 +13,21 @@
     flds     (rFP,%eax,4)
     flds     (rFP,%ecx,4)
     .endif
-    movzbl   rINST_HI,rINST_FULL
     xorl     %ecx,%ecx
     fucompp     # z if equal, p set if NaN, c set if st0 < st1
     fnstsw   %ax
     sahf
-    movl      rINST_FULL,%eax
-    FETCH_INST_WORD(2)
+    movl      rINST,%eax
+    FETCH_INST_OPCODE 2 %edx
     jp       .L${opcode}_isNaN
     je       .L${opcode}_finish
     sbbl     %ecx,%ecx
     jb       .L${opcode}_finish
     incl     %ecx
 .L${opcode}_finish:
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 %break
 
 .L${opcode}_isNaN:
diff --git a/vm/mterp/x86/OP_CMP_LONG.S b/vm/mterp/x86/OP_CMP_LONG.S
index 3b1afbc..e2b7436 100644
--- a/vm/mterp/x86/OP_CMP_LONG.S
+++ b/vm/mterp/x86/OP_CMP_LONG.S
@@ -8,30 +8,25 @@
      */
     /* cmp-long vAA, vBB, vCC */
     movzbl    2(rPC),%ecx              # ecx<- BB
-    SPILL(rPC)
-    movzbl    3(rPC),rPC               # rPC<- CC
-    GET_VREG_WORD(%eax,%ecx,1)         # eax<- v[BB+1]
-    GET_VREG_WORD(%ecx,%ecx,0)         # ecx<- v[BB+0]
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    cmpl      4(rFP,rPC,4),%eax
+    movzbl    3(rPC),%edx              # edx<- CC
+    GET_VREG_WORD %eax %ecx,1          # eax<- v[BB+1]
+    GET_VREG_WORD %ecx %ecx 0          # ecx<- v[BB+0]
+    cmpl      4(rFP,%edx,4),%eax
     jl        .L${opcode}_smaller
     jg        .L${opcode}_bigger
-    sub       (rFP,rPC,4),%ecx
+    sub       (rFP,%edx,4),%ecx
     ja        .L${opcode}_bigger
     jb        .L${opcode}_smaller
-    UNSPILL(rPC)
     jmp       .L${opcode}_finish
 %break
 
 .L${opcode}_bigger:
-    UNSPILL(rPC)
     movl      $$1,%ecx
     jmp       .L${opcode}_finish
 .L${opcode}_smaller:
-    UNSPILL(rPC)
     movl      $$-1,%ecx
 .L${opcode}_finish:
-    SET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST.S b/vm/mterp/x86/OP_CONST.S
index 80d547a..b1ff401 100644
--- a/vm/mterp/x86/OP_CONST.S
+++ b/vm/mterp/x86/OP_CONST.S
@@ -1,8 +1,8 @@
 %verify "executed"
     /* const vAA, #+BBBBbbbb */
-    movzbl    rINST_HI,%ecx           # ecx<- AA
-    movl      2(rPC),%eax               # grab all 32 bits at once
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG(%eax,%ecx)                 # vAA<- eax
-    GOTO_NEXT
+    movl      2(rPC),%eax             # grab all 32 bits at once
+    movl      rINST,%ecx              # ecx<- AA
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    SET_VREG %eax %ecx                # vAA<- eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_16.S b/vm/mterp/x86/OP_CONST_16.S
index d45f1c1..df3d423 100644
--- a/vm/mterp/x86/OP_CONST_16.S
+++ b/vm/mterp/x86/OP_CONST_16.S
@@ -1,8 +1,8 @@
 %verify "executed"
     /* const/16 vAA, #+BBBB */
     movswl  2(rPC),%ecx                # ecx<- ssssBBBB
-    movzx   rINST_HI,%eax              # eax<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%ecx,%eax)                # vAA<- ssssBBBB
-    GOTO_NEXT
+    movl    rINST,%eax                 # eax<- AA
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %ecx %eax                 # vAA<- ssssBBBB
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_4.S b/vm/mterp/x86/OP_CONST_4.S
index 499f7c3..54d1e44 100644
--- a/vm/mterp/x86/OP_CONST_4.S
+++ b/vm/mterp/x86/OP_CONST_4.S
@@ -1,10 +1,10 @@
 %verify "executed"
     /* const/4 vA, #+B */
-    movsx   rINST_HI,%eax              # eax<-ssssssBx
+    movsx   rINSTbl,%eax              # eax<-ssssssBx
     movl    $$0xf,%ecx
-    andl    %eax,%ecx                  # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    andl    %eax,%ecx                 # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     sarl    $$4,%eax
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_CLASS.S b/vm/mterp/x86/OP_CONST_CLASS.S
index fa37917..96890f5 100644
--- a/vm/mterp/x86/OP_CONST_CLASS.S
+++ b/vm/mterp/x86/OP_CONST_CLASS.S
@@ -3,39 +3,36 @@
 %verify "Class not yet resolved"
 %verify "Class cannot be resolved"
     /* const/class vAA, Class@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- dvmDex->pResClasses
     movl      (%ecx,%eax,4),%eax       # eax<- rResClasses[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 2 %edx
     testl     %eax,%eax                # resolved yet?
     je        .L${opcode}_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResClasses[BBBB]
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResClasses[BBBB]
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 %break
 
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .L${opcode}_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movl     $$1,OUT_ARG2(%esp)        # true
     movzwl   2(rPC),%ecx               # ecx<- BBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveClass           # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_HIGH16.S b/vm/mterp/x86/OP_CONST_HIGH16.S
index 9e9fa8a..3c3b2d7 100644
--- a/vm/mterp/x86/OP_CONST_HIGH16.S
+++ b/vm/mterp/x86/OP_CONST_HIGH16.S
@@ -1,9 +1,9 @@
 %verify "executed"
     /* const/high16 vAA, #+BBBB0000 */
     movzwl     2(rPC),%eax                # eax<- 0000BBBB
-    movzbl     rINST_HI,%ecx              # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
+    movl       rINST,%ecx                 # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     sall       $$16,%eax                  # eax<- BBBB0000
-    SET_VREG(%eax,%ecx)                   # vAA<- eax
-    GOTO_NEXT
+    SET_VREG %eax %ecx                    # vAA<- eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_STRING.S b/vm/mterp/x86/OP_CONST_STRING.S
index 96e5dcd..8fd9590 100644
--- a/vm/mterp/x86/OP_CONST_STRING.S
+++ b/vm/mterp/x86/OP_CONST_STRING.S
@@ -3,38 +3,35 @@
 %verify "String not yet resolved"
 %verify "String cannot be resolved"
     /* const/string vAA, String@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 2 %edx
     testl     %eax,%eax                # resolved yet?
     je        .L${opcode}_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResString[BBBB]
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 %break
 
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .L${opcode}_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movzwl   2(rPC),%ecx               # ecx<- BBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveString          # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_STRING_JUMBO.S b/vm/mterp/x86/OP_CONST_STRING_JUMBO.S
index 45316f9..9f5e16a 100644
--- a/vm/mterp/x86/OP_CONST_STRING_JUMBO.S
+++ b/vm/mterp/x86/OP_CONST_STRING_JUMBO.S
@@ -3,38 +3,35 @@
 %verify "String not yet resolved"
 %verify "String cannot be resolved"
     /* const/string vAA, String@BBBBBBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movl      2(rPC),%eax              # eax<- BBBBBBBB
     movl      offGlue_methodClassDex(%ecx),%ecx# ecx<- glue->methodClassDex
-    movzbl    rINST_HI,rINST_FULL      # rINST_FULL<- AA
     movl      offDvmDex_pResStrings(%ecx),%ecx # ecx<- dvmDex->pResStrings
     movl      (%ecx,%eax,4),%eax       # eax<- rResString[BBBB]
-    movl      rINST_FULL,%ecx
-    FETCH_INST_WORD(3)
+    movl      rINST,%ecx
+    FETCH_INST_OPCODE 3 %edx
     testl     %eax,%eax                # resolved yet?
     je        .L${opcode}_resolve
-    SET_VREG(%eax,%ecx)                # vAA<- rResString[BBBB]
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG  %eax %ecx                # vAA<- rResString[BBBB]
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 %break
 
 /* This is the less common path, so we'll redo some work
    here rather than force spills on the common path */
 .L${opcode}_resolve:
-    GET_GLUE(%eax)
-    movl     %ecx,rINST_FULL           # rINST_FULL<- AA
-    EXPORT_PC()
+    movl     rGLUE,%eax
+    movl     %ecx,rINST                # rINST<- AA
+    EXPORT_PC
     movl     offGlue_method(%eax),%eax # eax<- glue->method
     movl     2(rPC),%ecx               # ecx<- BBBBBBBB
     movl     offMethod_clazz(%eax),%eax
-    SPILL(rPC)
     movl     %ecx,OUT_ARG1(%esp)
     movl     %eax,OUT_ARG0(%esp)
     call     dvmResolveString          # go resolve
-    UNSPILL(rPC)
     testl    %eax,%eax                 # failed?
     je       common_exceptionThrown
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_WIDE.S b/vm/mterp/x86/OP_CONST_WIDE.S
index aa582b8..b4273df 100644
--- a/vm/mterp/x86/OP_CONST_WIDE.S
+++ b/vm/mterp/x86/OP_CONST_WIDE.S
@@ -1,11 +1,11 @@
 %verify "executed"
     /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
     movl      2(rPC),%eax         # eax<- lsw
-    movzbl    rINST_HI,%ecx       # ecx <- AA
-    movl      6(rPC),rINST_FULL   # rINST_FULL<- msw
+    movzbl    rINSTbl,%ecx        # ecx<- AA
+    movl      6(rPC),rINST        # rINST<- msw
     leal      (rFP,%ecx,4),%ecx   # dst addr
-    movl      rINST_FULL,4(%ecx)
-    FETCH_INST_WORD(5)
+    movl      rINST,4(%ecx)
+    FETCH_INST_OPCODE 5 %edx
     movl      %eax,(%ecx)
-    ADVANCE_PC(5)
-    GOTO_NEXT
+    ADVANCE_PC 5
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_WIDE_16.S b/vm/mterp/x86/OP_CONST_WIDE_16.S
index 03270dc..b720748 100644
--- a/vm/mterp/x86/OP_CONST_WIDE_16.S
+++ b/vm/mterp/x86/OP_CONST_WIDE_16.S
@@ -1,12 +1,9 @@
 %verify "executed"
     /* const-wide/16 vAA, #+BBBB */
     movswl    2(rPC),%eax               # eax<- ssssBBBB
-    SPILL(rPC)
-    movzbl    rINST_HI,%ecx             # ecx<- AA
-    FETCH_INST_WORD(2)
     cltd                                # rPC:eax<- ssssssssssssBBBB
-    SET_VREG_WORD(rPC,%ecx,1)           # store msw
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1          # store msw
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 0          # store lsw
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_WIDE_32.S b/vm/mterp/x86/OP_CONST_WIDE_32.S
index 19246c7..b059529 100644
--- a/vm/mterp/x86/OP_CONST_WIDE_32.S
+++ b/vm/mterp/x86/OP_CONST_WIDE_32.S
@@ -1,12 +1,9 @@
 %verify "executed"
     /* const-wide/32 vAA, #+BBBBbbbb */
-    movl     2(rPC),%eax               # eax<- BBBBbbbb
-    SPILL(rPC)
-    movzbl    rINST_HI,%ecx             # ecx<- AA
-    FETCH_INST_WORD(3)
+    movl     2(rPC),%eax                # eax<- BBBBbbbb
     cltd                                # rPC:eax<- ssssssssssssBBBB
-    SET_VREG_WORD(rPC,%ecx,1)           # store msw
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # store lsw
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST,1          # store msw
+    FETCH_INST_OPCODE 3 %edx
+    SET_VREG_WORD %eax rINST 0          # store lsw
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_CONST_WIDE_HIGH16.S b/vm/mterp/x86/OP_CONST_WIDE_HIGH16.S
index 1d726f4..dae78cb 100644
--- a/vm/mterp/x86/OP_CONST_WIDE_HIGH16.S
+++ b/vm/mterp/x86/OP_CONST_WIDE_HIGH16.S
@@ -1,11 +1,10 @@
 %verify "executed"
     /* const-wide/high16 vAA, #+BBBB000000000000 */
     movzwl     2(rPC),%eax                # eax<- 0000BBBB
-    movzbl     rINST_HI,%ecx              # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     sall       $$16,%eax                  # eax<- BBBB0000
-    SET_VREG_WORD(%eax,%ecx,1)            # v[AA+1]<- eax
+    SET_VREG_WORD %eax rINST 1            # v[AA+1]<- eax
     xorl       %eax,%eax
-    SET_VREG_WORD(%eax,%ecx,0)            # v[AA+0]<- eax
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0            # v[AA+0]<- eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_DIV_LONG.S b/vm/mterp/x86/OP_DIV_LONG.S
index f324be3..4a7704b 100644
--- a/vm/mterp/x86/OP_DIV_LONG.S
+++ b/vm/mterp/x86/OP_DIV_LONG.S
@@ -3,20 +3,19 @@
     /* div vAA, vBB, vCC */
     movzbl    3(rPC),%eax              # eax<- CC
     movzbl    2(rPC),%ecx              # ecx<- BB
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .L${opcode}_check_zero
     cmpl     $$-1,%eax
     je       .L${opcode}_check_neg1
 .L${opcode}_notSpecial:
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
 .L${opcode}_notSpecial1:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     jmp      .L${opcode}_continue
 %break
@@ -24,25 +23,22 @@
 .L${opcode}_continue:
     call     $routine
 .L${opcode}_finish:
-    movzbl   rINST_HI,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .L${opcode}_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .L${opcode}_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .L${opcode}_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .L${opcode}_notSpecial
-    GET_VREG_WORD(rPC,%ecx,0)
-    GET_VREG_WORD(%ecx,%ecx,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx %ecx 0
+    GET_VREG_WORD %ecx %ecx 1
+    testl    %edx,%edx
     jne      .L${opcode}_notSpecial1
     cmpl     $$0x80000000,%ecx
     jne      .L${opcode}_notSpecial1
diff --git a/vm/mterp/x86/OP_DIV_LONG_2ADDR.S b/vm/mterp/x86/OP_DIV_LONG_2ADDR.S
index 128ede0..64de025 100644
--- a/vm/mterp/x86/OP_DIV_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_DIV_LONG_2ADDR.S
@@ -1,50 +1,45 @@
 %verify "executed"
 %default {"routine":"__divdi3","special":"$0x80000000"}
     /* div/2addr vA, vB */
-    movzbl    rINST_HI,%eax
+    movzbl    rINSTbl,%eax
     shrl      $$4,%eax                  # eax<- B
-    movzbl    rINST_HI,rINST_FULL
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)
-    GET_VREG_WORD(%eax,%eax,1)
-    movl     rPC,OUT_ARG2(%esp)
+    andb      $$0xf,rINSTbl             # rINST<- A
+    GET_VREG_WORD %edx %eax 0
+    GET_VREG_WORD %eax %eax 1
+    movl     %edx,OUT_ARG2(%esp)
     testl    %eax,%eax
     je       .L${opcode}_check_zero
     cmpl     $$-1,%eax
     je       .L${opcode}_check_neg1
 .L${opcode}_notSpecial:
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
 .L${opcode}_notSpecial1:
     jmp      .L${opcode}_continue
 %break
 
 .L${opcode}_continue:
     movl     %eax,OUT_ARG3(%esp)
-    movl     rPC,OUT_ARG0(%esp)
+    movl     %edx,OUT_ARG0(%esp)
     movl     %ecx,OUT_ARG1(%esp)
     call     $routine
 .L${opcode}_finish:
-    movl     rINST_FULL,%ecx
-    SET_VREG_WORD(rPC,%ecx,1)
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1
+    SET_VREG_WORD %eax rINST 0
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .L${opcode}_check_zero:
-    testl   rPC,rPC
+    testl   %edx,%edx
     jne     .L${opcode}_notSpecial
-    UNSPILL(rPC)
     jmp     common_errDivideByZero
 .L${opcode}_check_neg1:
-    testl   rPC,%eax
+    testl   %edx,%eax
     jne     .L${opcode}_notSpecial
-    GET_VREG_WORD(rPC,rINST_FULL,0)
-    GET_VREG_WORD(%ecx,rINST_FULL,1)
-    testl    rPC,rPC
+    GET_VREG_WORD %edx rINST 0
+    GET_VREG_WORD %ecx rINST 1
+    testl    %edx,%edx
     jne      .L${opcode}_notSpecial1
     cmpl     $$0x80000000,%ecx
     jne      .L${opcode}_notSpecial1
diff --git a/vm/mterp/x86/OP_EXECUTE_INLINE.S b/vm/mterp/x86/OP_EXECUTE_INLINE.S
index 1eca6e2..85f9fcf 100644
--- a/vm/mterp/x86/OP_EXECUTE_INLINE.S
+++ b/vm/mterp/x86/OP_EXECUTE_INLINE.S
@@ -7,22 +7,21 @@
      *
      * (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult)
      *
+     * Ignores argument count - always loads 4.
+     *
      */
     /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl      rGLUE,%ecx
+    EXPORT_PC
     movzwl    2(rPC),%eax               # eax<- BBBB
     leal      offGlue_retval(%ecx),%ecx # ecx<- & glue->retval
     movl      %ecx,OUT_ARG4(%esp)
-    sarl      $$12,rINST_FULL           # rINST_FULL<- arg count (0-4)
-    SPILL(rPC)
     call      .L${opcode}_continue      # make call; will return after
-    UNSPILL(rPC)
     testl     %eax,%eax                 # successful?
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     je        common_exceptionThrown    # no, handle exception
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 %break
 
 .L${opcode}_continue:
@@ -35,30 +34,30 @@
      *
      *  Go ahead and load all 4 args, even if not used.
      */
-    movzwl    4(rPC),rPC
+    movzwl    4(rPC),%edx
 
     movl      $$0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $$4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $$4,%edx
     movl      %ecx,4+OUT_ARG0(%esp)
 
     movl      $$0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $$4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $$4,%edx
     movl      %ecx,4+OUT_ARG1(%esp)
 
     movl      $$0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $$4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $$4,%edx
     movl      %ecx,4+OUT_ARG2(%esp)
 
     movl      $$0xf,%ecx
-    andl      rPC,%ecx
-    GET_VREG(%ecx,%ecx)
-    sarl      $$4,rPC
+    andl      %edx,%ecx
+    GET_VREG_R  %ecx %ecx
+    sarl      $$4,%edx
     movl      %ecx,4+OUT_ARG3(%esp)
 
     sall      $$4,%eax      # index *= sizeof(table entry)
diff --git a/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S b/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
index b990aeb..60974ac 100644
--- a/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
+++ b/vm/mterp/x86/OP_FILLED_NEW_ARRAY.S
@@ -8,18 +8,16 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
-    GET_GLUE(%eax)
-    movzbl  rINST_HI,rINST_FULL               # rINST_FULL<- AA or BA
+    movl    rGLUE,%eax
     movl    offGlue_methodClassDex(%eax),%eax # eax<- pDvmDex
     movzwl  2(rPC),%ecx                       # ecx<- BBBB
     movl    offDvmDex_pResClasses(%eax),%eax  # eax<- pDvmDex->pResClasses
-    SPILL(rPC)
     movl    (%eax,%ecx,4),%eax                # eax<- resolved class
-    EXPORT_PC()
+    EXPORT_PC
     testl   %eax,%eax                         # already resolved?
     jne     .L${opcode}_continue              # yes, continue
     # less frequent path, so we'll redo some work
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     movl    $$0,OUT_ARG2(%esp)                # arg2<- false
     movl    %ecx,OUT_ARG1(%esp)               # arg1<- BBBB
     movl    offGlue_method(%eax),%eax         # eax<- glue->method
@@ -30,7 +28,6 @@
     movl    offMethod_clazz(%eax),%eax        # eax<- method->clazz
     movl    %eax,OUT_ARG0(%esp)               # arg0<- clazz
     call    dvmResolveClass                   # eax<- call(clazz,ref,flag)
-    UNSPILL(rPC)
     testl   %eax,%eax                         # null?
     je      common_exceptionThrown            # yes, handle it
 
@@ -39,16 +36,15 @@
     /*
      * On entry:
      *    eax holds array class [r0]
-     *    rINST_FULL holds AA or BB [r10]
+     *    rINST holds AA or BB [r10]
      *    ecx is scratch
-     *    rPC is valid, but has been spilled
      */
 .L${opcode}_continue:
     movl    offClassObject_descriptor(%eax),%ecx  # ecx<- arrayClass->descriptor
     movl    $$ALLOC_DONT_TRACK,OUT_ARG2(%esp)     # arg2<- flags
     movzbl  1(%ecx),%ecx                          # ecx<- descriptor[1]
     movl    %eax,OUT_ARG0(%esp)                   # arg0<- arrayClass
-    GET_GLUE(%eax)
+    movl    rGLUE,%eax
     cmpb    $$'I',%cl                             # supported?
     je      1f
     cmpb    $$'L',%cl
@@ -58,13 +54,12 @@
 1:
     movl    %ecx,offGlue_retval+4(%eax)           # save type
     .if      (!$isrange)
-    SPILL_TMP(rINST_FULL)                         # save copy, need "B" later
-    sarl    $$4,rINST_FULL
+    SPILL_TMP1(rINST)                              # save copy, need "B" later
+    sarl    $$4,rINST
     .endif
-    movl    rINST_FULL,OUT_ARG1(%esp)             # arg1<- A or AA (length)
-    call    dvmAllocArrayByClass                  # eax<- call(arrayClass, length, flags)
-    UNSPILL(rPC)
-    GET_GLUE(%ecx)
+    movl    rINST,OUT_ARG1(%esp)                  # arg1<- A or AA (length)
+    call    dvmAllocArrayByClass     # eax<- call(arrayClass, length, flags)
+    movl    rGLUE,%ecx
     testl   %eax,%eax                             # alloc successful?
     je      common_exceptionThrown                # no, handle exception
     movl    %eax,offGlue_retval(%ecx)             # retval.l<- new array
@@ -73,48 +68,45 @@
 
 /* at this point:
  *     eax is pointer to tgt
- *     rINST_FULL is length
+ *     rINST is length
  *     ecx is FEDC or CCCC
  *     TMP_SPILL is BA
- *     rPC is valid, but spilled
  *  We now need to copy values from registers into the array
  */
 
     .if $isrange
     # set up src pointer
-    SPILL(rFP)     # esi
-    SPILL(rIBASE)   # edi
+    SPILL_TMP2(%esi)
+    SPILL_TMP3(%edi)
     movl    %eax,%edi         # set up dst ptr
     leal    (rFP,%ecx,4),%esi # set up src ptr
-    movl    rINST_FULL,%ecx   # load count register
-    FETCH_INST_WORD(3)
+    movl    rINST,%ecx        # load count register
     rep
     movsd
-    GET_GLUE(%ecx)
-    UNSPILL(rIBASE)
+    UNSPILL_TMP2(%esi)
+    UNSPILL_TMP3(%edi)
+    movl    rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    UNSPILL(rFP)
+    FETCH_INST_OPCODE 3 %edx
     .else
-    testl  rINST_FULL,rINST_FULL
+    testl  rINST,rINST
     je     4f
-    UNSPILL_TMP(rPC)
-    andl   $$0x0f,rPC            # rPC<- 0000000A
-    sall   $$16,rPC              # rPC<- 000A0000
-    orl    %ecx,rPC              # rpc<- 000AFEDC
+    andl   $$0x0f,%edx        # edx<- 0000000A
+    sall   $$16,%edx          # edx<- 000A0000
+    orl    %ecx,%edx          # edx<- 000AFEDC
 3:
     movl   $$0xf,%ecx
-    andl   rPC,%ecx           # ecx<- next reg to load
-    GET_VREG(%ecx,%ecx)
-    shrl   $$4,rPC
+    andl   %edx,%ecx          # ecx<- next reg to load
+    GET_VREG_R %ecx %ecx
+    shrl   $$4,%edx
     leal   4(%eax),%eax
     movl   %ecx,-4(%eax)
-    sub    $$1,rINST_FULL
+    sub    $$1,rINST
     jne    3b
 4:
-    GET_GLUE(%ecx)
-    UNSPILL(rPC)
+    movl   rGLUE,%ecx
     movl    offGlue_retval+4(%ecx),%eax      # eax<- type
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     .endif
 
     cmpb    $$'I',%al                        # Int array?
@@ -124,8 +116,8 @@
     shrl    $$GC_CARD_SHIFT,%eax             # convert to card num
     movb    %cl,(%ecx,%eax)                  # mark card
 5:
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
 
 
     /*
@@ -133,10 +125,9 @@
      * mode of filled-new-array.
      */
 .L${opcode}_notimpl:
-    movl    $$.LstrInternalError,%eax
+    movl    $$.LstrInternalErrorA,%eax
     movl    %eax,OUT_ARG0(%esp)
-    movl    $$.LstrFilledNewArrayNotImpl,%eax
+    movl    $$.LstrFilledNewArrayNotImplA,%eax
     movl    %eax,OUT_ARG1(%esp)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
diff --git a/vm/mterp/x86/OP_FILL_ARRAY_DATA.S b/vm/mterp/x86/OP_FILL_ARRAY_DATA.S
index 9db60ac..28826f4 100644
--- a/vm/mterp/x86/OP_FILL_ARRAY_DATA.S
+++ b/vm/mterp/x86/OP_FILL_ARRAY_DATA.S
@@ -1,17 +1,14 @@
 %verify "executed"
     /* fill-array-data vAA, +BBBBBBBB */
     movl    2(rPC),%ecx                # ecx<- BBBBbbbb
-    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
     leal    (rPC,%ecx,2),%ecx          # ecx<- PC + BBBBbbbb*2
-    GET_VREG(%eax,rINST_FULL)
-    SPILL(rPC)
-    EXPORT_PC()
+    GET_VREG_R %eax rINST
+    EXPORT_PC
     movl    %eax,OUT_ARG0(%esp)
     movl    %ecx,OUT_ARG1(%esp)
     call    dvmInterpHandleFillArrayData
-    UNSPILL(rPC)
-    FETCH_INST_WORD(3)
+    FETCH_INST_OPCODE 3 %edx
     testl   %eax,%eax                   # exception thrown?
     je      common_exceptionThrown
-    ADVANCE_PC(3)
-    GOTO_NEXT
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_GOTO.S b/vm/mterp/x86/OP_GOTO.S
index 5d530ec..c61d902 100644
--- a/vm/mterp/x86/OP_GOTO.S
+++ b/vm/mterp/x86/OP_GOTO.S
@@ -7,10 +7,10 @@
      * double to get a byte offset.
      */
     /* goto +AA */
-    movsbl  rINST_HI,rINST_FULL         # ebx<- ssssssAA
-    testl   rINST_FULL,rINST_FULL       # test for <0
+    movsbl  rINSTbl,rINST         # ebx<- ssssssAA
+    testl   rINST,rINST           # test for <0
     js      common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_GOTO_16.S b/vm/mterp/x86/OP_GOTO_16.S
index 3feb33b..8b58d60 100644
--- a/vm/mterp/x86/OP_GOTO_16.S
+++ b/vm/mterp/x86/OP_GOTO_16.S
@@ -6,10 +6,10 @@
      * The branch distance is a signed code-unit offset
      */
     /* goto/16 +AAAA */
-    movswl  2(rPC),rINST_FULL           # rINST_FULL<- ssssAAAA
-    testl   rINST_FULL,rINST_FULL       # test for <0
+    movswl  2(rPC),rINST           # rINST<- ssssAAAA
+    testl   rINST,rINST            # test for <0
     js      common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_GOTO_32.S b/vm/mterp/x86/OP_GOTO_32.S
index 6720bd6..2deae57 100644
--- a/vm/mterp/x86/OP_GOTO_32.S
+++ b/vm/mterp/x86/OP_GOTO_32.S
@@ -9,10 +9,10 @@
      * our "backward branch" test must be "<=0" instead of "<0".
      */
     /* goto/32 AAAAAAAA */
-    movl    2(rPC),rINST_FULL           # rINST_FULL<- AAAAAAAA
-    cmpl    $$0,rINST_FULL              # test for <= 0
+    movl    2(rPC),rINST           # rINST<- AAAAAAAA
+    cmpl    $$0,rINST              # test for <= 0
     jle     common_backwardBranch
-    movl    rINST_FULL,%eax
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    movl    rINST,%eax
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_IGET.S b/vm/mterp/x86/OP_IGET.S
index cd8033f..0495827 100644
--- a/vm/mterp/x86/OP_IGET.S
+++ b/vm/mterp/x86/OP_IGET.S
@@ -10,37 +10,32 @@
      * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $$4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $$0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .L${opcode}_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $$4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $$0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .L${opcode}_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .L${opcode}_resolve
 %break
 
 
 .L${opcode}_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  returns InstrField ptr
     jne     .L${opcode}_finish
     jmp     common_exceptionThrown
 
@@ -49,16 +44,14 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    $load   (%ecx,%eax,1),%ecx                   # ecx<- obj.field (8/16/32 bits)
-    movl    rINST_FULL,%eax                      # eax<- A
-    FETCH_INST_WORD(2)
-    SET_VREG(%ecx,%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    $load   (%ecx,%eax,1),%ecx                  # ecx<- obj.field (8/16/32 bits)
+    movl    rINST,%eax                          # eax<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG %ecx %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IGET_QUICK.S b/vm/mterp/x86/OP_IGET_QUICK.S
index 88d0725..51a5937 100644
--- a/vm/mterp/x86/OP_IGET_QUICK.S
+++ b/vm/mterp/x86/OP_IGET_QUICK.S
@@ -2,16 +2,15 @@
 %verify "null object"
     /* For: iget-quick, iget-object-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     cmpl      $$0,%ecx                  # is object null?
     je        common_errNullObject
     movl      (%ecx,%eax,1),%eax
-    movzbl    rINST_HI,%ecx
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    andb      $$0xf,%cl                 # rINST_FULL<- A
-    SET_VREG  (%eax,%ecx)               # fp[A]<- result
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    andb      $$0xf,rINSTbl             # rINST<- A
+    SET_VREG  %eax rINST                # fp[A]<- result
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IGET_WIDE.S b/vm/mterp/x86/OP_IGET_WIDE.S
index 77a5994..3e22dd2 100644
--- a/vm/mterp/x86/OP_IGET_WIDE.S
+++ b/vm/mterp/x86/OP_IGET_WIDE.S
@@ -8,37 +8,32 @@
      *
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $$4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $$0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .L${opcode}_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)                 # needed by dvmResolveInstField
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $$4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $$0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .L${opcode}_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)                 # for dvmResolveInstField
+    movl    rGLUE,%edx
     jmp     .L${opcode}_resolve
 %break
 
 
 .L${opcode}_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save objpointer across call
+    movl    rPC,OUT_ARG0(%esp)                  # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .L${opcode}_finish
     jmp     common_exceptionThrown
 
@@ -47,18 +42,16 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
-    movl    (%eax),%ecx                          # ecx<- lsw
-    movl    4(%eax),%eax                         # eax<- msw
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    leal    (%ecx,%eax,1),%eax                  # eax<- address of field
+    movl    (%eax),%ecx                         # ecx<- lsw
+    movl    4(%eax),%eax                        # eax<- msw
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IGET_WIDE_QUICK.S b/vm/mterp/x86/OP_IGET_WIDE_QUICK.S
index 4747284..3867eea 100644
--- a/vm/mterp/x86/OP_IGET_WIDE_QUICK.S
+++ b/vm/mterp/x86/OP_IGET_WIDE_QUICK.S
@@ -2,19 +2,18 @@
 %verify "null object"
     /* For: iget-wide-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     cmpl      $$0,%ecx                  # is object null?
     je        common_errNullObject
     leal      (%ecx,%eax,1),%eax        # eax<- address of 64-bit source
     movl      (%eax),%ecx               # ecx<- lsw
-    movl      4(%eax),%eax               # eax<- msw
-    movzbl    rINST_HI,rINST_FULL
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    SET_VREG_WORD(%ecx,rINST_FULL,0)    # v[A+0]<- lsw
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[A+1]<- msw
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      4(%eax),%eax              # eax<- msw
+    andb      $$0xf,rINSTbl             # rINST<- A
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %ecx rINST 0          # v[A+0]<- lsw
+    SET_VREG_WORD %eax rINST 1          # v[A+1]<- msw
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_INSTANCE_OF.S b/vm/mterp/x86/OP_INSTANCE_OF.S
index 71b92d3..fddb5c8 100644
--- a/vm/mterp/x86/OP_INSTANCE_OF.S
+++ b/vm/mterp/x86/OP_INSTANCE_OF.S
@@ -12,17 +12,16 @@
      * an already-resolved class.
      */
     /* instance-of vA, vB, class@CCCC */
-    movzbl  rINST_HI,%eax               # eax<- BA
+    movl    rINST,%eax                # eax<- BA
     sarl    $$4,%eax                    # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
-    GET_GLUE(%ecx)
+    GET_VREG_R %eax %eax                # eax<- vB (obj)
+    movl    rGLUE,%ecx
     testl   %eax,%eax                   # object null?
     movl    offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
-    SPILL(rPC)
     je      .L${opcode}_store           # null obj, not instance, store it
-    movzwl  2(rPC),rPC                  # rPC<- CCCC
+    movzwl  2(rPC),%edx                 # edx<- CCCC
     movl    offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
-    movl    (%ecx,rPC,4),%ecx           # ecx<- resolved class
+    movl    (%ecx,%edx,4),%ecx          # ecx<- resolved class
     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
     testl   %ecx,%ecx                   # have we resolved this before?
     je      .L${opcode}_resolve         # not resolved, do it now
@@ -36,8 +35,7 @@
      * Trivial test failed, need to perform full check.  This is common.
      *  eax holds obj->clazz
      *  ecx holds class resolved from BBBB
-     *  rINST_HI has BA
-     *  rPC already spilled
+     *  rINST has BA
      */
 .L${opcode}_fullcheck:
     movl    %eax,OUT_ARG0(%esp)
@@ -47,56 +45,50 @@
 
     /*
      * eax holds boolean result
-     * rINST_HI holds BA
+     * rINST holds BA
      */
 .L${opcode}_store:
-    UNSPILL(rPC)
-    movzbl  rINST_HI,%ecx               # ecx<- BA
-    FETCH_INST_WORD(2)
-    andb    $$0xf,%cl                   # ecl<- A
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)                 # vA<- eax
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    andb    $$0xf,rINSTbl               # <- A
+    ADVANCE_PC 2
+    SET_VREG %eax rINST                 # vA<- eax
+    GOTO_NEXT_R %edx
 
     /*
      * Trivial test succeeded, save and bail.
      *  r9 holds A
      */
 .L${opcode}_trivial:
-    UNSPILL(rPC)
-    movzbl  rINST_HI,%ecx               # ecx<- BA
-    FETCH_INST_WORD(2)
-    andb    $$0xf,%cl                   # ecl<- A
-    ADVANCE_PC(2)
+    FETCH_INST_OPCODE 2 %edx
+    andb    $$0xf,rINSTbl               # <- A
+    ADVANCE_PC 2
     movl    $$1,%eax
-    SET_VREG(%eax,%ecx)                  # vA<- true
-    GOTO_NEXT
+    SET_VREG %eax rINST                 # vA<- true
+    GOTO_NEXT_R %edx
 
     /*
      * Resolution required.  This is the least-likely path.
      *
-     *  rPC holds BBBB
-     *  rINST_HI holds BA
+     *  edx holds BBBB
+     *  rINST holds BA
      */
 .L${opcode}_resolve:
-    movl    rPC,OUT_ARG1(%esp)          # arg1<- BBBB
-    GET_GLUE(%ecx)
-    UNSPILL(rPC)
+    movl    %edx,OUT_ARG1(%esp)         # arg1<- BBBB
+    movl    rGLUE,%ecx
     movl    offGlue_method(%ecx),%ecx
     movl    $$1,OUT_ARG2(%esp)          # arg2<- true
     movl    offMethod_clazz(%ecx),%ecx  # ecx<- method->clazz
-    EXPORT_PC()
+    EXPORT_PC
     movl    %ecx,OUT_ARG0(%esp)         # arg0<- method->clazz
     call    dvmResolveClass             # eax<- resolved ClassObject ptr
-    UNSPILL(rPC)
     testl   %eax,%eax                   # success?
     je      common_exceptionThrown      # no, handle exception
 /* Now, we need to sync up with fast path.  We need eax to
  * hold the obj->clazz, and ecx to hold the resolved class
  */
     movl    %eax,%ecx                   # ecx<- resolved class
-    movzbl  rINST_HI,%eax               # eax<- BA
+    movl    rINST,%eax                # eax<- BA
     sarl    $$4,%eax                    # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB (obj)
+    GET_VREG_R %eax %eax                # eax<- vB (obj)
     movl    offObject_clazz(%eax),%eax  # eax<- obj->clazz
     jmp     .L${opcode}_resolved
diff --git a/vm/mterp/x86/OP_INT_TO_LONG.S b/vm/mterp/x86/OP_INT_TO_LONG.S
index 13f7483..6d5d0aa 100644
--- a/vm/mterp/x86/OP_INT_TO_LONG.S
+++ b/vm/mterp/x86/OP_INT_TO_LONG.S
@@ -1,14 +1,12 @@
 %verify "executed"
     /* int to long vA, vB */
-    movzbl  rINST_HI,%ecx               # ecx<- +A
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    SPILL(rPC)                          # will step on edx later
-    andb    $$0xf,%cl                   # ecx<- A
+    movzbl  rINSTbl,%eax                # eax<- +A
+    sarl    $$4,%eax                    # eax<- B
+    GET_VREG_R %eax %eax                # eax<- vB
+    andb    $$0xf,rINSTbl               # rINST<- A
     cltd                                # edx:eax<- sssssssBBBBBBBB
-    SET_VREG_WORD(%edx,%ecx,1)          # v[A+1]<- edx/rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,%ecx,0)          # v[A+0]<- %eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 1          # v[A+1]<- edx/rPC
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0          # v[A+0]<- %eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_INVOKE_DIRECT.S b/vm/mterp/x86/OP_INVOKE_DIRECT.S
index f423dc3..3718101 100644
--- a/vm/mterp/x86/OP_INVOKE_DIRECT.S
+++ b/vm/mterp/x86/OP_INVOKE_DIRECT.S
@@ -13,22 +13,20 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax              # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
-    SPILL(rPC)
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
-    movzwl    4(rPC),rPC               # rPC<- GFED or CCCC
+    movzwl    4(rPC),%edx              # edx<- GFED or CCCC
     movl      (%ecx,%eax,4),%eax       # eax<- resolved methodToCall
     .if       (!$isrange)
-    andl      $$0xf,rPC                # rPC<- D (or stays CCCC)
+    andl      $$0xf,%edx               # edx<- D (or stays CCCC)
     .endif
     testl     %eax,%eax                # already resolved?
-    GET_VREG(%ecx,rPC)                 # ecx<- "this" ptr
+    GET_VREG_R  %ecx %edx              # ecx<- "this" ptr
     je        .L${opcode}_resolve      # not resolved, do it now
 .L${opcode}_finish:
-    UNSPILL(rPC)
     testl     %ecx,%ecx                # null "this"?
     jne       common_invokeMethod${routine}  # no, continue on
     jmp       common_errNullObject
@@ -41,9 +39,8 @@
      * frequent one.  We'll have to do some reloading.
      */
 .L${opcode}_resolve:
-     SPILL_TMP(%ecx)
-     GET_GLUE(%ecx)
-     UNSPILL(rPC)
+     SPILL_TMP1(%ecx)
+     movl     rGLUE,%ecx
      movl     offGlue_method(%ecx),%ecx  # ecx<- glue->method
      movzwl   2(rPC),%eax      # reference (BBBB or CCCC)
      movl     offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
@@ -51,8 +48,7 @@
      movl     %eax,OUT_ARG1(%esp)
      movl     %ecx,OUT_ARG0(%esp)
      call     dvmResolveMethod # eax<- call(clazz, ref, flags)
-     UNSPILL_TMP(%ecx)
+     UNSPILL_TMP1(%ecx)
      testl    %eax,%eax
      jne      .L${opcode}_finish
-     UNSPILL(rPC)
      jmp      common_exceptionThrown
diff --git a/vm/mterp/x86/OP_INVOKE_DIRECT_EMPTY.S b/vm/mterp/x86/OP_INVOKE_DIRECT_EMPTY.S
index cec8b0a..2fa25e3 100644
--- a/vm/mterp/x86/OP_INVOKE_DIRECT_EMPTY.S
+++ b/vm/mterp/x86/OP_INVOKE_DIRECT_EMPTY.S
@@ -2,6 +2,6 @@
     /*
      * invoke-direct-empty is a no-op in a "standard" interpreter.
      */
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
+    FETCH_INST_WORD 3
+    ADVANCE_PC 3
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_INVOKE_INTERFACE.S b/vm/mterp/x86/OP_INVOKE_INTERFACE.S
index ff48ab8..aab94be 100644
--- a/vm/mterp/x86/OP_INVOKE_INTERFACE.S
+++ b/vm/mterp/x86/OP_INVOKE_INTERFACE.S
@@ -10,12 +10,12 @@
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
     movzwl     4(rPC),%eax              # eax<- FEDC or CCCC
-    GET_GLUE(%ecx)
+    movl       rGLUE,%ecx
     .if        (!$isrange)
     andl       $$0xf,%eax               # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- "this"
-    EXPORT_PC()
+    GET_VREG_R   %eax %eax              # eax<- "this"
+    EXPORT_PC
     testl      %eax,%eax                # null this?
     je         common_errNullObject     # yes, fail
     movl       offObject_clazz(%eax),%eax# eax<- thisPtr->clazz
@@ -26,13 +26,11 @@
     movzwl     2(rPC),%eax                         # eax<- BBBB
     movl       %ecx,OUT_ARG2(%esp)                 # arg2<- method
     movl       %eax,OUT_ARG1(%esp)                 # arg1<- BBBB
-    SPILL(rPC)
     jmp        .L${opcode}_continue
 %break
 
 .L${opcode}_continue:
     call       dvmFindInterfaceMethodInCache # eax<- call(class, ref, method, dex)
-    UNSPILL(rPC)
     testl      %eax,%eax
     je         common_exceptionThrown
     jmp        common_invokeMethod${routine}
diff --git a/vm/mterp/x86/OP_INVOKE_STATIC.S b/vm/mterp/x86/OP_INVOKE_STATIC.S
index a8a8d77..ca89cff 100644
--- a/vm/mterp/x86/OP_INVOKE_STATIC.S
+++ b/vm/mterp/x86/OP_INVOKE_STATIC.S
@@ -8,15 +8,15 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx  # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%eax        # eax<- resolved methodToCall
     testl     %eax,%eax
     jne       common_invokeMethod${routine}
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movl      offGlue_method(%ecx),%ecx # ecx<- glue->method
     movzwl    2(rPC),%eax
     movl      offMethod_clazz(%ecx),%ecx# ecx<- method->clazz
@@ -28,9 +28,7 @@
 .L${opcode}_continue:
     movl      $$METHOD_STATIC,%eax
     movl      %eax,OUT_ARG2(%esp)       # arg2<- flags
-    SPILL(rPC)
     call      dvmResolveMethod          # call(clazz,ref,flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                 # got null?
     jne       common_invokeMethod${routine}
     jmp       common_exceptionThrown
diff --git a/vm/mterp/x86/OP_INVOKE_SUPER.S b/vm/mterp/x86/OP_INVOKE_SUPER.S
index 013fc01..42bd6a6 100644
--- a/vm/mterp/x86/OP_INVOKE_SUPER.S
+++ b/vm/mterp/x86/OP_INVOKE_SUPER.S
@@ -8,19 +8,19 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(rINST_FULL)
+    movl      rGLUE,rINST
     movzwl    2(rPC),%eax               # eax<- BBBB
-    movl      offGlue_methodClassDex(rINST_FULL),%ecx # ecx<- pDvmDex
-    EXPORT_PC()
+    movl      offGlue_methodClassDex(rINST),%ecx # ecx<- pDvmDex
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%ecx),%ecx # ecx<- pDvmDex->pResMethods
     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved baseMethod
-    movl      offGlue_method(rINST_FULL),%eax # eax<- method
-    movzwl    4(rPC),rINST_FULL         # rINST_FULL<- GFED or CCCC
+    movl      offGlue_method(rINST),%eax # eax<- method
+    movzwl    4(rPC),rINST              # rINST<- GFED or CCCC
     .if       (!$isrange)
-    andl      $$0xf,rINST_FULL          # rINST_FULL<- D (or stays CCCC)
+    andl      $$0xf,rINST               # rINST<- D (or stays CCCC)
     .endif
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- "this" ptr
-    testl     rINST_FULL,rINST_FULL     # null "this"?
+    GET_VREG_R  rINST rINST             # rINST<- "this" ptr
+    testl     rINST,rINST               # null "this"?
     je        common_errNullObject      # yes, throw
     movl      offMethod_clazz(%eax),%eax # eax<- method->clazz
     testl     %ecx,%ecx                 # already resolved?
@@ -48,17 +48,15 @@
      * eax = method->clazz
     */
 .L${opcode}_resolve:
-    SPILL_TMP(%eax)                     # method->clazz
+    SPILL_TMP1(%eax)                    # method->clazz
     movl    %eax,OUT_ARG0(%esp)         # arg0<- method->clazz
     movzwl  2(rPC),%ecx                 # ecx<- BBBB
     movl    $$METHOD_VIRTUAL,OUT_ARG2(%esp)  # arg2<- resolver method type
     movl    %ecx,OUT_ARG1(%esp)         # arg1<- ref
-    SPILL(rPC)
     call    dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl   %eax,%eax                   # got null?
     movl    %eax,%ecx                   # ecx<- resolved base method
-    UNSPILL_TMP(%eax)                   # restore method->clazz
+    UNSPILL_TMP1(%eax)                  # restore method->clazz
     jne     .L${opcode}_continue        # good to go - continue
     jmp     common_exceptionThrown      # handle exception
 
diff --git a/vm/mterp/x86/OP_INVOKE_SUPER_QUICK.S b/vm/mterp/x86/OP_INVOKE_SUPER_QUICK.S
index 96c662a..d02cf13 100644
--- a/vm/mterp/x86/OP_INVOKE_SUPER_QUICK.S
+++ b/vm/mterp/x86/OP_INVOKE_SUPER_QUICK.S
@@ -8,19 +8,19 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    4(rPC),%eax               # eax<- GFED or CCCC
     movl      offGlue_method(%ecx),%ecx # ecx<- current method
     .if       (!$isrange)
     andl      $$0xf,%eax                # eax<- D (or stays CCCC)
     .endif
     movl      offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
-    GET_VREG(%eax,%eax)                 # eax<- "this"
+    GET_VREG_R  %eax %eax               # eax<- "this"
     movl      offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super
     testl     %eax,%eax                 # null "this"?
     je        common_errNullObject      # "this" is null, throw exception
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offClassObject_vtable(%ecx),%ecx # ecx<- vtable
-    EXPORT_PC()
+    EXPORT_PC
     movl      (%ecx,%eax,4),%eax        # eax<- super->vtable[BBBB]
     jmp       common_invokeMethod${routine}
diff --git a/vm/mterp/x86/OP_INVOKE_VIRTUAL.S b/vm/mterp/x86/OP_INVOKE_VIRTUAL.S
index 85fcf83..ab4dc95 100644
--- a/vm/mterp/x86/OP_INVOKE_VIRTUAL.S
+++ b/vm/mterp/x86/OP_INVOKE_VIRTUAL.S
@@ -10,18 +10,17 @@
      */
     /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
     /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movzwl    2(rPC),%ecx                 # ecx<- BBBB
     movl      offGlue_methodClassDex(%eax),%eax  # eax<- pDvmDex
-    EXPORT_PC()
+    EXPORT_PC
     movl      offDvmDex_pResMethods(%eax),%eax   # eax<- pDvmDex->pResMethods
     movl      (%eax,%ecx,4),%eax          # eax<- resolved baseMethod
     testl     %eax,%eax                   # already resolved?
     jne       .L${opcode}_continue        # yes, continue
-    GET_GLUE(%eax)
+    movl      rGLUE,%eax
     movl      %ecx,OUT_ARG1(%esp)         # arg1<- ref
     movl      offGlue_method(%eax),%eax   # eax<- glue->method
-    SPILL(rPC)
     jmp       .L${opcode}_more
 %break
 
@@ -31,7 +30,6 @@
     movl      %eax,OUT_ARG0(%esp)         # arg0<- clazz
     movl      $$METHOD_VIRTUAL,OUT_ARG2(%esp) # arg2<- flags
     call      dvmResolveMethod            # eax<- call(clazz, ref, flags)
-    UNSPILL(rPC)
     testl     %eax,%eax                   # got null?
     jne       .L${opcode}_continue        # no, continue
     jmp       common_exceptionThrown      # yes, handle exception
@@ -45,7 +43,7 @@
     .if       (!$isrange)
     andl      $$0xf,%ecx                # ecx<- D (or stays CCCC)
     .endif
-    GET_VREG(%ecx,%ecx)                 # ecx<- "this"
+    GET_VREG_R  %ecx %ecx               # ecx<- "this"
     movzwl    offMethod_methodIndex(%eax),%eax  # eax<- baseMethod->methodIndex
     testl     %ecx,%ecx                 # null this?
     je        common_errNullObject      # go if so
diff --git a/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S b/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S
index 1ba93eb..14202d8 100644
--- a/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S
+++ b/vm/mterp/x86/OP_INVOKE_VIRTUAL_QUICK.S
@@ -13,11 +13,11 @@
     .if     (!$isrange)
     andl      $$0xf,%eax                # eax<- C (or stays CCCC)
     .endif
-    GET_VREG(%eax,%eax)                 # eax<- vC ("this" ptr)
+    GET_VREG_R  %eax %eax               # eax<- vC ("this" ptr)
     testl     %eax,%eax                 # null?
     je        common_errNullObject      # yep, throw exception
     movl      offObject_clazz(%eax),%eax # eax<- thisPtr->clazz
     movl      offClassObject_vtable(%eax),%eax # eax<- thisPtr->clazz->vtable
-    EXPORT_PC()                         # might throw later - get ready
+    EXPORT_PC                           # might throw later - get ready
     movl      (%eax,%ecx,4),%eax        # eax<- vtable[BBBB]
     jmp       common_invokeMethod${routine}
diff --git a/vm/mterp/x86/OP_IPUT.S b/vm/mterp/x86/OP_IPUT.S
index 78d9edb..20d4a1a 100644
--- a/vm/mterp/x86/OP_IPUT.S
+++ b/vm/mterp/x86/OP_IPUT.S
@@ -1,5 +1,5 @@
 
-%default { "store":"movl", "reg":"rINST_FULL", "sqnum":"0" }
+%default { "store":"movl", "reg":"rINST", "sqnum":"0" }
 %verify "executed"
 %verify "null object"
 %verify "field already resolved"
@@ -11,37 +11,32 @@
      * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $$4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $$0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .L${opcode}_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # %edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $$4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $$0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .L${opcode}_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .L${opcode}_resolve
 %break
 
 
 .L${opcode}_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .L${opcode}_finish
     jmp     common_exceptionThrown
 
@@ -50,15 +45,13 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
+    GET_VREG_R rINST rINST                       # rINST<- v[A]
     movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
     testl   %ecx,%ecx                            # object null?
     je      common_errNullObject                 # object was null
+    FETCH_INST_OPCODE 2 %edx
     $store   $reg,(%ecx,%eax,1)            # obj.field <- v[A](8/16/32 bits)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IPUT_BOOLEAN.S b/vm/mterp/x86/OP_IPUT_BOOLEAN.S
index 5072a68..1bdde9d 100644
--- a/vm/mterp/x86/OP_IPUT_BOOLEAN.S
+++ b/vm/mterp/x86/OP_IPUT_BOOLEAN.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/OP_IPUT.S" { "store":"movb","reg":"rINST_LO", "sqnum":"1" }
+%include "x86/OP_IPUT.S" { "store":"movb","reg":"rINSTbl", "sqnum":"1" }
diff --git a/vm/mterp/x86/OP_IPUT_BYTE.S b/vm/mterp/x86/OP_IPUT_BYTE.S
index 3ad2a4b..3a8652d 100644
--- a/vm/mterp/x86/OP_IPUT_BYTE.S
+++ b/vm/mterp/x86/OP_IPUT_BYTE.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/OP_IPUT.S" { "store":"movb", "reg":"rINST_LO", "sqnum":"2" }
+%include "x86/OP_IPUT.S" { "store":"movb", "reg":"rINSTbl", "sqnum":"2" }
diff --git a/vm/mterp/x86/OP_IPUT_CHAR.S b/vm/mterp/x86/OP_IPUT_CHAR.S
index c7a7478..ba8d38e 100644
--- a/vm/mterp/x86/OP_IPUT_CHAR.S
+++ b/vm/mterp/x86/OP_IPUT_CHAR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/OP_IPUT.S" { "store":"movw", "reg":"rINST", "sqnum":"3" }
+%include "x86/OP_IPUT.S" { "store":"movw", "reg":"rINSTw", "sqnum":"3" }
diff --git a/vm/mterp/x86/OP_IPUT_OBJECT.S b/vm/mterp/x86/OP_IPUT_OBJECT.S
index 39c64e7..a9a99ea 100644
--- a/vm/mterp/x86/OP_IPUT_OBJECT.S
+++ b/vm/mterp/x86/OP_IPUT_OBJECT.S
@@ -10,37 +10,32 @@
      * for: iput-object
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $$4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $$0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .L${opcode}_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $$4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $$0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .L${opcode}_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .L${opcode}_resolve
 %break
 
 
 .L${opcode}_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           # returns InstrField ptr
     jne     .L${opcode}_finish
     jmp     common_exceptionThrown
 
@@ -49,22 +44,21 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   %edx is scratch, but needs to be unspilled
+     *   rINST holds A
      */
-    GET_VREG(rINST_FULL,rINST_FULL)              # rINST_FULL<- v[A]
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    movl    rINST_FULL,(%ecx,%eax)          # obj.field <- v[A](8/16/32 bits)
-    GET_GLUE(%eax)
-    testl   rINST_FULL,rINST_FULL                # stored a NULL?
-    movl    offGlue_cardTable(%eax),%eax         # get card table base
-    FETCH_INST_WORD(2)
-    je      1f                                   # skip card mark if null store
-    shrl    $$GC_CARD_SHIFT,%ecx                 # object head to card number
-    movb    %al,(%eax,%ecx)                      # mark card
+    GET_VREG_R rINST rINST                      # rINST<- v[A]
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    movl    rINST,(%ecx,%eax)      # obj.field <- v[A](8/16/32 bits)
+    movl    rGLUE,%eax
+    testl   rINST,rINST                         # stored a NULL?
+    movl    offGlue_cardTable(%eax),%eax        # get card table base
+    FETCH_INST_OPCODE 2 %edx
+    je      1f                                  # skip card mark if null store
+    shrl    $$GC_CARD_SHIFT,%ecx                # object head to card number
+    movb    %al,(%eax,%ecx)                     # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S b/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
index fb7205b..8e8c47d 100644
--- a/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
+++ b/vm/mterp/x86/OP_IPUT_OBJECT_QUICK.S
@@ -2,27 +2,26 @@
 %verify "null object"
     /* For: iput-object-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
-    movzbl    rINST_HI,rINST_FULL
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
+    andb      $$0xf,rINSTbl             # rINST<- A
+    GET_VREG_R  rINST rINST             # rINST<- v[A]
     movzwl    2(rPC),%eax               # eax<- field byte offset
     testl     %ecx,%ecx                 # is object null?
     je        common_errNullObject
-    movl      rINST_FULL,(%ecx,%eax,1)
-    GET_GLUE(%eax)
+    movl      rINST,(%ecx,%eax,1)
+    movl      rGLUE,%eax
     jmp       .L${opcode}_finish
 %break
 
 .L${opcode}_finish:
-    testl     rINST_FULL,rINST_FULL         # did we store null?
-    FETCH_INST_WORD(2)
+    testl     rINST,rINST               # did we store null?
+    FETCH_INST_OPCODE 2 %edx
     movl      offGlue_cardTable(%eax),%eax  # get card table base
     je        1f                            # skip card mark if null store
     shrl      $$GC_CARD_SHIFT,%ecx          # object head to card number
     movb      %al,(%eax,%ecx)               # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IPUT_QUICK.S b/vm/mterp/x86/OP_IPUT_QUICK.S
index e62ec00..6cec0d1 100644
--- a/vm/mterp/x86/OP_IPUT_QUICK.S
+++ b/vm/mterp/x86/OP_IPUT_QUICK.S
@@ -2,16 +2,15 @@
 %verify "null object"
     /* For: iput-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
-    movzbl    rINST_HI,rINST_FULL
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG(rINST_FULL,rINST_FULL)     # rINST_FULL<- v[A]
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
+    andb      $$0xf,rINSTbl             # rINST<- A
+    GET_VREG_R  rINST,rINST             # rINST<- v[A]
     movzwl    2(rPC),%eax               # eax<- field byte offset
-    testl     %ecx,%ecx                  # is object null?
+    testl     %ecx,%ecx                 # is object null?
+    FETCH_INST_OPCODE 2 %edx
     je        common_errNullObject
-    movl      rINST_FULL,(%ecx,%eax,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,(%ecx,%eax,1)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IPUT_SHORT.S b/vm/mterp/x86/OP_IPUT_SHORT.S
index 4b20b46..299953a 100644
--- a/vm/mterp/x86/OP_IPUT_SHORT.S
+++ b/vm/mterp/x86/OP_IPUT_SHORT.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/OP_IPUT.S" { "store":"movw", "reg":"rINST", "sqnum":"4" }
+%include "x86/OP_IPUT.S" { "store":"movw", "reg":"rINSTw", "sqnum":"4" }
diff --git a/vm/mterp/x86/OP_IPUT_WIDE.S b/vm/mterp/x86/OP_IPUT_WIDE.S
index 53f8212..435d474 100644
--- a/vm/mterp/x86/OP_IPUT_WIDE.S
+++ b/vm/mterp/x86/OP_IPUT_WIDE.S
@@ -8,37 +8,32 @@
      *
      */
     /* op vA, vB, field@CCCC */
-    GET_GLUE(%ecx)
-    SPILL(rIBASE)                                 # need another reg
-    movzwl  2(rPC),rIBASE                         # rIBASE<- 0000CCCC
-    movl    offGlue_methodClassDex(%ecx),%eax     # eax<- DvmDex
-    movzbl  rINST_HI,%ecx                         # ecx<- BA
-    sarl    $$4,%ecx                              # ecx<- B
-    movl    offDvmDex_pResFields(%eax),%eax       # eax<- pDvmDex->pResFields
-    movzbl  rINST_HI,rINST_FULL                   # rINST_FULL<- BA
-    andb    $$0xf,rINST_LO                        # rINST_FULL<- A
-    GET_VREG(%ecx,%ecx)                           # ecx<- fp[B], the object ptr
-    movl    (%eax,rIBASE,4),%eax                  # resolved entry
-    testl   %eax,%eax                             # is resolved entry null?
-    jne     .L${opcode}_finish                    # no, already resolved
-    movl    rIBASE,OUT_ARG1(%esp)
-    GET_GLUE(rIBASE)
+    movl    rGLUE,%ecx
+    movzwl  2(rPC),%edx                         # edx<- 0000CCCC
+    movl    offGlue_methodClassDex(%ecx),%eax   # eax<- DvmDex
+    movzbl  rINSTbl,%ecx                        # ecx<- BA
+    sarl    $$4,%ecx                            # ecx<- B
+    movl    offDvmDex_pResFields(%eax),%eax     # eax<- pDvmDex->pResFields
+    andb    $$0xf,rINSTbl                       # rINST<- A
+    GET_VREG_R %ecx %ecx                        # ecx<- fp[B], the object ptr
+    movl    (%eax,%edx,4),%eax                  # resolved entry
+    testl   %eax,%eax                           # is resolved entry null?
+    jne     .L${opcode}_finish                  # no, already resolved
+    movl    %edx,OUT_ARG1(%esp)
+    movl    rGLUE,%edx
     jmp     .L${opcode}_resolve
 %break
 
 
 .L${opcode}_resolve:
-    EXPORT_PC()
-    SPILL(rPC)
-    movl    offGlue_method(rIBASE),rPC            # rPC<- current method
-    UNSPILL(rIBASE)
-    movl    offMethod_clazz(rPC),rPC              # rPC<- method->clazz
-    SPILL_TMP(%ecx)                               # save object pointer across call
-    movl    rPC,OUT_ARG0(%esp)                    # pass in method->clazz
-    call    dvmResolveInstField                   #  ... to dvmResolveInstField
-    UNSPILL_TMP(%ecx)
-    UNSPILL(rPC)
-    testl   %eax,%eax                             #  ... which returns InstrField ptr
+    EXPORT_PC
+    movl    offGlue_method(%edx),%edx           # edx<- current method
+    movl    offMethod_clazz(%edx),%edx          # edx<- method->clazz
+    SPILL_TMP1(%ecx)                            # save obj pointer across call
+    movl    %edx,OUT_ARG0(%esp)                 # pass in method->clazz
+    call    dvmResolveInstField                 #  ... to dvmResolveInstField
+    UNSPILL_TMP1(%ecx)
+    testl   %eax,%eax                           #  ... which returns InstrField ptr
     jne     .L${opcode}_finish
     jmp     common_exceptionThrown
 
@@ -47,18 +42,17 @@
      * Currently:
      *   eax holds resolved field
      *   ecx holds object
-     *   rIBASE is scratch, but needs to be unspilled
-     *   rINST_FULL holds A
+     *   %edx is scratch, but needs to be unspilled
+     *   rINST holds A
      */
-    movl    offInstField_byteOffset(%eax),%eax   # eax<- byte offset of field
-    UNSPILL(rIBASE)
-    testl   %ecx,%ecx                            # object null?
-    je      common_errNullObject                 # object was null
-    leal    (%ecx,%eax,1),%eax                   # eax<- address of field
-    GET_VREG_WORD(%ecx,rINST_FULL,0)             # ecx<- lsw
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1)       # rINST_FULL<- msw
-    movl    rINST_FULL,4(%eax)
-    FETCH_INST_WORD(2)
+    movl    offInstField_byteOffset(%eax),%eax  # eax<- byte offset of field
+    testl   %ecx,%ecx                           # object null?
+    je      common_errNullObject                # object was null
+    leal    (%ecx,%eax,1),%eax                  # eax<- address of field
+    GET_VREG_WORD %ecx rINST 0                  # ecx<- lsw
+    GET_VREG_WORD rINST rINST 1                 # rINST<- msw
+    FETCH_INST_OPCODE 2 %edx
+    movl    rINST,4(%eax)
     movl    %ecx,(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_IPUT_WIDE_QUICK.S b/vm/mterp/x86/OP_IPUT_WIDE_QUICK.S
index d2a1ae4..63bf89a 100644
--- a/vm/mterp/x86/OP_IPUT_WIDE_QUICK.S
+++ b/vm/mterp/x86/OP_IPUT_WIDE_QUICK.S
@@ -2,19 +2,18 @@
 %verify "null object"
     /* For: iput-wide-quick */
     /* op vA, vB, offset@CCCC */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG(%ecx,%ecx)                 # vB (object we're operating on)
+    GET_VREG_R  %ecx %ecx               # vB (object we're operating on)
     movzwl    2(rPC),%eax               # eax<- field byte offset
     testl      %ecx,%ecx                # is object null?
     je        common_errNullObject
     leal      (%ecx,%eax,1),%ecx        # ecx<- Address of 64-bit target
-    movzbl    rINST_HI,rINST_FULL
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- lsw
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- msw
+    andb      $$0xf,rINSTbl             # rINST<- A
+    GET_VREG_WORD %eax rINST 0          # eax<- lsw
+    GET_VREG_WORD rINST rINST 1         # rINST<- msw
+    FETCH_INST_OPCODE 2 %edx
     movl      %eax,(%ecx)
-    movl      rINST_FULL,4(%ecx)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    movl      rINST,4(%ecx)
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MONITOR_ENTER.S b/vm/mterp/x86/OP_MONITOR_ENTER.S
index 548f71f..848f0fd 100644
--- a/vm/mterp/x86/OP_MONITOR_ENTER.S
+++ b/vm/mterp/x86/OP_MONITOR_ENTER.S
@@ -4,29 +4,26 @@
      * Synchronize on an object.
      */
     /* monitor-enter vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
+    movl    rGLUE,%ecx
+    GET_VREG_R %eax rINST               # eax<- vAA
     movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
-    FETCH_INST_WORD(1)
+    FETCH_INST_WORD 1
     testl   %eax,%eax                   # null object?
-    EXPORT_PC()                         # need for precise GC, MONITOR_TRACKING
+    EXPORT_PC                           # need for precise GC, MONITOR_TRACKING
     jne     .L${opcode}_continue
     jmp     common_errNullObject
 %break
 
 .L${opcode}_continue:
-    SPILL(rPC)                          # have to - caller save
     movl    %ecx,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     call    dvmLockObject               # dvmLockObject(self,object)
-    UNSPILL(rPC)
 #ifdef WITH_DEADLOCK_PREDICTION
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     movl    offGlueSelf(%ecx),%ecx      # ecx<- glue->self
     movl    offThread_exception(%ecx),%eax
     testl   %eax,%eax
     jne     common_exceptionThrown
 #endif
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_MONITOR_EXIT.S b/vm/mterp/x86/OP_MONITOR_EXIT.S
index 788b7a7..7e4e3d0 100644
--- a/vm/mterp/x86/OP_MONITOR_EXIT.S
+++ b/vm/mterp/x86/OP_MONITOR_EXIT.S
@@ -9,27 +9,24 @@
      * instruction spec.
      */
     /* monitor-exit vAA */
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    GET_VREG_R %eax rINST
+    movl    rGLUE,%ecx
+    EXPORT_PC
     testl   %eax,%eax                   # null object?
     je      .L${opcode}_errNullObject   # go if so
     movl    offGlue_self(%ecx),%ecx     # ecx<- glue->self
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     movl    %ecx,OUT_ARG0(%esp)
     jmp     .L${opcode}_continue
 %break
 
 .L${opcode}_continue:
     call    dvmUnlockObject             # unlock(self,obj)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
     testl   %eax,%eax                   # success?
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     je      common_exceptionThrown      # no, exception pending
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 .L${opcode}_errNullObject:
-    ADVANCE_PC(1)                       # advance before throw
+    ADVANCE_PC 1                        # advance before throw
     jmp     common_errNullObject
diff --git a/vm/mterp/x86/OP_MOVE.S b/vm/mterp/x86/OP_MOVE.S
index f0d070d..0953bec 100644
--- a/vm/mterp/x86/OP_MOVE.S
+++ b/vm/mterp/x86/OP_MOVE.S
@@ -1,11 +1,11 @@
 %verify "executed"
     /* for move, move-object, long-to-int */
     /* op vA, vB */
-    movzbl rINST_HI,%eax         # eax<- BA
+    movzbl rINSTbl,%eax          # eax<- BA
     andb   $$0xf,%al             # eax<- A
-    shrl   $$12,rINST_FULL       # rINST_FULL<- B
-    GET_VREG(%ecx,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG(%ecx,%eax)          # fp[A]<-fp[B]
-    GOTO_NEXT
+    shrl   $$4,rINST            # rINST<- B
+    GET_VREG_R %ecx rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG %ecx %eax           # fp[A]<-fp[B]
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_16.S b/vm/mterp/x86/OP_MOVE_16.S
index 9a0e4ee..6554135 100644
--- a/vm/mterp/x86/OP_MOVE_16.S
+++ b/vm/mterp/x86/OP_MOVE_16.S
@@ -3,8 +3,8 @@
     /* op vAAAA, vBBBB */
     movzwl    4(rPC),%ecx              # ecx<- BBBB
     movzwl    2(rPC),%eax              # eax<- AAAA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG(%ecx,%eax)
-    GOTO_NEXT
+    GET_VREG_R  %ecx %ecx
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    SET_VREG  %ecx %eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_EXCEPTION.S b/vm/mterp/x86/OP_MOVE_EXCEPTION.S
index 07a32c9..f9542ae 100644
--- a/vm/mterp/x86/OP_MOVE_EXCEPTION.S
+++ b/vm/mterp/x86/OP_MOVE_EXCEPTION.S
@@ -1,11 +1,10 @@
 %verify "executed"
     /* move-exception vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL        # rINST_FULL<- AA
+    movl    rGLUE,%ecx
     movl    offGlue_self(%ecx),%ecx    # ecx<- glue->self
     movl    offThread_exception(%ecx),%eax # eax<- dvmGetException bypass
-    SET_VREG(%eax,rINST_FULL)          # fp[AA]<- exception object
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    SET_VREG %eax rINST                # fp[AA]<- exception object
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     movl    $$0,offThread_exception(%ecx) # dvmClearException bypass
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_FROM16.S b/vm/mterp/x86/OP_MOVE_FROM16.S
index 35d3147..3c99c55 100644
--- a/vm/mterp/x86/OP_MOVE_FROM16.S
+++ b/vm/mterp/x86/OP_MOVE_FROM16.S
@@ -1,10 +1,10 @@
 %verify "executed"
     /* for: move/from16, move-object/from16 */
     /* op vAA, vBBBB */
-    movzx    rINST_HI,%eax            # eax <= AA
-    movw     2(rPC),rINST             # rINST <= BBBB
-    GET_VREG (%ecx,rINST_FULL)        # ecx<- fp[BBBB]
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG (%ecx,%eax)              # fp[AA]<- ecx]
-    GOTO_NEXT
+    movzx    rINSTbl,%eax              # eax <= AA
+    movw     2(rPC),rINSTw             # rINSTw <= BBBB
+    GET_VREG_R %ecx rINST              # ecx<- fp[BBBB]
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %ecx %eax                # fp[AA]<- ecx]
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_RESULT.S b/vm/mterp/x86/OP_MOVE_RESULT.S
index 160aec6..07770cb 100644
--- a/vm/mterp/x86/OP_MOVE_RESULT.S
+++ b/vm/mterp/x86/OP_MOVE_RESULT.S
@@ -1,10 +1,10 @@
 %verify "executed"
     /* for: move-result, move-result-object */
     /* op vAA */
-    GET_GLUE(%eax)                         # eax<- rGLUE
-    movzx    rINST_HI,%ecx                 # ecx<- AA
+    movl     rGLUE,%eax                    # eax<- rGLUE
+    movzx    rINSTbl,%ecx                  # ecx<- AA
     movl     offGlue_retval(%eax),%eax     # eax<- glue->retval.l
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG (%eax,%ecx)                   # fp[AA]<- retval.l
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG  %eax %ecx                    # fp[AA]<- retval.l
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_RESULT_WIDE.S b/vm/mterp/x86/OP_MOVE_RESULT_WIDE.S
index 905037f..9f8d315 100644
--- a/vm/mterp/x86/OP_MOVE_RESULT_WIDE.S
+++ b/vm/mterp/x86/OP_MOVE_RESULT_WIDE.S
@@ -1,11 +1,10 @@
 %verify "executed"
     /* move-result-wide vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
+    movl    rGLUE,%ecx
     movl    offGlue_retval(%ecx),%eax
     movl    4+offGlue_retval(%ecx),%ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)    # v[AA+0] <- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)    # v[AA+1] <- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0     # v[AA+0] <- eax
+    SET_VREG_WORD %ecx rINST 1     # v[AA+1] <- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_WIDE.S b/vm/mterp/x86/OP_MOVE_WIDE.S
index 022cc6e..2d89e3b 100644
--- a/vm/mterp/x86/OP_MOVE_WIDE.S
+++ b/vm/mterp/x86/OP_MOVE_WIDE.S
@@ -1,13 +1,13 @@
 %verify "executed"
     /* move-wide vA, vB */
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
-    movzbl    rINST_HI,%ecx                # ecx <- BA
-    sarl      $$12,rINST_FULL              # rinst_FULL<- B
-    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[B+0]
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[B+1]
-    andb      $$0xf,%cl                    # ecx <- A
-    SET_VREG_WORD(rINST_FULL,%ecx,1)       # v[A+1]<- rINST_FULL
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    SET_VREG_WORD(%eax,%ecx,0)             # v[A+0]<- eax
-    GOTO_NEXT
+    movzbl    rINSTbl,%ecx                # ecx <- BA
+    sarl      $$4,rINST                   # rINST<- B
+    GET_VREG_WORD %eax rINST 0            # eax<- v[B+0]
+    GET_VREG_WORD rINST rINST 1           # rINST<- v[B+1]
+    andb      $$0xf,%cl                   # ecx <- A
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD rINST %ecx 1            # v[A+1]<- rINST
+    ADVANCE_PC 1
+    SET_VREG_WORD %eax %ecx 0             # v[A+0]<- eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_WIDE_16.S b/vm/mterp/x86/OP_MOVE_WIDE_16.S
index d7be1d1..4cec42c 100644
--- a/vm/mterp/x86/OP_MOVE_WIDE_16.S
+++ b/vm/mterp/x86/OP_MOVE_WIDE_16.S
@@ -3,10 +3,10 @@
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
     movzwl    4(rPC),%ecx            # ecx<- BBBB
     movzwl    2(rPC),%eax            # eax<- AAAA
-    GET_VREG_WORD(rINST_FULL,%ecx,0) # rINST_WORD<- v[BBBB+0]
-    GET_VREG_WORD(%ecx,%ecx,1)       # ecx<- v[BBBB+1]
-    SET_VREG_WORD(rINST_FULL,%eax,0) # v[AAAA+0]<- rINST_FULL
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    SET_VREG_WORD(%ecx,%eax,1)       # v[AAAA+1]<- ecx
-    GOTO_NEXT
+    GET_VREG_WORD rINST %ecx 0       # rINSTw_WORD<- v[BBBB+0]
+    GET_VREG_WORD %ecx %ecx 1        # ecx<- v[BBBB+1]
+    FETCH_INST_OPCODE 3 %edx
+    SET_VREG_WORD rINST %eax 0       # v[AAAA+0]<- rINST
+    ADVANCE_PC 3
+    SET_VREG_WORD %ecx %eax 1        # v[AAAA+1]<- ecx
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MOVE_WIDE_FROM16.S b/vm/mterp/x86/OP_MOVE_WIDE_FROM16.S
index cbc13d2..6b59c68 100644
--- a/vm/mterp/x86/OP_MOVE_WIDE_FROM16.S
+++ b/vm/mterp/x86/OP_MOVE_WIDE_FROM16.S
@@ -2,11 +2,11 @@
     /* move-wide/from16 vAA, vBBBB */
     /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
     movzwl    2(rPC),%ecx              # ecx<- BBBB
-    movzbl    rINST_HI,%eax            # eax<- AAAA
-    GET_VREG_WORD(rINST_FULL,%ecx,0)   # rINST_FULL<- v[BBBB+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[BBBB+1]
-    SET_VREG_WORD(rINST_FULL,%eax,0)   # v[AAAA+0]<- rINST_FULL
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG_WORD(%ecx,%eax,1)         # v[AAAA+1]<- eax
-    GOTO_NEXT
+    movzbl    rINSTbl,%eax             # eax<- AAAA
+    GET_VREG_WORD rINST %ecx 0         # rINST<- v[BBBB+0]
+    GET_VREG_WORD %ecx %ecx 1          # ecx<- v[BBBB+1]
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG_WORD rINST %eax 0         # v[AAAA+0]<- rINST
+    SET_VREG_WORD %ecx %eax 1          # v[AAAA+1]<- eax
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MUL_INT.S b/vm/mterp/x86/OP_MUL_INT.S
index b859672..df4be1d 100644
--- a/vm/mterp/x86/OP_MUL_INT.S
+++ b/vm/mterp/x86/OP_MUL_INT.S
@@ -5,12 +5,9 @@
     /* mul vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    SPILL(rPC)
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    imull    (rFP,%ecx,4),%eax      # trashes rPC/edx
-    UNSPILL(rPC)
-    movzbl   rINST_HI,%ecx          # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    GET_VREG_R %eax %eax            # eax<- vBB
+    imull    (rFP,%ecx,4),%eax      # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MUL_INT_2ADDR.S b/vm/mterp/x86/OP_MUL_INT_2ADDR.S
index 823ab64..00d294f 100644
--- a/vm/mterp/x86/OP_MUL_INT_2ADDR.S
+++ b/vm/mterp/x86/OP_MUL_INT_2ADDR.S
@@ -1,13 +1,11 @@
 %verify "executed"
     /* mul vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    andb    $$0xf,%cl                   # ecx<- A
-    SPILL(rPC)
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $$4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    andb    $$0xf,%cl                  # ecx<- A
     imull   (rFP,%ecx,4),%eax
-    UNSPILL(rPC)
-    SET_VREG(%eax,%ecx)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG %eax %ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MUL_INT_LIT16.S b/vm/mterp/x86/OP_MUL_INT_LIT16.S
index f562425..57c9d4c 100644
--- a/vm/mterp/x86/OP_MUL_INT_LIT16.S
+++ b/vm/mterp/x86/OP_MUL_INT_LIT16.S
@@ -1,16 +1,13 @@
 %verify "executed"
     /* mul/lit16 vA, vB, #+CCCC */
-    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $$4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    SPILL(rPC)
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $$0xf,rINST_LO             # rINST_FULL<- A
-    imull     %ecx,%eax                 # trashes rPC
-    UNSPILL(rPC)
-    SET_VREG(%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    andb     $$0xf,rINSTbl              # rINST<- A
+    imull     %ecx,%eax                 # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MUL_INT_LIT8.S b/vm/mterp/x86/OP_MUL_INT_LIT8.S
index 2cf11b3..f662d25 100644
--- a/vm/mterp/x86/OP_MUL_INT_LIT8.S
+++ b/vm/mterp/x86/OP_MUL_INT_LIT8.S
@@ -2,12 +2,9 @@
     /* mul/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    SPILL(rPC)
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
-    imull     %ecx,%eax                # trashes rPC
-    UNSPILL(rPC)
-    SET_VREG  (%eax,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GET_VREG_R   %eax %eax             # eax<- rBB
+    imull     %ecx,%eax                # trashes edx
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG  %eax rINST
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_MUL_LONG.S b/vm/mterp/x86/OP_MUL_LONG.S
index fd151e0..3d8341a 100644
--- a/vm/mterp/x86/OP_MUL_LONG.S
+++ b/vm/mterp/x86/OP_MUL_LONG.S
@@ -3,41 +3,37 @@
      * Signed 64-bit integer multiply.
      *
      * We could definately use more free registers for
-     * this code.  We must spill rPC (edx) because it
-     * is used by imul.  We'll also spill rINST (ebx),
+     * this code.   We spill rINSTw (ebx),
      * giving us eax, ebc, ecx and edx as computational
-     * temps.  On top of that, we'll spill rIBASE (edi)
-     * for use as the vB pointer and rFP (esi) for use
+     * temps.  On top of that, we'll spill edi (rFP)
+     * for use as the vB pointer and esi for use
      * as the vC pointer.  Yuck.
      */
     /* mul-long vAA, vBB, vCC */
     movzbl    2(rPC),%eax              # eax<- B
     movzbl    3(rPC),%ecx              # ecx<- C
-    SPILL(rPC)
-    SPILL(rIBASE)
+    SPILL_TMP2(%esi)
     SPILL(rFP)
-    SPILL(rINST_FULL)
-    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[B]
+    SPILL(rINST)
+    leal      (rFP,%eax,4),%esi        # esi<- &v[B]
     leal      (rFP,%ecx,4),rFP         # rFP<- &v[C]
-    movl      4(rIBASE),%ecx      # ecx<- Bmsw
-    imull     (rFP),%ecx          # ecx<- (Bmsw*Clsw)
-    movl      4(rFP),%eax         # eax<- Cmsw
-    imull     (rIBASE),%eax       # eax<- (Cmsw*Blsw)
-    addl      %eax,%ecx           # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
-    movl      (rFP),%eax          # eax<- Clsw
-    mull      (rIBASE)            # eax<- (Clsw*Alsw)
-    UNSPILL(rINST_FULL)
+    movl      4(%esi),%ecx             # ecx<- Bmsw
+    imull     (rFP),%ecx               # ecx<- (Bmsw*Clsw)
+    movl      4(rFP),%eax              # eax<- Cmsw
+    imull     (%esi),%eax              # eax<- (Cmsw*Blsw)
+    addl      %eax,%ecx                # ecx<- (Bmsw*Clsw)+(Cmsw*Blsw)
+    movl      (rFP),%eax               # eax<- Clsw
+    mull      (%esi)                   # eax<- (Clsw*Alsw)
+    UNSPILL(rINST)
     UNSPILL(rFP)
     jmp       .L${opcode}_continue
 %break
 
 .L${opcode}_continue:
     leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
-    movzbl    rINST_HI,%ecx       # ecx<- A
-    movl      %edx,4(rFP,%ecx,4)  # v[B+1]<- %edx
-    UNSPILL(rPC)                  # restore rPC/%edx
-    FETCH_INST_WORD(2)
-    UNSPILL(rIBASE)
-    movl      %eax,(rFP,%ecx,4)   # v[B]<- %eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %ecx
+    UNSPILL_TMP2(%esi)
+    movl      %edx,4(rFP,rINST,4)  # v[B+1]<- %edx
+    movl      %eax,(rFP,rINST,4)   # v[B]<- %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %ecx
diff --git a/vm/mterp/x86/OP_MUL_LONG_2ADDR.S b/vm/mterp/x86/OP_MUL_LONG_2ADDR.S
index 5651dfe..b8c41ab 100644
--- a/vm/mterp/x86/OP_MUL_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_MUL_LONG_2ADDR.S
@@ -3,39 +3,37 @@
      * Signed 64-bit integer multiply, 2-addr version
      *
      * We could definately use more free registers for
-     * this code.  We must spill rPC (edx) because it
+     * this code.  We must spill %edx (edx) because it
      * is used by imul.  We'll also spill rINST (ebx),
      * giving us eax, ebc, ecx and edx as computational
-     * temps.  On top of that, we'll spill rIBASE (edi)
+     * temps.  On top of that, we'll spill %esi (edi)
      * for use as the vA pointer and rFP (esi) for use
      * as the vB pointer.  Yuck.
      */
     /* mul-long/2addr vA, vB */
-    movzbl    rINST_HI,%eax            # eax<- BA
+    movzbl    rINSTbl,%eax             # eax<- BA
     andb      $$0xf,%al                # eax<- A
-    sarl      $$12,rINST_FULL          # rINST_FULL<- B
-    SPILL(rPC)
-    SPILL(rIBASE)
+    sarl      $$4,rINST                # rINST<- B
+    SPILL_TMP2(%esi)
     SPILL(rFP)
-    leal      (rFP,%eax,4),rIBASE      # rIBASE<- &v[A]
-    leal      (rFP,rINST_FULL,4),rFP   # rFP<- &v[B]
-    movl      4(rIBASE),%ecx      # ecx<- Amsw
-    imull     (rFP),%ecx          # ecx<- (Amsw*Blsw)
-    movl      4(rFP),%eax         # eax<- Bmsw
-    imull     (rIBASE),%eax       # eax<- (Bmsw*Alsw)
-    addl      %eax,%ecx           # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
-    movl      (rFP),%eax          # eax<- Blsw
-    mull      (rIBASE)            # eax<- (Blsw*Alsw)
+    leal      (rFP,%eax,4),%esi        # %esi<- &v[A]
+    leal      (rFP,rINST,4),rFP        # rFP<- &v[B]
+    movl      4(%esi),%ecx             # ecx<- Amsw
+    imull     (rFP),%ecx               # ecx<- (Amsw*Blsw)
+    movl      4(rFP),%eax              # eax<- Bmsw
+    imull     (%esi),%eax              # eax<- (Bmsw*Alsw)
+    addl      %eax,%ecx                # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
+    movl      (rFP),%eax               # eax<- Blsw
+    mull      (%esi)                   # eax<- (Blsw*Alsw)
     jmp       .L${opcode}_continue
 %break
 
 .L${opcode}_continue:
-    leal      (%ecx,%edx),%edx    # full result now in %edx:%eax
-    movl      %edx,4(rIBASE)      # v[A+1]<- %edx
-    UNSPILL(rPC)                  # restore rPC/%edx
-    FETCH_INST_WORD(1)
-    movl      %eax,(rIBASE)       # v[A]<- %eax
+    leal      (%ecx,%edx),%edx         # full result now in %edx:%eax
+    movl      %edx,4(%esi)             # v[A+1]<- %edx
+    movl      %eax,(%esi)              # v[A]<- %eax
+    UNSPILL_TMP2(%esi)
+    FETCH_INST_OPCODE 1 %ecx
     UNSPILL(rFP)
-    UNSPILL(rIBASE)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %ecx
diff --git a/vm/mterp/x86/OP_NEG_LONG.S b/vm/mterp/x86/OP_NEG_LONG.S
index 18bd275..a69afbc 100644
--- a/vm/mterp/x86/OP_NEG_LONG.S
+++ b/vm/mterp/x86/OP_NEG_LONG.S
@@ -1,16 +1,15 @@
 %verify "executed"
     /* unop vA, vB */
-    movzbl    rINST_HI,%ecx            # ecx<- BA
-    sarl      $$4,%ecx                 # ecx<- B
-    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
-    andb      $$0xf,rINST_LO           # rINST_FULL<- A
-    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
+    movzbl    rINSTbl,%ecx        # ecx<- BA
+    sarl      $$4,%ecx            # ecx<- B
+    andb      $$0xf,rINSTbl       # rINST<- A
+    GET_VREG_WORD %eax %ecx 0     # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1     # ecx<- v[B+1]
     negl      %eax
     adcl      $$0,%ecx
     negl      %ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0    # v[A+0]<- eax
+    SET_VREG_WORD %ecx rINST 1    # v[A+1]<- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_NEW_ARRAY.S b/vm/mterp/x86/OP_NEW_ARRAY.S
index 74d72ed..4f36ac2 100644
--- a/vm/mterp/x86/OP_NEW_ARRAY.S
+++ b/vm/mterp/x86/OP_NEW_ARRAY.S
@@ -9,17 +9,16 @@
      * check for it here.
      */
     /* new-array vA, vB, class@CCCC */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
+    movl    rGLUE,%ecx
+    EXPORT_PC
     movl    offGlue_methodClassDex(%ecx),%ecx # ecx<- pDvmDex
     movzwl  2(rPC),%eax                       # eax<- CCCC
     movl    offDvmDex_pResClasses(%ecx),%ecx  # ecx<- pDvmDex->pResClasses
     movl    (%ecx,%eax,4),%ecx                # ecx<- resolved class
-    movzbl  rINST_HI,%eax
+    movzbl  rINSTbl,%eax
     sarl    $$4,%eax                          # eax<- B
-    GET_VREG(%eax,%eax)                       # eax<- vB (array length)
-    movzbl  rINST_HI,rINST_FULL
-    andb    $$0xf,rINST_LO                    # rINST_FULL<- A
+    GET_VREG_R %eax %eax                      # eax<- vB (array length)
+    andb    $$0xf,rINSTbl                     # rINST<- A
     testl   %eax,%eax
     js      common_errNegativeArraySize       # bail
     testl   %ecx,%ecx                         # already resolved?
@@ -33,19 +32,17 @@
      *  eax holds array length (vB)
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
-    SPILL_TMP(%eax)                    # save array length
+    movl    rGLUE,%ecx
+    SPILL_TMP1(%eax)                   # save array length
     movl    offGlue_method(%ecx),%ecx  # ecx<- glue->method
     movzwl  2(rPC),%eax                # eax<- CCCC
     movl    offMethod_clazz(%ecx),%ecx # ecx<- method->clazz
     movl    %eax,OUT_ARG1(%esp)
     movl    $$0,OUT_ARG2(%esp)
     movl    %ecx,OUT_ARG0(%esp)
-    SPILL(rPC)
     call    dvmResolveClass            # eax<- call(clazz,ref,flag)
-    UNSPILL(rPC)
     movl    %eax,%ecx
-    UNSPILL_TMP(%eax)
+    UNSPILL_TMP1(%eax)
     testl   %ecx,%ecx                  # successful resolution?
     je      common_exceptionThrown     # no, bail.
 # fall through to ${opcode}_finish
@@ -60,13 +57,10 @@
     movl    %ecx,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     movl    $$ALLOC_DONT_TRACK,OUT_ARG2(%esp)
-    SPILL(rPC)
     call    dvmAllocArrayByClass    # eax<- call(clazz,length,flags)
-    UNSPILL(rPC)
+    FETCH_INST_OPCODE 2 %edx
     testl   %eax,%eax               # failed?
     je      common_exceptionThrown  # yup - go handle
-    movl    rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_NEW_INSTANCE.S b/vm/mterp/x86/OP_NEW_INSTANCE.S
index e11e518..6ceb933 100644
--- a/vm/mterp/x86/OP_NEW_INSTANCE.S
+++ b/vm/mterp/x86/OP_NEW_INSTANCE.S
@@ -10,14 +10,12 @@
      * Create a new instance of a class.
      */
     /* new-instance vAA, class@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax               # eax<- BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- pDvmDex
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
     movl      offDvmDex_pResClasses(%ecx),%ecx # ecx<- pDvmDex->pResClasses
-    EXPORT_PC()
+    EXPORT_PC
     movl      (%ecx,%eax,4),%ecx        # ecx<- resolved class
-    SPILL(rPC)
     testl     %ecx,%ecx                 # resolved?
     je        .L${opcode}_resolve       # no, go do it
 .L${opcode}_resolved:  # on entry, ecx<- class
@@ -34,14 +32,12 @@
 .L${opcode}_finish: # ecx=class
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmAllocObject             # eax<- new object
-    UNSPILL(rPC)
-    movl     rINST_FULL,%ecx
-    FETCH_INST_WORD(2)
+    FETCH_INST_OPCODE 2 %edx
     testl    %eax,%eax                  # success?
     je       common_exceptionThrown     # no, bail out
-    SET_VREG(%eax,%ecx)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG %eax rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
     /*
      * Class initialization required.
@@ -49,13 +45,12 @@
      *  ecx holds class object
      */
 .L${opcode}_needinit:
-    SPILL_TMP(%ecx)                     # save object
+    SPILL_TMP1(%ecx)                    # save object
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmInitClass                # initialize class
-    UNSPILL_TMP(%ecx)                   # restore object
+    UNSPILL_TMP1(%ecx)                  # restore object
     testl   %eax,%eax                   # success?
     jne     .L${opcode}_initialized     # success, continue
-    UNSPILL(rPC)                        # failed, restore PC
     jmp     common_exceptionThrown      # go deal with init exception
 
     /*
@@ -63,7 +58,7 @@
      *
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     movzwl  2(rPC),%eax
     movl    offGlue_method(%ecx),%ecx   # ecx<- glue->method
     movl    %eax,OUT_ARG1(%esp)
@@ -74,7 +69,6 @@
     movl    %eax,%ecx                   # ecx<- resolved ClassObject ptr
     testl   %ecx,%ecx                   # success?
     jne     .L${opcode}_resolved        # good to go
-    UNSPILL(rPC)
     jmp     common_exceptionThrown      # no, handle exception
 
     /*
@@ -89,5 +83,4 @@
     movl    $$.LstrInstantiationError,OUT_ARG0(%esp)
     movl    %eax,OUT_ARG1(%esp)
     call    dvmThrowExceptionWithClassMessage
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
diff --git a/vm/mterp/x86/OP_NOP.S b/vm/mterp/x86/OP_NOP.S
index 17e3589..167d842 100644
--- a/vm/mterp/x86/OP_NOP.S
+++ b/vm/mterp/x86/OP_NOP.S
@@ -1,4 +1,4 @@
 %verify "executed"
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_NOT_LONG.S b/vm/mterp/x86/OP_NOT_LONG.S
index 3eca120..bdecf46 100644
--- a/vm/mterp/x86/OP_NOT_LONG.S
+++ b/vm/mterp/x86/OP_NOT_LONG.S
@@ -1,15 +1,14 @@
 %verify "executed"
     /* unop vA, vB */
-    movzbl    rINST_HI,%ecx            # ecx<- BA
-    sarl      $$4,%ecx                 # ecx<- B
-    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
-    andb      $$0xf,rINST_LO           # rINST_FULL<- A
-    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
+    movzbl    rINSTbl,%ecx       # ecx<- BA
+    sarl      $$4,%ecx           # ecx<- B
+    andb      $$0xf,rINSTbl      # rINST<- A
+    GET_VREG_WORD %eax %ecx 0    # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1    # ecx<- v[B+1]
+    FETCH_INST_OPCODE 1 %edx
     notl      %eax
     notl      %ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0]<- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1]<- ecx
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0   # v[A+0]<- eax
+    SET_VREG_WORD %ecx rINST 1   # v[A+1]<- ecx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_OR_LONG.S b/vm/mterp/x86/OP_OR_LONG.S
index b14555b..ebeb05a 100644
--- a/vm/mterp/x86/OP_OR_LONG.S
+++ b/vm/mterp/x86/OP_OR_LONG.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide.S" {"instr1":"orl (rFP,%ecx,4),rPC", "instr2":"orl 4(rFP,%ecx,4),%eax"}
+%include "x86/binopWide.S" {"instr1":"orl (rFP,%ecx,4),%edx", "instr2":"orl 4(rFP,%ecx,4),%eax"}
diff --git a/vm/mterp/x86/OP_OR_LONG_2ADDR.S b/vm/mterp/x86/OP_OR_LONG_2ADDR.S
index d1e78b2..52d740e 100644
--- a/vm/mterp/x86/OP_OR_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_OR_LONG_2ADDR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide2addr.S" {"instr1":"orl %eax,(rFP,rINST_FULL,4)","instr2":"orl %ecx,4(rFP,rINST_FULL,4)"}
+%include "x86/binopWide2addr.S" {"instr1":"orl %eax,(rFP,rINST,4)","instr2":"orl %ecx,4(rFP,rINST,4)"}
diff --git a/vm/mterp/x86/OP_PACKED_SWITCH.S b/vm/mterp/x86/OP_PACKED_SWITCH.S
index 089fc55..1b48635 100644
--- a/vm/mterp/x86/OP_PACKED_SWITCH.S
+++ b/vm/mterp/x86/OP_PACKED_SWITCH.S
@@ -10,18 +10,15 @@
      * for: packed-switch, sparse-switch
      */
     /* op vAA, +BBBB */
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    movl    2(rPC),%ecx                 # ecx<- BBBBbbbb
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
-    leal    (rPC,%ecx,2),%ecx           # ecx<- PC + BBBBbbbb*2
-    movl    %eax,OUT_ARG1(%esp)         # ARG1<- vAA
-    movl    %ecx,OUT_ARG0(%esp)         # ARG0<- switchData
-    SPILL(rPC)
+    movl    2(rPC),%ecx           # ecx<- BBBBbbbb
+    GET_VREG_R %eax rINST         # eax<- vAA
+    leal    (rPC,%ecx,2),%ecx     # ecx<- PC + BBBBbbbb*2
+    movl    %eax,OUT_ARG1(%esp)   # ARG1<- vAA
+    movl    %ecx,OUT_ARG0(%esp)   # ARG0<- switchData
     call    $func
-    UNSPILL(rPC)
     testl   %eax,%eax
-    movl    %eax,rINST_FULL             # set up word offset
-    jle     common_backwardBranch       # check on special actions
-    ADVANCE_PC_INDEXED(rINST_FULL)
-    FETCH_INST()
+    movl    %eax,rINST            # set up word offset
+    jle     common_backwardBranch # check on special actions
+    ADVANCE_PC_INDEXED rINST
+    FETCH_INST
     GOTO_NEXT
diff --git a/vm/mterp/x86/OP_REM_DOUBLE.S b/vm/mterp/x86/OP_REM_DOUBLE.S
index 809ac0a..bad3e22 100644
--- a/vm/mterp/x86/OP_REM_DOUBLE.S
+++ b/vm/mterp/x86/OP_REM_DOUBLE.S
@@ -4,14 +4,14 @@
     movzbl   2(rPC),%eax            # eax<- CC
     fldl     (rFP,%ecx,4)           # vCC to fp stack
     fldl     (rFP,%eax,4)           # vCC to fp stack
-    movzbl   rINST_HI,%ecx          # ecx<- AA
-    FETCH_INST_WORD(2)
+    movzbl   rINSTbl,%ecx           # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(2)
+    ADVANCE_PC 2
     fstpl    (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_REM_DOUBLE_2ADDR.S b/vm/mterp/x86/OP_REM_DOUBLE_2ADDR.S
index b199e6e..aaee1d4 100644
--- a/vm/mterp/x86/OP_REM_DOUBLE_2ADDR.S
+++ b/vm/mterp/x86/OP_REM_DOUBLE_2ADDR.S
@@ -1,17 +1,17 @@
 %verify "executed"
     /* rem_float/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    fldl     (rFP,rINST_FULL,4)         # vBB to fp stack
+    movzx   rINSTbl,%ecx                # ecx<- A+
+    sarl    $$4,rINST                  # rINST<- B
+    fldl     (rFP,rINST,4)              # vBB to fp stack
     andb    $$0xf,%cl                   # ecx<- A
     fldl     (rFP,%ecx,4)               # vAA to fp stack
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     fstpl    (rFP,%ecx,4)               # %st to vA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_REM_FLOAT.S b/vm/mterp/x86/OP_REM_FLOAT.S
index d78bc9a..12af510 100644
--- a/vm/mterp/x86/OP_REM_FLOAT.S
+++ b/vm/mterp/x86/OP_REM_FLOAT.S
@@ -4,14 +4,14 @@
     movzbl   2(rPC),%eax            # eax<- CC
     flds     (rFP,%ecx,4)           # vCC to fp stack
     flds     (rFP,%eax,4)           # vCC to fp stack
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
+    movzbl   rINSTbl,%ecx           # ecx<- AA
+    FETCH_INST_OPCODE 2 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(2)
+    ADVANCE_PC 2
     fstps    (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_REM_FLOAT_2ADDR.S b/vm/mterp/x86/OP_REM_FLOAT_2ADDR.S
index fd1742b..6a5f716 100644
--- a/vm/mterp/x86/OP_REM_FLOAT_2ADDR.S
+++ b/vm/mterp/x86/OP_REM_FLOAT_2ADDR.S
@@ -1,17 +1,17 @@
 %verify "executed"
     /* rem_float/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    flds     (rFP,rINST_FULL,4)         # vBB to fp stack
+    movzx   rINSTbl,%ecx                # ecx<- A+
+    sarl    $$4,rINST                  # rINST<- B
+    flds     (rFP,rINST,4)              # vBB to fp stack
     andb    $$0xf,%cl                   # ecx<- A
     flds     (rFP,%ecx,4)               # vAA to fp stack
-    FETCH_INST_WORD(1)
+    FETCH_INST_OPCODE 1 %edx
 1:
     fprem
     fstsw     %ax
     sahf
     jp        1b
     fstp      %st(1)
-    ADVANCE_PC(1)
+    ADVANCE_PC 1
     fstps    (rFP,%ecx,4)               # %st to vA
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_RETURN.S b/vm/mterp/x86/OP_RETURN.S
index 5d6a9a0..657903d 100644
--- a/vm/mterp/x86/OP_RETURN.S
+++ b/vm/mterp/x86/OP_RETURN.S
@@ -6,8 +6,7 @@
      * for: return, return-object
      */
     /* op vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL         # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)           # eax<- vAA
+    movl    rGLUE,%ecx
+    GET_VREG_R %eax rINST               # eax<- vAA
     movl    %eax,offGlue_retval(%ecx)   # retval.i <- AA
     jmp     common_returnFromMethod
diff --git a/vm/mterp/x86/OP_RETURN_WIDE.S b/vm/mterp/x86/OP_RETURN_WIDE.S
index a2fd636..049030f 100644
--- a/vm/mterp/x86/OP_RETURN_WIDE.S
+++ b/vm/mterp/x86/OP_RETURN_WIDE.S
@@ -4,10 +4,9 @@
      * structure, then jumps to the return handler.
      */
     /* return-wide vAA */
-    GET_GLUE(%ecx)
-    movzbl  rINST_HI,rINST_FULL            # rINST_FULL<- AA
-    GET_VREG_WORD(%eax,rINST_FULL,0)       # eax<- v[AA+0]
-    GET_VREG_WORD(rINST_FULL,rINST_FULL,1) # rINST_FULL<- v[AA+1]
+    movl    rGLUE,%ecx
+    GET_VREG_WORD %eax rINST 0       # eax<- v[AA+0]
+    GET_VREG_WORD rINST rINST 1      # rINST<- v[AA+1]
     movl    %eax,offGlue_retval(%ecx)
-    movl    rINST_FULL,4+offGlue_retval(%ecx)
+    movl    rINST,4+offGlue_retval(%ecx)
     jmp     common_returnFromMethod
diff --git a/vm/mterp/x86/OP_SGET.S b/vm/mterp/x86/OP_SGET.S
index f05eae7..0be038a 100644
--- a/vm/mterp/x86/OP_SGET.S
+++ b/vm/mterp/x86/OP_SGET.S
@@ -8,7 +8,7 @@
      * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -17,27 +17,24 @@
     je        .L${opcode}_resolve                # if not, make it so
 .L${opcode}_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG %eax rINST
+    GOTO_NEXT_R %edx
 %break
 
     /*
      * Go resolve the field
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .L${opcode}_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
diff --git a/vm/mterp/x86/OP_SGET_WIDE.S b/vm/mterp/x86/OP_SGET_WIDE.S
index 5c038a7..54e7f10 100644
--- a/vm/mterp/x86/OP_SGET_WIDE.S
+++ b/vm/mterp/x86/OP_SGET_WIDE.S
@@ -7,7 +7,7 @@
      *
      */
     /* sget-wide vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -17,28 +17,25 @@
 .L${opcode}_finish:     # field ptr in eax
     movl      offStaticField_value(%eax),%ecx    # ecx<- lsw
     movl      4+offStaticField_value(%eax),%eax  # eax<- msw
-    movzbl    rINST_HI,rINST_FULL                # rINST_FULL<- AA
-    SET_VREG_WORD(%ecx,rINST_FULL,0)
-    SET_VREG_WORD(%eax,rINST_FULL,1)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG_WORD %ecx rINST 0
+    SET_VREG_WORD %eax rINST 1
+    GOTO_NEXT_R %edx
 %break
 
     /*
      * Go resolve the field
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .L${opcode}_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
diff --git a/vm/mterp/x86/OP_SHL_LONG.S b/vm/mterp/x86/OP_SHL_LONG.S
index 2d06200..f181340 100644
--- a/vm/mterp/x86/OP_SHL_LONG.S
+++ b/vm/mterp/x86/OP_SHL_LONG.S
@@ -10,13 +10,12 @@
     /* shl-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # ecx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # ecx<- v[BB+1]
+    GET_VREG_R   %ecx %ecx              # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shldl     %eax,%edx
     sall      %cl,%eax
     testb     $$32,%cl
@@ -24,14 +23,12 @@
     movl      %eax,%edx
     xorl      %eax,%eax
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- %edx
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
+    SET_VREG_WORD %edx rINST 1          # v[AA+1]<- %edx
+    FETCH_INST_OPCODE 2 %edx
     jmp       .L${opcode}_finish
 %break
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- %eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0          # v[AA+0]<- %eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_SHL_LONG_2ADDR.S b/vm/mterp/x86/OP_SHL_LONG_2ADDR.S
index b98ed92..30f3d1b 100644
--- a/vm/mterp/x86/OP_SHL_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_SHL_LONG_2ADDR.S
@@ -6,15 +6,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $$4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx             # ecx<- BA
+    andb      $$0xf,rINSTbl            # rINST<- A
+    GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
+    sarl      $$4,%ecx                 # ecx<- B
+    GET_VREG_WORD %edx rINST 1         # edx<- v[AA+1]
+    GET_VREG_R  %ecx %ecx              # ecx<- vBB
     shldl     %eax,%edx
     sall      %cl,%eax
     testb     $$32,%cl
@@ -22,14 +20,13 @@
     movl      %eax,%edx
     xorl      %eax,%eax
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1         # v[AA+1]<- edx
     jmp       .L${opcode}_finish
 %break
 
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_SHR_LONG.S b/vm/mterp/x86/OP_SHR_LONG.S
index bccae8e..45a07ae 100644
--- a/vm/mterp/x86/OP_SHR_LONG.S
+++ b/vm/mterp/x86/OP_SHR_LONG.S
@@ -10,13 +10,12 @@
     /* shr-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # edx<- v[BB+1]
+    GET_VREG_R   %ecx %ecx              # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shrdl     %edx,%eax
     sarl      %cl,%edx
     testb     $$32,%cl
@@ -24,15 +23,13 @@
     movl      %edx,%eax
     sarl      $$31,%edx
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[AA+1]<- edx
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
+    SET_VREG_WORD %edx rINST 1          # v[AA+1]<- edx
+    FETCH_INST_OPCODE 2 %edx
     jmp       .L${opcode}_finish
 %break
 
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,%ecx,0)         # v[AA+0]<- eax
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0          # v[AA+0]<- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_SHR_LONG_2ADDR.S b/vm/mterp/x86/OP_SHR_LONG_2ADDR.S
index fba1f25..9987cf7 100644
--- a/vm/mterp/x86/OP_SHR_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_SHR_LONG_2ADDR.S
@@ -6,15 +6,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $$4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx         # ecx<- BA
+    andb      $$0xf,rINSTbl        # rINST<- A
+    GET_VREG_WORD %eax rINST 0     # eax<- v[AA+0]
+    sarl      $$4,%ecx             # ecx<- B
+    GET_VREG_WORD %edx rINST 1     # edx<- v[AA+1]
+    GET_VREG_R %ecx %ecx           # ecx<- vBB
     shrdl     %edx,%eax
     sarl      %cl,%edx
     testb     $$32,%cl
@@ -22,14 +20,13 @@
     movl      %edx,%eax
     sarl      $$31,%edx
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1     # v[AA+1]<- edx
     jmp       .L${opcode}_finish
 %break
 
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)  # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0    # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_SPUT.S b/vm/mterp/x86/OP_SPUT.S
index 440dcfb..e293838 100644
--- a/vm/mterp/x86/OP_SPUT.S
+++ b/vm/mterp/x86/OP_SPUT.S
@@ -8,7 +8,7 @@
      * for: sput, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -16,28 +16,25 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .L${opcode}_resolve                # if not, make it so
 .L${opcode}_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
-    FETCH_INST_WORD(2)
+    GET_VREG_R  %ecx rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
     movl      %ecx,offStaticField_value(%eax)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 %break
 
     /*
      * Go resolve the field
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .L${opcode}_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
diff --git a/vm/mterp/x86/OP_SPUT_OBJECT.S b/vm/mterp/x86/OP_SPUT_OBJECT.S
index f55d151..f9e0be1 100644
--- a/vm/mterp/x86/OP_SPUT_OBJECT.S
+++ b/vm/mterp/x86/OP_SPUT_OBJECT.S
@@ -6,7 +6,7 @@
      * SPUT object handler.
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -14,8 +14,8 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .L${opcode}_resolve                # if not, make it so
 .L${opcode}_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG(%ecx,%ecx)
+    movzbl    rINSTbl,%ecx                       # ecx<- AA
+    GET_VREG_R  %ecx %ecx
     jmp       .L${opcode}_continue
 %break
 
@@ -23,27 +23,25 @@
 .L${opcode}_continue:
     movl      %ecx,offStaticField_value(%eax)
     testl     %ecx,%ecx
-    GET_GLUE(%ecx)
-    FETCH_INST_WORD(2)
+    movl      rGLUE,%ecx
+    FETCH_INST_OPCODE 2 %edx
     je        1f
     movl      offGlue_cardTable(%ecx),%ecx       # get card table base
     shrl      $$GC_CARD_SHIFT,%eax               # head to card number
     movb      %cl,(%ecx,%eax)                    # mark card
 1:
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
 
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .L${opcode}_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
diff --git a/vm/mterp/x86/OP_SPUT_WIDE.S b/vm/mterp/x86/OP_SPUT_WIDE.S
index 5a48c2e..43d5509 100644
--- a/vm/mterp/x86/OP_SPUT_WIDE.S
+++ b/vm/mterp/x86/OP_SPUT_WIDE.S
@@ -8,7 +8,7 @@
      * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short
      */
     /* op vAA, field@BBBB */
-    GET_GLUE(%ecx)
+    movl      rGLUE,%ecx
     movzwl    2(rPC),%eax                        # eax<- field ref BBBB
     movl      offGlue_methodClassDex(%ecx),%ecx  # ecx<- DvmDex
     movl      offDvmDex_pResFields(%ecx),%ecx    # ecx<- dvmDex->pResFields
@@ -16,30 +16,27 @@
     testl     %eax,%eax                          # resolved entry null?
     je        .L${opcode}_resolve                # if not, make it so
 .L${opcode}_finish:     # field ptr in eax
-    movzbl    rINST_HI,%ecx                      # ecx<- AA
-    GET_VREG_WORD(rINST_FULL,%ecx,0)             # rINST_FULL<- lsw
-    GET_VREG_WORD(%ecx,%ecx,1)                   # ecx<- msw
-    movl      rINST_FULL,offStaticField_value(%eax)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    movl      %ecx,4+offStaticField_value(%eax)
-    GOTO_NEXT
+    GET_VREG_WORD %ecx rINST 0                  # rINST<- lsw
+    GET_VREG_WORD rINST rINST 1                 # ecx<- msw
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    movl      %ecx,offStaticField_value(%eax)
+    movl      rINST,4+offStaticField_value(%eax)
+    GOTO_NEXT_R %edx
 %break
 
     /*
      * Go resolve the field
      */
 .L${opcode}_resolve:
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                        # eax<- field ref BBBB
     movl     offGlue_method(%ecx),%ecx          # ecx<- current method
-    EXPORT_PC()                                 # could throw, need to export
+    EXPORT_PC                                   # could throw, need to export
     movl     offMethod_clazz(%ecx),%ecx         # ecx<- method->clazz
-    SPILL(rPC)
     movl     %eax,OUT_ARG1(%esp)
     movl     %ecx,OUT_ARG0(%esp)
     call     dvmResolveStaticField              # eax<- resolved StaticField ptr
-    UNSPILL(rPC)
     testl    %eax,%eax
     jne      .L${opcode}_finish                 # success, continue
     jmp      common_exceptionThrown             # no, handle exception
diff --git a/vm/mterp/x86/OP_SUB_LONG.S b/vm/mterp/x86/OP_SUB_LONG.S
index 6eda7bb..cd95435 100644
--- a/vm/mterp/x86/OP_SUB_LONG.S
+++ b/vm/mterp/x86/OP_SUB_LONG.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide.S" {"instr1":"subl (rFP,%ecx,4),rPC", "instr2":"sbbl 4(rFP,%ecx,4),%eax"}
+%include "x86/binopWide.S" {"instr1":"subl (rFP,%ecx,4),%edx", "instr2":"sbbl 4(rFP,%ecx,4),%eax"}
diff --git a/vm/mterp/x86/OP_SUB_LONG_2ADDR.S b/vm/mterp/x86/OP_SUB_LONG_2ADDR.S
index 94bf0d6..f2a94ea 100644
--- a/vm/mterp/x86/OP_SUB_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_SUB_LONG_2ADDR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide2addr.S" {"instr1":"subl %eax,(rFP,rINST_FULL,4)","instr2":"sbbl %ecx,4(rFP,rINST_FULL,4)"}
+%include "x86/binopWide2addr.S" {"instr1":"subl %eax,(rFP,rINST,4)","instr2":"sbbl %ecx,4(rFP,rINST,4)"}
diff --git a/vm/mterp/x86/OP_THROW.S b/vm/mterp/x86/OP_THROW.S
index d7e1574..6884f78 100644
--- a/vm/mterp/x86/OP_THROW.S
+++ b/vm/mterp/x86/OP_THROW.S
@@ -4,10 +4,9 @@
      * Throw an exception object in the current thread.
      */
     /* throw vAA */
-    GET_GLUE(%ecx)
-    EXPORT_PC()
-    movzbl   rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    GET_VREG(%eax,rINST_FULL)          # eax<- exception object
+    movl     rGLUE,%ecx
+    EXPORT_PC
+    GET_VREG_R %eax rINST              # eax<- exception object
     movl     offGlue_self(%ecx),%ecx   # ecx<- glue->self
     testl    %eax,%eax                 # null object?
     je       common_errNullObject
diff --git a/vm/mterp/x86/OP_THROW_VERIFICATION_ERROR.S b/vm/mterp/x86/OP_THROW_VERIFICATION_ERROR.S
index e492e2d..c32e2d7 100644
--- a/vm/mterp/x86/OP_THROW_VERIFICATION_ERROR.S
+++ b/vm/mterp/x86/OP_THROW_VERIFICATION_ERROR.S
@@ -5,15 +5,12 @@
      * exception is indicated by AA, with some detail provided by BBBB.
      */
     /* op AA, ref@BBBB */
-    GET_GLUE(%ecx)
+    movl     rGLUE,%ecx
     movzwl   2(rPC),%eax                     # eax<- BBBB
     movl     offGlue_method(%ecx),%ecx       # ecx<- glue->method
-    EXPORT_PC()
-    movzbl   rINST_HI,rINST_FULL             # rINST_FULL<- AA
+    EXPORT_PC
     movl     %eax,OUT_ARG2(%esp)             # arg2<- BBBB
-    movl     rINST_FULL,OUT_ARG1(%esp)       # arg1<- AA
+    movl     rINST,OUT_ARG1(%esp)            # arg1<- AA
     movl     %ecx,OUT_ARG0(%esp)             # arg0<- method
-    SPILL(rPC)
     call     dvmThrowVerificationError       # call(method, kind, ref)
-    UNSPILL(rPC)
     jmp      common_exceptionThrown          # handle exception
diff --git a/vm/mterp/x86/OP_USHR_LONG.S b/vm/mterp/x86/OP_USHR_LONG.S
index 5e4c89b..380bb3c 100644
--- a/vm/mterp/x86/OP_USHR_LONG.S
+++ b/vm/mterp/x86/OP_USHR_LONG.S
@@ -10,13 +10,12 @@
     /* shr-long vAA, vBB, vCC */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
+    /* rINSTw gets AA */
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)                          # spill edx
-    GET_VREG_WORD(%edx,%eax,1)          # edx<- v[BB+1]
-    GET_VREG  (%ecx,%ecx)               # ecx<- vCC
-    GET_VREG_WORD(%eax,%eax,0)          # eax<- v[BB+0]
+    GET_VREG_WORD %edx %eax 1           # edx<- v[BB+1]
+    GET_VREG_R  %ecx %ecx               # ecx<- vCC
+    GET_VREG_WORD %eax %eax 0           # eax<- v[BB+0]
     shrdl     %edx,%eax
     shrl      %cl,%edx
     testb     $$32,%cl
@@ -24,15 +23,13 @@
     movl      %edx,%eax
     xorl      %edx,%edx
 2:
-    movzbl    rINST_HI,%ecx
-    SET_VREG_WORD(%edx,%ecx,1)         # v[BB+1]<- edx
-    UNSPILL(rPC)
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %edx rINST 1          # v[BB+1]<- edx
     jmp       .L${opcode}_finish
 %break
 
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,%ecx,0)        # v[BB+0]<- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %eax rINST 0         # v[BB+0]<- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_USHR_LONG_2ADDR.S b/vm/mterp/x86/OP_USHR_LONG_2ADDR.S
index b2555e9..b00ec61 100644
--- a/vm/mterp/x86/OP_USHR_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_USHR_LONG_2ADDR.S
@@ -6,15 +6,13 @@
     /* shl-long/2addr vA, vB */
     /* ecx gets shift count */
     /* Need to spill edx */
-    /* rINST gets AA */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
-    movzbl    rINST_HI,rINST_FULL       # rINST_HI<- BA
-    andb      $$0xf,rINST_LO            # rINST_FULL<- A
-    GET_VREG_WORD(%eax,rINST_FULL,0)    # eax<- v[AA+0]
-    sarl      $$4,%ecx                  # ecx<- B
-    SPILL(rPC)
-    GET_VREG_WORD(%edx,rINST_FULL,1)    # edx<- v[AA+1]
-    GET_VREG(%ecx,%ecx)                 # ecx<- vBB
+    /* rINSTw gets AA */
+    movzbl    rINSTbl,%ecx             # ecx<- BA
+    andb      $$0xf,rINSTbl            # rINST<- A
+    GET_VREG_WORD %eax rINST 0         # eax<- v[AA+0]
+    sarl      $$4,%ecx                 # ecx<- B
+    GET_VREG_WORD %edx rINST 1         # edx<- v[AA+1]
+    GET_VREG_R %ecx %ecx               # ecx<- vBB
     shrdl     %edx,%eax
     shrl      %cl,%edx
     testb     $$32,%cl
@@ -22,14 +20,13 @@
     movl      %edx,%eax
     xorl      %edx,%edx
 2:
-    SET_VREG_WORD(%edx,rINST_FULL,1)   # v[AA+1]<- edx
-    UNSPILL(rPC)
+    SET_VREG_WORD %edx rINST 1         # v[AA+1]<- edx
     jmp       .L${opcode}_finish
 %break
 
 
 .L${opcode}_finish:
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[AA+0]<- eax
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG_WORD %eax rINST 0         # v[AA+0]<- eax
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/OP_XOR_LONG.S b/vm/mterp/x86/OP_XOR_LONG.S
index ebeb126..e9fa59a 100644
--- a/vm/mterp/x86/OP_XOR_LONG.S
+++ b/vm/mterp/x86/OP_XOR_LONG.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide.S" {"instr1":"xorl (rFP,%ecx,4),rPC", "instr2":"xorl 4(rFP,%ecx,4),%eax"}
+%include "x86/binopWide.S" {"instr1":"xorl (rFP,%ecx,4),%edx", "instr2":"xorl 4(rFP,%ecx,4),%eax"}
diff --git a/vm/mterp/x86/OP_XOR_LONG_2ADDR.S b/vm/mterp/x86/OP_XOR_LONG_2ADDR.S
index 2b127b1..6d72124 100644
--- a/vm/mterp/x86/OP_XOR_LONG_2ADDR.S
+++ b/vm/mterp/x86/OP_XOR_LONG_2ADDR.S
@@ -1,2 +1,2 @@
 %verify "executed"
-%include "x86/binopWide2addr.S" {"instr1":"xorl %eax,(rFP,rINST_FULL,4)","instr2":"xorl %ecx,4(rFP,rINST_FULL,4)"}
+%include "x86/binopWide2addr.S" {"instr1":"xorl %eax,(rFP,rINST,4)","instr2":"xorl %ecx,4(rFP,rINST,4)"}
diff --git a/vm/mterp/x86/bincmp.S b/vm/mterp/x86/bincmp.S
index 26956b4..2090553 100644
--- a/vm/mterp/x86/bincmp.S
+++ b/vm/mterp/x86/bincmp.S
@@ -8,19 +8,18 @@
      * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
      */
     /* if-cmp vA, vB, +CCCC */
-    movzx    rINST_HI,%ecx              # ecx <- A+
-    andb     $$0xf,%cl                  # ecx <- A
-    GET_VREG(%eax,%ecx)                 # eax <- vA
-    sarl     $$12,rINST_FULL            # rINST_FULL<- B
-    cmpl     (rFP,rINST_FULL,4),%eax    # compare (vA, vB)
-    movswl   2(rPC),rINST_FULL          # Get signed branch offset
-    movl     $$2,%eax                   # assume not taken
+    movzx    rINSTbl,%ecx          # ecx <- A+
+    andb     $$0xf,%cl             # ecx <- A
+    GET_VREG_R %eax %ecx           # eax <- vA
+    sarl     $$4,rINST            # rINST<- B
+    cmpl     (rFP,rINST,4),%eax    # compare (vA, vB)
+    movswl   2(rPC),rINST          # Get signed branch offset
+    movl     $$2,%eax              # assume not taken
     j${revcmp}   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
-    GOTO_NEXT
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT
diff --git a/vm/mterp/x86/bindiv.S b/vm/mterp/x86/bindiv.S
index 6aca1a4..b2aafc3 100644
--- a/vm/mterp/x86/bindiv.S
+++ b/vm/mterp/x86/bindiv.S
@@ -7,9 +7,8 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    SPILL(rPC)
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     cmpl     $$0,%ecx
     je       common_errDivideByZero
     cmpl     $$-1,%ecx
@@ -24,9 +23,7 @@
     cltd
     idivl   %ecx
 .L${opcode}_finish_div:
-    movzbl   rINST_HI,%ecx         # ecl<- AA
-    SET_VREG($result,%ecx)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG $result rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/bindiv2addr.S b/vm/mterp/x86/bindiv2addr.S
index efa76b5..fdbc4ec 100644
--- a/vm/mterp/x86/bindiv2addr.S
+++ b/vm/mterp/x86/bindiv2addr.S
@@ -4,13 +4,11 @@
      * op1=-1.
      */
     /* div/rem/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
-    sarl     $$4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $$0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vBB
-    SPILL(rPC)
+    movzx    rINSTbl,%ecx          # eax<- BA
+    sarl     $$4,%ecx              # ecx<- B
+    GET_VREG_R %ecx %ecx           # eax<- vBB
+    andb     $$0xf,rINSTbl         # rINST<- A
+    GET_VREG_R %eax rINST          # eax<- vBB
     cmpl     $$0,%ecx
     je       common_errDivideByZero
     cmpl     $$-1,%ecx
@@ -25,8 +23,7 @@
     cltd
     idivl   %ecx
 .L${opcode}_finish_div2addr:
-    SET_VREG($result,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    SET_VREG $result rINST
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/bindivLit16.S b/vm/mterp/x86/bindivLit16.S
index 3806830..70bf183 100644
--- a/vm/mterp/x86/bindivLit16.S
+++ b/vm/mterp/x86/bindivLit16.S
@@ -4,14 +4,12 @@
      * op1=-1.
      */
     /* div/rem/lit16 vA, vB, #+CCCC */
-    /* Need A in rINST_FULL, ssssCCCC in ecx, vB in eax */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
-    sarl     $$4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
-    movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $$0xf,rINST_LO             # rINST_FULL<- A
-    SPILL(rPC)
+    /* Need A in rINST, ssssCCCC in ecx, vB in eax */
+    movzbl   rINSTbl,%eax         # eax<- 000000BA
+    sarl     $$4,%eax             # eax<- B
+    GET_VREG_R %eax %eax          # eax<- vB
+    movswl   2(rPC),%ecx          # ecx<- ssssCCCC
+    andb     $$0xf,rINSTbl        # rINST<- A
     cmpl     $$0,%ecx
     je       common_errDivideByZero
     cmpl     $$-1,%ecx
@@ -26,8 +24,7 @@
     cltd
     idivl   %ecx
 .L${opcode}_finish_div:
-    SET_VREG($result,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG $result rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/bindivLit8.S b/vm/mterp/x86/bindivLit8.S
index 6d616ba..4bd61a6 100644
--- a/vm/mterp/x86/bindivLit8.S
+++ b/vm/mterp/x86/bindivLit8.S
@@ -4,11 +4,9 @@
      * op0=minint & op1=-1
      */
     /* div/rem/lit8 vAA, vBB, #+CC */
-    movzbl    2(rPC),%eax              # eax<- BB
-    movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    GET_VREG  (%eax,%eax)              # eax<- rBB
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    SPILL(rPC)
+    movzbl    2(rPC),%eax        # eax<- BB
+    movsbl    3(rPC),%ecx        # ecx<- ssssssCC
+    GET_VREG_R  %eax %eax        # eax<- rBB
     cmpl     $$0,%ecx
     je       common_errDivideByZero
     cmpl     $$0x80000000,%eax
@@ -23,8 +21,7 @@
     cltd
     idivl   %ecx
 .L${opcode}_finish_div:
-    SET_VREG($result,rINST_FULL)
-    UNSPILL(rPC)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG $result rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binflop.S b/vm/mterp/x86/binflop.S
index 233799c..0bcbb07 100644
--- a/vm/mterp/x86/binflop.S
+++ b/vm/mterp/x86/binflop.S
@@ -4,12 +4,11 @@
      * For: add-fp, sub-fp, mul-fp, div-fp
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- CC
-    movzbl   3(rPC),%ecx            # ecx<- BB
-    $load    (rFP,%eax,4)           # vCC to fp stack
-    $instr   (rFP,%ecx,4)           # ex: faddp
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    $store   (rFP,%ecx,4)           # %st to vAA
-    GOTO_NEXT
+    movzbl   2(rPC),%eax          # eax<- CC
+    movzbl   3(rPC),%ecx          # ecx<- BB
+    $load    (rFP,%eax,4)         # vCC to fp stack
+    $instr   (rFP,%ecx,4)         # ex: faddp
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    $store   (rFP,rINST,4)         # %st to vAA
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binflop2addr.S b/vm/mterp/x86/binflop2addr.S
index 4b78e11..54ca894 100644
--- a/vm/mterp/x86/binflop2addr.S
+++ b/vm/mterp/x86/binflop2addr.S
@@ -5,12 +5,12 @@
      */
 
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    andb    $$0xf,%cl                   # ecx<- A
-    $load    (rFP,%ecx,4)               # vAA to fp stack
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    $instr   (rFP,rINST_FULL,4)           # ex: faddp
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    $store    (rFP,%ecx,4)              # %st to vA
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx           # ecx<- A+
+    andb    $$0xf,%cl              # ecx<- A
+    $load    (rFP,%ecx,4)          # vAA to fp stack
+    sarl    $$4,rINST             # rINST<- B
+    $instr   (rFP,rINST,4)         # ex: faddp
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    $store    (rFP,%ecx,4)         # %st to vA
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binop.S b/vm/mterp/x86/binop.S
index 00d9118..c7511e0 100644
--- a/vm/mterp/x86/binop.S
+++ b/vm/mterp/x86/binop.S
@@ -9,12 +9,11 @@
      *      xor-int, shl-int, shr-int, ushr-int
      */
     /* binop vAA, vBB, vCC */
-    movzbl   2(rPC),%eax            # eax<- BB
-    movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    $instr              # ex: addl    (rFP,%ecx,4),%eax
-    movzbl   rINST_HI,%ecx         # ecx<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG($result,%ecx)
-    GOTO_NEXT
+    movzbl   2(rPC),%eax   # eax<- BB
+    movzbl   3(rPC),%ecx   # ecx<- CC
+    GET_VREG_R %eax %eax   # eax<- vBB
+    $instr                 # ex: addl    (rFP,%ecx,4),%eax
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG $result rINST
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binop1.S b/vm/mterp/x86/binop1.S
index e932103..c4d4b1e 100644
--- a/vm/mterp/x86/binop1.S
+++ b/vm/mterp/x86/binop1.S
@@ -6,11 +6,10 @@
     /* binop vAA, vBB, vCC */
     movzbl   2(rPC),%eax            # eax<- BB
     movzbl   3(rPC),%ecx            # ecx<- CC
-    GET_VREG(%eax,%eax)             # eax<- vBB
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
+    GET_VREG_R %eax %eax            # eax<- vBB
+    GET_VREG_R %ecx %ecx            # eax<- vBB
     $instr                          # ex: addl    %ecx,%eax
-    movzbl   rINST_HI,$tmp          # tmp<- AA
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    SET_VREG($result,$tmp)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    SET_VREG $result rINST
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binop2addr.S b/vm/mterp/x86/binop2addr.S
index 0600aa3..0b040c7 100644
--- a/vm/mterp/x86/binop2addr.S
+++ b/vm/mterp/x86/binop2addr.S
@@ -14,11 +14,11 @@
      *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
      */
     /* binop/2addr vA, vB */
-    movzx   rINST_HI,%ecx               # ecx<- A+
-    sarl    $$12,rINST_FULL             # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)           # eax<- vB
-    FETCH_INST_WORD(1)
-    andb    $$0xf,%cl                   # ecx<- A
-    $instr                              # for ex: addl   %eax,(rFP,%ecx,4)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    movzx   rINSTbl,%ecx               # ecx<- A+
+    sarl    $$4,rINST                 # rINST<- B
+    GET_VREG_R %eax rINST              # eax<- vB
+    FETCH_INST_OPCODE 1 %edx
+    andb    $$0xf,%cl                  # ecx<- A
+    $instr                             # for ex: addl   %eax,(rFP,%ecx,4)
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binopLit16.S b/vm/mterp/x86/binopLit16.S
index 762068f..3c985cc 100644
--- a/vm/mterp/x86/binopLit16.S
+++ b/vm/mterp/x86/binopLit16.S
@@ -9,14 +9,13 @@
      *      and-int/lit16, or-int/lit16, xor-int/lit16
      */
     /* binop/lit16 vA, vB, #+CCCC */
-    movzbl   rINST_HI,%eax              # eax<- 000000BA
+    movzbl   rINSTbl,%eax               # eax<- 000000BA
     sarl     $$4,%eax                   # eax<- B
-    GET_VREG(%eax,%eax)                 # eax<- vB
+    GET_VREG_R %eax %eax                # eax<- vB
     movswl   2(rPC),%ecx                # ecx<- ssssCCCC
-    movzbl   rINST_HI,rINST_FULL        # rINST_FULL<- BA
-    andb     $$0xf,rINST_LO             # rINST_FULL<- A
+    andb     $$0xf,rINSTbl              # rINST<- A
     $instr                              # for example: addl %ecx, %eax
-    SET_VREG($result,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG $result rINST
+    FETCH_INST_OPCODE 2 %edx
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binopLit8.S b/vm/mterp/x86/binopLit8.S
index 73a146c..d0bce9e 100644
--- a/vm/mterp/x86/binopLit8.S
+++ b/vm/mterp/x86/binopLit8.S
@@ -12,10 +12,9 @@
     /* binop/lit8 vAA, vBB, #+CC */
     movzbl    2(rPC),%eax              # eax<- BB
     movsbl    3(rPC),%ecx              # ecx<- ssssssCC
-    movzx     rINST_HI,rINST_FULL      # rINST_FULL<- AA
-    GET_VREG  (%eax,%eax)              # eax<- rBB
+    GET_VREG_R   %eax %eax             # eax<- rBB
     $instr                             # ex: addl %ecx,%eax
-    SET_VREG  ($result,rINST_FULL)
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG   $result rINST
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binopWide.S b/vm/mterp/x86/binopWide.S
index 592e45f..4131785 100644
--- a/vm/mterp/x86/binopWide.S
+++ b/vm/mterp/x86/binopWide.S
@@ -5,15 +5,12 @@
 
     movzbl    2(rPC),%eax               # eax<- BB
     movzbl    3(rPC),%ecx               # ecx<- CC
-    SPILL(rPC)
-    GET_VREG_WORD(rPC,%eax,0)           # rPC<- v[BB+0]
-    GET_VREG_WORD(%eax,%eax,1)          # eax<- v[BB+1]
-    $instr1         # ex: addl   (rFP,%ecx,4),rPC
+    GET_VREG_WORD %edx %eax 0           # edx<- v[BB+0]
+    GET_VREG_WORD %eax %eax 1           # eax<- v[BB+1]
+    $instr1         # ex: addl   (rFP,%ecx,4),%edx
     $instr2         # ex: adcl   4(rFP,%ecx,4),%eax
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- AA
-    SET_VREG_WORD(rPC,rINST_FULL,0)     # v[AA+0] <- rPC
-    UNSPILL(rPC)
-    SET_VREG_WORD(%eax,rINST_FULL,1)    # v[AA+1] <- eax
-    FETCH_INST_WORD(2)
-    ADVANCE_PC(2)
-    GOTO_NEXT
+    SET_VREG_WORD %edx rINST 0          # v[AA+0] <- edx
+    FETCH_INST_OPCODE 2 %edx
+    SET_VREG_WORD %eax rINST 1          # v[AA+1] <- eax
+    ADVANCE_PC 2
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/binopWide2addr.S b/vm/mterp/x86/binopWide2addr.S
index 5d378bf..be9084b 100644
--- a/vm/mterp/x86/binopWide2addr.S
+++ b/vm/mterp/x86/binopWide2addr.S
@@ -2,14 +2,13 @@
      * Generic 64-bit binary operation.
      */
     /* binop/2addr vA, vB */
-    movzbl    rINST_HI,%ecx             # ecx<- BA
+    movzbl    rINSTbl,%ecx              # ecx<- BA
     sarl      $$4,%ecx                  # ecx<- B
-    GET_VREG_WORD(%eax,%ecx,0)          # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)          # eax<- v[B+1]
-    movzbl    rINST_HI,rINST_FULL       # rINST_FULL<- BA
-    andb      $$0xF,rINST_LO            # rINST_FULL<- A
-    $instr1         # example: addl   %eax,(rFP,rINST_FULL,4)
-    $instr2         # example: adcl   %ecx,4(rFP,rINST_FULL,4)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_VREG_WORD %eax %ecx 0           # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1           # eax<- v[B+1]
+    andb      $$0xF,rINSTbl             # rINST<- A
+    $instr1         # example: addl   %eax,(rFP,rINST,4)
+    $instr2         # example: adcl   %ecx,4(rFP,rINST,4)
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/cvtfp_int.S b/vm/mterp/x86/cvtfp_int.S
index f4f36b8..13dc936 100644
--- a/vm/mterp/x86/cvtfp_int.S
+++ b/vm/mterp/x86/cvtfp_int.S
@@ -7,20 +7,20 @@
  * to play some games.
  */
     /* float/double to int/long vA, vB */
-    movzbl    rINST_HI,%ecx           # ecx<- A+
-    sarl      $$12,rINST_FULL         # rINST_FULL<- B
+    movzbl    rINSTbl,%ecx       # ecx<- A+
+    sarl      $$4,rINST         # rINST<- B
     .if $srcdouble
-    fldl     (rFP,rINST_FULL,4)       # %st0<- vB
+    fldl     (rFP,rINST,4)       # %st0<- vB
     .else
-    flds     (rFP,rINST_FULL,4)       # %st0<- vB
+    flds     (rFP,rINST,4)       # %st0<- vB
     .endif
     ftst
     fnstcw   LOCAL0_OFFSET(%ebp)      # remember original rounding mode
     movzwl   LOCAL0_OFFSET(%ebp),%eax
     movb     $$0xc,%ah
     movw     %ax,LOCAL0_OFFSET+2(%ebp)
-    fldcw    LOCAL0_OFFSET+2(%ebp)      # set "to zero" rounding mode
-    FETCH_INST_WORD(1)
+    fldcw    LOCAL0_OFFSET+2(%ebp)    # set "to zero" rounding mode
+    FETCH_INST_OPCODE 1 %edx
     andb     $$0xf,%cl                # ecx<- A
     .if $tgtlong
     fistpll  (rFP,%ecx,4)             # convert and store
@@ -43,8 +43,8 @@
     je       .L${opcode}_special_case # fix up result
 
 .L${opcode}_finish:
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
 
 .L${opcode}_special_case:
     fnstsw   %ax
diff --git a/vm/mterp/x86/entry.S b/vm/mterp/x86/entry.S
index ff310fe..9211d81 100644
--- a/vm/mterp/x86/entry.S
+++ b/vm/mterp/x86/entry.S
@@ -25,26 +25,26 @@
  *
  */
 dvmMterpStdRun:
-    push    %ebp
-    movl    %esp,%ebp
-    push    %edi
-    push    %esi
-    push    %ebx
+    movl    4(%esp), %ecx        # get incoming rGLUE
+    push    %ebp                 # save caller base pointer
+    push    %ecx                 # save rGLUE at (%ebp)
+    movl    %esp, %ebp           # set our %ebp
+/*
+ * At this point we've allocated two slots on the stack
+ * via push and stack is 8-byte aligned.  Allocate space
+ * for 8 spill slots, 3 local slots, 5 arg slots + 2 slots for
+ * padding to bring us to 16-byte alignment
+ */
+    subl    $$(FRAME_SIZE-8), %esp
 
-/* at this point, stack is misaligned by 1 word
-   We're allocating spill space for 6 words, plus
-   outgoing argument (5 words) and local variables
-   (4 words) - 15 words or 60 bytes total. See
-   diagram in header.S
-*/
-    subl   $$60,%esp
+/* Spill callee save regs */
+    movl    %edi,EDI_SPILL(%ebp)
+    movl    %esi,ESI_SPILL(%ebp)
+    movl    %ebx,EBX_SPILL(%ebp)
 
 /* Set up "named" registers */
-    movl    IN_ARG0(%ebp),%ecx
-    movl    %ecx,rGLUE_SPILL(%ebp)
-    LOAD_PC_FROM_GLUE(%ecx)
-    LOAD_FP_FROM_GLUE(%ecx)
-    movl    $$dvmAsmInstructionStart,rIBASE
+    movl    offGlue_pc(%ecx),rPC
+    movl    offGlue_fp(%ecx),rFP
 
 /* Remember %esp for future "longjmp" */
     movl    %esp,offGlue_bailPtr(%ecx)
@@ -57,7 +57,7 @@
     jne     .Lnot_instr
 
    /* Normal case: start executing the instruction at rPC */
-    FETCH_INST()
+    FETCH_INST
     GOTO_NEXT
 
 .Lnot_instr:
@@ -94,12 +94,13 @@
 dvmMterpStdBail:
     movl    4(%esp),%ecx                 # grab glue
     movl    8(%esp),%eax                 # changeInterp to return reg
-    movl    offGlue_bailPtr(%ecx),%esp   # Stack back to normal
-    addl    $$60,%esp                    # Strip dvmMterpStdRun's frame
-    pop     %ebx
-    pop     %esi
-    pop     %edi
-    pop     %ebp
+    movl    offGlue_bailPtr(%ecx),%esp   # Restore "setjmp" esp
+    movl    (FRAME_SIZE-8)(%esp), %ebp   # Restore %ebp at point of setjmp
+    movl    EDI_SPILL(%ebp),%edi
+    movl    ESI_SPILL(%ebp),%esi
+    movl    EBX_SPILL(%ebp),%ebx
+    movl    PREV_FP(%ebp),%ebp           # restore caller's ebp
+    addl    $$FRAME_SIZE,%esp                    # strip frame
     ret                                  # return to dvmMterpStdRun's caller
 
 
@@ -109,3 +110,270 @@
     .section    .rodata
 .LstrBadEntryPoint:
     .asciz  "Bad entry point %d\n"
+
+
+/*
+ * FIXME: Should have the config/rebuild mechanism generate this
+ * for targets that need it.
+ */
+
+/* Jump table */
+dvmAsmInstructionJmpTable = .LdvmAsmInstructionJmpTable
+.LdvmAsmInstructionJmpTable:
+.long .L_OP_NOP
+.long .L_OP_MOVE
+.long .L_OP_MOVE_FROM16
+.long .L_OP_MOVE_16
+.long .L_OP_MOVE_WIDE
+.long .L_OP_MOVE_WIDE_FROM16
+.long .L_OP_MOVE_WIDE_16
+.long .L_OP_MOVE_OBJECT
+.long .L_OP_MOVE_OBJECT_FROM16
+.long .L_OP_MOVE_OBJECT_16
+.long .L_OP_MOVE_RESULT
+.long .L_OP_MOVE_RESULT_WIDE
+.long .L_OP_MOVE_RESULT_OBJECT
+.long .L_OP_MOVE_EXCEPTION
+.long .L_OP_RETURN_VOID
+.long .L_OP_RETURN
+.long .L_OP_RETURN_WIDE
+.long .L_OP_RETURN_OBJECT
+.long .L_OP_CONST_4
+.long .L_OP_CONST_16
+.long .L_OP_CONST
+.long .L_OP_CONST_HIGH16
+.long .L_OP_CONST_WIDE_16
+.long .L_OP_CONST_WIDE_32
+.long .L_OP_CONST_WIDE
+.long .L_OP_CONST_WIDE_HIGH16
+.long .L_OP_CONST_STRING
+.long .L_OP_CONST_STRING_JUMBO
+.long .L_OP_CONST_CLASS
+.long .L_OP_MONITOR_ENTER
+.long .L_OP_MONITOR_EXIT
+.long .L_OP_CHECK_CAST
+.long .L_OP_INSTANCE_OF
+.long .L_OP_ARRAY_LENGTH
+.long .L_OP_NEW_INSTANCE
+.long .L_OP_NEW_ARRAY
+.long .L_OP_FILLED_NEW_ARRAY
+.long .L_OP_FILLED_NEW_ARRAY_RANGE
+.long .L_OP_FILL_ARRAY_DATA
+.long .L_OP_THROW
+.long .L_OP_GOTO
+.long .L_OP_GOTO_16
+.long .L_OP_GOTO_32
+.long .L_OP_PACKED_SWITCH
+.long .L_OP_SPARSE_SWITCH
+.long .L_OP_CMPL_FLOAT
+.long .L_OP_CMPG_FLOAT
+.long .L_OP_CMPL_DOUBLE
+.long .L_OP_CMPG_DOUBLE
+.long .L_OP_CMP_LONG
+.long .L_OP_IF_EQ
+.long .L_OP_IF_NE
+.long .L_OP_IF_LT
+.long .L_OP_IF_GE
+.long .L_OP_IF_GT
+.long .L_OP_IF_LE
+.long .L_OP_IF_EQZ
+.long .L_OP_IF_NEZ
+.long .L_OP_IF_LTZ
+.long .L_OP_IF_GEZ
+.long .L_OP_IF_GTZ
+.long .L_OP_IF_LEZ
+.long .L_OP_UNUSED_3E
+.long .L_OP_UNUSED_3F
+.long .L_OP_UNUSED_40
+.long .L_OP_UNUSED_41
+.long .L_OP_UNUSED_42
+.long .L_OP_UNUSED_43
+.long .L_OP_AGET
+.long .L_OP_AGET_WIDE
+.long .L_OP_AGET_OBJECT
+.long .L_OP_AGET_BOOLEAN
+.long .L_OP_AGET_BYTE
+.long .L_OP_AGET_CHAR
+.long .L_OP_AGET_SHORT
+.long .L_OP_APUT
+.long .L_OP_APUT_WIDE
+.long .L_OP_APUT_OBJECT
+.long .L_OP_APUT_BOOLEAN
+.long .L_OP_APUT_BYTE
+.long .L_OP_APUT_CHAR
+.long .L_OP_APUT_SHORT
+.long .L_OP_IGET
+.long .L_OP_IGET_WIDE
+.long .L_OP_IGET_OBJECT
+.long .L_OP_IGET_BOOLEAN
+.long .L_OP_IGET_BYTE
+.long .L_OP_IGET_CHAR
+.long .L_OP_IGET_SHORT
+.long .L_OP_IPUT
+.long .L_OP_IPUT_WIDE
+.long .L_OP_IPUT_OBJECT
+.long .L_OP_IPUT_BOOLEAN
+.long .L_OP_IPUT_BYTE
+.long .L_OP_IPUT_CHAR
+.long .L_OP_IPUT_SHORT
+.long .L_OP_SGET
+.long .L_OP_SGET_WIDE
+.long .L_OP_SGET_OBJECT
+.long .L_OP_SGET_BOOLEAN
+.long .L_OP_SGET_BYTE
+.long .L_OP_SGET_CHAR
+.long .L_OP_SGET_SHORT
+.long .L_OP_SPUT
+.long .L_OP_SPUT_WIDE
+.long .L_OP_SPUT_OBJECT
+.long .L_OP_SPUT_BOOLEAN
+.long .L_OP_SPUT_BYTE
+.long .L_OP_SPUT_CHAR
+.long .L_OP_SPUT_SHORT
+.long .L_OP_INVOKE_VIRTUAL
+.long .L_OP_INVOKE_SUPER
+.long .L_OP_INVOKE_DIRECT
+.long .L_OP_INVOKE_STATIC
+.long .L_OP_INVOKE_INTERFACE
+.long .L_OP_UNUSED_73
+.long .L_OP_INVOKE_VIRTUAL_RANGE
+.long .L_OP_INVOKE_SUPER_RANGE
+.long .L_OP_INVOKE_DIRECT_RANGE
+.long .L_OP_INVOKE_STATIC_RANGE
+.long .L_OP_INVOKE_INTERFACE_RANGE
+.long .L_OP_UNUSED_79
+.long .L_OP_UNUSED_7A
+.long .L_OP_NEG_INT
+.long .L_OP_NOT_INT
+.long .L_OP_NEG_LONG
+.long .L_OP_NOT_LONG
+.long .L_OP_NEG_FLOAT
+.long .L_OP_NEG_DOUBLE
+.long .L_OP_INT_TO_LONG
+.long .L_OP_INT_TO_FLOAT
+.long .L_OP_INT_TO_DOUBLE
+.long .L_OP_LONG_TO_INT
+.long .L_OP_LONG_TO_FLOAT
+.long .L_OP_LONG_TO_DOUBLE
+.long .L_OP_FLOAT_TO_INT
+.long .L_OP_FLOAT_TO_LONG
+.long .L_OP_FLOAT_TO_DOUBLE
+.long .L_OP_DOUBLE_TO_INT
+.long .L_OP_DOUBLE_TO_LONG
+.long .L_OP_DOUBLE_TO_FLOAT
+.long .L_OP_INT_TO_BYTE
+.long .L_OP_INT_TO_CHAR
+.long .L_OP_INT_TO_SHORT
+.long .L_OP_ADD_INT
+.long .L_OP_SUB_INT
+.long .L_OP_MUL_INT
+.long .L_OP_DIV_INT
+.long .L_OP_REM_INT
+.long .L_OP_AND_INT
+.long .L_OP_OR_INT
+.long .L_OP_XOR_INT
+.long .L_OP_SHL_INT
+.long .L_OP_SHR_INT
+.long .L_OP_USHR_INT
+.long .L_OP_ADD_LONG
+.long .L_OP_SUB_LONG
+.long .L_OP_MUL_LONG
+.long .L_OP_DIV_LONG
+.long .L_OP_REM_LONG
+.long .L_OP_AND_LONG
+.long .L_OP_OR_LONG
+.long .L_OP_XOR_LONG
+.long .L_OP_SHL_LONG
+.long .L_OP_SHR_LONG
+.long .L_OP_USHR_LONG
+.long .L_OP_ADD_FLOAT
+.long .L_OP_SUB_FLOAT
+.long .L_OP_MUL_FLOAT
+.long .L_OP_DIV_FLOAT
+.long .L_OP_REM_FLOAT
+.long .L_OP_ADD_DOUBLE
+.long .L_OP_SUB_DOUBLE
+.long .L_OP_MUL_DOUBLE
+.long .L_OP_DIV_DOUBLE
+.long .L_OP_REM_DOUBLE
+.long .L_OP_ADD_INT_2ADDR
+.long .L_OP_SUB_INT_2ADDR
+.long .L_OP_MUL_INT_2ADDR
+.long .L_OP_DIV_INT_2ADDR
+.long .L_OP_REM_INT_2ADDR
+.long .L_OP_AND_INT_2ADDR
+.long .L_OP_OR_INT_2ADDR
+.long .L_OP_XOR_INT_2ADDR
+.long .L_OP_SHL_INT_2ADDR
+.long .L_OP_SHR_INT_2ADDR
+.long .L_OP_USHR_INT_2ADDR
+.long .L_OP_ADD_LONG_2ADDR
+.long .L_OP_SUB_LONG_2ADDR
+.long .L_OP_MUL_LONG_2ADDR
+.long .L_OP_DIV_LONG_2ADDR
+.long .L_OP_REM_LONG_2ADDR
+.long .L_OP_AND_LONG_2ADDR
+.long .L_OP_OR_LONG_2ADDR
+.long .L_OP_XOR_LONG_2ADDR
+.long .L_OP_SHL_LONG_2ADDR
+.long .L_OP_SHR_LONG_2ADDR
+.long .L_OP_USHR_LONG_2ADDR
+.long .L_OP_ADD_FLOAT_2ADDR
+.long .L_OP_SUB_FLOAT_2ADDR
+.long .L_OP_MUL_FLOAT_2ADDR
+.long .L_OP_DIV_FLOAT_2ADDR
+.long .L_OP_REM_FLOAT_2ADDR
+.long .L_OP_ADD_DOUBLE_2ADDR
+.long .L_OP_SUB_DOUBLE_2ADDR
+.long .L_OP_MUL_DOUBLE_2ADDR
+.long .L_OP_DIV_DOUBLE_2ADDR
+.long .L_OP_REM_DOUBLE_2ADDR
+.long .L_OP_ADD_INT_LIT16
+.long .L_OP_RSUB_INT
+.long .L_OP_MUL_INT_LIT16
+.long .L_OP_DIV_INT_LIT16
+.long .L_OP_REM_INT_LIT16
+.long .L_OP_AND_INT_LIT16
+.long .L_OP_OR_INT_LIT16
+.long .L_OP_XOR_INT_LIT16
+.long .L_OP_ADD_INT_LIT8
+.long .L_OP_RSUB_INT_LIT8
+.long .L_OP_MUL_INT_LIT8
+.long .L_OP_DIV_INT_LIT8
+.long .L_OP_REM_INT_LIT8
+.long .L_OP_AND_INT_LIT8
+.long .L_OP_OR_INT_LIT8
+.long .L_OP_XOR_INT_LIT8
+.long .L_OP_SHL_INT_LIT8
+.long .L_OP_SHR_INT_LIT8
+.long .L_OP_USHR_INT_LIT8
+.long .L_OP_IGET_VOLATILE
+.long .L_OP_IPUT_VOLATILE
+.long .L_OP_SGET_VOLATILE
+.long .L_OP_SPUT_VOLATILE
+.long .L_OP_IGET_OBJECT_VOLATILE
+.long .L_OP_IGET_WIDE_VOLATILE
+.long .L_OP_IPUT_WIDE_VOLATILE
+.long .L_OP_SGET_WIDE_VOLATILE
+.long .L_OP_SPUT_WIDE_VOLATILE
+.long .L_OP_BREAKPOINT
+.long .L_OP_THROW_VERIFICATION_ERROR
+.long .L_OP_EXECUTE_INLINE
+.long .L_OP_EXECUTE_INLINE_RANGE
+.long .L_OP_INVOKE_DIRECT_EMPTY
+.long .L_OP_RETURN_VOID_BARRIER
+.long .L_OP_IGET_QUICK
+.long .L_OP_IGET_WIDE_QUICK
+.long .L_OP_IGET_OBJECT_QUICK
+.long .L_OP_IPUT_QUICK
+.long .L_OP_IPUT_WIDE_QUICK
+.long .L_OP_IPUT_OBJECT_QUICK
+.long .L_OP_INVOKE_VIRTUAL_QUICK
+.long .L_OP_INVOKE_VIRTUAL_QUICK_RANGE
+.long .L_OP_INVOKE_SUPER_QUICK
+.long .L_OP_INVOKE_SUPER_QUICK_RANGE
+.long .L_OP_IPUT_OBJECT_VOLATILE
+.long .L_OP_SGET_OBJECT_VOLATILE
+.long .L_OP_SPUT_OBJECT_VOLATILE
+.long .L_OP_UNUSED_FF
+
diff --git a/vm/mterp/x86/footer.S b/vm/mterp/x86/footer.S
index d276183..cbb86e1 100644
--- a/vm/mterp/x86/footer.S
+++ b/vm/mterp/x86/footer.S
@@ -44,13 +44,13 @@
  * Common code when a backwards branch is taken
  *
  * On entry:
- *   ebx (a.k.a. rINST_FULL) -> PC adjustment in 16-bit words
+ *   ebx (a.k.a. rINST) -> PC adjustment in 16-bit words
  */
 common_backwardBranch:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     call   common_periodicChecks  # Note: expects rPC to be preserved
-    ADVANCE_PC_INDEXED(rINST_FULL)
-    FETCH_INST()
+    ADVANCE_PC_INDEXED rINST
+    FETCH_INST
     GOTO_NEXT
 
 
@@ -60,7 +60,7 @@
  *
  * On entry:
  *   eax = Method* methodToCall
- *   rINST trashed, must reload
+ *   rINSTw trashed, must reload
  */
 
 common_invokeMethodRange:
@@ -70,12 +70,11 @@
     * prepare to copy args to "outs" area of current frame
     */
 
-    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- AA
+    movzbl      1(rPC),rINST       # rINST<- AA
     movzwl      4(rPC), %ecx            # %ecx<- CCCC
-    SPILL(rPC)
-    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
-    test        rINST_FULL, rINST_FULL
-    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
+    SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
+    test        rINST, rINST
+    movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- AA
     jz          .LinvokeArgsDone        # no args; jump to args done
 
 
@@ -106,13 +105,12 @@
 
 common_invokeMethodNoRange:
 .LinvokeNewNoRange:
-    movzbl      1(rPC),rINST_FULL       # rINST_FULL<- BA
-    SPILL(rPC)
-    movl        rINST_FULL, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
+    movzbl      1(rPC),rINST       # rINST<- BA
+    movl        rINST, LOCAL0_OFFSET(%ebp) # LOCAL0_OFFSET(%ebp)<- BA
     shrl        $$4, LOCAL0_OFFSET(%ebp)        # LOCAL0_OFFSET(%ebp)<- B
     je          .LinvokeArgsDone        # no args; jump to args done
     movzwl      4(rPC), %ecx            # %ecx<- GFED
-    SAVEAREA_FROM_FP(%edx,rFP)          # %edx<- &StackSaveArea
+    SAVEAREA_FROM_FP %edx               # %edx<- &StackSaveArea
 
    /*
     * %eax=methodToCall, %ecx=GFED, LOCAL0_OFFSET(%ebp)=count, %edx=outs
@@ -127,9 +125,9 @@
     jl          3f                      # handle 3 args
     je          4f                      # handle 4 args
 5:
-    andl        $$15, rINST_FULL        # rINST<- A
+    andl        $$15, rINST             # rINSTw<- A
     lea         -4(%edx), %edx          # %edx<- update &outs; &outs--
-    movl        (rFP, rINST_FULL, 4), %ecx # %ecx<- vA
+    movl        (rFP, rINST, 4), %ecx   # %ecx<- vA
     movl        %ecx, (%edx)            # *outs<- vA
     movl        LOCAL1_OFFSET(%ebp), %ecx       # %ecx<- GFED
 4:
@@ -168,9 +166,9 @@
     movzwl      offMethod_outsSize(%eax), %ecx # %ecx<- methodToCall->outsSize
     movl        %eax, LOCAL0_OFFSET(%ebp)       # LOCAL0_OFFSET<- methodToCall
     shl         $$2, %edx               # %edx<- update offset
-    SAVEAREA_FROM_FP(%eax,rFP)          # %eax<- &StackSaveArea
+    SAVEAREA_FROM_FP %eax               # %eax<- &StackSaveArea
     subl        %edx, %eax              # %eax<- newFP; (old savearea - regsSize)
-    GET_GLUE(%edx)                      # %edx<- pMterpGlue
+    movl        rGLUE,%edx              # %edx<- pMterpGlue
     movl        %eax, LOCAL1_OFFSET(%ebp)       # LOCAL1_OFFSET(%ebp)<- &outs
     subl        $$sizeofStackSaveArea, %eax # %eax<- newSaveArea (stack save area using newFP)
     movl        offGlue_interpStackEnd(%edx), %edx # %edx<- glue->interpStackEnd
@@ -187,12 +185,11 @@
     */
 
 #ifdef EASY_GDB
-    SAVEAREA_FROM_FP(%ecx,rFP)          # %ecx<- &StackSaveArea
+    SAVEAREA_FROM_FP %ecx               # %ecx<- &StackSaveArea
     movl        %ecx, offStackSaveArea_prevSave(%edx) # newSaveArea->prevSave<- &outs
 #endif
     movl        rFP, offStackSaveArea_prevFrame(%edx) # newSaveArea->prevFrame<- rFP
-    movl        rPC_SPILL(%ebp), %ecx
-    movl        %ecx, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
+    movl        rPC, offStackSaveArea_savedPc(%edx) # newSaveArea->savedPc<- rPC
     testl       $$ACC_NATIVE, offMethod_accessFlags(%eax) # check for native call
     movl        %eax, offStackSaveArea_method(%edx) # newSaveArea->method<- method to call
     jne         .LinvokeNative          # handle native call
@@ -203,7 +200,7 @@
     */
 
     movl        offMethod_clazz(%eax), %edx # %edx<- method->clazz
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx                  # %ecx<- pMterpGlue
     movl        offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex
     movl        %eax, offGlue_method(%ecx) # glue->method<- methodToCall
     movl        %edx, offGlue_methodClassDex(%ecx) # glue->methodClassDex<- method->clazz->pDvmDex
@@ -211,7 +208,7 @@
     movl        offGlue_self(%ecx), %eax # %eax<- glue->self
     movl        LOCAL1_OFFSET(%ebp), rFP # rFP<- newFP
     movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- newFP
-    FETCH_INST()
+    FETCH_INST
     GOTO_NEXT                           # jump to methodToCall->insns
 
    /*
@@ -220,7 +217,7 @@
     */
 
 .LinvokeNative:
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx              # %ecx<- pMterpGlue
     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
     movl        offGlue_self(%ecx), %ecx        # %ecx<- glue->self
     movl        offThread_jniLocal_topCookie(%ecx), %eax # %eax<- self->localRef->...
@@ -230,7 +227,7 @@
     movl        %edx, offThread_curFrame(%ecx)  # glue->self->curFrame<- newFP
     movl        %ecx, OUT_ARG3(%esp)    # save glue->self
     movl        %ecx, OUT_ARG2(%esp)    # push parameter glue->self
-    GET_GLUE(%ecx)                      # %ecx<- pMterpGlue
+    movl        rGLUE,%ecx              # %ecx<- pMterpGlue
     movl        OUT_ARG1(%esp), %eax    # %eax<- methodToCall
     lea         offGlue_retval(%ecx), %ecx # %ecx<- &retval
     movl        %ecx, OUT_ARG0(%esp)    # push parameter pMterpGlue
@@ -244,48 +241,21 @@
     cmp         $$0, offThread_exception(%eax) # check for exception
     movl        rFP, offThread_curFrame(%eax) # glue->self->curFrame<- rFP
     movl        %edx, offThread_jniLocal_topCookie(%eax) # new top <- old top
-    UNSPILL(rPC)
     jne         common_exceptionThrown  # handle exception
-    FETCH_INST_WORD(3)
-    ADVANCE_PC(3)
-    GOTO_NEXT                           # jump to next instruction
+    FETCH_INST_OPCODE 3 %edx
+    ADVANCE_PC 3
+    GOTO_NEXT_R %edx                    # jump to next instruction
 
 .LstackOverflow:    # eax=methodToCall
     movl        %eax, OUT_ARG1(%esp)    # push parameter methodToCall
-    GET_GLUE(%eax)                      # %eax<- pMterpGlue
+    movl        rGLUE,%eax              # %eax<- pMterpGlue
     movl        offGlue_self(%eax), %eax # %eax<- glue->self
     movl        %eax, OUT_ARG0(%esp)    # push parameter self
     call        dvmHandleStackOverflow  # call: (Thread* self, Method* meth)
-    UNSPILL(rPC)                        # return: void
     jmp         common_exceptionThrown  # handle exception
 
 
 /*
- * Common invoke code (old-style).
- * TUNING:  Rewrite along lines of new armv5 code?
- *
- * On entry:
- *   eax = Method* methodToCall
- *   ecx = bool methodCallRange
- *   rINST trashed, must reload
- */
-common_invokeOld:
-    movl     %ecx,OUT_ARG1(%esp)     # arg1<- methodCallRange
-    GET_GLUE(%ecx)
-    movzwl  (rPC),rINST_FULL         # recover rINST
-    movl     %eax,OUT_ARG2(%esp)     # arg2<- method
-    movzwl   4(rPC),%eax             # eax<- GFED or CCCC
-    SAVE_PC_TO_GLUE(%ecx)
-    SAVE_FP_TO_GLUE(%ecx)
-    movzbl   rINST_HI,rINST_FULL
-    movl     rINST_FULL,OUT_ARG3(%esp)# arg3<- AA
-    movl     %ecx,OUT_ARG0(%esp)     # arg0<- GLUE
-    movl     %eax,OUT_ARG4(%esp)     # arg4<- GFED/CCCC
-    call     dvmMterp_invokeMethod
-    jmp      common_resumeAfterGlueCall
-
-
-/*
  * Do we need the thread to be suspended or have debugger/profiling activity?
  *
  * On entry:
@@ -293,8 +263,8 @@
  *   ecx  -> GLUE pointer
  *   reentry type, e.g. kInterpEntryInstr stored in rGLUE->entryPoint
  *
- * Note: A call will normally kill %eax, rPC/%edx and %ecx.  To
- *       streamline the normal case, this routine will preserve rPC and
+ * Note: A call will normally kill %eax and %ecx.  To
+ *       streamline the normal case, this routine will preserve
  *       %ecx in addition to the normal caller save regs.  The save/restore
  *       is a bit ugly, but will happen in the relatively uncommon path.
  * TODO: Basic-block style Jit will need a hook here as well.  Fold it into
@@ -313,7 +283,7 @@
     movzbl (%eax),%eax             # get active count
 2:
     orl    (%ecx),%eax             # eax <- debuggerActive | activeProfilers
-    GET_GLUE(%ecx)                 # restore rGLUE
+    movl   rGLUE,%ecx              # restore rGLUE
     jne    3f                      # one or both active - switch interp
 
 5:
@@ -323,14 +293,13 @@
 1:
     /*  At this point, the return pointer to the caller of
      *  common_periodicChecks is on the top of stack.  We need to preserve
-     *  rPC(edx) and GLUE(ecx).  We'll spill rPC, and reload GLUE.
+     *  GLUE(ecx).
      *  The outgoing profile is:
      *      bool dvmCheckSuspendPending(Thread* self)
      *  Because we reached here via a call, go ahead and build a new frame.
      */
-    EXPORT_PC()                         # need for precise GC
+    EXPORT_PC                         # need for precise GC
     movl    offGlue_self(%ecx),%eax      # eax<- glue->self
-    SPILL(rPC)                      # save edx
     push    %ebp
     movl    %esp,%ebp
     subl    $$24,%esp
@@ -338,8 +307,7 @@
     call    dvmCheckSuspendPending
     addl    $$24,%esp
     pop     %ebp
-    UNSPILL(rPC)
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
 
     /*
      * Need to check to see if debugger or profiler flags got set
@@ -359,8 +327,8 @@
      */
 3:
     leal    (rPC,%ebx,2),rPC       # adjust pc to show target
-    GET_GLUE(%ecx)                 # bail expect GLUE already loaded
-    movl    $$1,rINST_FULL         # set changeInterp to true
+    movl    rGLUE,%ecx             # bail expect GLUE already loaded
+    movl    $$1,rINST              # set changeInterp to true
     jmp     common_gotoBail
 
 
@@ -368,47 +336,47 @@
  * Common code for handling a return instruction
  */
 common_returnFromMethod:
-    GET_GLUE(%ecx)
+    movl    rGLUE,%ecx
     /* Set entry mode in case we bail */
     movb    $$kInterpEntryReturn,offGlue_entryPoint(%ecx)
-    xorl    rINST_FULL,rINST_FULL   # zero offset in case we switch interps
+    xorl    rINST,rINST   # zero offset in case we switch interps
     call    common_periodicChecks   # Note: expects %ecx to be preserved
 
-    SAVEAREA_FROM_FP(%eax,rFP)                    # eax<- saveArea (old)
+    SAVEAREA_FROM_FP %eax                         # eax<- saveArea (old)
     movl    offStackSaveArea_prevFrame(%eax),rFP  # rFP<- prevFrame
-    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST_FULL
-    cmpl    $$0,rINST_FULL                        # break?
+    movl    (offStackSaveArea_method-sizeofStackSaveArea)(rFP),rINST
+    cmpl    $$0,rINST                             # break?
     je      common_gotoBail    # break frame, bail out completely
 
     movl    offStackSaveArea_savedPc(%eax),rPC    # pc<- saveArea->savedPC
     movl    offGlue_self(%ecx),%eax               # eax<- self
-    movl    rINST_FULL,offGlue_method(%ecx)  # glue->method = newSave->meethod
+    movl    rINST,offGlue_method(%ecx)  # glue->method = newSave->meethod
     movl    rFP,offThread_curFrame(%eax)     # self->curFrame = fp
-    movl    offMethod_clazz(rINST_FULL),%eax # eax<- method->clazz
-    FETCH_INST_WORD(3)
+    movl    offMethod_clazz(rINST),%eax      # eax<- method->clazz
+    FETCH_INST_OPCODE 3 %edx
     movl    offClassObject_pDvmDex(%eax),%eax # eax<- method->clazz->pDvmDex
-    ADVANCE_PC(3)
+    ADVANCE_PC 3
     movl    %eax,offGlue_methodClassDex(%ecx)
     /* not bailing - restore entry mode to default */
     movb    $$kInterpEntryInstr,offGlue_entryPoint(%ecx)
-    GOTO_NEXT
+    GOTO_NEXT_R %edx
 
 /*
  * Prepare to strip the current frame and "longjump" back to caller of
  * dvmMterpStdRun.
  *
  * on entry:
- *    rINST_FULL holds changeInterp
+ *    rINST holds changeInterp
  *    ecx holds glue pointer
  *
  * expected profile: dvmMterpStdBail(MterpGlue *glue, bool changeInterp)
  */
 common_gotoBail:
-    SAVE_PC_TO_GLUE(%ecx)                # export state to glue
-    SAVE_FP_TO_GLUE(%ecx)
-    movl   %ecx,OUT_ARG0(%esp)           # glue in arg0
-    movl   rINST_FULL,OUT_ARG1(%esp)     # changeInterp in arg1
-    call    dvmMterpStdBail              # bail out....
+    movl   rPC,offGlue_pc(%ecx)     # export state to glue
+    movl   rFP,offGlue_fp(%ecx)
+    movl   %ecx,OUT_ARG0(%esp)      # glue in arg0
+    movl   rINST,OUT_ARG1(%esp)     # changeInterp in arg1
+    call   dvmMterpStdBail          # bail out....
 
 
 /*
@@ -416,38 +384,32 @@
  * and start executing at the next instruction.
  */
  common_resumeAfterGlueCall:
-     GET_GLUE(%ecx)
-     LOAD_PC_FROM_GLUE(%ecx)
-     LOAD_FP_FROM_GLUE(%ecx)
-     FETCH_INST()
+     LOAD_PC_FP_FROM_GLUE
+     FETCH_INST
      GOTO_NEXT
 
 /*
  * Integer divide or mod by zero
  */
 common_errDivideByZero:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrArithmeticException,%eax
     movl    %eax,OUT_ARG0(%esp)
     movl    $$.LstrDivideByZero,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
  * Attempt to allocate an array with a negative size.
  */
 common_errNegativeArraySize:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrNegativeArraySizeException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -455,14 +417,12 @@
  */
 common_errNoSuchMethod:
 
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrNoSuchMethodError,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -470,41 +430,35 @@
  * NullPointerException and goto the exception processing code.
  */
 common_errNullObject:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrNullPointerException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
  * Array index exceeds max.
  */
 common_errArrayIndex:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrArrayIndexException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 /*
  * Invalid array value.
  */
 common_errArrayStore:
-    EXPORT_PC()
+    EXPORT_PC
     movl    $$.LstrArrayStoreException,%eax
     movl    %eax,OUT_ARG0(%esp)
     xorl    %eax,%eax
     movl    %eax,OUT_ARG1(%esp)
-    SPILL(rPC)
     call    dvmThrowException
-    UNSPILL(rPC)
     jmp     common_exceptionThrown
 
 /*
@@ -517,9 +471,9 @@
  * This does not return.
  */
 common_exceptionThrown:
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)
-    SAVE_FP_TO_GLUE(%ecx)
+    movl    rGLUE,%ecx
+    movl    rPC,offGlue_pc(%ecx)
+    movl    rFP,offGlue_fp(%ecx)
     movl    %ecx,OUT_ARG0(%esp)
     call    dvmMterp_exceptionThrown
     jmp     common_resumeAfterGlueCall
@@ -552,7 +506,7 @@
     .asciz  "Ljava/lang/ClassCastException;"
 .LstrNoSuchMethodError:
     .asciz  "Ljava/lang/NoSuchMethodError;"
-.LstrInternalError:
+.LstrInternalErrorA:
     .asciz  "Ljava/lang/InternalError;"
-.LstrFilledNewArrayNotImpl:
+.LstrFilledNewArrayNotImplA:
     .asciz  "filled-new-array only implemented for 'int'"
diff --git a/vm/mterp/x86/fpcvt.S b/vm/mterp/x86/fpcvt.S
index 4fffbe4..22d09bd 100644
--- a/vm/mterp/x86/fpcvt.S
+++ b/vm/mterp/x86/fpcvt.S
@@ -3,12 +3,12 @@
      * Generic 32-bit FP conversion operation.
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $$12,rINST_FULL         # rINST_FULL<- B
-    $load    (rFP,rINST_FULL,4)      # %st0<- vB
-    andb     $$0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx       # ecx<- A+
+    sarl     $$4,rINST         # rINST<- B
+    $load    (rFP,rINST,4)      # %st0<- vB
+    andb     $$0xf,%cl          # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     $instr
-    $store  (rFP,%ecx,4)             # vA<- %st0
-    GOTO_NEXT
+    $store  (rFP,%ecx,4)        # vA<- %st0
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/header.S b/vm/mterp/x86/header.S
index bb043ba..cb2ddf8 100644
--- a/vm/mterp/x86/header.S
+++ b/vm/mterp/x86/header.S
@@ -52,46 +52,45 @@
 to callee save registers).
 
   nick     reg   purpose
-  rPC      edx   interpreted program counter, used for fetching instructions
+  rPC      edi   interpreted program counter, used for fetching instructions
   rFP      esi   interpreted frame pointer, used for accessing locals and args
-  rIBASE   edi   Base pointer for instruction dispatch computed goto
-  rINST    bx    first 16-bit code of current instruction
-  rOPCODE  bl    opcode portion of instruction word
-  rINST_HI bh    high byte of instruction word, usually contains src/tgt reg names
+  rINSTw   bx    first 16-bit code of current instruction
+  rINSTbl  bl    opcode portion of instruction word
+  rINSTbh  bh    high byte of inst word, usually contains src/tgt reg names
 
 Notes:
    o High order 16 bits of ebx must be zero on entry to handler
-   o rPC, rFP, rIBASE, rINST/rOPCODE valid on handler entry and exit
-   o eax and ecx are scratch, rINST/ebx sometimes scratch
+   o rPC, rFP, rINSTw/rINSTbl valid on handler entry and exit
+   o eax, edx and ecx are scratch, rINSTw/ebx sometimes scratch
    o rPC is in the caller save set, and will be killed across external calls. Don't
      forget to SPILL/UNSPILL it around call points
 
 */
 
-#define rPC      %edx
-#define rFP      %esi
-#define rIBASE   %edi
-#define rINST_FULL %ebx
-#define rINST    %bx
-#define rINST_HI %bh
-#define rINST_LO %bl
-#define rOPCODE  %bl
+#define rGLUE    (%ebp)
+#define rPC      %esi
+#define rFP      %edi
+#define rINST    %ebx
+#define rINSTw   %bx
+#define rINSTbh  %bh
+#define rINSTbl  %bl
 
 
 /* Frame diagram while executing dvmMterpStdRun, high to low addresses */
-#define IN_ARG0        (  8)
-#define CALLER_RP      (  4)
-#define PREV_FP        (  0) /* <- dvmMterpStdRun ebp */
+#define IN_ARG0        ( 12)
+#define CALLER_RP      (  8)
+#define PREV_FP        (  4)
+#define rGLUE_SPILL    (  0) /* <- dvmMterpStdRun ebp */
 /* Spill offsets relative to %ebp */
 #define EDI_SPILL      ( -4)
 #define ESI_SPILL      ( -8)
-#define EDX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
+#define EBX_SPILL      (-12) /* <- esp following dmMterpStdRun header */
 #define rPC_SPILL      (-16)
 #define rFP_SPILL      (-20)
-#define rGLUE_SPILL    (-24)
-#define rIBASE_SPILL   (-28)
-#define rINST_FULL_SPILL    (-32)
-#define TMP_SPILL      (-36)
+#define rINST_SPILL    (-24)
+#define TMP_SPILL1     (-28)
+#define TMP_SPILL2     (-32)
+#define TMP_SPILL3     (-36)
 #define LOCAL0_OFFSET  (-40)
 #define LOCAL1_OFFSET  (-44)
 #define LOCAL2_OFFSET  (-48)
@@ -102,20 +101,29 @@
 #define OUT_ARG2       (  8)
 #define OUT_ARG1       (  4)
 #define OUT_ARG0       (  0)  /* <- dvmMterpStdRun esp */
+#define FRAME_SIZE     80
 
 #define SPILL(reg) movl reg##,reg##_SPILL(%ebp)
 #define UNSPILL(reg) movl reg##_SPILL(%ebp),reg
-#define SPILL_TMP(reg) movl reg,TMP_SPILL(%ebp)
-#define UNSPILL_TMP(reg) movl TMP_SPILL(%ebp),reg
-
+#define SPILL_TMP1(reg) movl reg,TMP_SPILL1(%ebp)
+#define UNSPILL_TMP1(reg) movl TMP_SPILL1(%ebp),reg
+#define SPILL_TMP2(reg) movl reg,TMP_SPILL2(%ebp)
+#define UNSPILL_TMP2(reg) movl TMP_SPILL2(%ebp),reg
+#define SPILL_TMP3(reg) movl reg,TMP_SPILL3(%ebp)
+#define UNSPILL_TMP3(reg) movl TMP_SPILL3(%ebp),reg
 
 /* save/restore the PC and/or FP from the glue struct */
-#define LOAD_PC_FROM_GLUE(_glu)     movl    offGlue_pc(_glu),rPC
-#define SAVE_PC_TO_GLUE(_glu)       movl    rPC,offGlue_pc(_glu)
-#define LOAD_FP_FROM_GLUE(_glu)     movl    offGlue_fp(_glu),rFP
-#define SAVE_FP_TO_GLUE(_glu)       movl    rFP,offGlue_fp(_glu)
+.macro SAVE_PC_FP_TO_GLUE _reg
+    movl     rGLUE,\_reg
+    movl     rPC,offGlue_pc(\_reg)
+    movl     rFP,offGlue_fp(\_reg)
+.endm
 
-#define GET_GLUE(_reg)     movl   rGLUE_SPILL(%ebp),_reg
+.macro LOAD_PC_FP_FROM_GLUE
+    movl    rGLUE,rFP
+    movl    offGlue_pc(rFP),rPC
+    movl    offGlue_fp(rFP),rFP
+.endm
 
 /* The interpreter assumes a properly aligned stack on entry, and
  * will preserve 16-byte alignment.
@@ -130,76 +138,447 @@
  *
  * It's okay to do this more than once.
  */
-#define EXPORT_PC() \
+.macro EXPORT_PC
     movl     rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP)
+.endm
 
 /*
  * Given a frame pointer, find the stack save area.
  *
  * In C this is "((StackSaveArea*)(_fp) -1)".
  */
-#define SAVEAREA_FROM_FP(_reg, _fpreg) \
-    leal    -sizeofStackSaveArea(_fpreg),_reg
+.macro SAVEAREA_FROM_FP _reg
+    leal    -sizeofStackSaveArea(rFP), \_reg
+.endm
 
 /*
- * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
+ * Fetch the next instruction from rPC into rINSTw.  Does not advance rPC.
  */
-#define FETCH_INST()            movzwl    (rPC),rINST_FULL
+.macro FETCH_INST
+    movzwl    (rPC),rINST
+.endm
 
 /*
- * Fetch the nth instruction word from rPC into rINST.  Does not advance
+ * Fetch the opcode byte and zero-extend it into _reg.  Must be used
+ * in conjunction with GOTO_NEXT_R
+ */
+.macro FETCH_INST_R _reg
+    movzbl    (rPC),\_reg
+.endm
+
+/*
+ * Fetch the opcode byte at _count words offset from rPC and zero-extend
+ * it into _reg.  Must be used in conjunction with GOTO_NEXT_R
+ */
+.macro FETCH_INST_OPCODE _count _reg
+    movzbl  \_count*2(rPC),\_reg
+.endm
+
+/*
+ * Fetch the nth instruction word from rPC into rINSTw.  Does not advance
  * rPC, and _count is in words
  */
-#define FETCH_INST_WORD(_count)  movzwl  _count*2(rPC),rINST_FULL
+.macro FETCH_INST_WORD _count
+    movzwl  \_count*2(rPC),rINST
+.endm
 
 /*
  * Fetch instruction word indexed (used for branching).
  * Index is in instruction word units.
  */
-#define FETCH_INST_INDEXED(_reg) movzwl  (rPC,_reg,2),rINST_FULL
-
-/*
- * Extract the opcode of the instruction in rINST
- */
-#define EXTRACT_OPCODE(_reg)   movzx rOPCODE,_reg
+.macro FETCH_INST_INDEXED _reg
+    movzwl  (rPC,\_reg,2),rINST
+.endm
 
 /*
  * Advance rPC by instruction count
  */
-#define ADVANCE_PC(_count)    leal  2*_count(rPC),rPC
+.macro ADVANCE_PC _count
+    leal  2*\_count(rPC),rPC
+.endm
 
 /*
  * Advance rPC by branch offset in register
  */
-#define ADVANCE_PC_INDEXED(_reg) leal (rPC,_reg,2),rPC
+.macro ADVANCE_PC_INDEXED _reg
+    leal (rPC,\_reg,2),rPC
+.endm
 
-/*
- * Note: assumes opcode previously fetched and in rINST, and
- *       %eax is killable at this point.
- */
-#if 1
 .macro GOTO_NEXT
-    /* For computed next version */
-     movzx    rOPCODE,%eax
-     sall     $$$handler_size_bits,%eax
-     addl     rIBASE,%eax
-     jmp      *%eax
+     movzx   rINSTbl,%eax
+     movzbl  rINSTbh,rINST
+     jmp     *dvmAsmInstructionJmpTable(,%eax,4)
 .endm
-#else
-   /* For jump table version */
-.macro GOTO_NEXT
-     movzx   rOPCODE,%eax
-     jmp     *(rIBASE,%eax,4)
+
+   /*
+    * Version of GOTO_NEXT that assumes _reg preloaded with opcode.
+    * Should be paired with FETCH_INST_R
+    */
+.macro GOTO_NEXT_R _reg
+     movzbl  1(rPC),rINST
+     jmp     *dvmAsmInstructionJmpTable(,\_reg,4)
 .endm
-#endif
 
 /*
  * Get/set the 32-bit value from a Dalvik register.
  */
-#define GET_VREG(_reg, _vreg)   movl     (rFP,_vreg,4),_reg
-#define SET_VREG(_reg, _vreg)   movl     _reg,(rFP,_vreg,4)
-#define GET_VREG_WORD(_reg, _vreg, _offset)   movl     4*(_offset)(rFP,_vreg,4),_reg
-#define SET_VREG_WORD(_reg, _vreg, _offset)   movl     _reg,4*(_offset)(rFP,_vreg,4)
+.macro GET_VREG_R _reg _vreg
+    movl     (rFP,\_vreg,4),\_reg
+.endm
+
+.macro SET_VREG _reg _vreg
+    movl     \_reg,(rFP,\_vreg,4)
+.endm
+
+.macro GET_VREG_WORD _reg _vreg _offset
+    movl     4*(\_offset)(rFP,\_vreg,4),\_reg
+.endm
+
+.macro SET_VREG_WORD _reg _vreg _offset
+    movl     \_reg,4*(\_offset)(rFP,\_vreg,4)
+.endm
+
+#if 1
+
+#define rFinish %edx
+
+/* Macros for x86-atom handlers */
+    /*
+    * Get the 32-bit value from a dalvik register.
+    */
+
+    .macro      GET_VREG _vreg
+    movl        (rFP,\_vreg, 4), \_vreg
+    .endm
+
+   /*
+    * Fetch the next instruction from the specified offset. Advances rPC
+    * to point to the next instruction. "_count" is in 16-bit code units.
+    *
+    * This must come AFTER anything that can throw an exception, or the
+    * exception catch may miss. (This also implies that it must come after
+    * EXPORT_PC())
+    */
+
+    .macro      FETCH_ADVANCE_INST _count
+    add         $$(\_count*2), rPC
+    movzwl      (rPC), rINST
+    .endm
+
+   /*
+    * Fetch the next instruction from an offset specified by _reg. Updates
+    * rPC to point to the next instruction. "_reg" must specify the distance
+    * in bytes, *not* 16-bit code units, and may be a signed value.
+    */
+
+    .macro      FETCH_ADVANCE_INST_RB _reg
+    addl        \_reg, rPC
+    movzwl      (rPC), rINST
+    .endm
+
+   /*
+    * Fetch a half-word code unit from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op BBBB, it
+    * fetches BBBB.
+    */
+
+    .macro      FETCH _count _reg
+    movzwl      (\_count*2)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch a half-word code unit from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * This variant treats the value as signed.
+    */
+
+    .macro      FETCHs _count _reg
+    movswl      (\_count*2)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch the first byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op CC|BB, it
+    * fetches BB.
+    */
+
+    .macro      FETCH_BB _count _reg
+    movzbl      (\_count*2)(rPC), \_reg
+    .endm
+
+    /*
+    * Fetch the second byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * For example, given instruction of format: AA|op CC|BB, it
+    * fetches CC.
+    */
+
+    .macro      FETCH_CC _count _reg
+    movzbl      (\_count*2 + 1)(rPC), \_reg
+    .endm
+
+   /*
+    * Fetch the second byte from an offset past the current PC. The
+    * "_count" value is in 16-bit code units. Does not advance rPC.
+    * This variant treats the value as signed.
+    */
+
+    .macro      FETCH_CCs _count _reg
+    movsbl      (\_count*2 + 1)(rPC), \_reg
+    .endm
+
+
+   /*
+    * Fetch one byte from an offset past the current PC.  Pass in the same
+    * "_count" as you would for FETCH, and an additional 0/1 indicating which
+    * byte of the halfword you want (lo/hi).
+    */
+
+    .macro      FETCH_B _reg  _count  _byte
+    movzbl      (\_count*2+\_byte)(rPC), \_reg
+    .endm
+
+   /*
+    * Put the instruction's opcode field into the specified register.
+    */
+
+    .macro      GET_INST_OPCODE _reg
+    movzbl      rINSTbl, \_reg
+    .endm
+
+   /*
+    * Begin executing the opcode in _reg.
+    */
+
+    .macro      GOTO_OPCODE _reg
+    shl         $$${handler_size_bits}, \_reg
+    addl        $$dvmAsmInstructionStart,\_reg
+    jmp         *\_reg
+    .endm
+
+
+
+   /*
+    * Macros pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH _rFinish
+    movzbl      (rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_JMPa _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish and _count should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH_ADV _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_JMP _count _rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $$(\_count*2), rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+    .macro      FGETOP_JMP2 _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+    .macro      OLD_JMP_1 _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    shl         $$${handler_size_bits}, \_rFinish
+    .endm
+
+    .macro      OLD_JMP_2 _rFinish
+    addl        $$dvmAsmInstructionStart,\_rFinish
+    .endm
+
+    .macro      OLD_JMP_3 _count
+    addl        $$(\_count*2), rPC
+    .endm
+
+    .macro      OLD_JMP_4 _rFinish
+    movzbl      1(rPC), rINST
+    jmp         *\_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_1 _reg _rFinish
+    movzbl      (rPC, \_reg), \_rFinish
+    shl         $$${handler_size_bits}, \_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_2 _rFinish
+    addl        $$dvmAsmInstructionStart,\_rFinish
+    .endm
+
+    .macro      OLD_JMP_A_3 _reg _rFinish
+    addl        \_reg, rPC
+    movzbl      1(rPC, \_reg), rINST
+    jmp         *\_rFinish
+    .endm
+
+   /*
+    * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE
+    * by using a jump table. _rFinish and _reg should must be the same register for
+    * both macros.
+    */
+
+    .macro      FFETCH_ADV_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    .endm
+
+    .macro      FGETOP_RB_JMP _reg _rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_INST, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH _rFinish
+    movzbl      (rPC), \_rFinish
+    movzbl      1(rPC), rINST
+    .endm
+
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH_ADVANCE _count _rFinish
+    movzbl      (\_count*2)(rPC), \_rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $$(\_count*2), rPC
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE using
+    * a jump table. This macro should be called before FINISH_JMP where
+    * rFinish should be the same register containing the opcode value.
+    * This is an attempt to split up FINISH in order to reduce or remove
+    * potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_FETCH_ADVANCE_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    .endm
+
+   /*
+    * Attempts to speed up GOTO_OPCODE using a jump table. This macro should
+    * be called after a FINISH_FETCH* instruction where rFinish should be the
+    * same register containing the opcode value. This is an attempt to split up
+    * FINISH in order to reduce or remove potential stalls due to the wait for rFINISH.
+    */
+
+    .macro      FINISH_JMP _rFinish
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_INST, GET_INST_OPCODE, GOTO_OPCODE by using
+    * a jump table. Uses a single macro - but it should be faster if we
+    * split up the fetch for rFinish and the jump using rFinish.
+    */
+
+    .macro      FINISH_A
+    movzbl      (rPC), rFinish
+    movzbl      1(rPC), rINST
+    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE,
+    * GOTO_OPCODE by using a jump table. Uses a single macro -
+    * but it should be faster if we split up the fetch for rFinish
+    * and the jump using rFinish.
+    */
+
+    .macro      FINISH _count
+    movzbl      (\_count*2)(rPC), rFinish
+    movzbl      (\_count*2 + 1)(rPC), rINST
+    addl        $$(\_count*2), rPC
+    jmp         *dvmAsmInstructionJmpTable(,rFinish, 4)
+    .endm
+
+   /*
+    * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE,
+    * GOTO_OPCODE by using a jump table. Uses a single macro -
+    * but it should be faster if we split up the fetch for rFinish
+    * and the jump using rFinish.
+    */
+
+    .macro      FINISH_RB _reg _rFinish
+    movzbl      (\_reg, rPC), \_rFinish
+    movzbl      1(\_reg, rPC), rINST
+    addl        \_reg, rPC
+    jmp         *dvmAsmInstructionJmpTable(,\_rFinish, 4)
+    .endm
+
+#define sReg0 LOCAL0_OFFSET(%ebp)
+#define sReg1 LOCAL1_OFFSET(%ebp)
+#define sReg2 LOCAL2_OFFSET(%ebp)
+#define sReg3 LOCAL3_OFFSET(%ebp)
+
+   /*
+    * Hard coded helper values.
+    */
+
+.balign 16
+
+.LdoubNeg:
+    .quad       0x8000000000000000
+
+.L64bits:
+    .quad       0xFFFFFFFFFFFFFFFF
+
+.LshiftMask2:
+    .quad       0x0000000000000000
+.LshiftMask:
+    .quad       0x000000000000003F
+
+.Lvalue64:
+    .quad       0x0000000000000040
+
+.LvaluePosInfLong:
+    .quad       0x7FFFFFFFFFFFFFFF
+
+.LvalueNegInfLong:
+    .quad       0x8000000000000000
+
+.LvalueNanLong:
+    .quad       0x0000000000000000
+
+.LintMin:
+.long   0x80000000
+
+.LintMax:
+.long   0x7FFFFFFF
+#endif
+
 
 /*
  * This is a #include, not a %include, because we want the C pre-processor
diff --git a/vm/mterp/x86/shop2addr.S b/vm/mterp/x86/shop2addr.S
index 9e8bd56..c1c0e17 100644
--- a/vm/mterp/x86/shop2addr.S
+++ b/vm/mterp/x86/shop2addr.S
@@ -3,14 +3,13 @@
      * Generic 32-bit "shift/2addr" operation.
      */
     /* shift/2addr vA, vB */
-    movzx    rINST_HI,%ecx          # eax<- BA
+    movzx    rINSTbl,%ecx           # eax<- BA
     sarl     $$4,%ecx               # ecx<- B
-    GET_VREG(%ecx,%ecx)             # eax<- vBB
-    movzbl   rINST_HI,rINST_FULL    # rINST_FULL<- BA
-    andb     $$0xf,rINST_LO         # rINST_FULL<- A
-    GET_VREG(%eax,rINST_FULL)       # eax<- vAA
+    GET_VREG_R %ecx %ecx            # eax<- vBB
+    andb     $$0xf,rINSTbl          # rINST<- A
+    GET_VREG_R %eax rINST           # eax<- vAA
     $instr                          # ex: sarl %cl,%eax
-    SET_VREG($result,rINST_FULL)
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    FETCH_INST_OPCODE 1 %edx
+    SET_VREG $result rINST
+    ADVANCE_PC 1
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/stub.S b/vm/mterp/x86/stub.S
index c75645e..886bdf7 100644
--- a/vm/mterp/x86/stub.S
+++ b/vm/mterp/x86/stub.S
@@ -1,11 +1,8 @@
     /* (stub) */
-    GET_GLUE(%ecx)
-    SAVE_PC_TO_GLUE(%ecx)            # only need to export these two
-    SAVE_FP_TO_GLUE(%ecx)            # only need to export these two
+    SAVE_PC_FP_TO_GLUE %ecx          # leaves rGLUE in %ecx
     movl %ecx,OUT_ARG0(%esp)         # glue is first arg to function
     call      dvmMterp_${opcode}     # do the real work
-    GET_GLUE(%ecx)
-    LOAD_PC_FROM_GLUE(%ecx)          # retrieve updated values
-    LOAD_FP_FROM_GLUE(%ecx)          # retrieve updated values
-    FETCH_INST()
+    mov       rGLUE,%ecx
+    LOAD_PC_FP_FROM_GLUE             # retrieve updated values
+    FETCH_INST
     GOTO_NEXT
diff --git a/vm/mterp/x86/unop.S b/vm/mterp/x86/unop.S
index 7192d9a..faa41f4 100644
--- a/vm/mterp/x86/unop.S
+++ b/vm/mterp/x86/unop.S
@@ -4,14 +4,14 @@
      * specifies an instruction that performs "result = op eax".
      */
     /* unop vA, vB */
-    movzbl   rINST_HI,%ecx           # ecx<- A+
-    sarl     $$12,rINST_FULL         # rINST_FULL<- B
-    GET_VREG(%eax,rINST_FULL)        # eax<- vB
-    andb     $$0xf,%cl               # ecx<- A
-    FETCH_INST_WORD(1)
-    ADVANCE_PC(1)
+    movzbl   rINSTbl,%ecx           # ecx<- A+
+    sarl     $$4,rINST             # rINST<- B
+    GET_VREG_R %eax rINST           # eax<- vB
+    andb     $$0xf,%cl              # ecx<- A
+    FETCH_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
     $pre0
     $pre1
     $instr
-    SET_VREG(%eax,%ecx)
-    GOTO_NEXT
+    SET_VREG %eax %ecx
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/unopWide.S b/vm/mterp/x86/unopWide.S
index ad5b361..385b4ba 100644
--- a/vm/mterp/x86/unopWide.S
+++ b/vm/mterp/x86/unopWide.S
@@ -6,17 +6,16 @@
      * For: neg-long, not-long
      */
     /* unop vA, vB */
-    movzbl    rINST_HI,%ecx            # ecx<- BA
-    sarl      $$4,%ecx                 # ecx<- B
-    movzbl    rINST_HI,rINST_FULL      # ecx<- BA
-    andb      $$0xf,rINST_LO           # rINST_FULL<- A
-    GET_VREG_WORD(%eax,%ecx,0)         # eax<- v[B+0]
-    GET_VREG_WORD(%ecx,%ecx,1)         # ecx<- v[B+1]
+    movzbl    rINSTbl,%ecx            # ecx<- BA
+    sarl      $$4,%ecx                # ecx<- B
+    andb      $$0xf,rINSTbl           # rINST<- A
+    GET_VREG_WORD %eax %ecx 0         # eax<- v[B+0]
+    GET_VREG_WORD %ecx %ecx 1         # ecx<- v[B+1]
     $instr1   # ex: negl %eax
     $instr2   # ex: adcl $$0,%ecx
     $instr3   # ex: negl %ecx
-    SET_VREG_WORD(%eax,rINST_FULL,0)   # v[A+0] <- eax
-    SET_VREG_WORD(%ecx,rINST_FULL,1)   # v[A+1] <- ecx
-    GET_INST_WORD(1)
-    ADVANCE_PC(1)
-    GOTO_NEXT
+    GET_INST_OPCODE 1 %edx
+    ADVANCE_PC 1
+    SET_VREG_WORD %eax rINST 0        # v[A+0] <- eax
+    SET_VREG_WORD %ecx rINST 1        # v[A+1] <- ecx
+    GOTO_NEXT_R %edx
diff --git a/vm/mterp/x86/zcmp.S b/vm/mterp/x86/zcmp.S
index 221822d..ca6dee4 100644
--- a/vm/mterp/x86/zcmp.S
+++ b/vm/mterp/x86/zcmp.S
@@ -8,15 +8,14 @@
      * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
      */
     /* if-cmp vAA, +BBBB */
-    movzx    rINST_HI,%ecx             # ecx <- AA
-    cmpl     $$0,(rFP,%ecx,4)          # compare (vA, 0)
-    movswl   2(rPC),rINST_FULL         # fetch signed displacement
-    movl     $$2,%eax                  # assume branch not taken
+    cmpl     $$0,(rFP,rINST,4)     # compare (vA, 0)
+    movswl   2(rPC),rINST         # fetch signed displacement
+    movl     $$2,%eax             # assume branch not taken
     j${revcmp}   1f
-    testl    rINST_FULL,rINST_FULL
+    testl    rINST,rINST
     js       common_backwardBranch
-    movl     rINST_FULL,%eax
+    movl     rINST,%eax
 1:
-    FETCH_INST_INDEXED(%eax)
-    ADVANCE_PC_INDEXED(%eax)
+    FETCH_INST_INDEXED %eax
+    ADVANCE_PC_INDEXED %eax
     GOTO_NEXT