*/
#include <limits.h>
+#include <stdint.h>
static long framesize;
static long savedf[32];
static long savedi[32];
static int savedtop;
-static unsigned long lfs_set;
+static uint32_t lfs_set;
/* Calculate the register score of a local variable. */
int
savedf[regnum] = offset;
framesize += 8;
if (size == 4)
- lfs_set |= (1U << regnum);
+ lfs_set |= ((uint32_t)1<<regnum);
break;
case 'r':
savedi[regnum] = offset;
for (reg = 31; reg >= 0; reg--)
if (savedf[reg] >= 0)
fprintf(codefile, "%s f%d, %ld(fp)\n",
- (lfs_set & (1U << reg)) ? "lfs" : "lfd",
+ (lfs_set & ((uint32_t)1<<reg)) ? "lfs" : "lfd",
reg, savedf[reg]);
for (reg = 31; reg >= 0; reg--)
return;
case EX_REGVAR:
assert(leaf1.e_typ == EV_INT);
- i = isregvar_size((long) leaf1.e_v.e_con, node->ex_rnode);
+ i = PICK_REGVAR((long) leaf1.e_v.e_con, node->ex_rnode);
if (i<=0) {
presult->e_typ = EV_UNDEF;
return;
int isregvar(long);
#ifdef REGLAP
int isregvar_size(long, int);
-#else
-#define isregvar_size(off, size) isregvar(off)
#endif
int isregtyp(long);
void unlinkregs(void);
+
+#ifdef REGLAP
+#define PICK_REGVAR(off, size) isregvar_size(off, size)
+#else
+#define PICK_REGVAR(off, size) isregvar(off)
+#endif
case IN_D_DESCR:
compute(&enodes[inp->in_info[1]], &result);
assert(result.e_typ==EV_INT);
- regno = isregvar_size(result.e_v.e_con,
- tokens[inp->in_info[0]].t_size);
+ regno = PICK_REGVAR(result.e_v.e_con,
+ tokens[inp->in_info[0]].t_size);
if (regno > 0) {
token->t_token = -1;
token->t_att[0].ar = regno;
compute(&enodes[inp->in_info[1]], &result);
curtoken = ct;
assert(result.e_typ==EV_INT);
- regno = isregvar_size(result.e_v.e_con,
- tokens[inp->in_info[0]].t_size);
+ regno = PICK_REGVAR(result.e_v.e_con,
+ tokens[inp->in_info[0]].t_size);
if (regno > 0) {
token->t_token = -1;
token->t_att[0].ar = regno;
: constants
properties
registers
+ { check_reglap(); }
tokens
- { make_std_sets(); }
+ { make_std_sets(); }
sets
instructions
moves
wrong = 0;
if (overlap) {
/* reglap = size of overlap float */
- if (reglap==0)
+ if (reglap==0) {
reglap = regp->ri_size;
- else if (reglap!=regp->ri_size)
+ if (reglap == rvsize[reg_float])
+ error("Two sizes of reg_float can't be same size");
+ } else if (reglap!=regp->ri_size)
wrong = 1;
} else {
if (nregvar[rv]==0)
regclass++;
}
+void
+check_reglap() {
+ reginfo *regp;
+ int i;
+
+ if (reglap == 0)
+ return;
+
+ /* reglap: Check that every reg_float has size == reglap. */
+ for (i = 0; i < nregvar[reg_float]; i++) {
+ regp = &l_regs[rvnumbers[reg_float][i]];
+ if (regp->ri_size != reglap)
+ error("Missing reg_float of size %d to contain %s",
+ reglap, regp->ri_name);
+ }
+}
+
setallreg(vi) struct varinfo *vi; {
nallreg=0;