-/* src/vm/jit/sparc64/codegen.h - code generation macros and definitions for
- Sparc64
+/* src/vm/jit/sparc64/codegen.h - code generation macros and
+ definitions for SPARC64
- 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
+ Copyright (C) 1996-2005, 2006, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.h 4722 2006-04-03 15:36:00Z twisti $
-
*/
#ifndef _CODEGEN_H
#include "config.h"
#include "vm/types.h"
-#include "vm/jit/jit.h"
+#include "vm/jit/jit.hpp"
#include "md-abi.h" /* for INT_NATARG_CNT */
#include <assert.h>
+/* debug defines **************************************************************/
+#ifndef NDEBUG
+# define PASS13BIT(imm) ((((s4)(imm)&0x1fff)<<19)>>19)
+#else
+# define PASS13BIT(imm) imm
+#endif
+
+
/* from md-abi.c */
s4 nat_argintregs[INT_NATARG_CNT];
} while (0)
-/* stub defines ***************************************************************/
-
-#define COMPILERSTUB_CODESIZE 4 * 4
-
-
/* additional functions and macros to generate code ***************************/
slots++;
-/* M_INTMOVE:
- generates an integer-move from register rs to rd.
- if rs and rd are the same int-register, no code will be generated.
-*/
-
-#define M_INTMOVE(rs,rd) if (rs != rd) { M_MOV(rs, rd); }
-
-
-/* M_DBLMOVE:
- generates a double floating-point-move from register (pair) rs to rd.
- if rs and rd are the same double-register, no code will be generated
-*/
-
-#define M_DBLMOVE(rs, rd) if (rs != rd) { M_DMOV (rs, rd); }
-
-
-/* M_FLTMOVE:
- generates a double floating-point-move from pseudo register rs to rd.
- (ie. lower register of double rs pair to lower register of double rd pair)
- if rs and rd are the same double-register, no code will be generated
-*/
-#define M_FLTMOVE(rs, rd) if (rs != rd) { M_FMOV (rs, rd); }
-
-
-
#define M_COPY(s,d) emit_copy(jd, iptr, (s), (d))
#define ICONST(d,c) emit_iconst(cd, (d), (c))
#define LCONST(d,c) emit_lconst(cd, (d), (c))
*/
#define M_OP3(op,op3,rd,rs1,rs2,imm) \
do { \
+ assert(check_13bit_imm(rs2)); \
*((u4 *) cd->mcodeptr) = ((((s4) (op)) << 30) | ((rd) << 25) | ((op3) << 19) | ((rs1) << 14) | ((imm)<<13) | (imm?((rs2)&0x1fff):(rs2)) ); \
cd->mcodeptr += 4; \
} while (0)
} \
else { \
M_SETHI(sethi_part(~c), rd); \
- M_XOR_IMM(rd, setlo_part(c) | 0xffffffffffff1c00, rd); \
+ M_XOR_IMM(rd, PASS13BIT(setlo_part(c) | 0xffffffffffff1c00), rd); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,rd); \
- M_LDX_INTERN(rd,rd,get_lopart_disp(disp)); \
+ M_LDX_INTERN(rd,rd,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,rd); \
- M_ILD_INTERN(rd,rd,get_lopart_disp(disp)); \
+ M_ILD_INTERN(rd,rd,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,REG_ITMP3); \
- M_STX_INTERN(rd,REG_ITMP3,setlo_part(disp)); \
- assert(0); \
+ M_STX_INTERN(rd,REG_ITMP3,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,REG_ITMP3); \
- M_IST_INTERN(rd,REG_ITMP3,setlo_part(disp)); \
- assert(0); \
+ M_IST_INTERN(rd,REG_ITMP3,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
#define M_SAVE(rs1,rs2,rd) M_OP3(0x02,0x3c,rd,rs1,rs2,IMM)
+#define M_SAVE_REG(rs1,rs2,rd) M_OP3(0x02,0x3c,rd,rs1,rs2,REG)
#define M_RESTORE(rs1,rs2,rd) M_OP3(0x02,0x3d,rd,rs1,rs2,IMM)
} else { \
M_SETHI(hi&0x3ffff8,rd); \
M_AADD(rs,rd,rd); \
- M_DLD_INTERN(rd,rd,lo); \
+ M_DLD_INTERN(rd,rd,PASS13BIT(lo)); \
} \
} while (0)
/* Note for SETHI: sethi has a 22bit imm, only set upper 19 bits */
} else { \
M_SETHI(hi&0x3ffff8,rd); \
M_AADD(rs,rd,rd); \
- M_FLD_INTERN(rd,rd,lo); \
+ M_FLD_INTERN(rd,rd,PASS13BIT(lo)); \
} \
} while (0)
} else { \
M_SETHI(hi&0x3ffff8,REG_ITMP3); \
M_AADD(rs,REG_ITMP3,REG_ITMP3); \
- M_FST_INTERN(rd,REG_ITMP3,lo); \
+ M_FST_INTERN(rd,REG_ITMP3,PASS13BIT(lo)); \
} \
} while (0)
} else { \
M_SETHI(hi&0x3ffff8,REG_ITMP3); \
M_AADD(rs,REG_ITMP3,REG_ITMP3); \
- M_DST_INTERN(rd,REG_ITMP3,lo); \
+ M_DST_INTERN(rd,REG_ITMP3,PASS13BIT(lo)); \
} \
} while (0)
#define M_AADD_IMM(a,b,c) M_ADD_IMM(a,b,c)
#define M_ASUB_IMM(a,b,c) M_SUB_IMM(a,b,c)
#define M_ASLL_IMM(a,b,c) M_SLLX_IMM(a,b,c)
-
+
+#define M_ACMP(a,b) M_CMP(a,b)
+#define M_ICMP(a,b) M_CMP(a,b)
#endif /* _CODEGEN_H */