* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)tmps.c 5.2 (Berkeley) 11/12/86";
* This routine defines the register allocation strategy
* All temporaries are allocated here, and this routines decides
* where they are to be put.
* - are allocated from highreg towards lowreg.
* - register numbers from the various register types are mapped to
* integer register numbers using the offsets. (cf. pcc/mac2defs)
* - are allocated on a downward growing stack.
* first pass register declaration constants
} regtypes
[NUMREGTYPES
] = {
{ 6, 11, 4 }, /* r6..r11 */
* first pass register declaration constants
} regtypes
[NUMREGTYPES
] = {
{ 6, 12, 4 }, /* r6..r12 */
* first pass register declaration constants
} regtypes
[NUMREGTYPES
] = {
{ 2, 7, 4 }, /* d2..d7 */
{ 2, 5, 4 }, /* a2..a5 */
struct om
*sizesp
= &sizes
[cbn
];
sizesp
->om_max
= -DPOFF1
;
sizesp
->curtmps
.om_off
= -DPOFF1
;
for (i
= 0; i
< NUMREGTYPES
; i
++) {
sizesp
->low_water
[i
] = regtypes
[i
].highreg
+ 1;
sizesp
->curtmps
.next_avail
[i
] = regtypes
[i
].highreg
;
* allocate runtime temporary variables
tmpalloc(size
, type
, mode
)
register struct om
*op
= &sizes
[ cbn
];
# if defined(vax) || defined(tahoe)
&& size
== regtypes
[REG_GENERAL
].regsize
&& op
->curtmps
.next_avail
[REG_GENERAL
]
>= regtypes
[REG_GENERAL
].lowreg
) {
offset
= op
->curtmps
.next_avail
[REG_GENERAL
]--;
if (offset
< op
->low_water
[REG_GENERAL
]) {
op
->low_water
[REG_GENERAL
] = offset
;
nlp
= defnl( (char *) 0 , VAR
, type
, offset
);
nlp
-> extra_flags
= NLOCAL
| NREGVAR
;
&& size
== regtypes
[REG_DATA
].regsize
&& op
->curtmps
.next_avail
[REG_DATA
]
>= regtypes
[REG_DATA
].lowreg
) {
offset
= op
->curtmps
.next_avail
[REG_DATA
]--;
if (offset
< op
->low_water
[REG_DATA
]) {
op
->low_water
[REG_DATA
] = offset
;
nlp
= defnl(0, VAR
, type
, offset
+ DATA_REG_OFFSET
);
nlp
-> extra_flags
= NLOCAL
| NREGVAR
;
&& size
== regtypes
[REG_ADDR
].regsize
&& op
->curtmps
.next_avail
[REG_ADDR
]
>= regtypes
[REG_ADDR
].lowreg
) {
offset
= op
->curtmps
.next_avail
[REG_ADDR
]--;
if (offset
< op
->low_water
[REG_ADDR
]) {
op
->low_water
[REG_ADDR
] = offset
;
nlp
= defnl(0, VAR
, type
, offset
+ ADDR_REG_OFFSET
);
nlp
-> extra_flags
= NLOCAL
| NREGVAR
;
} else if (type
== nl
+TPTR
) {
roundup((int)(op
->curtmps
.om_off
- size
), alignment
);
offset
= op
->curtmps
.om_off
;
if ( offset
< op
->om_max
) {
nlp
= defnl( (char *) 0 , VAR
, type
, offset
);
nlp
-> extra_flags
= NLOCAL
;
* deallocate runtime temporary variables
register struct tmps
*restore
;
register struct om
*op
= &sizes
[ cbn
];
# if defined(vax) || defined(tahoe)
if (restore
->next_avail
[REG_GENERAL
]
> op
->curtmps
.next_avail
[REG_GENERAL
]) {
op
->curtmps
.next_avail
[REG_GENERAL
]
= restore
->next_avail
[REG_GENERAL
];
if (restore
->next_avail
[REG_DATA
]
> op
->curtmps
.next_avail
[REG_DATA
]) {
op
->curtmps
.next_avail
[REG_DATA
]
= restore
->next_avail
[REG_DATA
];
if (restore
->next_avail
[REG_ADDR
]
> op
->curtmps
.next_avail
[REG_ADDR
]) {
op
->curtmps
.next_avail
[REG_ADDR
]
= restore
->next_avail
[REG_ADDR
];
if (restore
->om_off
> op
->curtmps
.om_off
) {
op
->curtmps
.om_off
= restore
->om_off
;
#if defined(vax) || defined(tahoe)
* create a save mask for registers which have been used
for (i
= 0; i
<= regtypes
[REG_GENERAL
].highreg
; i
++) {
if (i
>= sizes
[cbn
].low_water
[REG_GENERAL
]) {