* Removed all Id tags.
[cacao.git] / src / vm / jit / i386 / codegen.h
index 986f21dab8d1461aba8d6c8a8e7d86a274569d41..aa635ed5673c119c6d1a72d908db4758e1e284d1 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/i386/codegen.h - code generation macros and definitions for i386
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Andreas Krall
-            Christian Thalinger
-
-   Changes:
-
-   $Id: codegen.h 5234 2006-08-14 17:50:12Z christian $
-
 */
 
 
@@ -40,6 +31,8 @@
 #include "config.h"
 #include "vm/types.h"
 
+#include "vm/jit/i386/emit.h"
+
 #include "vm/jit/jit.h"
 
 
 # define LSRA_USES_REG_RES
 #endif
 
-/* some defines ***************************************************************/
-
-#define PATCHER_CALL_SIZE    5          /* size in bytes of a patcher call    */
-
 
 /* additional functions and macros to generate code ***************************/
 
     } while (0)
 
 
-/* gen_nullptr_check(objreg) */
-
-#define gen_nullptr_check(objreg) \
-    if (checknull) { \
-        M_TEST(objreg); \
-        M_BEQ(0); \
-           codegen_add_nullpointerexception_ref(cd); \
-    }
-
-#define gen_bound_check \
-    if (checkbounds) { \
-        M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size)); \
-        M_CMP(REG_ITMP3, s2); \
-        M_BAE(0); \
-        codegen_add_arrayindexoutofboundsexception_ref(cd, s2); \
-    }
-
-
 /* MCODECHECK(icnt) */
 
 #define MCODECHECK(icnt) \
     if a and b are the same float-register, no code will be generated
 */
 
-#define M_FLTMOVE(reg,dreg) \
-    do { \
-        log_text("M_FLTMOVE"); \
-        assert(0); \
+#define M_FLTMOVE(reg,dreg)                                          \
+    do {                                                             \
+        if ((reg) != (dreg)) {                                       \
+            log_text("M_FLTMOVE");                                   \
+            assert(0);                                               \
+        }                                                            \
     } while (0)
 
 
-#if defined(ENABLE_SSA)
-#define M_COPY(from,to)                                                   \
-        { \
-        if ((ls==NULL) || (to->varkind != TEMPVAR) || \
-                (ls->lifetime[-to->varnum-1].type != -1)) \
-                { _M_COPY(from,to);     } }
-#else
-#define M_COPY(from,to) _M_COPY(from,to);
-#endif
-
-#define _M_COPY(s,d)                     emit_copy(jd, iptr, (s), (d))
-
 #define ICONST(d,c) \
     do { \
         if ((c) == 0) \
     } while (0)
 
 
+/* branch defines *************************************************************/
+
+#define BRANCH_UNCONDITIONAL_SIZE    5  /* size in bytes of a branch          */
+#define BRANCH_CONDITIONAL_SIZE      6  /* size in bytes of a branch          */
+
+#define BRANCH_NOPS \
+    do { \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+    } while (0)
+
+
+/* patcher defines ************************************************************/
+
+#define PATCHER_CALL_SIZE    5          /* size in bytes of a patcher call    */
+
+#define PATCHER_NOPS \
+    do { \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+        M_NOP; \
+    } while (0)
+
+
+/* stub defines ***************************************************************/
+
+#define COMPILERSTUB_CODESIZE    12
+
+
 /* macros to create code ******************************************************/
 
 #define M_ILD(a,b,disp)         emit_mov_membase_reg(cd, (b), (disp), (a))
 #define M_ALD(a,b,disp)         M_ILD(a,b,disp)
 #define M_ALD32(a,b,disp)       M_ILD32(a,b,disp)
 
+#define M_ALD_MEM(a,disp)       emit_mov_mem_reg(cd, (disp), (a))
+
+#define M_ALD_MEM_GET_OPC(p)    (*(p))
+#define M_ALD_MEM_GET_MOD(p)    (((*(p + 1)) >> 6) & 0x03)
+#define M_ALD_MEM_GET_REG(p)    (((*(p + 1)) >> 3) & 0x07)
+#define M_ALD_MEM_GET_RM(p)     (((*(p + 1))     ) & 0x07)
+#define M_ALD_MEM_GET_DISP(p)   (*((u4 *) (p + 2)))
+
 #define M_LLD(a,b,disp) \
     do { \
         M_ILD(GET_LOW_REG(a),b,disp); \
 
 #define M_IADD_IMM_MEMBASE(a,b,c) emit_alu_imm_membase(cd, ALU_ADD, (a), (b), (c))
 
+#define M_ISUB_IMM_MEMABS(a,b)  emit_alu_imm_memabs(cd, ALU_SUB, (a), (b))
+
 #define M_IADDC(a,b)            emit_alu_reg_reg(cd, ALU_ADC, (a), (b))
 #define M_ISUBB(a,b)            emit_alu_reg_reg(cd, ALU_SBB, (a), (b))
 
 #define M_BAE(a)                emit_jcc(cd, CC_AE, (a))
 #define M_BA(a)                 emit_jcc(cd, CC_A, (a))
 #define M_BNS(a)                emit_jcc(cd, CC_NS, (a))
+#define M_BS(a)                 emit_jcc(cd, CC_S, (a))
 
 #define M_JMP(a)                emit_jmp_reg(cd, (a))
 #define M_JMP_IMM(a)            emit_jmp_imm(cd, (a))
 #define M_FST(a,b,disp)         emit_fstps_membase(cd, (b), (disp))
 #define M_DST(a,b,disp)         emit_fstpl_membase(cd, (b), (disp))
 
-
-/* function gen_resolvebranch **************************************************
-
-    backpatches a branch instruction
-
-    parameters: ip ... pointer to instruction after branch (void*)
-                so ... offset of instruction after branch  (s4)
-                to ... offset of branch target             (s4)
-
-*******************************************************************************/
-
-#define gen_resolvebranch(ip,so,to) \
-    *((void **) ((ip) - 4)) = (void **) ((to) - (so));
-
+#define M_FSTNP(a,b,disp)       emit_fsts_membase(cd, (b), (disp))
+#define M_DSTNP(a,b,disp)       emit_fstl_membase(cd, (b), (disp))
 
 #endif /* _CODEGEN_H */