Authors: Andreas Krall
Christian Thalinger
- Changes:
-
- $Id: codegen.h 5109 2006-07-11 19:17:23Z twisti $
+ $Id: codegen.h 6211 2006-12-16 22:53:24Z edwin $
*/
#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)
-#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_NOPS \
+ do { \
+ 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)
+
+
/* macros to create code ******************************************************/
#define M_ILD(a,b,disp) emit_mov_membase_reg(cd, (b), (disp), (a))
#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 */