|
|
1.1 root 1: /*
2: * Machine dependant sparc
3: */
4:
5: #include "/sys/src/cmd/kc/k.out.h"
6: #define AOUTL ".k"
7: #define IALEF "-I/sys/include/alef"
8:
9: enum
10: {
11: /* Basic machine type size in bytes */
12: Machptr = 4,
13: Machint = 4,
14: Machsint = 2,
15: Machchar = 1,
16: Machchan = 4,
17: Machfloat = 8,
18:
19: Autobase = 4, /* Automatics start at Autobase(FP) */
20: Parambase = 0, /* Parameters start at Parambase(SP) */
21: Argbase = 4, /* Space for return pc/frame info */
22:
23: Shortfoff = 2,
24: Charfoff = 3,
25:
26: /* Type alignments for structs and data */
27: Align_Machptr = 4,
28: Align_Machint = 4,
29: Align_Machsint = 2,
30: Align_Machchar = 1,
31: Align_Machchan = 4,
32: Align_Machfloat = 4,
33: Align_data = Align_Machint,
34:
35: Sucall = 100, /* Complexity of a function */
36: Sucompute = 9, /* >sun Address needs to be computed */
37:
38: /* Size of the PAR rendez structure from the runtime */
39: SZPAREND = 4*Machint,
40: };
41:
42: #define isaddr(nr) (nr->islval > Sucompute)
43:
44: typedef struct Adres Adres;
45: typedef struct Inst Inst;
46: typedef struct Glab Glab;
47: typedef struct Bits Bits;
48: typedef struct Var Var;
49: typedef struct Reg Reg;
50: typedef struct Rgn Rgn;
51: typedef struct Scache Scache;
52: typedef struct Multab Multab;
53: typedef struct Hintab Hintab;
54:
55: enum
56: {
57: A_NONE = 0,
58: A_CONST,
59: A_FCONST,
60: A_REG,
61: A_FREG,
62: A_INDREG,
63: A_BRANCH,
64: A_STRING,
65: };
66:
67: struct Scache
68: {
69: Sym *s;
70: char class;
71: };
72:
73: struct Glab
74: {
75: Node *n;
76: int par;
77: int crit;
78: union {
79: Inst *i;
80: ulong pc;
81: };
82: Glab *next;
83: };
84:
85: struct Adres
86: {
87: char type;
88: char class;
89: char etype;
90: char reg;
91: Sym *sym;
92: union {
93: long ival;
94: float fval;
95: char str[NSNAME];
96: };
97: };
98: #define A ((Adres*)0)
99:
100: struct Inst
101: {
102: uchar op;
103: uchar fmt;
104: Adres src1;
105: Adres dst;
106: int reg;
107: Node *n;
108: ulong pc;
109: int lineno;
110: Inst *next;
111: };
112: #define P ((Inst*)0)
113:
114: enum
115: {
116: Retireg = 7, /* Integer return */
117: Regspass = 7, /* Complex ptr */
118: Ireg = 8, /* Base integer registers */
119: Maxireg = 20,
120: Retfreg = 21,
121: Freg = 21,
122: Maxfreg = 21+31,
123: Retfregno = 0,
124: Retiregno = 1,
125: Nreg = 55,
126: RegSP = 1,
127: Regtmp = 14, /* Loader temporary */
128: Reglink = 15, /* Link register */
129: Pregs = 6, /* Private registers */
130: };
131:
132: #define BITS 5
133: #define NVAR (BITS*sizeof(ulong)*8)
134: struct Bits
135: {
136: ulong b[BITS];
137: };
138:
139: struct Var
140: {
141: long ival;
142: Sym* sym;
143: char class;
144: char etype;
145: };
146:
147: struct Reg
148: {
149: long pc;
150:
151: Bits set;
152: Bits use1;
153: Bits use2;
154:
155: Bits refbehind;
156: Bits refahead;
157: Bits calbehind;
158: Bits calahead;
159: Bits regdiff;
160: Bits act;
161:
162: long regu;
163: long loop; /* could be shorter */
164:
165: union {
166: Reg* log5;
167: int active;
168: };
169: Reg* p1;
170: Reg* p2;
171: Reg* p2next;
172: Reg* s1;
173: Reg* s2;
174: Reg* next;
175: Inst* prog;
176: };
177: #define R ((Reg*)0)
178:
179: #define NRGN 600
180: struct Rgn
181: {
182: Reg* enter;
183: short cost;
184: short varno;
185: short regno;
186: };
187:
188: #define BLOAD(r) band(bnot(r->refbehind), r->refahead)
189: #define BSTORE(r) band(bnot(r->calbehind), r->calahead)
190: #define LOAD(r) (~r->refbehind.b[z] & r->refahead.b[z])
191: #define STORE(r) (~r->calbehind.b[z] & r->calahead.b[z])
192:
193: #define bset(a,n) ((a).b[(n)/32]&(1L<<(n)%32))
194:
195: #define CLOAD 5
196: #define CREF 5
197: #define CINF 1000
198: #define LOOP 3
199:
200: struct Multab
201: {
202: long val;
203: char code[20];
204: };
205:
206: struct Hintab
207: {
208: ushort val;
209: char hint[10];
210: };
211:
212: extern Hintab hintab[];
213: Multab multab[20];
214: int hintabsize;
215:
216: Tinfo *tip;
217: Node ratv;
218: Node *atv;
219: int frsize;
220: ulong args;
221:
222: Rgn region[NRGN];
223: Rgn* rgp;
224: int nregion;
225: int nvar;
226:
227: Bits externs;
228: Bits param;
229: Bits consts;
230: Bits addrs;
231: Bits zbits;
232:
233: long regbits;
234: long exregbits;
235:
236: int change;
237:
238: Reg* firstr;
239: Reg* lastr;
240: Reg zreg;
241: Reg* freer;
242: Var var[NVAR];
243:
244: Inst zprog;
245: ulong pc;
246:
247: Scache scache[NSYM];
248:
249: /* Code generator and machine specific optimisation */
250: Inst *ai(void);
251: void mkaddr(Node*, Adres*, int);
252: void reg(Node*, Type*, Node*);
253: Node *regtmp(void);
254: Node *regn(int);
255: void regfree(Node*);
256: void preamble(Node*);
257: void sucalc(Node*);
258: void scopeis(int);
259: void regret(Node*, Type*);
260: void genarg(Node*);
261: void codmop(Node*, Node*, Node*, Node*);
262: Inst *instruction(int, Node*, Node*, Node*);
263: void label(Inst*, ulong);
264: void gencond(Node*, Node*, int);
265: int immed(Node*);
266: void invertcond(Node*);
267: void codcond(int, Node*, Node*);
268: void genexp(Node*, Node*);
269: void ilink(Inst*);
270: int vconst(Node*);
271: void assign(Node*, Node*);
272: void oasgn(Node*, Node*);
273: Node *argnode(Type*);
274: void orecv(Node*, Node*);
275: void switchcode(Node*);
276: void gencmps(Node**, int, long, Node*);
277: void regcheck(void);
278: void setlabel(Node*, ulong);
279: void setgoto(Node*, Inst*);
280: void resolvegoto(void);
281: void gencomplex(Node*, Node*);
282: void parcode(Node*);
283: Node *stknode(Type*);
284: void mkdata(Node*, int, int, Inst*);
285: Reg* rega(void);
286: int rcmp(void*, void*);
287: void regopt(Inst*);
288: void addmove(Reg*, int, int, int);
289: Bits mkvar(Adres*, int);
290: void prop(Reg*, Bits, Bits);
291: int loopit(Reg*);
292: void synch(Reg*, Bits);
293: ulong allreg(ulong, Rgn*);
294: void paint1(Reg*, int);
295: ulong paint2(Reg*, int);
296: void paint3(Reg*, int, long, int);
297: void addreg(Adres*, int);
298: void peep(void);
299: void excise(Reg*);
300: Reg* uniqp(Reg*);
301: Reg* uniqs(Reg*);
302: int regtyp(Adres*);
303: int regzer(Adres*);
304: int anyvar(Adres*);
305: int subprop(Reg*);
306: int copyprop(Reg*);
307: int copy1(Adres*, Adres*, Reg*, int);
308: int copyu(Inst*, Adres*, Adres*);
309: int copyas(Adres*, Adres*);
310: int copyau(Adres*, Adres*);
311: int copyau1(Inst*, Adres*);
312: int copysub(Adres*, Adres*, Adres*, int);
313: int copysub1(Inst*, Adres*, Adres*, int);
314: long RtoB(int);
315: long FtoB(int);
316: int BtoR(long);
317: int BtoF(long);
318: Bits bor(Bits, Bits);
319: Bits band(Bits, Bits);
320: Bits bnot(Bits);
321: int bany(Bits*);
322: int bnum(Bits);
323: Bits blsh(int);
324: int beq(Bits, Bits);
325: int bitno(long);
326: int Bconv(void*, Fconv*);
327: void ieeedtod(Ieee*, double);
328: int vcache(Biobuf*, Adres*);
329: char *vaddr(char*, Adres*, int);
330: void vname(Biobuf*, char, char*, int);
331: void cominit(Node*, Type*, Node*, int);
332: Node* internnode(Type*);
333: void lblock(Node*);
334: Node* conf(double);
335: void evalarg(Node*, int);
336: Node* atvnode(Type*);
337: Node* paramnode(Type*);
338: void genelist(Node*);
339: int mulcon(Node*, Node*);
340: Multab* mulcon0(long);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.