|
|
1.1 root 1: # include "mfile2.h"
2:
3: ttype( t )
4: register TWORD t;
5: {
6: /* return the coded type of t */
7: /* this is called only from the first pass */
8:
9: # ifdef TWOPTRS
10: if( ISPTR(t) )
11: {
12: do
13: {
14: t = DECREF(t);
15: } while ( ISARY(t) );
16: /* arrays that are left are usually only
17: ** in structure references...
18: */
19: if( TWOPTRS(t) ) return( TPOINT2 );
20: return( TPOINT );
21: }
22: # endif
23:
24: if( t != BTYPE(t) ) return( TPOINT ); /* TPOINT means not simple! */
25:
26: switch( t )
27: {
28:
29: case CHAR:
30: return( TCHAR );
31: case SHORT:
32: return( TSHORT );
33: case STRTY:
34: case UNIONTY:
35: return( TSTRUCT );
36: case INT:
37: return( TINT );
38: case UNSIGNED:
39: return( TUNSIGNED );
40: case USHORT:
41: return( TUSHORT );
42: case UCHAR:
43: return( TUCHAR );
44: case ULONG:
45: return( TULONG );
46: case LONG:
47: return( TLONG );
48: case FLOAT:
49: return( TFLOAT );
50: case DOUBLE:
51: return( TDOUBLE );
52: case VOID:
53: return( TVOID );
54: }
55: cerror( "ttype(0%o)", t );
56: /* NOTREACHED */
57: }
58:
59: NODE resc[NRGS];
60:
61: int busy[NRGS];
62:
63: # define TBUSY 0100
64:
65: allo0()
66: {
67: /* free everything */
68: register i;
69:
70: for( i=0; i<NRGS; ++i )
71: {
72: busy[i] = 0;
73: }
74: }
75:
76: rbusy(r, t )
77: register r;
78: register TWORD t;
79: {
80: /* mark register r busy */
81:
82: #ifndef NODBG
83: if( rdebug )
84: {
85: printf( "rbusy( %s, ", rnames[r] );
86: t2print( t );
87: printf( " )\n" );
88: }
89: #endif
90: if( istreg(r) )
91: {
92: ++busy[r];
93: if( szty( t ) > 1 )
94: {
95: if( !istreg(r+1) ) cerror( "big register" );
96: ++busy[r+1];
97: }
98: }
99: }
100:
101: int tmpoff; /* offset of next temp to be allocated */
102:
103: freetemp( k )
104: register k;
105: {
106: /* allocate k integers worth of temp space
107: ** we also make the convention that, if the number of words is more than 1,
108: ** it must be aligned for storing doubles...
109: */
110:
111: # ifndef BACKTEMP
112: int t;
113:
114: if( k>1 )
115: {
116: SETOFF( tmpoff, ALDOUBLE );
117: }
118:
119: t = tmpoff;
120: tmpoff += k*SZINT;
121: if( tmpoff > maxtemp ) maxtemp = tmpoff;
122: return(t);
123:
124: # else
125: tmpoff += k*SZINT;
126: if( k>1 )
127: {
128: SETOFF( tmpoff, ALDOUBLE );
129: }
130: if( tmpoff > maxtemp ) maxtemp = tmpoff;
131: return( -tmpoff );
132: # endif
133: }
134:
135: allchk()
136: {
137: /* check to ensure that all register are free */
138: register i;
139:
140: for( i=0; i<NRGS; ++i )
141: {
142: if( busy[i] )
143: {
144: cerror( "register allocation error");
145: }
146: }
147: }
148:
149: /* this may not be the best place for this routine... */
150: argsize( p )
151: register NODE *p;
152: {
153: /* size of the arguments */
154: register t;
155: t = 0;
156: if( p->tn.op == CM )
157: {
158: t = argsize( p->in.left );
159: p = p->in.right;
160: }
161: if( p->tn.type & (TDOUBLE|TFLOAT) )
162: {
163: SETOFF( t, ALDOUBLE );
164: t += SZDOUBLE;
165: }
166: else if( p->tn.type & (TLONG|TULONG) )
167: {
168: SETOFF( t, ALLONG );
169: t += SZLONG;
170: }
171: else if( p->tn.type & TPOINT )
172: {
173: SETOFF( t, ALPOINT );
174: t += SZPOINT;
175: }
176: else if( p->tn.type & TSTRUCT )
177: {
178: SETOFF( p->stn.stsize, ALSTACK); /* alignment */
179: t += p->stn.stsize; /* size */
180: }
181: else
182: {
183: SETOFF( t, ALINT );
184: t += SZINT;
185: }
186: return( t );
187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.