Stefan Ring
Changes: Christian Thalinger
+ Christian Ullrich
- $Id: codegen.h 2693 2005-06-14 18:34:47Z twisti $
+ $Id: codegen.h 2920 2005-07-06 21:23:33Z twisti $
*/
/* additional functions and macros to generate code ***************************/
+
#if defined(STATISTICS)
#define COUNT_SPILLS count_spills++
#else
#define M_INTMOVE(a,b) if ((a) != (b)) { M_MOV(a, b); }
#define M_TINTMOVE(t,a,b) \
- if ((t) == TYPE_LNG) { \
- if ((a) <= (b)) \
- M_INTMOVE(rd->secondregs[(a)], rd->secondregs[(b)]); \
- M_INTMOVE((a), (b)); \
+ if ((t) == TYPE_LNG) { \
+ if ((a) <= (b)) \
+ M_INTMOVE(GET_LOW_REG((a)), GET_LOW_REG((b))); \
+ M_INTMOVE(GET_HIGH_REG((a)), GET_HIGH_REG((b))); \
if ((a) > (b)) \
- M_INTMOVE(rd->secondregs[(a)], rd->secondregs[(b)]); \
- } else { \
- M_INTMOVE((a), (b)); \
+ M_INTMOVE(GET_LOW_REG((a)), GET_LOW_REG((b))); \
+ } else { \
+ M_INTMOVE((a), (b)); \
}
number allready given to v)
*/
-#define var_to_reg_int0(regnr,v,tempnr,a,b) { \
- if ((v)->flags & INMEMORY) { \
- COUNT_SPILLS; \
- if ((a)) M_ILD((tempnr), REG_SP, 4 * (v)->regoff); \
- regnr = tempnr; \
- if ((b) && IS_2_WORD_TYPE((v)->type)) \
- M_ILD((a) ? rd->secondregs[(tempnr)] : (tempnr), REG_SP, 4 * (v)->regoff + 4); \
- } else \
- regnr = (!(a) && (b)) ? rd->secondregs[(v)->regoff] : (v)->regoff; \
-}
-#define var_to_reg_int(regnr,v,tempnr) var_to_reg_int0(regnr,v,tempnr,1,1)
-
-
-#define var_to_reg_flt(regnr,v,tempnr) { \
- if ((v)->flags & INMEMORY) { \
- COUNT_SPILLS; \
- if ((v)->type==TYPE_DBL) \
- M_DLD(tempnr,REG_SP,4*(v)->regoff); \
- else \
- M_FLD(tempnr,REG_SP,4*(v)->regoff); \
- regnr=tempnr; \
- } else regnr=(v)->regoff; \
-}
+#define var_to_reg_int(regnr,v,tempnr) \
+ do { \
+ if ((v)->flags & INMEMORY) { \
+ COUNT_SPILLS; \
+ if (IS_2_WORD_TYPE((v)->type)) { \
+ M_ILD(GET_HIGH_REG((tempnr)), REG_SP, (v)->regoff * 4); \
+ M_ILD(GET_LOW_REG((tempnr)), REG_SP, (v)->regoff * 4 + 4); \
+ } else \
+ M_ILD((tempnr), REG_SP, (v)->regoff * 4); \
+ regnr = tempnr; \
+ } else { \
+ regnr = (v)->regoff; \
+ } \
+ } while(0)
+
+
+/* fetch only the low part of v, regnr hast to be a single register */
+
+#define var_to_reg_int_low(regnr,v,tempnr) \
+ do { \
+ if ((v)->flags & INMEMORY) { \
+ COUNT_SPILLS; \
+ M_ILD((tempnr), REG_SP, (v)->regoff * 4 + 4); \
+ regnr = tempnr; \
+ } else { \
+ regnr = GET_LOW_REG((v)->regoff); \
+ } \
+ } while(0)
+
+
+/* fetch only the high part of v, regnr hast to be a single register */
+
+#define var_to_reg_int_high(regnr,v,tempnr) \
+ do { \
+ if ((v)->flags & INMEMORY) { \
+ COUNT_SPILLS; \
+ M_ILD((tempnr), REG_SP, (v)->regoff * 4); \
+ regnr = tempnr; \
+ } else { \
+ regnr = GET_HIGH_REG((v)->regoff); \
+ } \
+ } while(0)
+
+
+
+#define var_to_reg_flt(regnr,v,tempnr) \
+ do { \
+ if ((v)->flags & INMEMORY) { \
+ COUNT_SPILLS; \
+ if ((v)->type == TYPE_DBL) \
+ M_DLD(tempnr, REG_SP, (v)->regoff * 4); \
+ else \
+ M_FLD(tempnr, REG_SP, (v)->regoff * 4); \
+ regnr = tempnr; \
+ } else { \
+ regnr = (v)->regoff; \
+ } \
+ } while (0)
/* store_reg_to_var_xxx:
tempregnum ... Number of the temporary registers as returned by
reg_of_var.
*/
-
#define store_reg_to_var_int0(sptr, tempregnum, a, b) { \
if ((sptr)->flags & INMEMORY) { \
COUNT_SPILLS; \
- if (a) M_IST(tempregnum, REG_SP, 4 * (sptr)->regoff); \
+ if (a) M_IST(GET_HIGH_REG((tempregnum)), REG_SP, 4 * (sptr)->regoff); \
if ((b) && IS_2_WORD_TYPE((sptr)->type)) \
- M_IST(rd->secondregs[tempregnum], REG_SP, 4 * (sptr)->regoff + 4); \
+ M_IST(GET_LOW_REG((tempregnum)), REG_SP, 4 * (sptr)->regoff + 4); \
} \
}
}
#define LCONST(reg,c) \
- ICONST((reg), (s4) ((s8) (c) >> 32)); \
- ICONST(rd->secondregs[(reg)], (s4) ((s8) (c)));
+ ICONST(GET_HIGH_REG((reg)), (s4) ((s8) (c) >> 32)); \
+ ICONST(GET_LOW_REG((reg)), (s4) ((s8) (c)));
#define M_COPY(from,to) \
#define M_BLDU(a,b,c) M_OP2_IMM(34, a, b, c)
#define M_SLDU(a,b,c) M_OP2_IMM(40, a, b, c)
#define M_ILD(a,b,c) M_OP2_IMM(32, a, b, c)
-#define M_ALD(a,b,c) M_OP2_IMM(32, a, b, c)
+#define M_ALD(a,b,c) M_ILD(a, b, c)
#define M_BSEXT(a,b) M_OP3(31, 954, 0, 0, a, b, 0)
#define M_SSEXT(a,b) M_OP3(31, 922, 0, 0, a, b, 0)