return lodisp;
}
+
+#ifndef NDEBUG
+bool check_13bit_imm(s8 imm)
+{
+ s4 check = imm & ~0x1fff;
+ if (check == 0) return true; /* pos imm. */
+ if (check + 0x1fff == -1) return true; /* neg imm. */
+
+ printf("immediate out-of-bounds: %d\n", imm);
+ return false;
+}
+#endif
/* codegen_emit ****************************************************************
{
s4 i, p, t, l;
s4 savedregs_num;
+ s4 framesize_disp;
#if 0 /* no leaf optimization yet */
savedregs_num = (jd->isleafmethod) ? 0 : 1; /* space to save the RA */
/* create method header */
(void) dseg_add_unique_address(cd, code); /* CodeinfoPointer */
- (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
+ framesize_disp = dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize */
#if defined(ENABLE_THREADS)
/* IsSync contains the offset relative to the stack pointer for the
/* save register window and create stack frame (if necessary) */
- if (cd->stackframesize)
- M_SAVE(REG_SP, -cd->stackframesize * 8, REG_SP);
-
+ if (cd->stackframesize) {
+ if (cd->stackframesize <= 4095)
+ M_SAVE(REG_SP, -cd->stackframesize * 8, REG_SP);
+ else {
+ M_ILD_INTERN(REG_ITMP3, REG_PV_CALLER, framesize_disp);
+ M_SUB(REG_ZERO, REG_ITMP3, REG_ITMP3);
+ M_SAVE_REG(REG_SP, REG_ITMP3, REG_SP);
+ }
+ }
/* save callee saved float registers (none right now) */
#if 0
#include <assert.h>
+/* debug defines **************************************************************/
+#ifndef NDEBUG
+# define PASS13BIT(imm) (imm) & 0x1fff
+#else
+# define PASS13BIT(imm)
+#endif
+
+
/* from md-abi.c */
s4 nat_argintregs[INT_NATARG_CNT];
*/
#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)
#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)