|
|
1.1 root 1: /* @(#)machdep.h 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7: #ifdef VAX
8:
9: /* VAX-11 Registers */
10:
11: /* scratch registers */
12: # define R0 0
13: # define R1 1
14: # define R2 2
15: # define R3 3
16: # define R4 4
17: # define R5 5
18:
19: /* register variables */
20: # define R6 6
21: # define R7 7
22: # define R8 8
23: # define R9 9
24: # define R10 10
25: # define R11 11
26:
27: /* special purpose */
28: # define AP 12 /* argument pointer */
29: # define FP 13 /* frame pointer */
30: # define SP 14 /* stack pointer */
31: # define PC 15 /* program counter */
32:
33: /* floating registers */
34:
35: /* there are no floating point registers on the VAX */
36:
37: #else
38:
39: /* 68000 registers */
40: /* D0-D1/A0-A1/FP0-FP1 are scratch */
41: /* D2-D7/A2-A5/FP2-FP7 are available for variable allocation */
42: /* A6 and A7 are special purpose */
43:
44: /* data registers */
45: # define D0 0
46: # define D1 1
47: # define D2 2
48: # define D3 3
49: # define D4 4
50: # define D5 5
51: # define D6 6
52: # define D7 7
53: /* address registers */
54: # define A0 8
55: # define A1 9
56: # define A2 10
57: # define A3 11
58: # define A4 12
59: # define A5 13
60: # define A6 14
61: # define SP 15
62: /* floating registers */
63: # define FP0 16
64: # define FP1 17
65: # define FP2 18
66: # define FP3 19
67: # define FP4 20
68: # define FP5 21
69: # define FP6 22
70: # define FP7 23
71:
72: #endif
73:
74: /* register cookie for stack pointer */
75:
76: #ifdef VAX
77: # define STKREG FP
78: # define ARGREG AP
79: #else
80: # define STKREG A6
81: # define ARGREG A6
82: #endif
83:
84: /* maximum and minimum register variables */
85:
86: #ifdef VAX
87: # define MAXRVAR R11
88: # define MINRVAR R6
89: #else
90: # define MIN_DVAR D2
91: # define MAX_DVAR D7
92: # define MIN_AVAR A2
93: # define MAX_AVAR A5
94: # define MIN_FVAR FP2
95: # define MAX_FVAR FP7
96: #endif
97:
98: /*
99: * macros for register variable bookkeeping. This logically involves
100: * three counters (one for each register bank) but the "machine
101: * independent part" of the compiler explicitly deals with a single
102: * counter. So we have the following silliness:
103: */
104:
105: #ifndef VAX
106:
107: #define NEXTD(r) ((r)&0xf)
108: #define NEXTA(r) ((((r)>>4)&0xf)+A0)
109: #define NEXTF(r) ((((r)>>8)&0xf)+FP0)
110:
111: #ifdef FORT
112: /* register reserved by iropt for copy of __skybase */
113: #define SKYBASE(r) (((r)>>12)&0xf)
114: #endif FORT
115:
116: #define SETD(r,x) ((r)&=0xfffffff0, (r)|=((x)&0xf))
117: #define SETA(r,x) ((r)&=0xffffff0f, (r)|=(((x)-A0)&0xf)<<4)
118: #define SETF(r,x) ((r)&=0xfffff0ff, (r)|=(((x)-FP0)&0xf)<<8)
119:
120: /*
121: * REGVARMASK represents the set of registers available for
122: * variable allocation, starting at A7 on the left and counting
123: * down to D0. The register variable set is <d2-d7,a2-a7>.
124: */
125:
126: #define REGVARMASK 0x3cfc
127:
128: /*
129: * FREGVARMASK represents the set of registers available for
130: * floating point variable allocation, starting at FP0 on the
131: * left and counting up to FP7. The reg variable set is <fp2-fp7>.
132: */
133:
134: #define FREGVARMASK 0x3f
135:
136: /*
137: * mark a register as used
138: */
139: extern int usedregs;
140: extern int usedfpregs;
141:
142: #define markused(r) {\
143: if ((r) >= FP0)\
144: usedfpregs |= (0x80>>((r)-FP0));\
145: else\
146: usedregs |= (1<<(r));\
147: }
148:
149: #endif
150:
151: #ifdef VAX
152: # define makecc(val,i) lastcon = (lastcon<<8)|((val<<24)>>24);
153: #else
154: # define makecc(val,i) lastcon = i ? (val<<8)|lastcon : val
155: # define MULTIFLOAT
156: # ifdef FORT
157: # define FLOATMATH 2
158: # else
159: # define FLOATMATH floatmath
160: extern int floatmath;
161: # endif
162: #endif
163:
164: #ifdef VAX
165: # define ARGINIT 32
166: # define AUTOINIT 0
167: #else
168: # define ARGINIT 64
169: # define AUTOINIT 0
170: #endif
171:
172: # define SZCHAR 8
173: # define SZINT 32
174: # define SZFLOAT 32
175: # define SZDOUBLE 64
176: # define SZEXTENDED 96
177: # define SZLONG 32
178: # define SZSHORT 16
179: # define SZPOINT 32
180: # define ALCHAR 8
181: #ifdef VAX
182: # define ALINT 32
183: # define ALFLOAT 32
184: # define ALDOUBLE 32
185: # define ALEXTENDED 32
186: # define ALLONG 32
187: # define ALSHORT 16
188: # define ALPOINT 32
189: # define ALSTRUCT 8
190: # define ALSTACK 32
191: #else
192: # define ALINT 16
193: # define ALFLOAT 16
194: # define ALDOUBLE 16
195: # define ALEXTENDED 32
196: # define ALLONG 16
197: # define ALSHORT 16
198: # define ALPOINT 16
199: # define ALSTRUCT 16
200: # define ALSTACK 16
201: #endif
202:
203: /* size in which constants are converted */
204: /* should be long if feasable */
205:
206: # define CONSZ long
207: #ifdef VAX
208: # define CONFMT "%ld"
209: #else
210: # define CONFMT "0x%lx"
211: #endif
212:
213: /* size in which offsets are kept
214: /* should be large enough to cover address space in bits
215: */
216:
217: # define OFFSZ long
218:
219: /* character set macro */
220:
221: # define CCTRANS(x) x
222:
223: /* various standard pieces of code are used */
224: # define LABFMT "L%d"
225:
226: /* show stack grows negatively */
227: #define BACKAUTO
228: #define BACKTEMP
229:
230: /* show field hardware support on VAX */
231: /* pretend hardware support on 68000 */
232: #define FIELDOPS
233:
234: #ifdef VAX
235: /* bytes are numbered from right to left */
236: #define RTOLBYTES
237: #else
238: /* bit fields are never sign-extended */
239: #define UFIELDS
240: #endif
241:
242: /* we want prtree included */
243: # define STDPRTREE
244: # ifndef FORT
245: # define ONEPASS
246: # endif
247:
248: # define ENUMSIZE(high,low) INT
249:
250: /* su numbers are ints */
251:
252:
253: # define ADDROREG
254: # define FIXDEF(p) outstab(p)
255: # define FIXARG(p) fixarg(p)
256:
257: # define STACKPROBE /* in code.c */
258: # define STABBING
259: # define LCOMM
260: # define ASSTRINGS
261: # define FLEXNAMES
262: # define FIXSTRUCT outstruct
263:
264: /* Machines with multiple register banks have a hard time representing
265: * a one-component cost function for code generation. What we really
266: * need is a cost vector, with one dimension for each resource (register type).
267: * This approximates that.
268: */
269: #ifdef VAX
270: typedef int SUTYPE;
271: #else
272: typedef struct sunum{
273: char d, /* data registers */
274: a, /* address registers */
275: f, /* float registers */
276: x; /* not used yet */
277: } SUTYPE;
278: #endif
279:
280: #ifndef VAX
281: extern int use68020; /* for code generation options */
282: extern int use68881; /* code generation and register allocation */
283: #endif VAX
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.