From: ajordan Date: Wed, 15 Aug 2007 23:32:57 +0000 (+0000) Subject: * src/vm/jit/sparc64/codegen.h: Added M_SAVE_REG and 13-bit overflow checking. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=f059886e1ba433e4020f311898535407a7978f71;p=cacao.git * src/vm/jit/sparc64/codegen.h: Added M_SAVE_REG and 13-bit overflow checking. * src/vm/jit/sparc64/codegen.c (codegen_emit): Fixed stack increasing for large stackframe sizes. (check_13bit_imm): Added for overflow checking. --- diff --git a/src/vm/jit/sparc64/codegen.c b/src/vm/jit/sparc64/codegen.c index adf801896..6d096d6aa 100644 --- a/src/vm/jit/sparc64/codegen.c +++ b/src/vm/jit/sparc64/codegen.c @@ -98,6 +98,18 @@ s4 get_lopart_disp(disp) 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 **************************************************************** @@ -145,6 +157,7 @@ bool codegen_emit(jitdata *jd) { 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 */ @@ -172,7 +185,7 @@ bool codegen_emit(jitdata *jd) /* 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 @@ -204,9 +217,15 @@ bool codegen_emit(jitdata *jd) /* 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 diff --git a/src/vm/jit/sparc64/codegen.h b/src/vm/jit/sparc64/codegen.h index 9acf13b8b..6686a772b 100644 --- a/src/vm/jit/sparc64/codegen.h +++ b/src/vm/jit/sparc64/codegen.h @@ -39,6 +39,14 @@ #include +/* debug defines **************************************************************/ +#ifndef NDEBUG +# define PASS13BIT(imm) (imm) & 0x1fff +#else +# define PASS13BIT(imm) +#endif + + /* from md-abi.c */ s4 nat_argintregs[INT_NATARG_CNT]; @@ -142,6 +150,7 @@ 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) @@ -415,7 +424,7 @@ s4 get_lopart_disp(s4 disp); } \ 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) @@ -561,6 +570,7 @@ s4 get_lopart_disp(s4 disp); #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) @@ -625,7 +635,7 @@ s4 get_lopart_disp(s4 disp); } 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 */ @@ -640,7 +650,7 @@ s4 get_lopart_disp(s4 disp); } 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) @@ -655,7 +665,7 @@ s4 get_lopart_disp(s4 disp); } 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) @@ -670,7 +680,7 @@ s4 get_lopart_disp(s4 disp); } 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)