* src/vm/jit/sparc64/codegen.h: Added M_SAVE_REG and 13-bit overflow checking.
authorajordan <none@none>
Wed, 15 Aug 2007 23:32:57 +0000 (23:32 +0000)
committerajordan <none@none>
Wed, 15 Aug 2007 23:32:57 +0000 (23:32 +0000)
* src/vm/jit/sparc64/codegen.c (codegen_emit): Fixed stack increasing for
large stackframe sizes.
(check_13bit_imm): Added for overflow checking.

src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/codegen.h

index adf80189667b6b32e1521bc2f20c7e208eb6fd04..6d096d6aa4102e3019f2be9de2e483305d893568 100644 (file)
@@ -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
index 9acf13b8b6a11bac0b70deed87a3630f297ab1f6..6686a772b726c5c74793860e769ef8f9e021a406 100644 (file)
 
 #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];
 
@@ -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)