asm.emitPOP_Reg(T0); asm.emitPOP_Reg(S0); asm.emitPOP_Reg(T1); asm.emitSUB_Reg_Reg(T1, T0);  asm.emitPOP_Reg(T0);  asm.emitSBB_Reg_Reg(T0, S0);   asm.emitMOV_Reg_Imm(S0, -1); VM_ForwardReference fr1 = asm.forwardJcc(VM_Assembler.LT); asm.emitMOV_Reg_Imm(S0, 0); asm.emitOR_Reg_Reg(T0, T1); VM_ForwardReference fr2 = asm.forwardJcc(VM_Assembler.EQ); asm.emitMOV_Reg_Imm(S0, 1); fr1.resolve(asm); fr2.resolve(asm); asm.emitPUSH_Reg(S0);
asm.emitPOP_Reg(T0); asm.emitPOP_Reg(S0); asm.emitPOP_Reg(T1); asm.emitSUB_Reg_Reg(T1, T0); asm.emitPOP_Reg(T0);  asm.emitSBB_Reg_Reg(T0, S0); asm.emitSET_Cond_Reg_Byte(VM_Assembler.LT, S0); asm.emitOR_Reg_Reg(T0, T1); asm.emitSET_Cond_Reg_Byte(VM_Assembler.NE, T0); asm.emitNEG_Reg(S0); asm.emitOR_Reg_Reg(S0, T0); asm.emitMOVSX_Reg_Reg_Byte(S0, S0); asm.emitPUSH_Reg(S0);
  protected final void emit_lcmp() {    asm.emitPOP_Reg(T0);        // the low half of value2    asm.emitPOP_Reg(S0);        // the high half of value2    asm.emitPOP_Reg(T1);        // the low half of value1    asm.emitSUB_Reg_Reg(T1, T0);        // subtract the low half of value2 from                                // low half of value1, result into T1    asm.emitPOP_Reg(T0);        // the high half of value 1    //  pop does not alter the carry register    asm.emitSBB_Reg_Reg(T0, S0);        // subtract the high half of value2 plus                                // borrow from the high half of value 1,                                // result in T0    asm.emitMOV_Reg_Imm(S0, -1);        // load -1 into S0    VM_ForwardReference fr1 = asm.forwardJcc(VM_Assembler.LT); // result negative --> branch to end    asm.emitMOV_Reg_Imm(S0, 0);        // load 0 into S0    asm.emitOR_Reg_Reg(T0, T1);        // result 0     VM_ForwardReference fr2 = asm.forwardJcc(VM_Assembler.EQ); // result 0 --> branch to end    asm.emitMOV_Reg_Imm(S0, 1);        // load 1 into S0    fr1.resolve(asm);    fr2.resolve(asm);    asm.emitPUSH_Reg(S0);        // push result on stack  }