1*ce95e1b3SDavid du Colombier #include "gc.h"
2*ce95e1b3SDavid du Colombier
3*ce95e1b3SDavid du Colombier static long ncast64[];
4*ce95e1b3SDavid du Colombier
5*ce95e1b3SDavid du Colombier extern void ccmain(int, char**);
6*ce95e1b3SDavid du Colombier
7*ce95e1b3SDavid du Colombier void
main(int argc,char ** argv)8*ce95e1b3SDavid du Colombier main(int argc, char **argv)
9*ce95e1b3SDavid du Colombier {
10*ce95e1b3SDavid du Colombier char *p;
11*ce95e1b3SDavid du Colombier int oargc;
12*ce95e1b3SDavid du Colombier char **oargv;
13*ce95e1b3SDavid du Colombier
14*ce95e1b3SDavid du Colombier thechar = 'i';
15*ce95e1b3SDavid du Colombier p = strrchr(argv[0], '/');
16*ce95e1b3SDavid du Colombier if(p == nil)
17*ce95e1b3SDavid du Colombier p = argv[0];
18*ce95e1b3SDavid du Colombier else
19*ce95e1b3SDavid du Colombier p++;
20*ce95e1b3SDavid du Colombier if(*p == 'j')
21*ce95e1b3SDavid du Colombier thechar = 'j';
22*ce95e1b3SDavid du Colombier oargc = argc;
23*ce95e1b3SDavid du Colombier oargv = argv;
24*ce95e1b3SDavid du Colombier ARGBEGIN {
25*ce95e1b3SDavid du Colombier case 'j':
26*ce95e1b3SDavid du Colombier thechar = 'j';
27*ce95e1b3SDavid du Colombier break;
28*ce95e1b3SDavid du Colombier case 'o':
29*ce95e1b3SDavid du Colombier case 'D':
30*ce95e1b3SDavid du Colombier case 'I':
31*ce95e1b3SDavid du Colombier p = ARGF();
32*ce95e1b3SDavid du Colombier } ARGEND
33*ce95e1b3SDavid du Colombier USED(p);
34*ce95e1b3SDavid du Colombier
35*ce95e1b3SDavid du Colombier if(thechar == 'j'){
36*ce95e1b3SDavid du Colombier thestring = "riscv64";
37*ce95e1b3SDavid du Colombier ewidth[TIND] = 8;
38*ce95e1b3SDavid du Colombier }else{
39*ce95e1b3SDavid du Colombier thestring = "riscv";
40*ce95e1b3SDavid du Colombier ewidth[TIND] = 4;
41*ce95e1b3SDavid du Colombier }
42*ce95e1b3SDavid du Colombier ccmain(oargc, oargv);
43*ce95e1b3SDavid du Colombier }
44*ce95e1b3SDavid du Colombier
45*ce95e1b3SDavid du Colombier void
ginit(void)46*ce95e1b3SDavid du Colombier ginit(void)
47*ce95e1b3SDavid du Colombier {
48*ce95e1b3SDavid du Colombier int i;
49*ce95e1b3SDavid du Colombier Type *t;
50*ce95e1b3SDavid du Colombier
51*ce95e1b3SDavid du Colombier exregoffset = REGEXT;
52*ce95e1b3SDavid du Colombier exfregoffset = FREGEXT;
53*ce95e1b3SDavid du Colombier listinit();
54*ce95e1b3SDavid du Colombier nstring = 0;
55*ce95e1b3SDavid du Colombier mnstring = 0;
56*ce95e1b3SDavid du Colombier nrathole = 0;
57*ce95e1b3SDavid du Colombier pc = 0;
58*ce95e1b3SDavid du Colombier breakpc = -1;
59*ce95e1b3SDavid du Colombier continpc = -1;
60*ce95e1b3SDavid du Colombier cases = C;
61*ce95e1b3SDavid du Colombier firstp = P;
62*ce95e1b3SDavid du Colombier lastp = P;
63*ce95e1b3SDavid du Colombier tfield = types[TLONG];
64*ce95e1b3SDavid du Colombier
65*ce95e1b3SDavid du Colombier if(thechar == 'j'){
66*ce95e1b3SDavid du Colombier typeword = typechlvp;
67*ce95e1b3SDavid du Colombier typeswitch = typechlv;
68*ce95e1b3SDavid du Colombier typecmplx = typesu;
69*ce95e1b3SDavid du Colombier }
70*ce95e1b3SDavid du Colombier
71*ce95e1b3SDavid du Colombier zprog.link = P;
72*ce95e1b3SDavid du Colombier zprog.as = AGOK;
73*ce95e1b3SDavid du Colombier zprog.reg = NREG;
74*ce95e1b3SDavid du Colombier zprog.from.type = D_NONE;
75*ce95e1b3SDavid du Colombier zprog.from.name = D_NONE;
76*ce95e1b3SDavid du Colombier zprog.from.reg = NREG;
77*ce95e1b3SDavid du Colombier zprog.to = zprog.from;
78*ce95e1b3SDavid du Colombier
79*ce95e1b3SDavid du Colombier regnode.op = OREGISTER;
80*ce95e1b3SDavid du Colombier regnode.class = CEXREG;
81*ce95e1b3SDavid du Colombier regnode.reg = REGTMP;
82*ce95e1b3SDavid du Colombier regnode.complex = 0;
83*ce95e1b3SDavid du Colombier regnode.addable = 11;
84*ce95e1b3SDavid du Colombier regnode.type = types[TLONG];
85*ce95e1b3SDavid du Colombier
86*ce95e1b3SDavid du Colombier vregnode = regnode;
87*ce95e1b3SDavid du Colombier vregnode.type = types[TVLONG];
88*ce95e1b3SDavid du Colombier
89*ce95e1b3SDavid du Colombier constnode.op = OCONST;
90*ce95e1b3SDavid du Colombier constnode.class = CXXX;
91*ce95e1b3SDavid du Colombier constnode.complex = 0;
92*ce95e1b3SDavid du Colombier constnode.addable = 20;
93*ce95e1b3SDavid du Colombier constnode.type = types[TLONG];
94*ce95e1b3SDavid du Colombier
95*ce95e1b3SDavid du Colombier vconstnode = constnode;
96*ce95e1b3SDavid du Colombier vconstnode.type = types[TVLONG];
97*ce95e1b3SDavid du Colombier
98*ce95e1b3SDavid du Colombier fconstnode.op = OCONST;
99*ce95e1b3SDavid du Colombier fconstnode.class = CXXX;
100*ce95e1b3SDavid du Colombier fconstnode.complex = 0;
101*ce95e1b3SDavid du Colombier fconstnode.addable = 20;
102*ce95e1b3SDavid du Colombier fconstnode.type = types[TDOUBLE];
103*ce95e1b3SDavid du Colombier
104*ce95e1b3SDavid du Colombier nodsafe = new(ONAME, Z, Z);
105*ce95e1b3SDavid du Colombier nodsafe->sym = slookup(".safe");
106*ce95e1b3SDavid du Colombier nodsafe->type = types[TINT];
107*ce95e1b3SDavid du Colombier nodsafe->etype = types[TINT]->etype;
108*ce95e1b3SDavid du Colombier nodsafe->class = CAUTO;
109*ce95e1b3SDavid du Colombier complex(nodsafe);
110*ce95e1b3SDavid du Colombier
111*ce95e1b3SDavid du Colombier t = typ(TARRAY, types[TCHAR]);
112*ce95e1b3SDavid du Colombier symrathole = slookup(".rathole");
113*ce95e1b3SDavid du Colombier symrathole->class = CGLOBL;
114*ce95e1b3SDavid du Colombier symrathole->type = t;
115*ce95e1b3SDavid du Colombier
116*ce95e1b3SDavid du Colombier nodrat = new(ONAME, Z, Z);
117*ce95e1b3SDavid du Colombier nodrat->sym = symrathole;
118*ce95e1b3SDavid du Colombier nodrat->type = types[TIND];
119*ce95e1b3SDavid du Colombier nodrat->etype = TVOID;
120*ce95e1b3SDavid du Colombier nodrat->class = CGLOBL;
121*ce95e1b3SDavid du Colombier complex(nodrat);
122*ce95e1b3SDavid du Colombier nodrat->type = t;
123*ce95e1b3SDavid du Colombier
124*ce95e1b3SDavid du Colombier nodret = new(ONAME, Z, Z);
125*ce95e1b3SDavid du Colombier nodret->sym = slookup(".ret");
126*ce95e1b3SDavid du Colombier nodret->type = types[TIND];
127*ce95e1b3SDavid du Colombier nodret->etype = TIND;
128*ce95e1b3SDavid du Colombier nodret->class = CPARAM;
129*ce95e1b3SDavid du Colombier nodret = new(OIND, nodret, Z);
130*ce95e1b3SDavid du Colombier complex(nodret);
131*ce95e1b3SDavid du Colombier
132*ce95e1b3SDavid du Colombier if(thechar == 'i'){
133*ce95e1b3SDavid du Colombier com64init();
134*ce95e1b3SDavid du Colombier }else{
135*ce95e1b3SDavid du Colombier memmove(ncast, ncast64, NTYPE*sizeof(long));
136*ce95e1b3SDavid du Colombier }
137*ce95e1b3SDavid du Colombier
138*ce95e1b3SDavid du Colombier for(i=0; i<nelem(reg); i++) {
139*ce95e1b3SDavid du Colombier reg[i] = 0;
140*ce95e1b3SDavid du Colombier if(i == REGZERO)
141*ce95e1b3SDavid du Colombier reg[i] = 1;
142*ce95e1b3SDavid du Colombier }
143*ce95e1b3SDavid du Colombier }
144*ce95e1b3SDavid du Colombier
145*ce95e1b3SDavid du Colombier void
gclean(void)146*ce95e1b3SDavid du Colombier gclean(void)
147*ce95e1b3SDavid du Colombier {
148*ce95e1b3SDavid du Colombier int i;
149*ce95e1b3SDavid du Colombier Sym *s;
150*ce95e1b3SDavid du Colombier
151*ce95e1b3SDavid du Colombier for(i=0; i<NREG; i++)
152*ce95e1b3SDavid du Colombier if(i != REGZERO)
153*ce95e1b3SDavid du Colombier if(reg[i])
154*ce95e1b3SDavid du Colombier diag(Z, "reg %d left allocated", i);
155*ce95e1b3SDavid du Colombier for(i=NREG; i<NREG+NREG; i++)
156*ce95e1b3SDavid du Colombier if(reg[i])
157*ce95e1b3SDavid du Colombier diag(Z, "freg %d left allocated", i-NREG);
158*ce95e1b3SDavid du Colombier while(mnstring)
159*ce95e1b3SDavid du Colombier outstring("", 1L);
160*ce95e1b3SDavid du Colombier symstring->type->width = nstring;
161*ce95e1b3SDavid du Colombier symrathole->type->width = nrathole;
162*ce95e1b3SDavid du Colombier for(i=0; i<NHASH; i++)
163*ce95e1b3SDavid du Colombier for(s = hash[i]; s != S; s = s->link) {
164*ce95e1b3SDavid du Colombier if(s->type == T)
165*ce95e1b3SDavid du Colombier continue;
166*ce95e1b3SDavid du Colombier if(s->type->width == 0)
167*ce95e1b3SDavid du Colombier continue;
168*ce95e1b3SDavid du Colombier if(s->class != CGLOBL && s->class != CSTATIC)
169*ce95e1b3SDavid du Colombier continue;
170*ce95e1b3SDavid du Colombier if(s->type == types[TENUM])
171*ce95e1b3SDavid du Colombier continue;
172*ce95e1b3SDavid du Colombier gpseudo(AGLOBL, s, nodconst(s->type->width));
173*ce95e1b3SDavid du Colombier }
174*ce95e1b3SDavid du Colombier nextpc();
175*ce95e1b3SDavid du Colombier p->as = AEND;
176*ce95e1b3SDavid du Colombier outcode();
177*ce95e1b3SDavid du Colombier }
178*ce95e1b3SDavid du Colombier
179*ce95e1b3SDavid du Colombier void
nextpc(void)180*ce95e1b3SDavid du Colombier nextpc(void)
181*ce95e1b3SDavid du Colombier {
182*ce95e1b3SDavid du Colombier
183*ce95e1b3SDavid du Colombier p = alloc(sizeof(*p));
184*ce95e1b3SDavid du Colombier *p = zprog;
185*ce95e1b3SDavid du Colombier p->lineno = nearln;
186*ce95e1b3SDavid du Colombier pc++;
187*ce95e1b3SDavid du Colombier if(firstp == P) {
188*ce95e1b3SDavid du Colombier firstp = p;
189*ce95e1b3SDavid du Colombier lastp = p;
190*ce95e1b3SDavid du Colombier return;
191*ce95e1b3SDavid du Colombier }
192*ce95e1b3SDavid du Colombier lastp->link = p;
193*ce95e1b3SDavid du Colombier lastp = p;
194*ce95e1b3SDavid du Colombier }
195*ce95e1b3SDavid du Colombier
196*ce95e1b3SDavid du Colombier void
gargs(Node * n,Node * tn1,Node * tn2)197*ce95e1b3SDavid du Colombier gargs(Node *n, Node *tn1, Node *tn2)
198*ce95e1b3SDavid du Colombier {
199*ce95e1b3SDavid du Colombier long regs;
200*ce95e1b3SDavid du Colombier Node fnxargs[20], *fnxp;
201*ce95e1b3SDavid du Colombier
202*ce95e1b3SDavid du Colombier regs = cursafe;
203*ce95e1b3SDavid du Colombier
204*ce95e1b3SDavid du Colombier fnxp = fnxargs;
205*ce95e1b3SDavid du Colombier garg1(n, tn1, tn2, 0, &fnxp); /* compile fns to temps */
206*ce95e1b3SDavid du Colombier
207*ce95e1b3SDavid du Colombier curarg = 0;
208*ce95e1b3SDavid du Colombier fnxp = fnxargs;
209*ce95e1b3SDavid du Colombier garg1(n, tn1, tn2, 1, &fnxp); /* compile normal args and temps */
210*ce95e1b3SDavid du Colombier
211*ce95e1b3SDavid du Colombier cursafe = regs;
212*ce95e1b3SDavid du Colombier }
213*ce95e1b3SDavid du Colombier
214*ce95e1b3SDavid du Colombier void
garg1(Node * n,Node * tn1,Node * tn2,int f,Node ** fnxp)215*ce95e1b3SDavid du Colombier garg1(Node *n, Node *tn1, Node *tn2, int f, Node **fnxp)
216*ce95e1b3SDavid du Colombier {
217*ce95e1b3SDavid du Colombier Node nod;
218*ce95e1b3SDavid du Colombier
219*ce95e1b3SDavid du Colombier if(n == Z)
220*ce95e1b3SDavid du Colombier return;
221*ce95e1b3SDavid du Colombier if(n->op == OLIST) {
222*ce95e1b3SDavid du Colombier garg1(n->left, tn1, tn2, f, fnxp);
223*ce95e1b3SDavid du Colombier garg1(n->right, tn1, tn2, f, fnxp);
224*ce95e1b3SDavid du Colombier return;
225*ce95e1b3SDavid du Colombier }
226*ce95e1b3SDavid du Colombier if(f == 0) {
227*ce95e1b3SDavid du Colombier if(n->complex >= FNX) {
228*ce95e1b3SDavid du Colombier regsalloc(*fnxp, n);
229*ce95e1b3SDavid du Colombier nod = znode;
230*ce95e1b3SDavid du Colombier nod.op = OAS;
231*ce95e1b3SDavid du Colombier nod.left = *fnxp;
232*ce95e1b3SDavid du Colombier nod.right = n;
233*ce95e1b3SDavid du Colombier nod.type = n->type;
234*ce95e1b3SDavid du Colombier cgen(&nod, Z);
235*ce95e1b3SDavid du Colombier (*fnxp)++;
236*ce95e1b3SDavid du Colombier }
237*ce95e1b3SDavid du Colombier return;
238*ce95e1b3SDavid du Colombier }
239*ce95e1b3SDavid du Colombier if(typecmplx[n->type->etype]) {
240*ce95e1b3SDavid du Colombier regaalloc(tn2, n);
241*ce95e1b3SDavid du Colombier if(n->complex >= FNX) {
242*ce95e1b3SDavid du Colombier sugen(*fnxp, tn2, n->type->width);
243*ce95e1b3SDavid du Colombier (*fnxp)++;
244*ce95e1b3SDavid du Colombier } else
245*ce95e1b3SDavid du Colombier sugen(n, tn2, n->type->width);
246*ce95e1b3SDavid du Colombier return;
247*ce95e1b3SDavid du Colombier }
248*ce95e1b3SDavid du Colombier if(REGARG && curarg == 0 && typeword[n->type->etype]) {
249*ce95e1b3SDavid du Colombier regaalloc1(tn1, n);
250*ce95e1b3SDavid du Colombier if(n->complex >= FNX) {
251*ce95e1b3SDavid du Colombier cgen(*fnxp, tn1);
252*ce95e1b3SDavid du Colombier (*fnxp)++;
253*ce95e1b3SDavid du Colombier } else
254*ce95e1b3SDavid du Colombier cgen(n, tn1);
255*ce95e1b3SDavid du Colombier return;
256*ce95e1b3SDavid du Colombier }
257*ce95e1b3SDavid du Colombier if(vconst(n) == 0) {
258*ce95e1b3SDavid du Colombier regaalloc(tn2, n);
259*ce95e1b3SDavid du Colombier gopcode(OAS, n, Z, tn2);
260*ce95e1b3SDavid du Colombier return;
261*ce95e1b3SDavid du Colombier }
262*ce95e1b3SDavid du Colombier regalloc(tn1, n, Z);
263*ce95e1b3SDavid du Colombier if(n->complex >= FNX) {
264*ce95e1b3SDavid du Colombier cgen(*fnxp, tn1);
265*ce95e1b3SDavid du Colombier (*fnxp)++;
266*ce95e1b3SDavid du Colombier } else
267*ce95e1b3SDavid du Colombier cgen(n, tn1);
268*ce95e1b3SDavid du Colombier regaalloc(tn2, n);
269*ce95e1b3SDavid du Colombier gopcode(OAS, tn1, Z, tn2);
270*ce95e1b3SDavid du Colombier regfree(tn1);
271*ce95e1b3SDavid du Colombier }
272*ce95e1b3SDavid du Colombier
273*ce95e1b3SDavid du Colombier Node*
nodgconst(vlong v,Type * t)274*ce95e1b3SDavid du Colombier nodgconst(vlong v, Type *t)
275*ce95e1b3SDavid du Colombier {
276*ce95e1b3SDavid du Colombier if(!typev[t->etype])
277*ce95e1b3SDavid du Colombier return nodconst((long)v);
278*ce95e1b3SDavid du Colombier vconstnode.vconst = v;
279*ce95e1b3SDavid du Colombier return &vconstnode;
280*ce95e1b3SDavid du Colombier }
281*ce95e1b3SDavid du Colombier
282*ce95e1b3SDavid du Colombier Node*
nodconst(long v)283*ce95e1b3SDavid du Colombier nodconst(long v)
284*ce95e1b3SDavid du Colombier {
285*ce95e1b3SDavid du Colombier constnode.vconst = v;
286*ce95e1b3SDavid du Colombier return &constnode;
287*ce95e1b3SDavid du Colombier }
288*ce95e1b3SDavid du Colombier
289*ce95e1b3SDavid du Colombier Node*
nod32const(vlong v)290*ce95e1b3SDavid du Colombier nod32const(vlong v)
291*ce95e1b3SDavid du Colombier {
292*ce95e1b3SDavid du Colombier constnode.vconst = v & MASK(32);
293*ce95e1b3SDavid du Colombier return &constnode;
294*ce95e1b3SDavid du Colombier }
295*ce95e1b3SDavid du Colombier
296*ce95e1b3SDavid du Colombier Node*
nodfconst(double d)297*ce95e1b3SDavid du Colombier nodfconst(double d)
298*ce95e1b3SDavid du Colombier {
299*ce95e1b3SDavid du Colombier fconstnode.fconst = d;
300*ce95e1b3SDavid du Colombier return &fconstnode;
301*ce95e1b3SDavid du Colombier }
302*ce95e1b3SDavid du Colombier
303*ce95e1b3SDavid du Colombier void
nodreg(Node * n,Node * nn,int reg)304*ce95e1b3SDavid du Colombier nodreg(Node *n, Node *nn, int reg)
305*ce95e1b3SDavid du Colombier {
306*ce95e1b3SDavid du Colombier *n = regnode;
307*ce95e1b3SDavid du Colombier n->reg = reg;
308*ce95e1b3SDavid du Colombier n->type = nn->type;
309*ce95e1b3SDavid du Colombier n->lineno = nn->lineno;
310*ce95e1b3SDavid du Colombier }
311*ce95e1b3SDavid du Colombier
312*ce95e1b3SDavid du Colombier void
regret(Node * n,Node * nn)313*ce95e1b3SDavid du Colombier regret(Node *n, Node *nn)
314*ce95e1b3SDavid du Colombier {
315*ce95e1b3SDavid du Colombier int r;
316*ce95e1b3SDavid du Colombier
317*ce95e1b3SDavid du Colombier r = REGRET;
318*ce95e1b3SDavid du Colombier if(typefd[nn->type->etype])
319*ce95e1b3SDavid du Colombier r = FREGRET+NREG;
320*ce95e1b3SDavid du Colombier nodreg(n, nn, r);
321*ce95e1b3SDavid du Colombier reg[r]++;
322*ce95e1b3SDavid du Colombier }
323*ce95e1b3SDavid du Colombier
324*ce95e1b3SDavid du Colombier int
tmpreg(void)325*ce95e1b3SDavid du Colombier tmpreg(void)
326*ce95e1b3SDavid du Colombier {
327*ce95e1b3SDavid du Colombier int i;
328*ce95e1b3SDavid du Colombier
329*ce95e1b3SDavid du Colombier for(i=REGRET+1; i<REGALLOC; i++)
330*ce95e1b3SDavid du Colombier if(reg[i] == 0)
331*ce95e1b3SDavid du Colombier return i;
332*ce95e1b3SDavid du Colombier diag(Z, "out of fixed registers");
333*ce95e1b3SDavid du Colombier return 0;
334*ce95e1b3SDavid du Colombier }
335*ce95e1b3SDavid du Colombier
336*ce95e1b3SDavid du Colombier void
regalloc(Node * n,Node * tn,Node * o)337*ce95e1b3SDavid du Colombier regalloc(Node *n, Node *tn, Node *o)
338*ce95e1b3SDavid du Colombier {
339*ce95e1b3SDavid du Colombier int i, j;
340*ce95e1b3SDavid du Colombier static int lasti;
341*ce95e1b3SDavid du Colombier
342*ce95e1b3SDavid du Colombier switch(tn->type->etype) {
343*ce95e1b3SDavid du Colombier case TCHAR:
344*ce95e1b3SDavid du Colombier case TUCHAR:
345*ce95e1b3SDavid du Colombier case TSHORT:
346*ce95e1b3SDavid du Colombier case TUSHORT:
347*ce95e1b3SDavid du Colombier case TINT:
348*ce95e1b3SDavid du Colombier case TUINT:
349*ce95e1b3SDavid du Colombier case TLONG:
350*ce95e1b3SDavid du Colombier case TULONG:
351*ce95e1b3SDavid du Colombier case TVLONG:
352*ce95e1b3SDavid du Colombier case TUVLONG:
353*ce95e1b3SDavid du Colombier case TIND:
354*ce95e1b3SDavid du Colombier if(o != Z && o->op == OREGISTER) {
355*ce95e1b3SDavid du Colombier i = o->reg;
356*ce95e1b3SDavid du Colombier if(i > 0 && i < NREG)
357*ce95e1b3SDavid du Colombier goto out;
358*ce95e1b3SDavid du Colombier }
359*ce95e1b3SDavid du Colombier j = lasti + REGRET+1;
360*ce95e1b3SDavid du Colombier for(i=REGRET+1; i<=REGALLOC; i++) {
361*ce95e1b3SDavid du Colombier if(j > REGALLOC)
362*ce95e1b3SDavid du Colombier j = REGRET+1;
363*ce95e1b3SDavid du Colombier if(reg[j] == 0) {
364*ce95e1b3SDavid du Colombier i = j;
365*ce95e1b3SDavid du Colombier goto out0;
366*ce95e1b3SDavid du Colombier }
367*ce95e1b3SDavid du Colombier j++;
368*ce95e1b3SDavid du Colombier }
369*ce95e1b3SDavid du Colombier diag(tn, "out of fixed registers");
370*ce95e1b3SDavid du Colombier goto err;
371*ce95e1b3SDavid du Colombier
372*ce95e1b3SDavid du Colombier case TFLOAT:
373*ce95e1b3SDavid du Colombier case TDOUBLE:
374*ce95e1b3SDavid du Colombier if(o != Z && o->op == OREGISTER) {
375*ce95e1b3SDavid du Colombier i = o->reg;
376*ce95e1b3SDavid du Colombier if(i >= NREG && i < NREG+NREG)
377*ce95e1b3SDavid du Colombier goto out;
378*ce95e1b3SDavid du Colombier }
379*ce95e1b3SDavid du Colombier for(j=NREG; j<NREG+16; j++) {
380*ce95e1b3SDavid du Colombier if(reg[j] == 0) {
381*ce95e1b3SDavid du Colombier i = j;
382*ce95e1b3SDavid du Colombier goto out;
383*ce95e1b3SDavid du Colombier }
384*ce95e1b3SDavid du Colombier }
385*ce95e1b3SDavid du Colombier diag(tn, "out of float registers");
386*ce95e1b3SDavid du Colombier goto err;
387*ce95e1b3SDavid du Colombier }
388*ce95e1b3SDavid du Colombier diag(tn, "unknown type in regalloc: %T", tn->type);
389*ce95e1b3SDavid du Colombier err:
390*ce95e1b3SDavid du Colombier nodreg(n, tn, 0);
391*ce95e1b3SDavid du Colombier return;
392*ce95e1b3SDavid du Colombier out0:
393*ce95e1b3SDavid du Colombier lasti++;
394*ce95e1b3SDavid du Colombier if(lasti >= 5)
395*ce95e1b3SDavid du Colombier lasti = 0;
396*ce95e1b3SDavid du Colombier out:
397*ce95e1b3SDavid du Colombier reg[i]++;
398*ce95e1b3SDavid du Colombier nodreg(n, tn, i);
399*ce95e1b3SDavid du Colombier }
400*ce95e1b3SDavid du Colombier
401*ce95e1b3SDavid du Colombier void
regialloc(Node * n,Node * tn,Node * o)402*ce95e1b3SDavid du Colombier regialloc(Node *n, Node *tn, Node *o)
403*ce95e1b3SDavid du Colombier {
404*ce95e1b3SDavid du Colombier Node nod;
405*ce95e1b3SDavid du Colombier
406*ce95e1b3SDavid du Colombier nod = *tn;
407*ce95e1b3SDavid du Colombier nod.type = types[TIND];
408*ce95e1b3SDavid du Colombier regalloc(n, &nod, o);
409*ce95e1b3SDavid du Colombier }
410*ce95e1b3SDavid du Colombier
411*ce95e1b3SDavid du Colombier void
regfree(Node * n)412*ce95e1b3SDavid du Colombier regfree(Node *n)
413*ce95e1b3SDavid du Colombier {
414*ce95e1b3SDavid du Colombier int i;
415*ce95e1b3SDavid du Colombier
416*ce95e1b3SDavid du Colombier i = 0;
417*ce95e1b3SDavid du Colombier if(n->op != OREGISTER && n->op != OINDREG)
418*ce95e1b3SDavid du Colombier goto err;
419*ce95e1b3SDavid du Colombier i = n->reg;
420*ce95e1b3SDavid du Colombier if(i < 0 || i >= sizeof(reg))
421*ce95e1b3SDavid du Colombier goto err;
422*ce95e1b3SDavid du Colombier if(reg[i] <= 0)
423*ce95e1b3SDavid du Colombier goto err;
424*ce95e1b3SDavid du Colombier reg[i]--;
425*ce95e1b3SDavid du Colombier return;
426*ce95e1b3SDavid du Colombier err:
427*ce95e1b3SDavid du Colombier diag(n, "error in regfree: %d", i);
428*ce95e1b3SDavid du Colombier }
429*ce95e1b3SDavid du Colombier
430*ce95e1b3SDavid du Colombier void
regsalloc(Node * n,Node * nn)431*ce95e1b3SDavid du Colombier regsalloc(Node *n, Node *nn)
432*ce95e1b3SDavid du Colombier {
433*ce95e1b3SDavid du Colombier cursafe = align(cursafe + stkoff, nn->type, Aaut3) - stkoff;
434*ce95e1b3SDavid du Colombier maxargsafe = maxround(maxargsafe, cursafe+curarg);
435*ce95e1b3SDavid du Colombier *n = *nodsafe;
436*ce95e1b3SDavid du Colombier n->xoffset = -(stkoff + cursafe);
437*ce95e1b3SDavid du Colombier n->type = nn->type;
438*ce95e1b3SDavid du Colombier n->etype = nn->type->etype;
439*ce95e1b3SDavid du Colombier n->lineno = nn->lineno;
440*ce95e1b3SDavid du Colombier }
441*ce95e1b3SDavid du Colombier
442*ce95e1b3SDavid du Colombier void
regaalloc1(Node * n,Node * nn)443*ce95e1b3SDavid du Colombier regaalloc1(Node *n, Node *nn)
444*ce95e1b3SDavid du Colombier {
445*ce95e1b3SDavid du Colombier nodreg(n, nn, REGARG);
446*ce95e1b3SDavid du Colombier reg[REGARG]++;
447*ce95e1b3SDavid du Colombier curarg = align(curarg, nn->type, Aarg1);
448*ce95e1b3SDavid du Colombier curarg = align(curarg, nn->type, Aarg2);
449*ce95e1b3SDavid du Colombier maxargsafe = maxround(maxargsafe, cursafe+curarg);
450*ce95e1b3SDavid du Colombier }
451*ce95e1b3SDavid du Colombier
452*ce95e1b3SDavid du Colombier void
regaalloc(Node * n,Node * nn)453*ce95e1b3SDavid du Colombier regaalloc(Node *n, Node *nn)
454*ce95e1b3SDavid du Colombier {
455*ce95e1b3SDavid du Colombier curarg = align(curarg, nn->type, Aarg1);
456*ce95e1b3SDavid du Colombier *n = *nn;
457*ce95e1b3SDavid du Colombier n->op = OINDREG;
458*ce95e1b3SDavid du Colombier n->reg = REGSP;
459*ce95e1b3SDavid du Colombier n->xoffset = curarg + ewidth[TIND];
460*ce95e1b3SDavid du Colombier n->complex = 0;
461*ce95e1b3SDavid du Colombier n->addable = 20;
462*ce95e1b3SDavid du Colombier curarg = align(curarg, nn->type, Aarg2);
463*ce95e1b3SDavid du Colombier maxargsafe = maxround(maxargsafe, cursafe+curarg);
464*ce95e1b3SDavid du Colombier }
465*ce95e1b3SDavid du Colombier
466*ce95e1b3SDavid du Colombier void
regind(Node * n,Node * nn)467*ce95e1b3SDavid du Colombier regind(Node *n, Node *nn)
468*ce95e1b3SDavid du Colombier {
469*ce95e1b3SDavid du Colombier
470*ce95e1b3SDavid du Colombier if(n->op != OREGISTER) {
471*ce95e1b3SDavid du Colombier diag(n, "regind not OREGISTER");
472*ce95e1b3SDavid du Colombier return;
473*ce95e1b3SDavid du Colombier }
474*ce95e1b3SDavid du Colombier n->op = OINDREG;
475*ce95e1b3SDavid du Colombier n->type = nn->type;
476*ce95e1b3SDavid du Colombier }
477*ce95e1b3SDavid du Colombier
478*ce95e1b3SDavid du Colombier void
raddr(Node * n,Prog * p)479*ce95e1b3SDavid du Colombier raddr(Node *n, Prog *p)
480*ce95e1b3SDavid du Colombier {
481*ce95e1b3SDavid du Colombier Adr a;
482*ce95e1b3SDavid du Colombier
483*ce95e1b3SDavid du Colombier naddr(n, &a);
484*ce95e1b3SDavid du Colombier if(a.type == D_CONST && a.offset == 0) {
485*ce95e1b3SDavid du Colombier a.type = D_REG;
486*ce95e1b3SDavid du Colombier a.reg = 0;
487*ce95e1b3SDavid du Colombier }
488*ce95e1b3SDavid du Colombier if(a.type != D_REG && a.type != D_FREG) {
489*ce95e1b3SDavid du Colombier if(n)
490*ce95e1b3SDavid du Colombier diag(n, "bad in raddr: %O", n->op);
491*ce95e1b3SDavid du Colombier else
492*ce95e1b3SDavid du Colombier diag(n, "bad in raddr: <null>");
493*ce95e1b3SDavid du Colombier p->reg = NREG;
494*ce95e1b3SDavid du Colombier } else
495*ce95e1b3SDavid du Colombier p->reg = a.reg;
496*ce95e1b3SDavid du Colombier }
497*ce95e1b3SDavid du Colombier
498*ce95e1b3SDavid du Colombier void
naddr(Node * n,Adr * a)499*ce95e1b3SDavid du Colombier naddr(Node *n, Adr *a)
500*ce95e1b3SDavid du Colombier {
501*ce95e1b3SDavid du Colombier long v;
502*ce95e1b3SDavid du Colombier
503*ce95e1b3SDavid du Colombier a->type = D_NONE;
504*ce95e1b3SDavid du Colombier if(n == Z)
505*ce95e1b3SDavid du Colombier return;
506*ce95e1b3SDavid du Colombier switch(n->op) {
507*ce95e1b3SDavid du Colombier default:
508*ce95e1b3SDavid du Colombier bad:
509*ce95e1b3SDavid du Colombier diag(n, "bad in naddr: %O", n->op);
510*ce95e1b3SDavid du Colombier break;
511*ce95e1b3SDavid du Colombier
512*ce95e1b3SDavid du Colombier case OREGISTER:
513*ce95e1b3SDavid du Colombier a->type = D_REG;
514*ce95e1b3SDavid du Colombier a->sym = S;
515*ce95e1b3SDavid du Colombier a->reg = n->reg;
516*ce95e1b3SDavid du Colombier if(a->reg >= NREG) {
517*ce95e1b3SDavid du Colombier a->type = D_FREG;
518*ce95e1b3SDavid du Colombier a->reg -= NREG;
519*ce95e1b3SDavid du Colombier }
520*ce95e1b3SDavid du Colombier break;
521*ce95e1b3SDavid du Colombier
522*ce95e1b3SDavid du Colombier case OIND:
523*ce95e1b3SDavid du Colombier naddr(n->left, a);
524*ce95e1b3SDavid du Colombier if(a->type == D_REG) {
525*ce95e1b3SDavid du Colombier a->type = D_OREG;
526*ce95e1b3SDavid du Colombier break;
527*ce95e1b3SDavid du Colombier }
528*ce95e1b3SDavid du Colombier if(a->type == D_CONST) {
529*ce95e1b3SDavid du Colombier a->type = D_OREG;
530*ce95e1b3SDavid du Colombier break;
531*ce95e1b3SDavid du Colombier }
532*ce95e1b3SDavid du Colombier goto bad;
533*ce95e1b3SDavid du Colombier
534*ce95e1b3SDavid du Colombier case OINDREG:
535*ce95e1b3SDavid du Colombier a->type = D_OREG;
536*ce95e1b3SDavid du Colombier a->sym = S;
537*ce95e1b3SDavid du Colombier a->offset = n->xoffset;
538*ce95e1b3SDavid du Colombier a->reg = n->reg;
539*ce95e1b3SDavid du Colombier break;
540*ce95e1b3SDavid du Colombier
541*ce95e1b3SDavid du Colombier case ONAME:
542*ce95e1b3SDavid du Colombier a->etype = n->etype;
543*ce95e1b3SDavid du Colombier a->type = D_OREG;
544*ce95e1b3SDavid du Colombier a->name = D_STATIC;
545*ce95e1b3SDavid du Colombier a->sym = n->sym;
546*ce95e1b3SDavid du Colombier a->offset = n->xoffset;
547*ce95e1b3SDavid du Colombier if(n->class == CSTATIC)
548*ce95e1b3SDavid du Colombier break;
549*ce95e1b3SDavid du Colombier if(n->class == CEXTERN || n->class == CGLOBL) {
550*ce95e1b3SDavid du Colombier a->name = D_EXTERN;
551*ce95e1b3SDavid du Colombier break;
552*ce95e1b3SDavid du Colombier }
553*ce95e1b3SDavid du Colombier if(n->class == CAUTO) {
554*ce95e1b3SDavid du Colombier a->name = D_AUTO;
555*ce95e1b3SDavid du Colombier break;
556*ce95e1b3SDavid du Colombier }
557*ce95e1b3SDavid du Colombier if(n->class == CPARAM) {
558*ce95e1b3SDavid du Colombier a->name = D_PARAM;
559*ce95e1b3SDavid du Colombier break;
560*ce95e1b3SDavid du Colombier }
561*ce95e1b3SDavid du Colombier goto bad;
562*ce95e1b3SDavid du Colombier
563*ce95e1b3SDavid du Colombier case OCONST:
564*ce95e1b3SDavid du Colombier a->sym = S;
565*ce95e1b3SDavid du Colombier a->reg = NREG;
566*ce95e1b3SDavid du Colombier if(typefd[n->type->etype]) {
567*ce95e1b3SDavid du Colombier a->type = D_FCONST;
568*ce95e1b3SDavid du Colombier a->dval = n->fconst;
569*ce95e1b3SDavid du Colombier } else {
570*ce95e1b3SDavid du Colombier v = (long)n->vconst;
571*ce95e1b3SDavid du Colombier if(thechar == 'j' && (vlong)v != n->vconst) {
572*ce95e1b3SDavid du Colombier a->type = D_VCONST;
573*ce95e1b3SDavid du Colombier *(vlong*)a->sval = n->vconst;
574*ce95e1b3SDavid du Colombier } else {
575*ce95e1b3SDavid du Colombier a->type = D_CONST;
576*ce95e1b3SDavid du Colombier a->offset = n->vconst;
577*ce95e1b3SDavid du Colombier }
578*ce95e1b3SDavid du Colombier }
579*ce95e1b3SDavid du Colombier break;
580*ce95e1b3SDavid du Colombier
581*ce95e1b3SDavid du Colombier case OADDR:
582*ce95e1b3SDavid du Colombier naddr(n->left, a);
583*ce95e1b3SDavid du Colombier if(a->type == D_OREG) {
584*ce95e1b3SDavid du Colombier a->type = D_CONST;
585*ce95e1b3SDavid du Colombier break;
586*ce95e1b3SDavid du Colombier }
587*ce95e1b3SDavid du Colombier goto bad;
588*ce95e1b3SDavid du Colombier
589*ce95e1b3SDavid du Colombier case OADD:
590*ce95e1b3SDavid du Colombier if(n->left->op == OCONST) {
591*ce95e1b3SDavid du Colombier naddr(n->left, a);
592*ce95e1b3SDavid du Colombier v = a->offset;
593*ce95e1b3SDavid du Colombier naddr(n->right, a);
594*ce95e1b3SDavid du Colombier } else {
595*ce95e1b3SDavid du Colombier naddr(n->right, a);
596*ce95e1b3SDavid du Colombier v = a->offset;
597*ce95e1b3SDavid du Colombier naddr(n->left, a);
598*ce95e1b3SDavid du Colombier }
599*ce95e1b3SDavid du Colombier a->offset += v;
600*ce95e1b3SDavid du Colombier break;
601*ce95e1b3SDavid du Colombier
602*ce95e1b3SDavid du Colombier }
603*ce95e1b3SDavid du Colombier }
604*ce95e1b3SDavid du Colombier
605*ce95e1b3SDavid du Colombier void
fop(int as,int f1,int f2,Node * t)606*ce95e1b3SDavid du Colombier fop(int as, int f1, int f2, Node *t)
607*ce95e1b3SDavid du Colombier {
608*ce95e1b3SDavid du Colombier Node nod1, nod2, nod3;
609*ce95e1b3SDavid du Colombier
610*ce95e1b3SDavid du Colombier nodreg(&nod1, t, NREG+f1);
611*ce95e1b3SDavid du Colombier nodreg(&nod2, t, NREG+f2);
612*ce95e1b3SDavid du Colombier regalloc(&nod3, t, t);
613*ce95e1b3SDavid du Colombier gopcode(as, &nod1, &nod2, &nod3);
614*ce95e1b3SDavid du Colombier gmove(&nod3, t);
615*ce95e1b3SDavid du Colombier regfree(&nod3);
616*ce95e1b3SDavid du Colombier }
617*ce95e1b3SDavid du Colombier
618*ce95e1b3SDavid du Colombier void
gmove(Node * f,Node * t)619*ce95e1b3SDavid du Colombier gmove(Node *f, Node *t)
620*ce95e1b3SDavid du Colombier {
621*ce95e1b3SDavid du Colombier int ft, tt, a;
622*ce95e1b3SDavid du Colombier Node nod;
623*ce95e1b3SDavid du Colombier double d;
624*ce95e1b3SDavid du Colombier
625*ce95e1b3SDavid du Colombier ft = f->type->etype;
626*ce95e1b3SDavid du Colombier tt = t->type->etype;
627*ce95e1b3SDavid du Colombier
628*ce95e1b3SDavid du Colombier if(debug['O'])
629*ce95e1b3SDavid du Colombier print("gmove: %O[%T],%O[%T]\n",
630*ce95e1b3SDavid du Colombier f->op, f->type, t->op, t->type);
631*ce95e1b3SDavid du Colombier if(ft == TDOUBLE && f->op == OCONST) {
632*ce95e1b3SDavid du Colombier d = f->fconst;
633*ce95e1b3SDavid du Colombier if(d == 0) {
634*ce95e1b3SDavid du Colombier a = FREGZERO;
635*ce95e1b3SDavid du Colombier goto ffreg;
636*ce95e1b3SDavid du Colombier }
637*ce95e1b3SDavid du Colombier if(d == 0.5) {
638*ce95e1b3SDavid du Colombier a = FREGHALF;
639*ce95e1b3SDavid du Colombier goto ffreg;
640*ce95e1b3SDavid du Colombier }
641*ce95e1b3SDavid du Colombier if(d == 1.0) {
642*ce95e1b3SDavid du Colombier a = FREGONE;
643*ce95e1b3SDavid du Colombier goto ffreg;
644*ce95e1b3SDavid du Colombier }
645*ce95e1b3SDavid du Colombier if(d == 2.0) {
646*ce95e1b3SDavid du Colombier a = FREGTWO;
647*ce95e1b3SDavid du Colombier goto ffreg;
648*ce95e1b3SDavid du Colombier }
649*ce95e1b3SDavid du Colombier if(d == -.5) {
650*ce95e1b3SDavid du Colombier fop(OSUB, FREGHALF, FREGZERO, t);
651*ce95e1b3SDavid du Colombier return;
652*ce95e1b3SDavid du Colombier }
653*ce95e1b3SDavid du Colombier if(d == -1.0) {
654*ce95e1b3SDavid du Colombier fop(OSUB, FREGONE, FREGZERO, t);
655*ce95e1b3SDavid du Colombier return;
656*ce95e1b3SDavid du Colombier }
657*ce95e1b3SDavid du Colombier if(d == -2.0) {
658*ce95e1b3SDavid du Colombier fop(OSUB, FREGTWO, FREGZERO, t);
659*ce95e1b3SDavid du Colombier return;
660*ce95e1b3SDavid du Colombier }
661*ce95e1b3SDavid du Colombier if(d == 1.5) {
662*ce95e1b3SDavid du Colombier fop(OADD, FREGONE, FREGHALF, t);
663*ce95e1b3SDavid du Colombier return;
664*ce95e1b3SDavid du Colombier }
665*ce95e1b3SDavid du Colombier if(d == 2.5) {
666*ce95e1b3SDavid du Colombier fop(OADD, FREGTWO, FREGHALF, t);
667*ce95e1b3SDavid du Colombier return;
668*ce95e1b3SDavid du Colombier }
669*ce95e1b3SDavid du Colombier if(d == 3.0) {
670*ce95e1b3SDavid du Colombier fop(OADD, FREGTWO, FREGONE, t);
671*ce95e1b3SDavid du Colombier return;
672*ce95e1b3SDavid du Colombier }
673*ce95e1b3SDavid du Colombier }
674*ce95e1b3SDavid du Colombier if(ft == TFLOAT && f->op == OCONST) {
675*ce95e1b3SDavid du Colombier d = f->fconst;
676*ce95e1b3SDavid du Colombier if(d == 0) {
677*ce95e1b3SDavid du Colombier a = FREGZERO;
678*ce95e1b3SDavid du Colombier ffreg:
679*ce95e1b3SDavid du Colombier nodreg(&nod, f, NREG+a);
680*ce95e1b3SDavid du Colombier gmove(&nod, t);
681*ce95e1b3SDavid du Colombier return;
682*ce95e1b3SDavid du Colombier }
683*ce95e1b3SDavid du Colombier }
684*ce95e1b3SDavid du Colombier
685*ce95e1b3SDavid du Colombier /*
686*ce95e1b3SDavid du Colombier * a load --
687*ce95e1b3SDavid du Colombier * put it into a register then
688*ce95e1b3SDavid du Colombier * worry what to do with it.
689*ce95e1b3SDavid du Colombier */
690*ce95e1b3SDavid du Colombier if(f->op == ONAME || f->op == OINDREG || f->op == OIND) {
691*ce95e1b3SDavid du Colombier switch(ft) {
692*ce95e1b3SDavid du Colombier default:
693*ce95e1b3SDavid du Colombier a = AMOV;
694*ce95e1b3SDavid du Colombier break;
695*ce95e1b3SDavid du Colombier case TFLOAT:
696*ce95e1b3SDavid du Colombier a = AMOVF;
697*ce95e1b3SDavid du Colombier break;
698*ce95e1b3SDavid du Colombier case TDOUBLE:
699*ce95e1b3SDavid du Colombier a = AMOVD;
700*ce95e1b3SDavid du Colombier break;
701*ce95e1b3SDavid du Colombier case TCHAR:
702*ce95e1b3SDavid du Colombier a = AMOVB;
703*ce95e1b3SDavid du Colombier break;
704*ce95e1b3SDavid du Colombier case TUCHAR:
705*ce95e1b3SDavid du Colombier a = AMOVBU;
706*ce95e1b3SDavid du Colombier break;
707*ce95e1b3SDavid du Colombier case TSHORT:
708*ce95e1b3SDavid du Colombier a = AMOVH;
709*ce95e1b3SDavid du Colombier break;
710*ce95e1b3SDavid du Colombier case TUSHORT:
711*ce95e1b3SDavid du Colombier a = AMOVHU;
712*ce95e1b3SDavid du Colombier break;
713*ce95e1b3SDavid du Colombier case TINT:
714*ce95e1b3SDavid du Colombier case TLONG:
715*ce95e1b3SDavid du Colombier a = AMOVW;
716*ce95e1b3SDavid du Colombier break;
717*ce95e1b3SDavid du Colombier case TUINT:
718*ce95e1b3SDavid du Colombier case TULONG:
719*ce95e1b3SDavid du Colombier a = AMOVW; /* sic */
720*ce95e1b3SDavid du Colombier break;
721*ce95e1b3SDavid du Colombier case TIND:
722*ce95e1b3SDavid du Colombier a = thechar == 'j' ? AMOV : AMOVW;
723*ce95e1b3SDavid du Colombier break;
724*ce95e1b3SDavid du Colombier }
725*ce95e1b3SDavid du Colombier if(typechlp[ft] && typeilp[tt])
726*ce95e1b3SDavid du Colombier regalloc(&nod, t, t);
727*ce95e1b3SDavid du Colombier else
728*ce95e1b3SDavid du Colombier regalloc(&nod, f, t);
729*ce95e1b3SDavid du Colombier gins(a, f, &nod);
730*ce95e1b3SDavid du Colombier gmove(&nod, t);
731*ce95e1b3SDavid du Colombier regfree(&nod);
732*ce95e1b3SDavid du Colombier return;
733*ce95e1b3SDavid du Colombier }
734*ce95e1b3SDavid du Colombier
735*ce95e1b3SDavid du Colombier /*
736*ce95e1b3SDavid du Colombier * a store --
737*ce95e1b3SDavid du Colombier * put it into a register then
738*ce95e1b3SDavid du Colombier * store it.
739*ce95e1b3SDavid du Colombier */
740*ce95e1b3SDavid du Colombier if(t->op == ONAME || t->op == OINDREG || t->op == OIND) {
741*ce95e1b3SDavid du Colombier switch(tt) {
742*ce95e1b3SDavid du Colombier default:
743*ce95e1b3SDavid du Colombier a = AMOVW;
744*ce95e1b3SDavid du Colombier break;
745*ce95e1b3SDavid du Colombier case TUCHAR:
746*ce95e1b3SDavid du Colombier if(!debug['N'] || debug['R'] || debug['P']){
747*ce95e1b3SDavid du Colombier a = AMOVBU;
748*ce95e1b3SDavid du Colombier break;
749*ce95e1b3SDavid du Colombier }
750*ce95e1b3SDavid du Colombier case TCHAR:
751*ce95e1b3SDavid du Colombier a = AMOVB;
752*ce95e1b3SDavid du Colombier break;
753*ce95e1b3SDavid du Colombier case TUSHORT:
754*ce95e1b3SDavid du Colombier if(!debug['N'] || debug['R'] || debug['P']){
755*ce95e1b3SDavid du Colombier a = AMOVHU;
756*ce95e1b3SDavid du Colombier break;
757*ce95e1b3SDavid du Colombier }
758*ce95e1b3SDavid du Colombier case TSHORT:
759*ce95e1b3SDavid du Colombier a = AMOVH;
760*ce95e1b3SDavid du Colombier break;
761*ce95e1b3SDavid du Colombier case TFLOAT:
762*ce95e1b3SDavid du Colombier a = AMOVF;
763*ce95e1b3SDavid du Colombier break;
764*ce95e1b3SDavid du Colombier case TDOUBLE:
765*ce95e1b3SDavid du Colombier a = AMOVD;
766*ce95e1b3SDavid du Colombier break;
767*ce95e1b3SDavid du Colombier case TVLONG:
768*ce95e1b3SDavid du Colombier case TUVLONG:
769*ce95e1b3SDavid du Colombier a = AMOV;
770*ce95e1b3SDavid du Colombier break;
771*ce95e1b3SDavid du Colombier case TIND:
772*ce95e1b3SDavid du Colombier a = thechar == 'j' ? AMOV : AMOVW;
773*ce95e1b3SDavid du Colombier break;
774*ce95e1b3SDavid du Colombier }
775*ce95e1b3SDavid du Colombier if(!typefd[ft] && vconst(f) == 0) {
776*ce95e1b3SDavid du Colombier #ifdef notyet
777*ce95e1b3SDavid du Colombier nodreg(&nod, f, REGZERO);
778*ce95e1b3SDavid du Colombier gins(a, &nod, t);
779*ce95e1b3SDavid du Colombier #else
780*ce95e1b3SDavid du Colombier gins(a, f, t);
781*ce95e1b3SDavid du Colombier #endif
782*ce95e1b3SDavid du Colombier return;
783*ce95e1b3SDavid du Colombier }
784*ce95e1b3SDavid du Colombier if(ft == tt)
785*ce95e1b3SDavid du Colombier regalloc(&nod, t, f);
786*ce95e1b3SDavid du Colombier else
787*ce95e1b3SDavid du Colombier regalloc(&nod, t, Z);
788*ce95e1b3SDavid du Colombier gmove(f, &nod);
789*ce95e1b3SDavid du Colombier gins(a, &nod, t);
790*ce95e1b3SDavid du Colombier regfree(&nod);
791*ce95e1b3SDavid du Colombier return;
792*ce95e1b3SDavid du Colombier }
793*ce95e1b3SDavid du Colombier
794*ce95e1b3SDavid du Colombier /*
795*ce95e1b3SDavid du Colombier * type x type cross table
796*ce95e1b3SDavid du Colombier */
797*ce95e1b3SDavid du Colombier a = AGOK;
798*ce95e1b3SDavid du Colombier switch(ft) {
799*ce95e1b3SDavid du Colombier case TDOUBLE:
800*ce95e1b3SDavid du Colombier case TFLOAT:
801*ce95e1b3SDavid du Colombier switch(tt) {
802*ce95e1b3SDavid du Colombier case TDOUBLE:
803*ce95e1b3SDavid du Colombier a = AMOVD;
804*ce95e1b3SDavid du Colombier if(ft == TFLOAT)
805*ce95e1b3SDavid du Colombier a = AMOVFD;
806*ce95e1b3SDavid du Colombier break;
807*ce95e1b3SDavid du Colombier case TFLOAT:
808*ce95e1b3SDavid du Colombier a = AMOVDF;
809*ce95e1b3SDavid du Colombier if(ft == TFLOAT)
810*ce95e1b3SDavid du Colombier a = AMOVF;
811*ce95e1b3SDavid du Colombier break;
812*ce95e1b3SDavid du Colombier case TVLONG:
813*ce95e1b3SDavid du Colombier case TUVLONG:
814*ce95e1b3SDavid du Colombier a = AMOVDV;
815*ce95e1b3SDavid du Colombier if(ft == TFLOAT)
816*ce95e1b3SDavid du Colombier a = AMOVFV;
817*ce95e1b3SDavid du Colombier break;
818*ce95e1b3SDavid du Colombier case TINT:
819*ce95e1b3SDavid du Colombier case TUINT:
820*ce95e1b3SDavid du Colombier case TLONG:
821*ce95e1b3SDavid du Colombier case TULONG:
822*ce95e1b3SDavid du Colombier case TIND:
823*ce95e1b3SDavid du Colombier case TSHORT:
824*ce95e1b3SDavid du Colombier case TUSHORT:
825*ce95e1b3SDavid du Colombier case TCHAR:
826*ce95e1b3SDavid du Colombier case TUCHAR:
827*ce95e1b3SDavid du Colombier a = AMOVDW;
828*ce95e1b3SDavid du Colombier if(ft == TFLOAT)
829*ce95e1b3SDavid du Colombier a = AMOVFW;
830*ce95e1b3SDavid du Colombier break;
831*ce95e1b3SDavid du Colombier }
832*ce95e1b3SDavid du Colombier break;
833*ce95e1b3SDavid du Colombier
834*ce95e1b3SDavid du Colombier case TVLONG:
835*ce95e1b3SDavid du Colombier case TUVLONG:
836*ce95e1b3SDavid du Colombier fvlong:
837*ce95e1b3SDavid du Colombier switch(tt) {
838*ce95e1b3SDavid du Colombier case TDOUBLE:
839*ce95e1b3SDavid du Colombier a = ft == TUVLONG ? AMOVUVD : AMOVVD;
840*ce95e1b3SDavid du Colombier break;
841*ce95e1b3SDavid du Colombier case TFLOAT:
842*ce95e1b3SDavid du Colombier a = ft == TUVLONG ? AMOVUVF : AMOVVF;
843*ce95e1b3SDavid du Colombier break;
844*ce95e1b3SDavid du Colombier case TVLONG:
845*ce95e1b3SDavid du Colombier case TUVLONG:
846*ce95e1b3SDavid du Colombier case TIND:
847*ce95e1b3SDavid du Colombier a = AMOV;
848*ce95e1b3SDavid du Colombier break;
849*ce95e1b3SDavid du Colombier case TINT:
850*ce95e1b3SDavid du Colombier case TUINT:
851*ce95e1b3SDavid du Colombier case TLONG:
852*ce95e1b3SDavid du Colombier case TULONG:
853*ce95e1b3SDavid du Colombier case TSHORT:
854*ce95e1b3SDavid du Colombier case TUSHORT:
855*ce95e1b3SDavid du Colombier case TCHAR:
856*ce95e1b3SDavid du Colombier case TUCHAR:
857*ce95e1b3SDavid du Colombier a = AMOVW;
858*ce95e1b3SDavid du Colombier break;
859*ce95e1b3SDavid du Colombier }
860*ce95e1b3SDavid du Colombier break;
861*ce95e1b3SDavid du Colombier
862*ce95e1b3SDavid du Colombier case TINT:
863*ce95e1b3SDavid du Colombier case TLONG:
864*ce95e1b3SDavid du Colombier switch(tt) {
865*ce95e1b3SDavid du Colombier case TDOUBLE:
866*ce95e1b3SDavid du Colombier gins(AMOVWD, f, t);
867*ce95e1b3SDavid du Colombier return;
868*ce95e1b3SDavid du Colombier case TFLOAT:
869*ce95e1b3SDavid du Colombier gins(AMOVWF, f, t);
870*ce95e1b3SDavid du Colombier return;
871*ce95e1b3SDavid du Colombier case TVLONG:
872*ce95e1b3SDavid du Colombier case TUVLONG:
873*ce95e1b3SDavid du Colombier a = AMOVW;
874*ce95e1b3SDavid du Colombier break;
875*ce95e1b3SDavid du Colombier case TINT:
876*ce95e1b3SDavid du Colombier case TUINT:
877*ce95e1b3SDavid du Colombier case TLONG:
878*ce95e1b3SDavid du Colombier case TULONG:
879*ce95e1b3SDavid du Colombier case TIND:
880*ce95e1b3SDavid du Colombier case TSHORT:
881*ce95e1b3SDavid du Colombier case TUSHORT:
882*ce95e1b3SDavid du Colombier case TCHAR:
883*ce95e1b3SDavid du Colombier case TUCHAR:
884*ce95e1b3SDavid du Colombier a = AMOV;
885*ce95e1b3SDavid du Colombier break;
886*ce95e1b3SDavid du Colombier }
887*ce95e1b3SDavid du Colombier break;
888*ce95e1b3SDavid du Colombier
889*ce95e1b3SDavid du Colombier case TIND:
890*ce95e1b3SDavid du Colombier if(thechar == 'j')
891*ce95e1b3SDavid du Colombier goto fvlong;
892*ce95e1b3SDavid du Colombier /* fall through */
893*ce95e1b3SDavid du Colombier case TUINT:
894*ce95e1b3SDavid du Colombier case TULONG:
895*ce95e1b3SDavid du Colombier switch(tt) {
896*ce95e1b3SDavid du Colombier case TDOUBLE:
897*ce95e1b3SDavid du Colombier gins(AMOVUD, f, t);
898*ce95e1b3SDavid du Colombier return;
899*ce95e1b3SDavid du Colombier case TFLOAT:
900*ce95e1b3SDavid du Colombier gins(AMOVUF, f, t);
901*ce95e1b3SDavid du Colombier return;
902*ce95e1b3SDavid du Colombier case TVLONG:
903*ce95e1b3SDavid du Colombier case TUVLONG:
904*ce95e1b3SDavid du Colombier a = AMOVWU;
905*ce95e1b3SDavid du Colombier break;
906*ce95e1b3SDavid du Colombier case TINT:
907*ce95e1b3SDavid du Colombier case TUINT:
908*ce95e1b3SDavid du Colombier case TLONG:
909*ce95e1b3SDavid du Colombier case TULONG:
910*ce95e1b3SDavid du Colombier case TIND:
911*ce95e1b3SDavid du Colombier case TSHORT:
912*ce95e1b3SDavid du Colombier case TUSHORT:
913*ce95e1b3SDavid du Colombier case TCHAR:
914*ce95e1b3SDavid du Colombier case TUCHAR:
915*ce95e1b3SDavid du Colombier if(thechar == 'j' && f->op == OCONST)
916*ce95e1b3SDavid du Colombier a = AMOVW;
917*ce95e1b3SDavid du Colombier else
918*ce95e1b3SDavid du Colombier a = AMOV;
919*ce95e1b3SDavid du Colombier break;
920*ce95e1b3SDavid du Colombier }
921*ce95e1b3SDavid du Colombier break;
922*ce95e1b3SDavid du Colombier
923*ce95e1b3SDavid du Colombier case TSHORT:
924*ce95e1b3SDavid du Colombier switch(tt) {
925*ce95e1b3SDavid du Colombier case TDOUBLE:
926*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
927*ce95e1b3SDavid du Colombier gins(AMOVH, f, &nod);
928*ce95e1b3SDavid du Colombier gins(AMOVWD, &nod, t);
929*ce95e1b3SDavid du Colombier regfree(&nod);
930*ce95e1b3SDavid du Colombier return;
931*ce95e1b3SDavid du Colombier case TFLOAT:
932*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
933*ce95e1b3SDavid du Colombier gins(AMOVH, f, &nod);
934*ce95e1b3SDavid du Colombier gins(AMOVWF, &nod, t);
935*ce95e1b3SDavid du Colombier regfree(&nod);
936*ce95e1b3SDavid du Colombier return;
937*ce95e1b3SDavid du Colombier case TINT:
938*ce95e1b3SDavid du Colombier case TUINT:
939*ce95e1b3SDavid du Colombier case TLONG:
940*ce95e1b3SDavid du Colombier case TULONG:
941*ce95e1b3SDavid du Colombier case TIND:
942*ce95e1b3SDavid du Colombier case TVLONG:
943*ce95e1b3SDavid du Colombier case TUVLONG:
944*ce95e1b3SDavid du Colombier a = AMOVH;
945*ce95e1b3SDavid du Colombier break;
946*ce95e1b3SDavid du Colombier case TSHORT:
947*ce95e1b3SDavid du Colombier case TUSHORT:
948*ce95e1b3SDavid du Colombier case TCHAR:
949*ce95e1b3SDavid du Colombier case TUCHAR:
950*ce95e1b3SDavid du Colombier a = AMOV;
951*ce95e1b3SDavid du Colombier break;
952*ce95e1b3SDavid du Colombier }
953*ce95e1b3SDavid du Colombier break;
954*ce95e1b3SDavid du Colombier case TUSHORT:
955*ce95e1b3SDavid du Colombier switch(tt) {
956*ce95e1b3SDavid du Colombier case TDOUBLE:
957*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
958*ce95e1b3SDavid du Colombier gins(AMOVHU, f, &nod);
959*ce95e1b3SDavid du Colombier gins(AMOVWD, &nod, t);
960*ce95e1b3SDavid du Colombier regfree(&nod);
961*ce95e1b3SDavid du Colombier return;
962*ce95e1b3SDavid du Colombier case TFLOAT:
963*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
964*ce95e1b3SDavid du Colombier gins(AMOVHU, f, &nod);
965*ce95e1b3SDavid du Colombier gins(AMOVWF, &nod, t);
966*ce95e1b3SDavid du Colombier regfree(&nod);
967*ce95e1b3SDavid du Colombier return;
968*ce95e1b3SDavid du Colombier case TINT:
969*ce95e1b3SDavid du Colombier case TUINT:
970*ce95e1b3SDavid du Colombier case TLONG:
971*ce95e1b3SDavid du Colombier case TULONG:
972*ce95e1b3SDavid du Colombier case TIND:
973*ce95e1b3SDavid du Colombier case TVLONG:
974*ce95e1b3SDavid du Colombier case TUVLONG:
975*ce95e1b3SDavid du Colombier a = AMOVHU;
976*ce95e1b3SDavid du Colombier break;
977*ce95e1b3SDavid du Colombier case TSHORT:
978*ce95e1b3SDavid du Colombier case TUSHORT:
979*ce95e1b3SDavid du Colombier case TCHAR:
980*ce95e1b3SDavid du Colombier case TUCHAR:
981*ce95e1b3SDavid du Colombier a = AMOV;
982*ce95e1b3SDavid du Colombier break;
983*ce95e1b3SDavid du Colombier }
984*ce95e1b3SDavid du Colombier break;
985*ce95e1b3SDavid du Colombier case TCHAR:
986*ce95e1b3SDavid du Colombier switch(tt) {
987*ce95e1b3SDavid du Colombier case TDOUBLE:
988*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
989*ce95e1b3SDavid du Colombier gins(AMOVB, f, &nod);
990*ce95e1b3SDavid du Colombier gins(AMOVWD, &nod, t);
991*ce95e1b3SDavid du Colombier regfree(&nod);
992*ce95e1b3SDavid du Colombier return;
993*ce95e1b3SDavid du Colombier case TFLOAT:
994*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
995*ce95e1b3SDavid du Colombier gins(AMOVB, f, &nod);
996*ce95e1b3SDavid du Colombier gins(AMOVWF, &nod, t);
997*ce95e1b3SDavid du Colombier regfree(&nod);
998*ce95e1b3SDavid du Colombier return;
999*ce95e1b3SDavid du Colombier case TINT:
1000*ce95e1b3SDavid du Colombier case TUINT:
1001*ce95e1b3SDavid du Colombier case TLONG:
1002*ce95e1b3SDavid du Colombier case TULONG:
1003*ce95e1b3SDavid du Colombier case TIND:
1004*ce95e1b3SDavid du Colombier case TVLONG:
1005*ce95e1b3SDavid du Colombier case TUVLONG:
1006*ce95e1b3SDavid du Colombier case TSHORT:
1007*ce95e1b3SDavid du Colombier case TUSHORT:
1008*ce95e1b3SDavid du Colombier a = AMOVB;
1009*ce95e1b3SDavid du Colombier break;
1010*ce95e1b3SDavid du Colombier case TCHAR:
1011*ce95e1b3SDavid du Colombier case TUCHAR:
1012*ce95e1b3SDavid du Colombier a = AMOV;
1013*ce95e1b3SDavid du Colombier break;
1014*ce95e1b3SDavid du Colombier }
1015*ce95e1b3SDavid du Colombier break;
1016*ce95e1b3SDavid du Colombier case TUCHAR:
1017*ce95e1b3SDavid du Colombier switch(tt) {
1018*ce95e1b3SDavid du Colombier case TDOUBLE:
1019*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
1020*ce95e1b3SDavid du Colombier gins(AMOVBU, f, &nod);
1021*ce95e1b3SDavid du Colombier gins(AMOVWD, &nod, t);
1022*ce95e1b3SDavid du Colombier regfree(&nod);
1023*ce95e1b3SDavid du Colombier return;
1024*ce95e1b3SDavid du Colombier case TFLOAT:
1025*ce95e1b3SDavid du Colombier regalloc(&nod, f, Z);
1026*ce95e1b3SDavid du Colombier gins(AMOVBU, f, &nod);
1027*ce95e1b3SDavid du Colombier gins(AMOVWF, &nod, t);
1028*ce95e1b3SDavid du Colombier regfree(&nod);
1029*ce95e1b3SDavid du Colombier return;
1030*ce95e1b3SDavid du Colombier case TINT:
1031*ce95e1b3SDavid du Colombier case TUINT:
1032*ce95e1b3SDavid du Colombier case TLONG:
1033*ce95e1b3SDavid du Colombier case TULONG:
1034*ce95e1b3SDavid du Colombier case TIND:
1035*ce95e1b3SDavid du Colombier case TVLONG:
1036*ce95e1b3SDavid du Colombier case TUVLONG:
1037*ce95e1b3SDavid du Colombier case TSHORT:
1038*ce95e1b3SDavid du Colombier case TUSHORT:
1039*ce95e1b3SDavid du Colombier a = AMOVBU;
1040*ce95e1b3SDavid du Colombier break;
1041*ce95e1b3SDavid du Colombier case TCHAR:
1042*ce95e1b3SDavid du Colombier case TUCHAR:
1043*ce95e1b3SDavid du Colombier a = AMOV;
1044*ce95e1b3SDavid du Colombier break;
1045*ce95e1b3SDavid du Colombier }
1046*ce95e1b3SDavid du Colombier break;
1047*ce95e1b3SDavid du Colombier }
1048*ce95e1b3SDavid du Colombier if(a == AGOK)
1049*ce95e1b3SDavid du Colombier diag(Z, "bad opcode in gmove %T -> %T", f->type, t->type);
1050*ce95e1b3SDavid du Colombier if(a == AMOV || (thechar == 'i' && (a == AMOVW || a == AMOVWU)) || a == AMOVF || a == AMOVD)
1051*ce95e1b3SDavid du Colombier if(samaddr(f, t))
1052*ce95e1b3SDavid du Colombier return;
1053*ce95e1b3SDavid du Colombier gins(a, f, t);
1054*ce95e1b3SDavid du Colombier }
1055*ce95e1b3SDavid du Colombier
1056*ce95e1b3SDavid du Colombier void
gins(int a,Node * f,Node * t)1057*ce95e1b3SDavid du Colombier gins(int a, Node *f, Node *t)
1058*ce95e1b3SDavid du Colombier {
1059*ce95e1b3SDavid du Colombier
1060*ce95e1b3SDavid du Colombier nextpc();
1061*ce95e1b3SDavid du Colombier p->as = a;
1062*ce95e1b3SDavid du Colombier if(f != Z)
1063*ce95e1b3SDavid du Colombier naddr(f, &p->from);
1064*ce95e1b3SDavid du Colombier if(t != Z)
1065*ce95e1b3SDavid du Colombier naddr(t, &p->to);
1066*ce95e1b3SDavid du Colombier if(debug['g'])
1067*ce95e1b3SDavid du Colombier print("%P\n", p);
1068*ce95e1b3SDavid du Colombier }
1069*ce95e1b3SDavid du Colombier
1070*ce95e1b3SDavid du Colombier void
gopcode(int o,Node * f1,Node * f2,Node * t)1071*ce95e1b3SDavid du Colombier gopcode(int o, Node *f1, Node *f2, Node *t)
1072*ce95e1b3SDavid du Colombier {
1073*ce95e1b3SDavid du Colombier int a, ab, et, tword;
1074*ce95e1b3SDavid du Colombier Adr ta;
1075*ce95e1b3SDavid du Colombier
1076*ce95e1b3SDavid du Colombier tword = 0;
1077*ce95e1b3SDavid du Colombier if(thechar == 'j')
1078*ce95e1b3SDavid du Colombier if(t != Z && t->type != T)
1079*ce95e1b3SDavid du Colombier if((et = t->type->etype) != TIND && !typev[et])
1080*ce95e1b3SDavid du Colombier tword = 1;
1081*ce95e1b3SDavid du Colombier et = TLONG;
1082*ce95e1b3SDavid du Colombier if(f1 != Z && f1->type != T)
1083*ce95e1b3SDavid du Colombier et = f1->type->etype;
1084*ce95e1b3SDavid du Colombier if(debug['O']) {
1085*ce95e1b3SDavid du Colombier if(f1 != Z && f1->type != T)
1086*ce95e1b3SDavid du Colombier print("gop: %O %O[%s],", o, f1->op, tnames[et]);
1087*ce95e1b3SDavid du Colombier else
1088*ce95e1b3SDavid du Colombier print("gop: %O Z,", o);
1089*ce95e1b3SDavid du Colombier if(f2 != Z && f2->type != T)
1090*ce95e1b3SDavid du Colombier print("%O[%s],", f2->op, tnames[f2->type->etype]);
1091*ce95e1b3SDavid du Colombier if(t != Z && t->type != T)
1092*ce95e1b3SDavid du Colombier print("%O[%s]\n", t->op, tnames[t->type->etype]);
1093*ce95e1b3SDavid du Colombier else
1094*ce95e1b3SDavid du Colombier print("Z\n");
1095*ce95e1b3SDavid du Colombier }
1096*ce95e1b3SDavid du Colombier a = AGOK;
1097*ce95e1b3SDavid du Colombier switch(o) {
1098*ce95e1b3SDavid du Colombier case OAS:
1099*ce95e1b3SDavid du Colombier gmove(f1, t);
1100*ce95e1b3SDavid du Colombier return;
1101*ce95e1b3SDavid du Colombier
1102*ce95e1b3SDavid du Colombier case OASADD:
1103*ce95e1b3SDavid du Colombier case OADD:
1104*ce95e1b3SDavid du Colombier a = tword ? AADDW : AADD;
1105*ce95e1b3SDavid du Colombier if(et == TFLOAT)
1106*ce95e1b3SDavid du Colombier a = AADDF;
1107*ce95e1b3SDavid du Colombier else
1108*ce95e1b3SDavid du Colombier if(et == TDOUBLE)
1109*ce95e1b3SDavid du Colombier a = AADDD;
1110*ce95e1b3SDavid du Colombier break;
1111*ce95e1b3SDavid du Colombier
1112*ce95e1b3SDavid du Colombier case OASSUB:
1113*ce95e1b3SDavid du Colombier case OSUB:
1114*ce95e1b3SDavid du Colombier a = tword ? ASUBW : ASUB;
1115*ce95e1b3SDavid du Colombier if(et == TFLOAT)
1116*ce95e1b3SDavid du Colombier a = ASUBF;
1117*ce95e1b3SDavid du Colombier else
1118*ce95e1b3SDavid du Colombier if(et == TDOUBLE)
1119*ce95e1b3SDavid du Colombier a = ASUBD;
1120*ce95e1b3SDavid du Colombier break;
1121*ce95e1b3SDavid du Colombier
1122*ce95e1b3SDavid du Colombier case OASOR:
1123*ce95e1b3SDavid du Colombier case OOR:
1124*ce95e1b3SDavid du Colombier a = AOR;
1125*ce95e1b3SDavid du Colombier break;
1126*ce95e1b3SDavid du Colombier
1127*ce95e1b3SDavid du Colombier case OASAND:
1128*ce95e1b3SDavid du Colombier case OAND:
1129*ce95e1b3SDavid du Colombier a = AAND;
1130*ce95e1b3SDavid du Colombier break;
1131*ce95e1b3SDavid du Colombier
1132*ce95e1b3SDavid du Colombier case OASXOR:
1133*ce95e1b3SDavid du Colombier case OXOR:
1134*ce95e1b3SDavid du Colombier a = AXOR;
1135*ce95e1b3SDavid du Colombier break;
1136*ce95e1b3SDavid du Colombier
1137*ce95e1b3SDavid du Colombier case OASLSHR:
1138*ce95e1b3SDavid du Colombier case OLSHR:
1139*ce95e1b3SDavid du Colombier a = tword ? ASRLW : ASRL;
1140*ce95e1b3SDavid du Colombier break;
1141*ce95e1b3SDavid du Colombier
1142*ce95e1b3SDavid du Colombier case OASASHR:
1143*ce95e1b3SDavid du Colombier case OASHR:
1144*ce95e1b3SDavid du Colombier a = tword ? ASRAW : ASRA;
1145*ce95e1b3SDavid du Colombier break;
1146*ce95e1b3SDavid du Colombier
1147*ce95e1b3SDavid du Colombier case OASASHL:
1148*ce95e1b3SDavid du Colombier case OASHL:
1149*ce95e1b3SDavid du Colombier a = tword ? ASLLW : ASLL;
1150*ce95e1b3SDavid du Colombier break;
1151*ce95e1b3SDavid du Colombier
1152*ce95e1b3SDavid du Colombier case OFUNC:
1153*ce95e1b3SDavid du Colombier a = AJAL;
1154*ce95e1b3SDavid du Colombier break;
1155*ce95e1b3SDavid du Colombier
1156*ce95e1b3SDavid du Colombier case OCOND:
1157*ce95e1b3SDavid du Colombier a = ASLTU;
1158*ce95e1b3SDavid du Colombier break;
1159*ce95e1b3SDavid du Colombier
1160*ce95e1b3SDavid du Colombier case OCOMMA:
1161*ce95e1b3SDavid du Colombier a = ASLT;
1162*ce95e1b3SDavid du Colombier break;
1163*ce95e1b3SDavid du Colombier
1164*ce95e1b3SDavid du Colombier case OASMUL:
1165*ce95e1b3SDavid du Colombier case OMUL:
1166*ce95e1b3SDavid du Colombier if(et == TFLOAT) {
1167*ce95e1b3SDavid du Colombier a = AMULF;
1168*ce95e1b3SDavid du Colombier break;
1169*ce95e1b3SDavid du Colombier } else
1170*ce95e1b3SDavid du Colombier if(et == TDOUBLE) {
1171*ce95e1b3SDavid du Colombier a = AMULD;
1172*ce95e1b3SDavid du Colombier break;
1173*ce95e1b3SDavid du Colombier }
1174*ce95e1b3SDavid du Colombier a = tword ? AMULW : AMUL;
1175*ce95e1b3SDavid du Colombier break;
1176*ce95e1b3SDavid du Colombier
1177*ce95e1b3SDavid du Colombier case OASDIV:
1178*ce95e1b3SDavid du Colombier case ODIV:
1179*ce95e1b3SDavid du Colombier if(et == TFLOAT) {
1180*ce95e1b3SDavid du Colombier a = ADIVF;
1181*ce95e1b3SDavid du Colombier break;
1182*ce95e1b3SDavid du Colombier } else
1183*ce95e1b3SDavid du Colombier if(et == TDOUBLE) {
1184*ce95e1b3SDavid du Colombier a = ADIVD;
1185*ce95e1b3SDavid du Colombier break;
1186*ce95e1b3SDavid du Colombier }
1187*ce95e1b3SDavid du Colombier a = tword ? ADIVW : ADIV;
1188*ce95e1b3SDavid du Colombier break;
1189*ce95e1b3SDavid du Colombier
1190*ce95e1b3SDavid du Colombier case OASMOD:
1191*ce95e1b3SDavid du Colombier case OMOD:
1192*ce95e1b3SDavid du Colombier a = tword ? AREMW : AREM;
1193*ce95e1b3SDavid du Colombier break;
1194*ce95e1b3SDavid du Colombier
1195*ce95e1b3SDavid du Colombier case OASLMUL:
1196*ce95e1b3SDavid du Colombier case OLMUL:
1197*ce95e1b3SDavid du Colombier a = tword ? AMULW : AMUL;
1198*ce95e1b3SDavid du Colombier break;
1199*ce95e1b3SDavid du Colombier
1200*ce95e1b3SDavid du Colombier case OASLMOD:
1201*ce95e1b3SDavid du Colombier case OLMOD:
1202*ce95e1b3SDavid du Colombier a = tword ? AREMUW : AREMU;
1203*ce95e1b3SDavid du Colombier break;
1204*ce95e1b3SDavid du Colombier
1205*ce95e1b3SDavid du Colombier case OASLDIV:
1206*ce95e1b3SDavid du Colombier case OLDIV:
1207*ce95e1b3SDavid du Colombier a = tword ? ADIVUW : ADIVU;
1208*ce95e1b3SDavid du Colombier break;
1209*ce95e1b3SDavid du Colombier
1210*ce95e1b3SDavid du Colombier case OEQ:
1211*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1212*ce95e1b3SDavid du Colombier a = ABEQ;
1213*ce95e1b3SDavid du Colombier break;
1214*ce95e1b3SDavid du Colombier }
1215*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPEQF : ACMPEQD;
1216*ce95e1b3SDavid du Colombier ab = ABNE;
1217*ce95e1b3SDavid du Colombier goto cmpfloat;
1218*ce95e1b3SDavid du Colombier case ONE:
1219*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1220*ce95e1b3SDavid du Colombier a = ABNE;
1221*ce95e1b3SDavid du Colombier break;
1222*ce95e1b3SDavid du Colombier }
1223*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPEQF : ACMPEQD;
1224*ce95e1b3SDavid du Colombier ab = ABEQ;
1225*ce95e1b3SDavid du Colombier goto cmpfloat;
1226*ce95e1b3SDavid du Colombier case OLT:
1227*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1228*ce95e1b3SDavid du Colombier a = ABLT;
1229*ce95e1b3SDavid du Colombier break;
1230*ce95e1b3SDavid du Colombier }
1231*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPLTF : ACMPLTD;
1232*ce95e1b3SDavid du Colombier ab = ABNE;
1233*ce95e1b3SDavid du Colombier goto cmpfloat;
1234*ce95e1b3SDavid du Colombier case OLE:
1235*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1236*ce95e1b3SDavid du Colombier a = ABLE; /* pseudo op */
1237*ce95e1b3SDavid du Colombier break;
1238*ce95e1b3SDavid du Colombier }
1239*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPLEF : ACMPLED;
1240*ce95e1b3SDavid du Colombier ab = ABNE;
1241*ce95e1b3SDavid du Colombier goto cmpfloat;
1242*ce95e1b3SDavid du Colombier case OGE:
1243*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1244*ce95e1b3SDavid du Colombier a = ABGE;
1245*ce95e1b3SDavid du Colombier break;
1246*ce95e1b3SDavid du Colombier }
1247*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPLTF : ACMPLTD;
1248*ce95e1b3SDavid du Colombier ab = ABEQ;
1249*ce95e1b3SDavid du Colombier goto cmpfloat;
1250*ce95e1b3SDavid du Colombier case OGT:
1251*ce95e1b3SDavid du Colombier if(!typefd[et]) {
1252*ce95e1b3SDavid du Colombier a = ABGT; /* pseudo op */
1253*ce95e1b3SDavid du Colombier break;
1254*ce95e1b3SDavid du Colombier }
1255*ce95e1b3SDavid du Colombier a = et == TFLOAT? ACMPLEF : ACMPLED;
1256*ce95e1b3SDavid du Colombier ab = ABEQ;
1257*ce95e1b3SDavid du Colombier goto cmpfloat;
1258*ce95e1b3SDavid du Colombier case OLO:
1259*ce95e1b3SDavid du Colombier a = ABLTU;
1260*ce95e1b3SDavid du Colombier break;
1261*ce95e1b3SDavid du Colombier case OLS:
1262*ce95e1b3SDavid du Colombier a = ABLEU; /* pseudo op */
1263*ce95e1b3SDavid du Colombier break;
1264*ce95e1b3SDavid du Colombier case OHS:
1265*ce95e1b3SDavid du Colombier a = ABGEU;
1266*ce95e1b3SDavid du Colombier break;
1267*ce95e1b3SDavid du Colombier case OHI:
1268*ce95e1b3SDavid du Colombier a = ABGTU; /* pseudo op */
1269*ce95e1b3SDavid du Colombier break;
1270*ce95e1b3SDavid du Colombier
1271*ce95e1b3SDavid du Colombier cmpfloat:
1272*ce95e1b3SDavid du Colombier nextpc();
1273*ce95e1b3SDavid du Colombier p->as = a;
1274*ce95e1b3SDavid du Colombier naddr(f1, &p->from);
1275*ce95e1b3SDavid du Colombier raddr(f2, p);
1276*ce95e1b3SDavid du Colombier if(t != Z)
1277*ce95e1b3SDavid du Colombier naddr(t, &p->to);
1278*ce95e1b3SDavid du Colombier else {
1279*ce95e1b3SDavid du Colombier naddr(®node, &p->to);
1280*ce95e1b3SDavid du Colombier p->to.reg = tmpreg();
1281*ce95e1b3SDavid du Colombier }
1282*ce95e1b3SDavid du Colombier if(debug['g'])
1283*ce95e1b3SDavid du Colombier print("%P\n", p);
1284*ce95e1b3SDavid du Colombier if(t == Z) {
1285*ce95e1b3SDavid du Colombier nextpc();
1286*ce95e1b3SDavid du Colombier p->as = ab;
1287*ce95e1b3SDavid du Colombier naddr(®node, &p->from);
1288*ce95e1b3SDavid du Colombier p->from.reg = tmpreg();
1289*ce95e1b3SDavid du Colombier if(debug['g'])
1290*ce95e1b3SDavid du Colombier print("%P\n", p);
1291*ce95e1b3SDavid du Colombier } else if (ab == ABNE) {
1292*ce95e1b3SDavid du Colombier nextpc();
1293*ce95e1b3SDavid du Colombier p->as = AXOR;
1294*ce95e1b3SDavid du Colombier naddr(nodconst(1), &p->from);
1295*ce95e1b3SDavid du Colombier raddr(t, p);
1296*ce95e1b3SDavid du Colombier naddr(t, &p->to);
1297*ce95e1b3SDavid du Colombier if(debug['g'])
1298*ce95e1b3SDavid du Colombier print("%P\n", p);
1299*ce95e1b3SDavid du Colombier }
1300*ce95e1b3SDavid du Colombier return;
1301*ce95e1b3SDavid du Colombier }
1302*ce95e1b3SDavid du Colombier if(a == AGOK)
1303*ce95e1b3SDavid du Colombier diag(Z, "bad in gopcode %O", o);
1304*ce95e1b3SDavid du Colombier nextpc();
1305*ce95e1b3SDavid du Colombier p->as = a;
1306*ce95e1b3SDavid du Colombier if(f1 != Z)
1307*ce95e1b3SDavid du Colombier naddr(f1, &p->from);
1308*ce95e1b3SDavid du Colombier if(f2 != Z) {
1309*ce95e1b3SDavid du Colombier naddr(f2, &ta);
1310*ce95e1b3SDavid du Colombier p->reg = ta.reg;
1311*ce95e1b3SDavid du Colombier if(ta.type == D_CONST && ta.offset == 0)
1312*ce95e1b3SDavid du Colombier p->reg = REGZERO;
1313*ce95e1b3SDavid du Colombier }
1314*ce95e1b3SDavid du Colombier if(t != Z)
1315*ce95e1b3SDavid du Colombier naddr(t, &p->to);
1316*ce95e1b3SDavid du Colombier if(debug['g'])
1317*ce95e1b3SDavid du Colombier print("%P\n", p);
1318*ce95e1b3SDavid du Colombier }
1319*ce95e1b3SDavid du Colombier
1320*ce95e1b3SDavid du Colombier int
samaddr(Node * f,Node * t)1321*ce95e1b3SDavid du Colombier samaddr(Node *f, Node *t)
1322*ce95e1b3SDavid du Colombier {
1323*ce95e1b3SDavid du Colombier
1324*ce95e1b3SDavid du Colombier if(f->op != t->op)
1325*ce95e1b3SDavid du Colombier return 0;
1326*ce95e1b3SDavid du Colombier switch(f->op) {
1327*ce95e1b3SDavid du Colombier
1328*ce95e1b3SDavid du Colombier case OREGISTER:
1329*ce95e1b3SDavid du Colombier if(f->reg != t->reg)
1330*ce95e1b3SDavid du Colombier break;
1331*ce95e1b3SDavid du Colombier return 1;
1332*ce95e1b3SDavid du Colombier }
1333*ce95e1b3SDavid du Colombier return 0;
1334*ce95e1b3SDavid du Colombier }
1335*ce95e1b3SDavid du Colombier
1336*ce95e1b3SDavid du Colombier void
gbranch(int o)1337*ce95e1b3SDavid du Colombier gbranch(int o)
1338*ce95e1b3SDavid du Colombier {
1339*ce95e1b3SDavid du Colombier int a;
1340*ce95e1b3SDavid du Colombier
1341*ce95e1b3SDavid du Colombier a = AGOK;
1342*ce95e1b3SDavid du Colombier switch(o) {
1343*ce95e1b3SDavid du Colombier case ORETURN:
1344*ce95e1b3SDavid du Colombier a = ARET;
1345*ce95e1b3SDavid du Colombier break;
1346*ce95e1b3SDavid du Colombier case OGOTO:
1347*ce95e1b3SDavid du Colombier a = AJMP;
1348*ce95e1b3SDavid du Colombier break;
1349*ce95e1b3SDavid du Colombier }
1350*ce95e1b3SDavid du Colombier nextpc();
1351*ce95e1b3SDavid du Colombier if(a == AGOK) {
1352*ce95e1b3SDavid du Colombier diag(Z, "bad in gbranch %O", o);
1353*ce95e1b3SDavid du Colombier nextpc();
1354*ce95e1b3SDavid du Colombier }
1355*ce95e1b3SDavid du Colombier p->as = a;
1356*ce95e1b3SDavid du Colombier }
1357*ce95e1b3SDavid du Colombier
1358*ce95e1b3SDavid du Colombier void
patch(Prog * op,long pc)1359*ce95e1b3SDavid du Colombier patch(Prog *op, long pc)
1360*ce95e1b3SDavid du Colombier {
1361*ce95e1b3SDavid du Colombier
1362*ce95e1b3SDavid du Colombier op->to.offset = pc;
1363*ce95e1b3SDavid du Colombier op->to.type = D_BRANCH;
1364*ce95e1b3SDavid du Colombier }
1365*ce95e1b3SDavid du Colombier
1366*ce95e1b3SDavid du Colombier void
gpseudo(int a,Sym * s,Node * n)1367*ce95e1b3SDavid du Colombier gpseudo(int a, Sym *s, Node *n)
1368*ce95e1b3SDavid du Colombier {
1369*ce95e1b3SDavid du Colombier
1370*ce95e1b3SDavid du Colombier nextpc();
1371*ce95e1b3SDavid du Colombier p->as = a;
1372*ce95e1b3SDavid du Colombier p->from.type = D_OREG;
1373*ce95e1b3SDavid du Colombier p->from.sym = s;
1374*ce95e1b3SDavid du Colombier if(a == ATEXT)
1375*ce95e1b3SDavid du Colombier p->reg = (profileflg ? 0 : NOPROF);
1376*ce95e1b3SDavid du Colombier p->from.name = D_EXTERN;
1377*ce95e1b3SDavid du Colombier if(s->class == CSTATIC)
1378*ce95e1b3SDavid du Colombier p->from.name = D_STATIC;
1379*ce95e1b3SDavid du Colombier naddr(n, &p->to);
1380*ce95e1b3SDavid du Colombier if(a == ADATA || a == AGLOBL)
1381*ce95e1b3SDavid du Colombier pc--;
1382*ce95e1b3SDavid du Colombier }
1383*ce95e1b3SDavid du Colombier
1384*ce95e1b3SDavid du Colombier int
sconst(Node * n)1385*ce95e1b3SDavid du Colombier sconst(Node *n)
1386*ce95e1b3SDavid du Colombier {
1387*ce95e1b3SDavid du Colombier vlong vv;
1388*ce95e1b3SDavid du Colombier
1389*ce95e1b3SDavid du Colombier if(n->op == OCONST) {
1390*ce95e1b3SDavid du Colombier if(!typefd[n->type->etype]) {
1391*ce95e1b3SDavid du Colombier vv = n->vconst;
1392*ce95e1b3SDavid du Colombier if(vv >= (vlong)(-2048) && vv < (vlong)2048)
1393*ce95e1b3SDavid du Colombier return 1;
1394*ce95e1b3SDavid du Colombier }
1395*ce95e1b3SDavid du Colombier }
1396*ce95e1b3SDavid du Colombier return 0;
1397*ce95e1b3SDavid du Colombier }
1398*ce95e1b3SDavid du Colombier
1399*ce95e1b3SDavid du Colombier int
sval(long v)1400*ce95e1b3SDavid du Colombier sval(long v)
1401*ce95e1b3SDavid du Colombier {
1402*ce95e1b3SDavid du Colombier if(v >= -32766L && v < 32766L)
1403*ce95e1b3SDavid du Colombier return 1;
1404*ce95e1b3SDavid du Colombier return 0;
1405*ce95e1b3SDavid du Colombier }
1406*ce95e1b3SDavid du Colombier
1407*ce95e1b3SDavid du Colombier long
exreg(Type * t)1408*ce95e1b3SDavid du Colombier exreg(Type *t)
1409*ce95e1b3SDavid du Colombier {
1410*ce95e1b3SDavid du Colombier long o;
1411*ce95e1b3SDavid du Colombier
1412*ce95e1b3SDavid du Colombier if(typechlp[t->etype]) {
1413*ce95e1b3SDavid du Colombier if(exregoffset <= REGTMP)
1414*ce95e1b3SDavid du Colombier return 0;
1415*ce95e1b3SDavid du Colombier o = exregoffset;
1416*ce95e1b3SDavid du Colombier exregoffset--;
1417*ce95e1b3SDavid du Colombier return o;
1418*ce95e1b3SDavid du Colombier }
1419*ce95e1b3SDavid du Colombier if(typefd[t->etype]) {
1420*ce95e1b3SDavid du Colombier if(exfregoffset <= 16)
1421*ce95e1b3SDavid du Colombier return 0;
1422*ce95e1b3SDavid du Colombier o = exfregoffset + NREG;
1423*ce95e1b3SDavid du Colombier exfregoffset--;
1424*ce95e1b3SDavid du Colombier return o;
1425*ce95e1b3SDavid du Colombier }
1426*ce95e1b3SDavid du Colombier return 0;
1427*ce95e1b3SDavid du Colombier }
1428*ce95e1b3SDavid du Colombier
1429*ce95e1b3SDavid du Colombier schar ewidth[NTYPE] =
1430*ce95e1b3SDavid du Colombier {
1431*ce95e1b3SDavid du Colombier -1, /* [TXXX] */
1432*ce95e1b3SDavid du Colombier SZ_CHAR, /* [TCHAR] */
1433*ce95e1b3SDavid du Colombier SZ_CHAR, /* [TUCHAR] */
1434*ce95e1b3SDavid du Colombier SZ_SHORT, /* [TSHORT] */
1435*ce95e1b3SDavid du Colombier SZ_SHORT, /* [TUSHORT] */
1436*ce95e1b3SDavid du Colombier SZ_INT, /* [TINT] */
1437*ce95e1b3SDavid du Colombier SZ_INT, /* [TUINT] */
1438*ce95e1b3SDavid du Colombier SZ_LONG, /* [TLONG] */
1439*ce95e1b3SDavid du Colombier SZ_LONG, /* [TULONG] */
1440*ce95e1b3SDavid du Colombier SZ_VLONG, /* [TVLONG] */
1441*ce95e1b3SDavid du Colombier SZ_VLONG, /* [TUVLONG] */
1442*ce95e1b3SDavid du Colombier SZ_FLOAT, /* [TFLOAT] */
1443*ce95e1b3SDavid du Colombier SZ_DOUBLE, /* [TDOUBLE] */
1444*ce95e1b3SDavid du Colombier 0, /* [TIND] - set to 4 or 8 in main */
1445*ce95e1b3SDavid du Colombier 0, /* [TFUNC] */
1446*ce95e1b3SDavid du Colombier -1, /* [TARRAY] */
1447*ce95e1b3SDavid du Colombier 0, /* [TVOID] */
1448*ce95e1b3SDavid du Colombier -1, /* [TSTRUCT] */
1449*ce95e1b3SDavid du Colombier -1, /* [TUNION] */
1450*ce95e1b3SDavid du Colombier SZ_INT, /* [TENUM] */
1451*ce95e1b3SDavid du Colombier };
1452*ce95e1b3SDavid du Colombier
1453*ce95e1b3SDavid du Colombier long ncast[NTYPE] =
1454*ce95e1b3SDavid du Colombier {
1455*ce95e1b3SDavid du Colombier 0, /* [TXXX] */
1456*ce95e1b3SDavid du Colombier BCHAR|BUCHAR, /* [TCHAR] */
1457*ce95e1b3SDavid du Colombier BCHAR|BUCHAR, /* [TUCHAR] */
1458*ce95e1b3SDavid du Colombier BSHORT|BUSHORT, /* [TSHORT] */
1459*ce95e1b3SDavid du Colombier BSHORT|BUSHORT, /* [TUSHORT] */
1460*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG|BIND, /* [TINT] */
1461*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG|BIND, /* [TUINT] */
1462*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG|BIND, /* [TLONG] */
1463*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG|BIND, /* [TULONG] */
1464*ce95e1b3SDavid du Colombier BVLONG|BUVLONG, /* [TVLONG] */
1465*ce95e1b3SDavid du Colombier BVLONG|BUVLONG, /* [TUVLONG] */
1466*ce95e1b3SDavid du Colombier BFLOAT, /* [TFLOAT] */
1467*ce95e1b3SDavid du Colombier BDOUBLE, /* [TDOUBLE] */
1468*ce95e1b3SDavid du Colombier BLONG|BULONG|BIND, /* [TIND] */
1469*ce95e1b3SDavid du Colombier 0, /* [TFUNC] */
1470*ce95e1b3SDavid du Colombier 0, /* [TARRAY] */
1471*ce95e1b3SDavid du Colombier 0, /* [TVOID] */
1472*ce95e1b3SDavid du Colombier BSTRUCT, /* [TSTRUCT] */
1473*ce95e1b3SDavid du Colombier BUNION, /* [TUNION] */
1474*ce95e1b3SDavid du Colombier 0, /* [TENUM] */
1475*ce95e1b3SDavid du Colombier };
1476*ce95e1b3SDavid du Colombier
1477*ce95e1b3SDavid du Colombier static long ncast64[NTYPE] =
1478*ce95e1b3SDavid du Colombier {
1479*ce95e1b3SDavid du Colombier 0, /* [TXXX] */
1480*ce95e1b3SDavid du Colombier BCHAR|BUCHAR, /* [TCHAR] */
1481*ce95e1b3SDavid du Colombier BCHAR|BUCHAR, /* [TUCHAR] */
1482*ce95e1b3SDavid du Colombier BSHORT|BUSHORT, /* [TSHORT] */
1483*ce95e1b3SDavid du Colombier BSHORT|BUSHORT, /* [TUSHORT] */
1484*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG, /* [TINT] */
1485*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG, /* [TUINT] */
1486*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG, /* [TLONG] */
1487*ce95e1b3SDavid du Colombier BINT|BUINT|BLONG|BULONG, /* [TULONG] */
1488*ce95e1b3SDavid du Colombier BVLONG|BUVLONG|BIND, /* [TVLONG] */
1489*ce95e1b3SDavid du Colombier BVLONG|BUVLONG|BIND, /* [TUVLONG] */
1490*ce95e1b3SDavid du Colombier BFLOAT, /* [TFLOAT] */
1491*ce95e1b3SDavid du Colombier BDOUBLE, /* [TDOUBLE] */
1492*ce95e1b3SDavid du Colombier BVLONG|BUVLONG|BIND, /* [TIND] */
1493*ce95e1b3SDavid du Colombier 0, /* [TFUNC] */
1494*ce95e1b3SDavid du Colombier 0, /* [TARRAY] */
1495*ce95e1b3SDavid du Colombier 0, /* [TVOID] */
1496*ce95e1b3SDavid du Colombier BSTRUCT, /* [TSTRUCT] */
1497*ce95e1b3SDavid du Colombier BUNION, /* [TUNION] */
1498*ce95e1b3SDavid du Colombier 0, /* [TENUM] */
1499*ce95e1b3SDavid du Colombier };
1500