Merged with tip.
[cacao.git] / src / vm / jit / i386 / emit.c
index 1a0be3daee41e4beae3caf5a0241a95fe81a10dc..7c61037afcaf40aa14b4b3befe25e6f81290c25b 100644 (file)
@@ -517,6 +517,20 @@ void emit_trap_compiler(codegendata *cd)
        M_ALD_MEM(REG_METHODPTR, TRAP_COMPILER);
 }
 
+/* emit_trap_countdown *********************************************************
+
+   Emit a countdown trap.
+
+   counter....absolute address of the counter variable
+
+*******************************************************************************/
+
+void emit_trap_countdown(codegendata *cd, s4 *counter)
+{
+       M_ISUB_IMM_MEMABS(1, (s4) counter);
+       M_BNS(6);
+       M_ALD_MEM(REG_METHODPTR, TRAP_COUNTDOWN);
+}
 
 /* emit_trap *******************************************************************
 
@@ -913,6 +927,15 @@ void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp)
 }
 
 
+void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+       assert(a < 4);                     /* Can only operate on al, bl, cl, dl. */
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0xbe;
+       emit_reg((b),(a));
+}
+
+
 void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
 {
        COUNT(count_mov_mem_reg);
@@ -939,6 +962,15 @@ void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg,
 }
 
 
+void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+       assert(a < 4);                     /* Can only operate on al, bl, cl, dl. */
+       *(cd->mcodeptr++) = 0x0f;
+       *(cd->mcodeptr++) = 0xb6;
+       emit_reg((b),(a));
+}
+
+
 void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b)
 {
        *(cd->mcodeptr++) = 0x0f;
@@ -1844,6 +1876,14 @@ void emit_fincstp(codegendata *cd)
        *(cd->mcodeptr++) = 0xf7;
 }
 
+#if defined(ENABLE_ESCAPE_CHECK)
+void emit_escape_check(codegendata *cd, s4 reg) {
+       M_PUSH(reg);
+       M_MOV_IMM(asm_escape_check, REG_ITMP3);
+       M_CALL(REG_ITMP3);
+       M_IADD_IMM(4, REG_SP);
+}
+#endif
 
 /*
  * These are local overrides for various environment variables in Emacs.