|
|
1.1 root 1: /*
2: * This file contains the
3: * machine independent parts of register
4: * allocation. Most has to do with
5: * extracting information from the register
6: * tables.
7: */
8: #ifdef vax
9: #include "INC$LIB:cc1.h"
10: #else
11: #include "cc1.h"
12: #endif
13:
14: /*
15: * Get the name of the
16: * high order half of a register pair.
17: */
18: hihalf(r)
19: {
20: return (reg[r].r_hihalf);
21: }
22:
23: /*
24: * Get the name of the
25: * low half of a register pair.
26: */
27: lohalf(r)
28: {
29: return (reg[r].r_lohalf);
30: }
31:
32: /*
33: * Get the name of the register
34: * pair that encloses the specified
35: * register.
36: */
37: enpair(r)
38: {
39: return (reg[r].r_enpair);
40: }
41:
42: /*
43: * Check if a register is busy by
44: * looking to see if any bits are set in
45: * the busy mask.
46: */
47: isbusy(r)
48: {
49: if ((reg[r].r_phys&curbusy) != 0)
50: return (1);
51: return (0);
52: }
53:
54: /*
55: * Turn on the busy bits for register
56: * `r' in the busy mask.
57: */
58: setbusy(r)
59: {
60: curbusy |= reg[r].r_phys;
61: }
62:
63: /*
64: * Turn off the busy bits for register
65: * `r' in the busy mask.
66: */
67: clrbusy(r)
68: {
69: curbusy &= ~reg[r].r_phys;
70: }
71:
72: /*
73: * Allocate a register. The
74: * register will be able to hold the
75: * result type of tree `tp'.
76: * Registers in the `used' set will
77: * be avoided.
78: * Flag = 0 means rvalue temp.
79: * Flag = 1 means offset temp.
80: * Flag = 2 means index temp.
81: * The register name is returned. A
82: * -1 is returned if no register is
83: * available.
84: */
85: rallo(tp, used, flag)
86: TREE *tp;
87: register PREGSET used;
88: {
89: register REGDESC *rp;
90: register KIND kind;
91:
92: kind = pertype[tp->t_type].p_kind;
93: used |= curbusy;
94: if (flag != 2)
95: used |= curxreg;
96: rp = ®[NRREG];
97: while (--rp >= ®[FRREG]) {
98: if ((rp->r_phys&used) != 0)
99: continue;
100: if (flag == 0) {
101: if ((rp->r_rvalue&kind) == 0)
102: continue;
103: } else {
104: if ((rp->r_lvalue&kind) == 0)
105: continue;
106: }
107: return (rp - ®[0]);
108: }
109: return (-1);
110: }
111:
112: /*
113: * This routine figures out the
114: * register name that gets passed down to
115: * a subordinate. The first argument `s'
116: * is a selector. The second is the current
117: * temp.
118: */
119: reguse(selreg, tmpreg)
120: register selreg;
121: register tmpreg;
122: {
123: if (selreg == TEMP)
124: selreg = tmpreg;
125: else if (selreg == LOTEMP)
126: selreg = lohalf(tmpreg);
127: else if (selreg == HITEMP)
128: selreg = hihalf(tmpreg);
129: return (selreg);
130: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.