general registers: 2
address registers: 0
floating point registers: 0
+use general as pointer: yes
register score parameters:
local variable:
general registers: 5
address registers: 4
floating point registers: 0
+use general as pointer: no
register score parameters:
local variable:
register save costs:
(11 cases)
0 -> (0,0)
- 1 -> (12,4)
+ 1 -> (12,6)
2 -> (24,8)
3 -> (34,8)
4 -> (42,8)
1 2 3 -1
forbidden operators: -1 -1
%%SP
-global stack pollution allowed?: no
+global stack pollution allowed?: yes
general registers: 5
address registers: 4
floating point registers: 0
+use general as pointer: no
register score parameters:
local variable:
general registers: 5
address registers: 4
floating point registers: 0
+use general as pointer: no
register score parameters:
local variable:
general registers: 2
address registers: 0
floating point registers: 0
+use general as pointer: yes
register score parameters:
local variable:
general registers: 8
address registers: 0
floating point registers: 0
+use general as pointer: yes
register score parameters:
local variable:
0 /* reg_float */
} ;
+short use_any_as_pointer = 0;
+
STATIC cond_p getcondtab(f)
FILE *f;
{
fscanf(f,"%hd",®s_available[reg_any]);
fscanf(f,"%hd",®s_available[reg_pointer]);
fscanf(f,"%hd",®s_available[reg_float]);
+ fscanf(f,"%hd",&use_any_as_pointer);
get_atab(f,alocaltab);
get_atab(f,alocaddrtab);
aconsttab = getcondtab(f);
extern short regs_available[]; /* contains #registers of every type */
+extern short use_any_as_pointer;/* indicates whether general registers
+ can be used as pointers
+ */
/* A thing that can be put in a register is called an "item". The are several
offset off;
short *time_out, *space_out;
{
- cond_p m;
+ cond_p m = (cond_p) 0;
if (localtyp == reg_loop) localtyp = reg_any;
if (size == ws || size ==ps && totyp == reg_pointer) {
m = alocaltab[localtyp][totyp];
break;
case LOCAL_ADDR:
- m = alocaddrtab[localtyp][totyp];
+ if (use_any_as_pointer || totyp == reg_pointer)
+ m = alocaddrtab[localtyp][totyp];
break;
case CONST:
m = aconsttab;
m = aconsttab;
break;
case GLOBL_ADDR:
- m = aglobaltab;
+ if (use_any_as_pointer || totyp == reg_pointer)
+ m = aglobaltab;
break;
case PROC_ADDR:
- m = aproctab;
+ if (use_any_as_pointer || totyp == reg_pointer)
+ m = aproctab;
break;
}
- } else {
- m = (cond_p) 0;
}
*time_out = (m == (cond_p) 0 ? -1 : map_value(m,off,TRUE));
*space_out = (m == (cond_p) 0 ? -1 : map_value(m,off,FALSE));