Merged revisions 7797-7917 via svnmerge from
[cacao.git] / src / vm / jit / s390 / codegen.h
index 8e4fa4ed3605296328856483fa20cb2e50a0b368..5d01e252eb97a281bc0ede0a10f0b610c239fbfb 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.h 7691 2007-04-12 12:45:10Z twisti $
+   $Id: codegen.h 7848 2007-05-01 21:40:26Z pm $
 
 */
 
 #include "vm/jit/jit.h"
 
 
-/* additional functions and macros to generate code ***************************/
-
-#define CALCOFFSETBYTES(var, reg, val) \
-    if ((s4) (val) < -128 || (s4) (val) > 127) (var) += 4; \
-    else if ((s4) (val) != 0) (var) += 1; \
-    else if ((reg) == RBP || (reg) == RSP || (reg) == R12 || (reg) == R13) (var) += 1;
-
-
-#define CALCIMMEDIATEBYTES(var, val) \
-    if ((s4) (val) < -128 || (s4) (val) > 127) (var) += 4; \
-    else (var) += 1;
-
-
-#define gen_nullptr_check_intern(objreg) \
-       do { \
-               M_TEST(objreg); \
-               M_BEQ(0); \
-               codegen_add_nullpointerexception_ref(cd); \
-       } while (0);
-
-#define gen_nullptr_check(objreg) \
-       if (checknull) { \
-               gen_nullptr_check_intern(objreg); \
-       }
-
-
-#define gen_bound_check \
-    if (checkbounds) { \
-        M_ILD(REG_ITMP3, s1, OFFSET(java_arrayheader, size));\
-        M_ICMP(REG_ITMP3, s2); \
-        M_BAE(0); \
-        codegen_add_arrayindexoutofboundsexception_ref(cd, s2); \
-    }
-
-
 /* MCODECHECK(icnt) */
 
 #define MCODECHECK(icnt) \
             codegen_increase(cd); \
     } while (0)
 
-
 #define ALIGNCODENOP \
     if ((s4) (((ptrint) cd->mcodeptr) & 7)) { \
         M_NOP; \
     }
 
-
-
-/* branch defines *************************************************************/
-
-#define BRANCH_NOPS \
-    do { \
-        M_NOP; \
-    } while (0)
-
-
 /* some patcher defines *******************************************************/
 
 #define PATCHER_CALL_SIZE    4          /* size in bytes of a patcher call    */
 #define PATCHER_NOPS \
     do { \
         M_NOP; \
-               M_NOP; \ 
+               M_NOP; \
                M_NOP; \
     } while (0)
 
 #define PATCHER_NOPS_SKIP   12 
 
+/* branch defines ************************************************************/
 
- /* stub defines **************************************************************/
+#define BRANCH_NOPS M_NOP /* Size of at least M_BRC */
 
-#define COMPILERSTUB_CODESIZE    (SZ_AHI + SZ_L + SZ_L + SZ_BCR)
+/* stub defines **************************************************************/
 
+#define COMPILERSTUB_CODESIZE    (SZ_AHI + SZ_L + SZ_L + SZ_BCR)
 
 /* *** BIG TODO ***
  * Make all this inline functions !!!!!!!!!!
 #define SZ_RX 4
 
 #define N_RI(op1, op2, r1, i2) \
-       _CODE4( (_OP(op1) << 24) | (_R(r1) << 20) | (_OP4(op2) << 16) | (u2)_I16(i2) )
+       _CODE4( (_OP(op1) << 24) | (_R(r1) << 20) | (_OP4(op2) << 16) | (u2)_SI16(i2) )
+
+#define N_RI2(op1, op2, r1, i2) \
+       _CODE4( (_OP(op1) << 24) | (_R(r1) << 20) | (_OP4(op2) << 16) | (u2)_UI16(i2) )
 
 #define SZ_RI 4
 
 
 /* Misc */
 
-#define N_LONG_0() _CODE4(0)
+/* Trap instruction.
+ * If most significant bits of first opcode byte are 00, then
+ * format is RR (1 byte opcode) or E (2 bytes opcode). 
+ * There seems to be no opcode 0x02 or 0x02**, so we'll define
+ * our trap instruction as:
+ * +--------+--------+
+ * |  0x02  |  data  |
+ * +--------+--------+
+ * 0                 15
+ */
+#define N_ILL(data) _CODE2(0x0200 | _UBITS(data, 8))
+#define SZ_ILL 2
+
+#define N_LONG(l) _CODE4(l)
+#define SZ_LONG 4
 
 /* Chapter 7. General instructions */
 
 #      define SZ_NR SZ_RR
 #define N_N(r1, d2, x2, b2) N_RX(0x54, r1, d2, x2, b2)
 #define N_NI(d1, b1, i2) N_SI(0x94, d1, b1, i2)
-#define N_NC(d1, l, b1, d2, b2) N_NC(0xD4, l, b1, d1, b2, d2)
+#define N_NC(d1, l, b1, d2, b2) N_SS(0xD4, (l - 1), b1, d1, b2, d2)
 #define N_BALR(r1, r2) N_RR(0x05, r1, _OR(r2))
 #define N_BAL(r1, d2, x2, b2) N_RX(0x45, r1, d2, x2, b2)
 #define N_BASR(r1, r2) N_RR(0x0D, r1, _OR(r2))
+#      define SZ_BASR SZ_RR
 #define N_BAS(r1, d2, x2, b2) N_RX(0x4D, r1, d2, x2, b2)
 #define N_BASSM(r1, r2) N_RR(0x0C, r1, _OR(r2))
 #define N_BSM(r1, r2) N_RR(0x0B, r1, _OR(r2))
 #define N_CLR(r1, r2) N_RR(0x15, r1, r2)
 #define N_CL(r1, d2, x2, b2) N_RX(0x55, r1, d2, x2, b2)
 #define N_CLI(d1, b1, i2) N_SI(0x95, d1, b1, i2)
-#define N_CLC(d1, l, b1, d2, b2) N_SS(0xD5, d1, l, b1, d2, b2)
+#define N_CLC(d1, l, b1, d2, b2) N_SS(0xD5, d1, (l - 1), b1, d2, b2)
 #define N_CLM(r1, m3, d2, b2) N_RS(0xBD, r1, m3, d2, b2)
 #define N_CLCL(r1, r2) N_RR(0x0F, r1, r2)
 #define N_CLCLE(r1, r3, d2, b2) N_RS(0xA9, r1, r3, d2, b2)
 #define N_XR(r1, r2) N_RR(0x17, r1, r2)
 #define N_X(r1, d2, x2, b2) N_RX(0x57, r1, d2, x2, b2)
 #define N_XI(d1, b1, i2) N_SI(0x97, d1, b1, i2)
-#define N_XC(d1, l, b1, d2, b2) N_SS(0xD7, d1, l, b1, d2, b2)
+#define N_XC(d1, l, b1, d2, b2) N_SS(0xD7, d1, (l - 1), b1, d2, b2)
 #define N_EX(r1, d2, x2, b2) N_RX(0x44, r1, d2, x2, b2)
 #define N_EAR(r1, r2) N_RRE(0xB24F, r1, r2)
 #define N_IC(r1, d2, x2, b2) N_RX(0x43, r1, d2, x2, b2)
 #define N_LPR(r1, r2) N_RR(0x10, r1, r2)
 #define N_MC(d1, b1, i2) N_SI(0xAF, d1, b1, i2)
 #define N_MVI(d1, b1, i2) N_SI(0x92, d1, b1, i2)
-#define N_MVC(d1, l, b1, d2, b2) N_SS(0xD2, d1, l, b1, d2, b2)
-#define N_MVCIN(d1, l, b1, d2, b2) N_SS(0xEB, d1, l, b1, d2, b2)
+#define N_MVC(d1, l, b1, d2, b2) N_SS(0xD2, d1, (l - 1), b1, d2, b2)
+#define N_MVCIN(d1, l, b1, d2, b2) N_SS(0xEB, d1, (l - 1), b1, d2, b2)
 #define N_MVCL(r1, r2) N_RR(0x0E, r1, r2)
 #define N_MVCLE(r1, r3, d2, b2)  N_RS(0xAB, r1, r3, d2, b2)
-#define N_MVN(d1, l, b1, d2, b2) N_SS(0xD1, d1, l, b1, d2, b2)
+#define N_MVN(d1, l, b1, d2, b2) N_SS(0xD1, d1, (l - 1), b1, d2, b2)
 #define N_MVPG(r1, r2) N_RRE(0xB254, r1, r2)
 #define N_MVST(r1, r2) N_RRE(0xB255, r1, r2)
-#define N_MVO(d1, l1, b1, d2, l2, b2) N_SS2(0xF1, d1, l1, b1, d2, l2, b2)
-#define N_MVZ(d1, l, b1, d2, b2) N_SS(0xD3, d1, l, b1, d2, b2)
+#define N_MVO(d1, l1, b1, d2, l2, b2) N_SS2(0xF1, d1, (l1 - 1), b1, d2, (l2 - 1), b2)
+#define N_MVZ(d1, l, b1, d2, b2) N_SS(0xD3, d1, (l - 1), b1, d2, b2)
 #define N_MR(r1, r2) N_RR(0x1C, r1, r2)
 #define N_M(r1, d2, x2, b2) N_RX(0x5C, r1, d2, x2, b2)
 #define N_MH(r1, d2, x2, b2) N_RX(0x4C, r1, d2, x2, b2)
 #define N_OR(r1, r2) N_RR(0x16, r1, r2)
 #define N_O(r1, d2, x2, b2) N_RX(0x56, r1, d2, x2, b2)
 #define N_OI(d1, b1, i2) N_SI(0x96, d1, b1, i2)
-#define N_OC(d1, l, b1, d2, b2) N_SS(0xD6, d1, l, b1, d2, b2)
-#define N_PACK(d1, l1, b1, d2, l2, b2) N_SS2(0xF2, d1, l1, b1, d2, l2, b2)
+#define N_OC(d1, l, b1, d2, b2) N_SS(0xD6, d1, (l - 1), b1, d2, b2)
+#define N_PACK(d1, l1, b1, d2, l2, b2) N_SS2(0xF2, d1, (l1 - 1), b1, d2, (l2 - 1), b2)
 #define N_PLO(r1, d2, b2, r3, d4, b4) N_SS2(0xEE, d2, r1, b2, d4, r3, b4)
 #define N_SRST(r1, r2) N_RRE(0xB25E, r1, r2)
 #define N_SAR(r1, r2) N_RRE(0xB24E, r1, r2)
 #define N_SVC(i) N_RR2(0x0A, i)
 #define N_TS(d2, b2) N_S2(0x93, d2, b2)
 #define N_TM(d1, b1, i2) N_SI(0x91, d1, b1, i2)
-#define N_TMH(r1, i2) N_RI(0xA7, 0x00, r1, i2)
-#define N_TML(r1, i2) N_RI(0xA7, 0x01, r1, i2)
-#define N_TR(d1, l, b1, d2, b2) N_SS(0xDC, d1, l, b1, d2, b2)
-#define N_TRT(d1, l, b1, d2, b2) N_SS(0xDD, d1, l, b1, d2, b2)
+#define N_TMH(r1, i2) N_RI2(0xA7, 0x00, r1, i2)
+#define N_TML(r1, i2) N_RI2(0xA7, 0x01, r1, i2)
+#define N_TR(d1, l, b1, d2, b2) N_SS(0xDC, d1, (l - 1), b1, d2, b2)
+#define N_TRT(d1, l, b1, d2, b2) N_SS(0xDD, d1, (l - 1), b1, d2, b2)
 #define N_TRE(r1, r2) N_RRE(0xB2A5, r1, r2)
-#define N_UNPK(d1, l1, b1, d2, l2, b2) N_SS2(0xF3, d1, l1, b1, d2, l2, b2)
+#define N_UNPK(d1, l1, b1, d2, l2, b2) N_SS2(0xF3, d1, (l1 - 1), b1, d2, (l2 - 2), b2)
 #define N_UPT() N_E(0x0102)
 
 /* Chapter 9. Floating point instructions */
 /* Alpha like instructions */
 
 #define M_CALL(r2) N_BASR(R14, r2)
+#define M_ILL(data) N_ILL(data)
+#define M_ILL2(data1, data2) N_ILL((_UBITS(data1, 4) << 4) | _UBITS(data2, 4))
+#define M_LONG(l) N_LONG(l)
 
 #define M_ILD(r, b, d) \
        do { \
 #define M_CVTDI(src, dst) N_CFDBR(dst, 5, src)
 #define M_IADD(a, dest) N_AR(dest, a)
 #define M_ISUB(a, dest) N_SR(dest, a)
+#define M_ASUB(a, dest) N_SR(dest, a)
 #define M_IAND(a, dest) N_NR(dest, a)
 #define M_IOR(a, dest) N_OR(dest, a)
 #define M_IXOR(a, dest) N_XR(dest, a)
         } \
     } while (0)
 
+#define M_ISUB_IMM32(imm, tmpreg, reg) \
+       do { \
+               if (N_VALID_IMM(imm)) { \
+                       M_ISUB_IMM(imm, reg); \
+               } else { \
+                       ICONST(tmpreg, imm); \
+                       M_ISUB(tmpreg, reg); \
+               } \
+       } while (0)
+
+#define M_ASUB_IMM32(imm, tmpreg, reg) M_ISUB_IMM32(imm, tmpreg, reg)
+
 /* ----------------------------------------------- */
 
 #define _DEPR(x) \
 #define M_JMP_IMM(a) _DEPR( M_JMP_IMM(a) )
 #define M_CALL_IMM(a) _DEPR( M_CALL_IMM(a) )
 
-
-
-
 #define M_FLD32(a,b,disp) _DEPR( M_FLD32(a,b,disp) )
 #define M_DLD32(a,b,disp) _DEPR( M_DLD32(a,b,disp) )
 
-
 #define M_FST32(a,b,disp) _DEPR( M_FST32(a,b,disp) )
 #define M_DST32(a,b,disp) _DEPR( M_DST32(a,b,disp) )
 
 #define PROFILE_CYCLE_STOP 
 #define __PROFILE_CYCLE_STOP _DEPR( __PROFILE_CYCLE_STOP )
 
-
-/* function gen_resolvebranch **************************************************
-
-    backpatches a branch instruction
-
-    parameters: ip ... pointer to instruction after branch (void*)
-                so ... offset of instruction after branch  (s8)
-                to ... offset of branch target             (s8)
-
-*******************************************************************************/
-
-#define gen_resolvebranch(ip,so,to) \
-    *((s4*) ((ip) - 4)) = (s4) ((to) - (so));
-
 #endif /* _CODEGEN_H */
 
 
 s4 codegen_reg_of_dst_notzero(jitdata *jd, instruction *iptr, s4 tempregnum);
 
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where