1da51d93aSDavid du Colombier #include "gc.h"
2da51d93aSDavid du Colombier
3da51d93aSDavid du Colombier void
zeroregm(Node * n)4da51d93aSDavid du Colombier zeroregm(Node *n)
5da51d93aSDavid du Colombier {
6da51d93aSDavid du Colombier gins(AMOVL, nodconst(0), n);
7da51d93aSDavid du Colombier }
8da51d93aSDavid du Colombier
9da51d93aSDavid du Colombier /* do we need to load the address of a vlong? */
10da51d93aSDavid du Colombier int
vaddr(Node * n,int a)11375daca8SDavid du Colombier vaddr(Node *n, int a)
12da51d93aSDavid du Colombier {
13da51d93aSDavid du Colombier switch(n->op) {
14da51d93aSDavid du Colombier case ONAME:
15da51d93aSDavid du Colombier if(a)
16375daca8SDavid du Colombier return 1;
17375daca8SDavid du Colombier return !(n->class == CEXTERN || n->class == CGLOBL || n->class == CSTATIC);
18da51d93aSDavid du Colombier
19da51d93aSDavid du Colombier case OCONST:
20da51d93aSDavid du Colombier case OREGISTER:
21da51d93aSDavid du Colombier case OINDREG:
22da51d93aSDavid du Colombier return 1;
23da51d93aSDavid du Colombier }
24375daca8SDavid du Colombier return 0;
25375daca8SDavid du Colombier }
26da51d93aSDavid du Colombier
27375daca8SDavid du Colombier long
hi64v(Node * n)28da51d93aSDavid du Colombier hi64v(Node *n)
29da51d93aSDavid du Colombier {
30da51d93aSDavid du Colombier if(align(0, types[TCHAR], Aarg1)) /* isbigendian */
31da51d93aSDavid du Colombier return (long)(n->vconst) & ~0L;
32da51d93aSDavid du Colombier else
33da51d93aSDavid du Colombier return (long)((uvlong)n->vconst>>32) & ~0L;
34da51d93aSDavid du Colombier }
35da51d93aSDavid du Colombier
36375daca8SDavid du Colombier long
lo64v(Node * n)37da51d93aSDavid du Colombier lo64v(Node *n)
38da51d93aSDavid du Colombier {
39da51d93aSDavid du Colombier if(align(0, types[TCHAR], Aarg1)) /* isbigendian */
40da51d93aSDavid du Colombier return (long)((uvlong)n->vconst>>32) & ~0L;
41da51d93aSDavid du Colombier else
42da51d93aSDavid du Colombier return (long)(n->vconst) & ~0L;
43da51d93aSDavid du Colombier }
44da51d93aSDavid du Colombier
45375daca8SDavid du Colombier Node *
hi64(Node * n)46da51d93aSDavid du Colombier hi64(Node *n)
47da51d93aSDavid du Colombier {
48da51d93aSDavid du Colombier return nodconst(hi64v(n));
49da51d93aSDavid du Colombier }
50da51d93aSDavid du Colombier
51375daca8SDavid du Colombier Node *
lo64(Node * n)52da51d93aSDavid du Colombier lo64(Node *n)
53da51d93aSDavid du Colombier {
54da51d93aSDavid du Colombier return nodconst(lo64v(n));
55da51d93aSDavid du Colombier }
56da51d93aSDavid du Colombier
57da51d93aSDavid du Colombier static Node *
anonreg(void)58da51d93aSDavid du Colombier anonreg(void)
59da51d93aSDavid du Colombier {
60da51d93aSDavid du Colombier Node *n;
61da51d93aSDavid du Colombier
62da51d93aSDavid du Colombier n = new(OREGISTER, Z, Z);
63da51d93aSDavid du Colombier n->reg = D_NONE;
64da51d93aSDavid du Colombier n->type = types[TLONG];
65da51d93aSDavid du Colombier return n;
66da51d93aSDavid du Colombier }
67da51d93aSDavid du Colombier
68da51d93aSDavid du Colombier static Node *
regpair(Node * n,Node * t)69da51d93aSDavid du Colombier regpair(Node *n, Node *t)
70da51d93aSDavid du Colombier {
71da51d93aSDavid du Colombier Node *r;
72da51d93aSDavid du Colombier
73da51d93aSDavid du Colombier if(n != Z && n->op == OREGPAIR)
74da51d93aSDavid du Colombier return n;
75da51d93aSDavid du Colombier r = new(OREGPAIR, anonreg(), anonreg());
76da51d93aSDavid du Colombier if(n != Z)
77da51d93aSDavid du Colombier r->type = n->type;
78da51d93aSDavid du Colombier else
79da51d93aSDavid du Colombier r->type = t->type;
80da51d93aSDavid du Colombier return r;
81da51d93aSDavid du Colombier }
82da51d93aSDavid du Colombier
83da51d93aSDavid du Colombier static void
evacaxdx(Node * r)84375daca8SDavid du Colombier evacaxdx(Node *r)
85da51d93aSDavid du Colombier {
86375daca8SDavid du Colombier Node nod1, nod2;
87375daca8SDavid du Colombier
88375daca8SDavid du Colombier if(r->reg == D_AX || r->reg == D_DX) {
89375daca8SDavid du Colombier reg[D_AX]++;
90375daca8SDavid du Colombier reg[D_DX]++;
91375daca8SDavid du Colombier /*
92375daca8SDavid du Colombier * this is just an optim that should
93375daca8SDavid du Colombier * check for spill
94375daca8SDavid du Colombier */
95375daca8SDavid du Colombier r->type = types[TULONG];
96375daca8SDavid du Colombier regalloc(&nod1, r, Z);
97375daca8SDavid du Colombier nodreg(&nod2, Z, r->reg);
98375daca8SDavid du Colombier gins(AMOVL, &nod2, &nod1);
99375daca8SDavid du Colombier regfree(r);
100375daca8SDavid du Colombier r->reg = nod1.reg;
101375daca8SDavid du Colombier reg[D_AX]--;
102375daca8SDavid du Colombier reg[D_DX]--;
103375daca8SDavid du Colombier }
104375daca8SDavid du Colombier }
105375daca8SDavid du Colombier
106375daca8SDavid du Colombier /* lazy instantiation of register pair */
107375daca8SDavid du Colombier static int
instpair(Node * n,Node * l)108375daca8SDavid du Colombier instpair(Node *n, Node *l)
109375daca8SDavid du Colombier {
110375daca8SDavid du Colombier int r;
111375daca8SDavid du Colombier
112375daca8SDavid du Colombier r = 0;
113375daca8SDavid du Colombier if(n->left->reg == D_NONE) {
114375daca8SDavid du Colombier if(l != Z) {
115375daca8SDavid du Colombier n->left->reg = l->reg;
116375daca8SDavid du Colombier r = 1;
117375daca8SDavid du Colombier }
118375daca8SDavid du Colombier else
119da51d93aSDavid du Colombier regalloc(n->left, n->left, Z);
120375daca8SDavid du Colombier }
121375daca8SDavid du Colombier if(n->right->reg == D_NONE)
122da51d93aSDavid du Colombier regalloc(n->right, n->right, Z);
123375daca8SDavid du Colombier return r;
124375daca8SDavid du Colombier }
125375daca8SDavid du Colombier
126375daca8SDavid du Colombier static void
zapreg(Node * n)127375daca8SDavid du Colombier zapreg(Node *n)
128375daca8SDavid du Colombier {
129375daca8SDavid du Colombier if(n->reg != D_NONE) {
130*acc79d09SDavid du Colombier //prtree(n, "zapreg");
131375daca8SDavid du Colombier regfree(n);
132375daca8SDavid du Colombier n->reg = D_NONE;
133375daca8SDavid du Colombier }
134da51d93aSDavid du Colombier }
135da51d93aSDavid du Colombier
136da51d93aSDavid du Colombier static void
freepair(Node * n)137da51d93aSDavid du Colombier freepair(Node *n)
138da51d93aSDavid du Colombier {
139da51d93aSDavid du Colombier regfree(n->left);
140da51d93aSDavid du Colombier regfree(n->right);
141da51d93aSDavid du Colombier }
142da51d93aSDavid du Colombier
143da51d93aSDavid du Colombier /* n is not OREGPAIR, nn is */
144da51d93aSDavid du Colombier void
loadpair(Node * n,Node * nn)145da51d93aSDavid du Colombier loadpair(Node *n, Node *nn)
146da51d93aSDavid du Colombier {
147da51d93aSDavid du Colombier Node nod;
148da51d93aSDavid du Colombier
149375daca8SDavid du Colombier instpair(nn, Z);
150da51d93aSDavid du Colombier if(n->op == OCONST) {
151da51d93aSDavid du Colombier gins(AMOVL, lo64(n), nn->left);
152da51d93aSDavid du Colombier n->xoffset += SZ_LONG;
153da51d93aSDavid du Colombier gins(AMOVL, hi64(n), nn->right);
154da51d93aSDavid du Colombier n->xoffset -= SZ_LONG;
155da51d93aSDavid du Colombier return;
156da51d93aSDavid du Colombier }
157375daca8SDavid du Colombier if(!vaddr(n, 0)) {
158da51d93aSDavid du Colombier /* steal the right register for the laddr */
159da51d93aSDavid du Colombier nod = regnode;
160da51d93aSDavid du Colombier nod.reg = nn->right->reg;
161da51d93aSDavid du Colombier lcgen(n, &nod);
162da51d93aSDavid du Colombier n = &nod;
163da51d93aSDavid du Colombier regind(n, n);
164da51d93aSDavid du Colombier n->xoffset = 0;
165da51d93aSDavid du Colombier }
166da51d93aSDavid du Colombier gins(AMOVL, n, nn->left);
167da51d93aSDavid du Colombier n->xoffset += SZ_LONG;
168da51d93aSDavid du Colombier gins(AMOVL, n, nn->right);
169da51d93aSDavid du Colombier n->xoffset -= SZ_LONG;
170da51d93aSDavid du Colombier }
171da51d93aSDavid du Colombier
172da51d93aSDavid du Colombier /* n is OREGPAIR, nn is not */
173da51d93aSDavid du Colombier static void
storepair(Node * n,Node * nn,int f)174da51d93aSDavid du Colombier storepair(Node *n, Node *nn, int f)
175da51d93aSDavid du Colombier {
176da51d93aSDavid du Colombier Node nod;
177da51d93aSDavid du Colombier
178375daca8SDavid du Colombier if(!vaddr(nn, 0)) {
179da51d93aSDavid du Colombier reglcgen(&nod, nn, Z);
180da51d93aSDavid du Colombier nn = &nod;
181da51d93aSDavid du Colombier }
182da51d93aSDavid du Colombier gins(AMOVL, n->left, nn);
183da51d93aSDavid du Colombier nn->xoffset += SZ_LONG;
184da51d93aSDavid du Colombier gins(AMOVL, n->right, nn);
185da51d93aSDavid du Colombier nn->xoffset -= SZ_LONG;
186da51d93aSDavid du Colombier if(nn == &nod)
187da51d93aSDavid du Colombier regfree(&nod);
188da51d93aSDavid du Colombier if(f)
189da51d93aSDavid du Colombier freepair(n);
190da51d93aSDavid du Colombier }
191da51d93aSDavid du Colombier
192da51d93aSDavid du Colombier enum
193da51d93aSDavid du Colombier {
194da51d93aSDavid du Colombier /* 4 only, see WW */
195da51d93aSDavid du Colombier WNONE = 0,
196da51d93aSDavid du Colombier WCONST,
197da51d93aSDavid du Colombier WADDR,
198da51d93aSDavid du Colombier WHARD,
199da51d93aSDavid du Colombier };
200da51d93aSDavid du Colombier
201da51d93aSDavid du Colombier static int
whatof(Node * n,int a)202da51d93aSDavid du Colombier whatof(Node *n, int a)
203da51d93aSDavid du Colombier {
204da51d93aSDavid du Colombier if(n->op == OCONST)
205da51d93aSDavid du Colombier return WCONST;
206375daca8SDavid du Colombier return !vaddr(n, a) ? WHARD : WADDR;
207da51d93aSDavid du Colombier }
208da51d93aSDavid du Colombier
209da51d93aSDavid du Colombier /* can upgrade an extern to addr for AND */
210da51d93aSDavid du Colombier static int
reduxv(Node * n)211da51d93aSDavid du Colombier reduxv(Node *n)
212da51d93aSDavid du Colombier {
213da51d93aSDavid du Colombier return lo64v(n) == 0 || hi64v(n) == 0;
214da51d93aSDavid du Colombier }
215da51d93aSDavid du Colombier
216da51d93aSDavid du Colombier int
cond(int op)217da51d93aSDavid du Colombier cond(int op)
218da51d93aSDavid du Colombier {
219da51d93aSDavid du Colombier switch(op) {
220da51d93aSDavid du Colombier case OANDAND:
221da51d93aSDavid du Colombier case OOROR:
222da51d93aSDavid du Colombier case ONOT:
223da51d93aSDavid du Colombier return 1;
224da51d93aSDavid du Colombier
225da51d93aSDavid du Colombier case OEQ:
226da51d93aSDavid du Colombier case ONE:
227da51d93aSDavid du Colombier case OLE:
228da51d93aSDavid du Colombier case OLT:
229da51d93aSDavid du Colombier case OGE:
230da51d93aSDavid du Colombier case OGT:
231da51d93aSDavid du Colombier case OHI:
232da51d93aSDavid du Colombier case OHS:
233da51d93aSDavid du Colombier case OLO:
234da51d93aSDavid du Colombier case OLS:
235da51d93aSDavid du Colombier return 1;
236da51d93aSDavid du Colombier }
237da51d93aSDavid du Colombier return 0;
238da51d93aSDavid du Colombier }
239da51d93aSDavid du Colombier
240da51d93aSDavid du Colombier /*
241da51d93aSDavid du Colombier * for a func operand call it and then return
242da51d93aSDavid du Colombier * the safe node
243da51d93aSDavid du Colombier */
244da51d93aSDavid du Colombier static Node *
vfunc(Node * n,Node * nn)245da51d93aSDavid du Colombier vfunc(Node *n, Node *nn)
246da51d93aSDavid du Colombier {
247da51d93aSDavid du Colombier Node *t;
248da51d93aSDavid du Colombier
249da51d93aSDavid du Colombier if(n->op != OFUNC)
250da51d93aSDavid du Colombier return n;
251da51d93aSDavid du Colombier t = new(0, Z, Z);
252da51d93aSDavid du Colombier if(nn == Z || nn == nodret)
253da51d93aSDavid du Colombier nn = n;
254da51d93aSDavid du Colombier regsalloc(t, nn);
255da51d93aSDavid du Colombier sugen(n, t, 8);
256da51d93aSDavid du Colombier return t;
257da51d93aSDavid du Colombier }
258da51d93aSDavid du Colombier
259375daca8SDavid du Colombier /* try to steal a reg */
260375daca8SDavid du Colombier static int
getreg(Node ** np,Node * t,int r)261375daca8SDavid du Colombier getreg(Node **np, Node *t, int r)
262da51d93aSDavid du Colombier {
263da51d93aSDavid du Colombier Node *n, *p;
264da51d93aSDavid du Colombier
265da51d93aSDavid du Colombier n = *np;
266375daca8SDavid du Colombier if(n->reg == r) {
267da51d93aSDavid du Colombier p = new(0, Z, Z);
268da51d93aSDavid du Colombier regalloc(p, n, Z);
269da51d93aSDavid du Colombier gins(AMOVL, n, p);
270da51d93aSDavid du Colombier *t = *n;
271da51d93aSDavid du Colombier *np = p;
272da51d93aSDavid du Colombier return 1;
273da51d93aSDavid du Colombier }
274da51d93aSDavid du Colombier return 0;
275da51d93aSDavid du Colombier }
276da51d93aSDavid du Colombier
277375daca8SDavid du Colombier static Node *
snarfreg(Node * n,Node * t,int r,Node * d,Node * c)278375daca8SDavid du Colombier snarfreg(Node *n, Node *t, int r, Node *d, Node *c)
279375daca8SDavid du Colombier {
280375daca8SDavid du Colombier if(n == Z || n->op != OREGPAIR || (!getreg(&n->left, t, r) && !getreg(&n->right, t, r))) {
281375daca8SDavid du Colombier if(nodreg(t, Z, r)) {
282375daca8SDavid du Colombier regalloc(c, d, Z);
283375daca8SDavid du Colombier gins(AMOVL, t, c);
284375daca8SDavid du Colombier reg[r]++;
285375daca8SDavid du Colombier return c;
286375daca8SDavid du Colombier }
287375daca8SDavid du Colombier reg[r]++;
288375daca8SDavid du Colombier }
289375daca8SDavid du Colombier return Z;
290375daca8SDavid du Colombier }
291375daca8SDavid du Colombier
292da51d93aSDavid du Colombier enum
293da51d93aSDavid du Colombier {
294da51d93aSDavid du Colombier Vstart = OEND,
295da51d93aSDavid du Colombier
296da51d93aSDavid du Colombier Vgo,
297da51d93aSDavid du Colombier Vamv,
298da51d93aSDavid du Colombier Vmv,
299da51d93aSDavid du Colombier Vzero,
300da51d93aSDavid du Colombier Vop,
301da51d93aSDavid du Colombier Vopx,
302da51d93aSDavid du Colombier Vins,
303da51d93aSDavid du Colombier Vins0,
304da51d93aSDavid du Colombier Vinsl,
305da51d93aSDavid du Colombier Vinsr,
306da51d93aSDavid du Colombier Vinsla,
307da51d93aSDavid du Colombier Vinsra,
308da51d93aSDavid du Colombier Vinsx,
309375daca8SDavid du Colombier Vmul,
310375daca8SDavid du Colombier Vshll,
311da51d93aSDavid du Colombier VT,
312da51d93aSDavid du Colombier VF,
313da51d93aSDavid du Colombier V_l_lo_f,
314da51d93aSDavid du Colombier V_l_hi_f,
315da51d93aSDavid du Colombier V_l_lo_t,
316da51d93aSDavid du Colombier V_l_hi_t,
317da51d93aSDavid du Colombier V_l_lo_u,
318da51d93aSDavid du Colombier V_l_hi_u,
319da51d93aSDavid du Colombier V_r_lo_f,
320da51d93aSDavid du Colombier V_r_hi_f,
321da51d93aSDavid du Colombier V_r_lo_t,
322da51d93aSDavid du Colombier V_r_hi_t,
323da51d93aSDavid du Colombier V_r_lo_u,
324da51d93aSDavid du Colombier V_r_hi_u,
325da51d93aSDavid du Colombier Vspazz,
326da51d93aSDavid du Colombier Vend,
327da51d93aSDavid du Colombier
328da51d93aSDavid du Colombier V_T0,
329da51d93aSDavid du Colombier V_T1,
330da51d93aSDavid du Colombier V_F0,
331da51d93aSDavid du Colombier V_F1,
332da51d93aSDavid du Colombier
333da51d93aSDavid du Colombier V_a0,
334da51d93aSDavid du Colombier V_a1,
335da51d93aSDavid du Colombier V_f0,
336da51d93aSDavid du Colombier V_f1,
337da51d93aSDavid du Colombier
338da51d93aSDavid du Colombier V_p0,
339da51d93aSDavid du Colombier V_p1,
340da51d93aSDavid du Colombier V_p2,
341da51d93aSDavid du Colombier V_p3,
342da51d93aSDavid du Colombier V_p4,
343da51d93aSDavid du Colombier
344da51d93aSDavid du Colombier V_s0,
345da51d93aSDavid du Colombier V_s1,
346da51d93aSDavid du Colombier V_s2,
347da51d93aSDavid du Colombier V_s3,
348da51d93aSDavid du Colombier V_s4,
349da51d93aSDavid du Colombier
350da51d93aSDavid du Colombier C00,
351da51d93aSDavid du Colombier C01,
352da51d93aSDavid du Colombier C31,
353da51d93aSDavid du Colombier C32,
354da51d93aSDavid du Colombier
355da51d93aSDavid du Colombier O_l_lo,
356da51d93aSDavid du Colombier O_l_hi,
357da51d93aSDavid du Colombier O_r_lo,
358da51d93aSDavid du Colombier O_r_hi,
359da51d93aSDavid du Colombier O_t_lo,
360da51d93aSDavid du Colombier O_t_hi,
361da51d93aSDavid du Colombier O_l,
362da51d93aSDavid du Colombier O_r,
363da51d93aSDavid du Colombier O_l_rp,
364da51d93aSDavid du Colombier O_r_rp,
365da51d93aSDavid du Colombier O_t_rp,
366da51d93aSDavid du Colombier O_r0,
367da51d93aSDavid du Colombier O_r1,
368375daca8SDavid du Colombier O_Zop,
369da51d93aSDavid du Colombier
370da51d93aSDavid du Colombier O_a0,
371da51d93aSDavid du Colombier O_a1,
372da51d93aSDavid du Colombier
373da51d93aSDavid du Colombier V_C0,
374da51d93aSDavid du Colombier V_C1,
375da51d93aSDavid du Colombier
376da51d93aSDavid du Colombier V_S0,
377da51d93aSDavid du Colombier V_S1,
378da51d93aSDavid du Colombier
379da51d93aSDavid du Colombier VOPS = 5,
380da51d93aSDavid du Colombier VLEN = 5,
381da51d93aSDavid du Colombier VARGS = 2,
382da51d93aSDavid du Colombier
383da51d93aSDavid du Colombier S00 = 0,
384da51d93aSDavid du Colombier Sc0,
385da51d93aSDavid du Colombier Sc1,
386da51d93aSDavid du Colombier Sc2,
387da51d93aSDavid du Colombier Sac3,
388da51d93aSDavid du Colombier Sac4,
389da51d93aSDavid du Colombier S10,
390da51d93aSDavid du Colombier
391da51d93aSDavid du Colombier SAgen = 0,
392da51d93aSDavid du Colombier SAclo,
393da51d93aSDavid du Colombier SAc32,
394da51d93aSDavid du Colombier SAchi,
395da51d93aSDavid du Colombier SAdgen,
396da51d93aSDavid du Colombier SAdclo,
397da51d93aSDavid du Colombier SAdc32,
398da51d93aSDavid du Colombier SAdchi,
399da51d93aSDavid du Colombier
400da51d93aSDavid du Colombier B0c = 0,
401da51d93aSDavid du Colombier Bca,
402da51d93aSDavid du Colombier Bac,
403da51d93aSDavid du Colombier
404da51d93aSDavid du Colombier T0i = 0,
405da51d93aSDavid du Colombier Tii,
406da51d93aSDavid du Colombier
407da51d93aSDavid du Colombier Bop0 = 0,
408da51d93aSDavid du Colombier Bop1,
409da51d93aSDavid du Colombier };
410da51d93aSDavid du Colombier
411da51d93aSDavid du Colombier /*
412da51d93aSDavid du Colombier * _testv:
413da51d93aSDavid du Colombier * CMPL lo,$0
414da51d93aSDavid du Colombier * JNE true
415da51d93aSDavid du Colombier * CMPL hi,$0
416da51d93aSDavid du Colombier * JNE true
417da51d93aSDavid du Colombier * GOTO false
418da51d93aSDavid du Colombier * false:
419da51d93aSDavid du Colombier * GOTO code
420da51d93aSDavid du Colombier * true:
421da51d93aSDavid du Colombier * GOTO patchme
422da51d93aSDavid du Colombier * code:
423da51d93aSDavid du Colombier */
424da51d93aSDavid du Colombier
425da51d93aSDavid du Colombier static uchar testi[][VLEN] =
426da51d93aSDavid du Colombier {
427da51d93aSDavid du Colombier {Vop, ONE, O_l_lo, C00},
428da51d93aSDavid du Colombier {V_s0, Vop, ONE, O_l_hi, C00},
429da51d93aSDavid du Colombier {V_s1, Vgo, V_s2, Vgo, V_s3},
430da51d93aSDavid du Colombier {VF, V_p0, V_p1, VT, V_p2},
431da51d93aSDavid du Colombier {Vgo, V_p3},
432da51d93aSDavid du Colombier {VT, V_p0, V_p1, VF, V_p2},
433da51d93aSDavid du Colombier {Vend},
434da51d93aSDavid du Colombier };
435da51d93aSDavid du Colombier
436da51d93aSDavid du Colombier /* shift left general case */
437da51d93aSDavid du Colombier static uchar shll00[][VLEN] =
438da51d93aSDavid du Colombier {
439da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
440da51d93aSDavid du Colombier {V_s0, Vinsl, ASHLL, O_r, O_l_rp},
441da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_l_lo, Vgo},
442da51d93aSDavid du Colombier {V_p0, V_s0},
443da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_l_lo},
444da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_l_hi},
445da51d93aSDavid du Colombier {Vzero, O_l_lo, V_p0, Vend},
446da51d93aSDavid du Colombier };
447da51d93aSDavid du Colombier
448da51d93aSDavid du Colombier /* shift left rp, const < 32 */
449da51d93aSDavid du Colombier static uchar shllc0[][VLEN] =
450da51d93aSDavid du Colombier {
451da51d93aSDavid du Colombier {Vinsl, ASHLL, O_r, O_l_rp},
452375daca8SDavid du Colombier {Vshll, O_r, O_l_lo, Vend},
453da51d93aSDavid du Colombier };
454da51d93aSDavid du Colombier
455da51d93aSDavid du Colombier /* shift left rp, const == 32 */
456da51d93aSDavid du Colombier static uchar shllc1[][VLEN] =
457da51d93aSDavid du Colombier {
458da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_l_hi},
459da51d93aSDavid du Colombier {Vzero, O_l_lo, Vend},
460da51d93aSDavid du Colombier };
461da51d93aSDavid du Colombier
462da51d93aSDavid du Colombier /* shift left rp, const > 32 */
463da51d93aSDavid du Colombier static uchar shllc2[][VLEN] =
464da51d93aSDavid du Colombier {
465375daca8SDavid du Colombier {Vshll, O_r, O_l_lo},
466da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_l_hi},
467da51d93aSDavid du Colombier {Vzero, O_l_lo, Vend},
468da51d93aSDavid du Colombier };
469da51d93aSDavid du Colombier
470da51d93aSDavid du Colombier /* shift left addr, const == 32 */
471da51d93aSDavid du Colombier static uchar shllac3[][VLEN] =
472da51d93aSDavid du Colombier {
473da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
474da51d93aSDavid du Colombier {Vzero, O_t_lo, Vend},
475da51d93aSDavid du Colombier };
476da51d93aSDavid du Colombier
477da51d93aSDavid du Colombier /* shift left addr, const > 32 */
478da51d93aSDavid du Colombier static uchar shllac4[][VLEN] =
479da51d93aSDavid du Colombier {
480da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
481375daca8SDavid du Colombier {Vshll, O_r, O_t_hi},
482da51d93aSDavid du Colombier {Vzero, O_t_lo, Vend},
483da51d93aSDavid du Colombier };
484da51d93aSDavid du Colombier
485da51d93aSDavid du Colombier /* shift left of constant */
486da51d93aSDavid du Colombier static uchar shll10[][VLEN] =
487da51d93aSDavid du Colombier {
488da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
489da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_t_lo},
490da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
491da51d93aSDavid du Colombier {Vinsl, ASHLL, O_r, O_t_rp},
492da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_t_lo, Vgo},
493da51d93aSDavid du Colombier {V_p0, V_s0},
494da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
495da51d93aSDavid du Colombier {V_l_lo_t, Vins, ASHLL, O_r, O_t_hi},
496da51d93aSDavid du Colombier {Vzero, O_t_lo, V_p0, Vend},
497da51d93aSDavid du Colombier };
498da51d93aSDavid du Colombier
499da51d93aSDavid du Colombier static uchar (*shlltab[])[VLEN] =
500da51d93aSDavid du Colombier {
501da51d93aSDavid du Colombier shll00,
502da51d93aSDavid du Colombier shllc0,
503da51d93aSDavid du Colombier shllc1,
504da51d93aSDavid du Colombier shllc2,
505da51d93aSDavid du Colombier shllac3,
506da51d93aSDavid du Colombier shllac4,
507da51d93aSDavid du Colombier shll10,
508da51d93aSDavid du Colombier };
509da51d93aSDavid du Colombier
510da51d93aSDavid du Colombier /* shift right general case */
511da51d93aSDavid du Colombier static uchar shrl00[][VLEN] =
512da51d93aSDavid du Colombier {
513da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
514da51d93aSDavid du Colombier {V_s0, Vinsr, ASHRL, O_r, O_l_rp},
515da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_l_hi, Vgo},
516da51d93aSDavid du Colombier {V_p0, V_s0},
517da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_l_hi},
518da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_l_lo},
519da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
520da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_l_hi},
521da51d93aSDavid du Colombier {V_p0, Vend},
522da51d93aSDavid du Colombier };
523da51d93aSDavid du Colombier
524da51d93aSDavid du Colombier /* shift right rp, const < 32 */
525da51d93aSDavid du Colombier static uchar shrlc0[][VLEN] =
526da51d93aSDavid du Colombier {
527da51d93aSDavid du Colombier {Vinsr, ASHRL, O_r, O_l_rp},
528da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_l_hi, Vend},
529da51d93aSDavid du Colombier };
530da51d93aSDavid du Colombier
531da51d93aSDavid du Colombier /* shift right rp, const == 32 */
532da51d93aSDavid du Colombier static uchar shrlc1[][VLEN] =
533da51d93aSDavid du Colombier {
534da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_l_lo},
535da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
536da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_l_hi},
537da51d93aSDavid du Colombier {Vend},
538da51d93aSDavid du Colombier };
539da51d93aSDavid du Colombier
540da51d93aSDavid du Colombier /* shift right rp, const > 32 */
541da51d93aSDavid du Colombier static uchar shrlc2[][VLEN] =
542da51d93aSDavid du Colombier {
543da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_l_hi},
544da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_l_lo},
545da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
546da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_l_hi},
547da51d93aSDavid du Colombier {Vend},
548da51d93aSDavid du Colombier };
549da51d93aSDavid du Colombier
550da51d93aSDavid du Colombier /* shift right addr, const == 32 */
551da51d93aSDavid du Colombier static uchar shrlac3[][VLEN] =
552da51d93aSDavid du Colombier {
553da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
554da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi},
555da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
556da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
557da51d93aSDavid du Colombier {Vend},
558da51d93aSDavid du Colombier };
559da51d93aSDavid du Colombier
560da51d93aSDavid du Colombier /* shift right addr, const > 32 */
561da51d93aSDavid du Colombier static uchar shrlac4[][VLEN] =
562da51d93aSDavid du Colombier {
563da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
564da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_t_lo},
565da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi},
566da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
567da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
568da51d93aSDavid du Colombier {Vend},
569da51d93aSDavid du Colombier };
570da51d93aSDavid du Colombier
571da51d93aSDavid du Colombier /* shift right of constant */
572da51d93aSDavid du Colombier static uchar shrl10[][VLEN] =
573da51d93aSDavid du Colombier {
574da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
575da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_t_lo},
576da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
577da51d93aSDavid du Colombier {Vinsr, ASHRL, O_r, O_t_rp},
578da51d93aSDavid du Colombier {Vins, O_a0, O_r, O_t_hi, Vgo},
579da51d93aSDavid du Colombier {V_p0, V_s0},
580da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
581da51d93aSDavid du Colombier {V_l_hi_t, Vins, O_a0, O_r, O_t_lo},
582da51d93aSDavid du Colombier {V_l_hi_u, V_S1},
583da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi, V_p0},
584da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
585da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
586da51d93aSDavid du Colombier {Vend},
587da51d93aSDavid du Colombier };
588da51d93aSDavid du Colombier
589da51d93aSDavid du Colombier static uchar (*shrltab[])[VLEN] =
590da51d93aSDavid du Colombier {
591da51d93aSDavid du Colombier shrl00,
592da51d93aSDavid du Colombier shrlc0,
593da51d93aSDavid du Colombier shrlc1,
594da51d93aSDavid du Colombier shrlc2,
595da51d93aSDavid du Colombier shrlac3,
596da51d93aSDavid du Colombier shrlac4,
597da51d93aSDavid du Colombier shrl10,
598da51d93aSDavid du Colombier };
599da51d93aSDavid du Colombier
600da51d93aSDavid du Colombier /* shift asop left general case */
601da51d93aSDavid du Colombier static uchar asshllgen[][VLEN] =
602da51d93aSDavid du Colombier {
603da51d93aSDavid du Colombier {V_a0, V_a1},
604da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
605da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_r0},
606da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r1},
607da51d93aSDavid du Colombier {Vinsla, ASHLL, O_r, O_r0},
608da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_r0},
609da51d93aSDavid du Colombier {Vins, AMOVL, O_r1, O_l_hi},
610da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo, Vgo},
611da51d93aSDavid du Colombier {V_p0, V_s0},
612da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
613da51d93aSDavid du Colombier {Vzero, O_l_lo},
614da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_r0},
615da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_hi, V_p0},
616da51d93aSDavid du Colombier {V_f0, V_f1, Vend},
617da51d93aSDavid du Colombier };
618da51d93aSDavid du Colombier
619da51d93aSDavid du Colombier /* shift asop left, const < 32 */
620da51d93aSDavid du Colombier static uchar asshllclo[][VLEN] =
621da51d93aSDavid du Colombier {
622da51d93aSDavid du Colombier {V_a0, V_a1},
623da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
624da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r1},
625da51d93aSDavid du Colombier {Vinsla, ASHLL, O_r, O_r0},
626375daca8SDavid du Colombier {Vshll, O_r, O_r0},
627da51d93aSDavid du Colombier {Vins, AMOVL, O_r1, O_l_hi},
628da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
629da51d93aSDavid du Colombier {V_f0, V_f1, Vend},
630da51d93aSDavid du Colombier };
631da51d93aSDavid du Colombier
632da51d93aSDavid du Colombier /* shift asop left, const == 32 */
633da51d93aSDavid du Colombier static uchar asshllc32[][VLEN] =
634da51d93aSDavid du Colombier {
635da51d93aSDavid du Colombier {V_a0},
636da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
637da51d93aSDavid du Colombier {Vzero, O_l_lo},
638da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_hi},
639da51d93aSDavid du Colombier {V_f0, Vend},
640da51d93aSDavid du Colombier };
641da51d93aSDavid du Colombier
642da51d93aSDavid du Colombier /* shift asop left, const > 32 */
643da51d93aSDavid du Colombier static uchar asshllchi[][VLEN] =
644da51d93aSDavid du Colombier {
645da51d93aSDavid du Colombier {V_a0},
646da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
647da51d93aSDavid du Colombier {Vzero, O_l_lo},
648375daca8SDavid du Colombier {Vshll, O_r, O_r0},
649da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_hi},
650da51d93aSDavid du Colombier {V_f0, Vend},
651da51d93aSDavid du Colombier };
652da51d93aSDavid du Colombier
653da51d93aSDavid du Colombier /* shift asop dest left general case */
654da51d93aSDavid du Colombier static uchar asdshllgen[][VLEN] =
655da51d93aSDavid du Colombier {
656da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
657da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_t_lo},
658da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
659da51d93aSDavid du Colombier {Vinsl, ASHLL, O_r, O_t_rp},
660da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_t_lo},
661da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
662da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo, Vgo},
663da51d93aSDavid du Colombier {V_p0, V_s0},
664da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
665da51d93aSDavid du Colombier {Vzero, O_l_lo},
666da51d93aSDavid du Colombier {Vins, ASHLL, O_r, O_t_hi},
667da51d93aSDavid du Colombier {Vzero, O_t_lo},
668da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi, V_p0},
669da51d93aSDavid du Colombier {Vend},
670da51d93aSDavid du Colombier };
671da51d93aSDavid du Colombier
672da51d93aSDavid du Colombier /* shift asop dest left, const < 32 */
673da51d93aSDavid du Colombier static uchar asdshllclo[][VLEN] =
674da51d93aSDavid du Colombier {
675da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
676da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
677da51d93aSDavid du Colombier {Vinsl, ASHLL, O_r, O_t_rp},
678375daca8SDavid du Colombier {Vshll, O_r, O_t_lo},
679da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
680da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
681da51d93aSDavid du Colombier {Vend},
682da51d93aSDavid du Colombier };
683da51d93aSDavid du Colombier
684da51d93aSDavid du Colombier /* shift asop dest left, const == 32 */
685da51d93aSDavid du Colombier static uchar asdshllc32[][VLEN] =
686da51d93aSDavid du Colombier {
687da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
688da51d93aSDavid du Colombier {Vzero, O_t_lo},
689da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
690da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
691da51d93aSDavid du Colombier {Vend},
692da51d93aSDavid du Colombier };
693da51d93aSDavid du Colombier
694da51d93aSDavid du Colombier /* shift asop dest, const > 32 */
695da51d93aSDavid du Colombier static uchar asdshllchi[][VLEN] =
696da51d93aSDavid du Colombier {
697da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_hi},
698da51d93aSDavid du Colombier {Vzero, O_t_lo},
699375daca8SDavid du Colombier {Vshll, O_r, O_t_hi},
700da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
701da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
702da51d93aSDavid du Colombier {Vend},
703da51d93aSDavid du Colombier };
704da51d93aSDavid du Colombier
705da51d93aSDavid du Colombier static uchar (*asshlltab[])[VLEN] =
706da51d93aSDavid du Colombier {
707da51d93aSDavid du Colombier asshllgen,
708da51d93aSDavid du Colombier asshllclo,
709da51d93aSDavid du Colombier asshllc32,
710da51d93aSDavid du Colombier asshllchi,
711da51d93aSDavid du Colombier asdshllgen,
712da51d93aSDavid du Colombier asdshllclo,
713da51d93aSDavid du Colombier asdshllc32,
714da51d93aSDavid du Colombier asdshllchi,
715da51d93aSDavid du Colombier };
716da51d93aSDavid du Colombier
717da51d93aSDavid du Colombier /* shift asop right general case */
718da51d93aSDavid du Colombier static uchar asshrlgen[][VLEN] =
719da51d93aSDavid du Colombier {
720da51d93aSDavid du Colombier {V_a0, V_a1},
721da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
722da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_r0},
723da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r1},
724da51d93aSDavid du Colombier {Vinsra, ASHRL, O_r, O_r0},
725da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_r1},
726da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
727da51d93aSDavid du Colombier {Vins, AMOVL, O_r1, O_l_hi, Vgo},
728da51d93aSDavid du Colombier {V_p0, V_s0},
729da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r0},
730da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_r0},
731da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
732da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
733da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_r0},
734da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_r0, O_l_hi},
735da51d93aSDavid du Colombier {V_p0, V_f0, V_f1, Vend},
736da51d93aSDavid du Colombier };
737da51d93aSDavid du Colombier
738da51d93aSDavid du Colombier /* shift asop right, const < 32 */
739da51d93aSDavid du Colombier static uchar asshrlclo[][VLEN] =
740da51d93aSDavid du Colombier {
741da51d93aSDavid du Colombier {V_a0, V_a1},
742da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
743da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r1},
744da51d93aSDavid du Colombier {Vinsra, ASHRL, O_r, O_r0},
745da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_r1},
746da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
747da51d93aSDavid du Colombier {Vins, AMOVL, O_r1, O_l_hi},
748da51d93aSDavid du Colombier {V_f0, V_f1, Vend},
749da51d93aSDavid du Colombier };
750da51d93aSDavid du Colombier
751da51d93aSDavid du Colombier /* shift asop right, const == 32 */
752da51d93aSDavid du Colombier static uchar asshrlc32[][VLEN] =
753da51d93aSDavid du Colombier {
754da51d93aSDavid du Colombier {V_a0},
755da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r0},
756da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
757da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
758da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_r0},
759da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_r0, O_l_hi},
760da51d93aSDavid du Colombier {V_f0, Vend},
761da51d93aSDavid du Colombier };
762da51d93aSDavid du Colombier
763da51d93aSDavid du Colombier /* shift asop right, const > 32 */
764da51d93aSDavid du Colombier static uchar asshrlchi[][VLEN] =
765da51d93aSDavid du Colombier {
766da51d93aSDavid du Colombier {V_a0},
767da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r0},
768da51d93aSDavid du Colombier {V_T1, Vzero, O_l_hi},
769da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_r0},
770da51d93aSDavid du Colombier {Vins, AMOVL, O_r0, O_l_lo},
771da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_r0},
772da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_r0, O_l_hi},
773da51d93aSDavid du Colombier {V_f0, Vend},
774da51d93aSDavid du Colombier };
775da51d93aSDavid du Colombier
776da51d93aSDavid du Colombier /* shift asop dest right general case */
777da51d93aSDavid du Colombier static uchar asdshrlgen[][VLEN] =
778da51d93aSDavid du Colombier {
779da51d93aSDavid du Colombier {Vop, OGE, O_r, C32},
780da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_lo, O_t_lo},
781da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
782da51d93aSDavid du Colombier {Vinsr, ASHRL, O_r, O_t_rp},
783da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_t_hi},
784da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
785da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi, Vgo},
786da51d93aSDavid du Colombier {V_p0, V_s0},
787da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
788da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi},
789da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_t_lo},
790da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
791da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
792da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi, V_p0},
793da51d93aSDavid du Colombier {Vend},
794da51d93aSDavid du Colombier };
795da51d93aSDavid du Colombier
796da51d93aSDavid du Colombier /* shift asop dest right, const < 32 */
797da51d93aSDavid du Colombier static uchar asdshrlclo[][VLEN] =
798da51d93aSDavid du Colombier {
799da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
800da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
801da51d93aSDavid du Colombier {Vinsr, ASHRL, O_r, O_t_rp},
802da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_t_hi},
803da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
804da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
805da51d93aSDavid du Colombier {Vend},
806da51d93aSDavid du Colombier };
807da51d93aSDavid du Colombier
808da51d93aSDavid du Colombier /* shift asop dest right, const == 32 */
809da51d93aSDavid du Colombier static uchar asdshrlc32[][VLEN] =
810da51d93aSDavid du Colombier {
811da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
812da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi},
813da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
814da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
815da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
816da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi},
817da51d93aSDavid du Colombier {Vend},
818da51d93aSDavid du Colombier };
819da51d93aSDavid du Colombier
820da51d93aSDavid du Colombier /* shift asop dest, const > 32 */
821da51d93aSDavid du Colombier static uchar asdshrlchi[][VLEN] =
822da51d93aSDavid du Colombier {
823da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_lo},
824da51d93aSDavid du Colombier {V_T1, Vzero, O_t_hi},
825da51d93aSDavid du Colombier {Vinsx, Bop0, O_r, O_t_lo},
826da51d93aSDavid du Colombier {V_T1, Vins, AMOVL, O_t_hi, O_l_hi},
827da51d93aSDavid du Colombier {V_T1, Vins, AMOVL, O_t_lo, O_l_lo},
828da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_t_hi},
829da51d93aSDavid du Colombier {V_F1, Vins, ASARL, C31, O_t_hi},
830da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_lo, O_l_lo},
831da51d93aSDavid du Colombier {V_F1, Vins, AMOVL, O_t_hi, O_l_hi},
832da51d93aSDavid du Colombier {Vend},
833da51d93aSDavid du Colombier };
834da51d93aSDavid du Colombier
835da51d93aSDavid du Colombier static uchar (*asshrltab[])[VLEN] =
836da51d93aSDavid du Colombier {
837da51d93aSDavid du Colombier asshrlgen,
838da51d93aSDavid du Colombier asshrlclo,
839da51d93aSDavid du Colombier asshrlc32,
840da51d93aSDavid du Colombier asshrlchi,
841da51d93aSDavid du Colombier asdshrlgen,
842da51d93aSDavid du Colombier asdshrlclo,
843da51d93aSDavid du Colombier asdshrlc32,
844da51d93aSDavid du Colombier asdshrlchi,
845da51d93aSDavid du Colombier };
846da51d93aSDavid du Colombier
847da51d93aSDavid du Colombier static uchar shrlargs[] = { ASHRL, 1 };
848da51d93aSDavid du Colombier static uchar sarlargs[] = { ASARL, 0 };
849da51d93aSDavid du Colombier
850da51d93aSDavid du Colombier /* ++ -- */
851da51d93aSDavid du Colombier static uchar incdec[][VLEN] =
852da51d93aSDavid du Colombier {
853da51d93aSDavid du Colombier {Vinsx, Bop0, C01, O_l_lo},
854da51d93aSDavid du Colombier {Vinsx, Bop1, C00, O_l_hi, Vend},
855da51d93aSDavid du Colombier };
856da51d93aSDavid du Colombier
857da51d93aSDavid du Colombier /* ++ -- *p */
858da51d93aSDavid du Colombier static uchar incdecpre[][VLEN] =
859da51d93aSDavid du Colombier {
860da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
861da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
862da51d93aSDavid du Colombier {Vinsx, Bop0, C01, O_t_lo},
863da51d93aSDavid du Colombier {Vinsx, Bop1, C00, O_t_hi},
864da51d93aSDavid du Colombier {Vins, AMOVL, O_t_lo, O_l_lo},
865da51d93aSDavid du Colombier {Vins, AMOVL, O_t_hi, O_l_hi, Vend},
866da51d93aSDavid du Colombier };
867da51d93aSDavid du Colombier
868da51d93aSDavid du Colombier /* *p ++ -- */
869da51d93aSDavid du Colombier static uchar incdecpost[][VLEN] =
870da51d93aSDavid du Colombier {
871da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
872da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
873da51d93aSDavid du Colombier {Vinsx, Bop0, C01, O_l_lo},
874da51d93aSDavid du Colombier {Vinsx, Bop1, C00, O_l_hi, Vend},
875da51d93aSDavid du Colombier };
876da51d93aSDavid du Colombier
877da51d93aSDavid du Colombier /* binop rp, rp */
878da51d93aSDavid du Colombier static uchar binop00[][VLEN] =
879da51d93aSDavid du Colombier {
880da51d93aSDavid du Colombier {Vinsx, Bop0, O_r_lo, O_l_lo},
881da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_l_hi, Vend},
882da51d93aSDavid du Colombier {Vend},
883da51d93aSDavid du Colombier };
884da51d93aSDavid du Colombier
885da51d93aSDavid du Colombier /* binop rp, addr */
886da51d93aSDavid du Colombier static uchar binoptmp[][VLEN] =
887da51d93aSDavid du Colombier {
888da51d93aSDavid du Colombier {V_a0, Vins, AMOVL, O_r_lo, O_r0},
889da51d93aSDavid du Colombier {Vinsx, Bop0, O_r0, O_l_lo},
890da51d93aSDavid du Colombier {Vins, AMOVL, O_r_hi, O_r0},
891da51d93aSDavid du Colombier {Vinsx, Bop1, O_r0, O_l_hi},
892da51d93aSDavid du Colombier {V_f0, Vend},
893da51d93aSDavid du Colombier };
894da51d93aSDavid du Colombier
895da51d93aSDavid du Colombier /* binop t = *a op *b */
896da51d93aSDavid du Colombier static uchar binop11[][VLEN] =
897da51d93aSDavid du Colombier {
898da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
899da51d93aSDavid du Colombier {Vinsx, Bop0, O_r_lo, O_t_lo},
900da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
901da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_t_hi, Vend},
902da51d93aSDavid du Colombier };
903da51d93aSDavid du Colombier
904da51d93aSDavid du Colombier /* binop t = rp +- c */
905da51d93aSDavid du Colombier static uchar add0c[][VLEN] =
906da51d93aSDavid du Colombier {
907da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_l_lo},
908da51d93aSDavid du Colombier {V_r_lo_f, Vamv, Bop0, Bop1},
909da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_l_hi},
910da51d93aSDavid du Colombier {Vend},
911da51d93aSDavid du Colombier };
912da51d93aSDavid du Colombier
913da51d93aSDavid du Colombier /* binop t = rp & c */
914da51d93aSDavid du Colombier static uchar and0c[][VLEN] =
915da51d93aSDavid du Colombier {
916da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_l_lo},
917da51d93aSDavid du Colombier {V_r_lo_f, Vins, AMOVL, C00, O_l_lo},
918da51d93aSDavid du Colombier {V_r_hi_t, Vinsx, Bop1, O_r_hi, O_l_hi},
919da51d93aSDavid du Colombier {V_r_hi_f, Vins, AMOVL, C00, O_l_hi},
920da51d93aSDavid du Colombier {Vend},
921da51d93aSDavid du Colombier };
922da51d93aSDavid du Colombier
923da51d93aSDavid du Colombier /* binop t = rp | c */
924da51d93aSDavid du Colombier static uchar or0c[][VLEN] =
925da51d93aSDavid du Colombier {
926da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_l_lo},
927da51d93aSDavid du Colombier {V_r_hi_t, Vinsx, Bop1, O_r_hi, O_l_hi},
928da51d93aSDavid du Colombier {Vend},
929da51d93aSDavid du Colombier };
930da51d93aSDavid du Colombier
931da51d93aSDavid du Colombier /* binop t = c - rp */
932da51d93aSDavid du Colombier static uchar sub10[][VLEN] =
933da51d93aSDavid du Colombier {
934da51d93aSDavid du Colombier {V_a0, Vins, AMOVL, O_l_lo, O_r0},
935da51d93aSDavid du Colombier {Vinsx, Bop0, O_r_lo, O_r0},
936da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_r_lo},
937da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_r_lo},
938da51d93aSDavid du Colombier {Vspazz, V_f0, Vend},
939da51d93aSDavid du Colombier };
940da51d93aSDavid du Colombier
941da51d93aSDavid du Colombier /* binop t = c + *b */
942da51d93aSDavid du Colombier static uchar addca[][VLEN] =
943da51d93aSDavid du Colombier {
944da51d93aSDavid du Colombier {Vins, AMOVL, O_r_lo, O_t_lo},
945da51d93aSDavid du Colombier {V_l_lo_t, Vinsx, Bop0, O_l_lo, O_t_lo},
946da51d93aSDavid du Colombier {V_l_lo_f, Vamv, Bop0, Bop1},
947da51d93aSDavid du Colombier {Vins, AMOVL, O_r_hi, O_t_hi},
948da51d93aSDavid du Colombier {Vinsx, Bop1, O_l_hi, O_t_hi},
949da51d93aSDavid du Colombier {Vend},
950da51d93aSDavid du Colombier };
951da51d93aSDavid du Colombier
952da51d93aSDavid du Colombier /* binop t = c & *b */
953da51d93aSDavid du Colombier static uchar andca[][VLEN] =
954da51d93aSDavid du Colombier {
955da51d93aSDavid du Colombier {V_l_lo_t, Vins, AMOVL, O_r_lo, O_t_lo},
956da51d93aSDavid du Colombier {V_l_lo_t, Vinsx, Bop0, O_l_lo, O_t_lo},
957da51d93aSDavid du Colombier {V_l_lo_f, Vzero, O_t_lo},
958da51d93aSDavid du Colombier {V_l_hi_t, Vins, AMOVL, O_r_hi, O_t_hi},
959da51d93aSDavid du Colombier {V_l_hi_t, Vinsx, Bop1, O_l_hi, O_t_hi},
960da51d93aSDavid du Colombier {V_l_hi_f, Vzero, O_t_hi},
961da51d93aSDavid du Colombier {Vend},
962da51d93aSDavid du Colombier };
963da51d93aSDavid du Colombier
964da51d93aSDavid du Colombier /* binop t = c | *b */
965da51d93aSDavid du Colombier static uchar orca[][VLEN] =
966da51d93aSDavid du Colombier {
967da51d93aSDavid du Colombier {Vins, AMOVL, O_r_lo, O_t_lo},
968da51d93aSDavid du Colombier {V_l_lo_t, Vinsx, Bop0, O_l_lo, O_t_lo},
969da51d93aSDavid du Colombier {Vins, AMOVL, O_r_hi, O_t_hi},
970da51d93aSDavid du Colombier {V_l_hi_t, Vinsx, Bop1, O_l_hi, O_t_hi},
971da51d93aSDavid du Colombier {Vend},
972da51d93aSDavid du Colombier };
973da51d93aSDavid du Colombier
974da51d93aSDavid du Colombier /* binop t = c - *b */
975da51d93aSDavid du Colombier static uchar subca[][VLEN] =
976da51d93aSDavid du Colombier {
977da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
978da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
979da51d93aSDavid du Colombier {Vinsx, Bop0, O_r_lo, O_t_lo},
980da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_t_hi},
981da51d93aSDavid du Colombier {Vend},
982da51d93aSDavid du Colombier };
983da51d93aSDavid du Colombier
984da51d93aSDavid du Colombier /* binop t = *a +- c */
985da51d93aSDavid du Colombier static uchar addac[][VLEN] =
986da51d93aSDavid du Colombier {
987da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
988da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_t_lo},
989da51d93aSDavid du Colombier {V_r_lo_f, Vamv, Bop0, Bop1},
990da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
991da51d93aSDavid du Colombier {Vinsx, Bop1, O_r_hi, O_t_hi},
992da51d93aSDavid du Colombier {Vend},
993da51d93aSDavid du Colombier };
994da51d93aSDavid du Colombier
995da51d93aSDavid du Colombier /* binop t = *a | c */
996da51d93aSDavid du Colombier static uchar orac[][VLEN] =
997da51d93aSDavid du Colombier {
998da51d93aSDavid du Colombier {Vins, AMOVL, O_l_lo, O_t_lo},
999da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_t_lo},
1000da51d93aSDavid du Colombier {Vins, AMOVL, O_l_hi, O_t_hi},
1001da51d93aSDavid du Colombier {V_r_hi_t, Vinsx, Bop1, O_r_hi, O_t_hi},
1002da51d93aSDavid du Colombier {Vend},
1003da51d93aSDavid du Colombier };
1004da51d93aSDavid du Colombier
1005da51d93aSDavid du Colombier /* binop t = *a & c */
1006da51d93aSDavid du Colombier static uchar andac[][VLEN] =
1007da51d93aSDavid du Colombier {
1008da51d93aSDavid du Colombier {V_r_lo_t, Vins, AMOVL, O_l_lo, O_t_lo},
1009da51d93aSDavid du Colombier {V_r_lo_t, Vinsx, Bop0, O_r_lo, O_t_lo},
1010da51d93aSDavid du Colombier {V_r_lo_f, Vzero, O_t_lo},
1011da51d93aSDavid du Colombier {V_r_hi_t, Vins, AMOVL, O_l_hi, O_t_hi},
1012da51d93aSDavid du Colombier {V_r_hi_t, Vinsx, Bop0, O_r_hi, O_t_hi},
1013da51d93aSDavid du Colombier {V_r_hi_f, Vzero, O_t_hi},
1014da51d93aSDavid du Colombier {Vend},
1015da51d93aSDavid du Colombier };
1016da51d93aSDavid du Colombier
1017da51d93aSDavid du Colombier static uchar ADDargs[] = { AADDL, AADCL };
1018da51d93aSDavid du Colombier static uchar ANDargs[] = { AANDL, AANDL };
1019da51d93aSDavid du Colombier static uchar ORargs[] = { AORL, AORL };
1020da51d93aSDavid du Colombier static uchar SUBargs[] = { ASUBL, ASBBL };
1021da51d93aSDavid du Colombier static uchar XORargs[] = { AXORL, AXORL };
1022da51d93aSDavid du Colombier
1023da51d93aSDavid du Colombier static uchar (*ADDtab[])[VLEN] =
1024da51d93aSDavid du Colombier {
1025da51d93aSDavid du Colombier add0c, addca, addac,
1026da51d93aSDavid du Colombier };
1027da51d93aSDavid du Colombier
1028da51d93aSDavid du Colombier static uchar (*ANDtab[])[VLEN] =
1029da51d93aSDavid du Colombier {
1030da51d93aSDavid du Colombier and0c, andca, andac,
1031da51d93aSDavid du Colombier };
1032da51d93aSDavid du Colombier
1033da51d93aSDavid du Colombier static uchar (*ORtab[])[VLEN] =
1034da51d93aSDavid du Colombier {
1035da51d93aSDavid du Colombier or0c, orca, orac,
1036da51d93aSDavid du Colombier };
1037da51d93aSDavid du Colombier
1038da51d93aSDavid du Colombier static uchar (*SUBtab[])[VLEN] =
1039da51d93aSDavid du Colombier {
1040da51d93aSDavid du Colombier add0c, subca, addac,
1041da51d93aSDavid du Colombier };
1042da51d93aSDavid du Colombier
1043375daca8SDavid du Colombier /* mul of const32 */
1044375daca8SDavid du Colombier static uchar mulc32[][VLEN] =
1045375daca8SDavid du Colombier {
1046375daca8SDavid du Colombier {V_a0, Vop, ONE, O_l_hi, C00},
1047375daca8SDavid du Colombier {V_s0, Vins, AMOVL, O_r_lo, O_r0},
1048375daca8SDavid du Colombier {Vins, AMULL, O_r0, O_Zop},
1049375daca8SDavid du Colombier {Vgo, V_p0, V_s0},
1050375daca8SDavid du Colombier {Vins, AMOVL, O_l_hi, O_r0},
1051375daca8SDavid du Colombier {Vmul, O_r_lo, O_r0},
1052375daca8SDavid du Colombier {Vins, AMOVL, O_r_lo, O_l_hi},
1053375daca8SDavid du Colombier {Vins, AMULL, O_l_hi, O_Zop},
1054375daca8SDavid du Colombier {Vins, AADDL, O_r0, O_l_hi},
1055375daca8SDavid du Colombier {V_f0, V_p0, Vend},
1056375daca8SDavid du Colombier };
1057375daca8SDavid du Colombier
1058375daca8SDavid du Colombier /* mul of const64 */
1059375daca8SDavid du Colombier static uchar mulc64[][VLEN] =
1060375daca8SDavid du Colombier {
1061375daca8SDavid du Colombier {V_a0, Vins, AMOVL, O_r_hi, O_r0},
1062375daca8SDavid du Colombier {Vop, OOR, O_l_hi, O_r0},
1063375daca8SDavid du Colombier {Vop, ONE, O_r0, C00},
1064375daca8SDavid du Colombier {V_s0, Vins, AMOVL, O_r_lo, O_r0},
1065375daca8SDavid du Colombier {Vins, AMULL, O_r0, O_Zop},
1066375daca8SDavid du Colombier {Vgo, V_p0, V_s0},
1067375daca8SDavid du Colombier {Vmul, O_r_lo, O_l_hi},
1068375daca8SDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
1069375daca8SDavid du Colombier {Vmul, O_r_hi, O_r0},
1070375daca8SDavid du Colombier {Vins, AADDL, O_l_hi, O_r0},
1071375daca8SDavid du Colombier {Vins, AMOVL, O_r_lo, O_l_hi},
1072375daca8SDavid du Colombier {Vins, AMULL, O_l_hi, O_Zop},
1073375daca8SDavid du Colombier {Vins, AADDL, O_r0, O_l_hi},
1074375daca8SDavid du Colombier {V_f0, V_p0, Vend},
1075375daca8SDavid du Colombier };
1076375daca8SDavid du Colombier
1077375daca8SDavid du Colombier /* mul general */
1078375daca8SDavid du Colombier static uchar mull[][VLEN] =
1079375daca8SDavid du Colombier {
1080375daca8SDavid du Colombier {V_a0, Vins, AMOVL, O_r_hi, O_r0},
1081375daca8SDavid du Colombier {Vop, OOR, O_l_hi, O_r0},
1082375daca8SDavid du Colombier {Vop, ONE, O_r0, C00},
1083375daca8SDavid du Colombier {V_s0, Vins, AMOVL, O_r_lo, O_r0},
1084375daca8SDavid du Colombier {Vins, AMULL, O_r0, O_Zop},
1085375daca8SDavid du Colombier {Vgo, V_p0, V_s0},
1086375daca8SDavid du Colombier {Vins, AIMULL, O_r_lo, O_l_hi},
1087375daca8SDavid du Colombier {Vins, AMOVL, O_l_lo, O_r0},
1088375daca8SDavid du Colombier {Vins, AIMULL, O_r_hi, O_r0},
1089375daca8SDavid du Colombier {Vins, AADDL, O_l_hi, O_r0},
1090375daca8SDavid du Colombier {Vins, AMOVL, O_r_lo, O_l_hi},
1091375daca8SDavid du Colombier {Vins, AMULL, O_l_hi, O_Zop},
1092375daca8SDavid du Colombier {Vins, AADDL, O_r0, O_l_hi},
1093375daca8SDavid du Colombier {V_f0, V_p0, Vend},
1094375daca8SDavid du Colombier };
1095375daca8SDavid du Colombier
1096da51d93aSDavid du Colombier /* cast rp l to rp t */
1097da51d93aSDavid du Colombier static uchar castrp[][VLEN] =
1098da51d93aSDavid du Colombier {
1099da51d93aSDavid du Colombier {Vmv, O_l, O_t_lo},
1100da51d93aSDavid du Colombier {VT, Vins, AMOVL, O_t_lo, O_t_hi},
1101da51d93aSDavid du Colombier {VT, Vins, ASARL, C31, O_t_hi},
1102da51d93aSDavid du Colombier {VF, Vzero, O_t_hi},
1103da51d93aSDavid du Colombier {Vend},
1104da51d93aSDavid du Colombier };
1105da51d93aSDavid du Colombier
1106da51d93aSDavid du Colombier /* cast rp l to addr t */
1107da51d93aSDavid du Colombier static uchar castrpa[][VLEN] =
1108da51d93aSDavid du Colombier {
1109da51d93aSDavid du Colombier {VT, V_a0, Vmv, O_l, O_r0},
1110da51d93aSDavid du Colombier {VT, Vins, AMOVL, O_r0, O_t_lo},
1111da51d93aSDavid du Colombier {VT, Vins, ASARL, C31, O_r0},
1112da51d93aSDavid du Colombier {VT, Vins, AMOVL, O_r0, O_t_hi},
1113da51d93aSDavid du Colombier {VT, V_f0},
1114da51d93aSDavid du Colombier {VF, Vmv, O_l, O_t_lo},
1115da51d93aSDavid du Colombier {VF, Vzero, O_t_hi},
1116da51d93aSDavid du Colombier {Vend},
1117da51d93aSDavid du Colombier };
1118da51d93aSDavid du Colombier
1119da51d93aSDavid du Colombier static uchar netab0i[][VLEN] =
1120da51d93aSDavid du Colombier {
1121da51d93aSDavid du Colombier {Vop, ONE, O_l_lo, O_r_lo},
1122da51d93aSDavid du Colombier {V_s0, Vop, ONE, O_l_hi, O_r_hi},
1123da51d93aSDavid du Colombier {V_s1, Vgo, V_s2, Vgo, V_s3},
1124da51d93aSDavid du Colombier {VF, V_p0, V_p1, VT, V_p2},
1125da51d93aSDavid du Colombier {Vgo, V_p3},
1126da51d93aSDavid du Colombier {VT, V_p0, V_p1, VF, V_p2},
1127da51d93aSDavid du Colombier {Vend},
1128da51d93aSDavid du Colombier };
1129da51d93aSDavid du Colombier
1130da51d93aSDavid du Colombier static uchar netabii[][VLEN] =
1131da51d93aSDavid du Colombier {
1132da51d93aSDavid du Colombier {V_a0, Vins, AMOVL, O_l_lo, O_r0},
1133da51d93aSDavid du Colombier {Vop, ONE, O_r0, O_r_lo},
1134da51d93aSDavid du Colombier {V_s0, Vins, AMOVL, O_l_hi, O_r0},
1135da51d93aSDavid du Colombier {Vop, ONE, O_r0, O_r_hi},
1136da51d93aSDavid du Colombier {V_s1, Vgo, V_s2, Vgo, V_s3},
1137da51d93aSDavid du Colombier {VF, V_p0, V_p1, VT, V_p2},
1138da51d93aSDavid du Colombier {Vgo, V_p3},
1139da51d93aSDavid du Colombier {VT, V_p0, V_p1, VF, V_p2},
1140da51d93aSDavid du Colombier {V_f0, Vend},
1141da51d93aSDavid du Colombier };
1142da51d93aSDavid du Colombier
1143da51d93aSDavid du Colombier static uchar cmptab0i[][VLEN] =
1144da51d93aSDavid du Colombier {
1145da51d93aSDavid du Colombier {Vopx, Bop0, O_l_hi, O_r_hi},
1146da51d93aSDavid du Colombier {V_s0, Vins0, AJNE},
1147da51d93aSDavid du Colombier {V_s1, Vopx, Bop1, O_l_lo, O_r_lo},
1148da51d93aSDavid du Colombier {V_s2, Vgo, V_s3, Vgo, V_s4},
1149da51d93aSDavid du Colombier {VT, V_p1, V_p3},
1150da51d93aSDavid du Colombier {VF, V_p0, V_p2},
1151da51d93aSDavid du Colombier {Vgo, V_p4},
1152da51d93aSDavid du Colombier {VT, V_p0, V_p2},
1153da51d93aSDavid du Colombier {VF, V_p1, V_p3},
1154da51d93aSDavid du Colombier {Vend},
1155da51d93aSDavid du Colombier };
1156da51d93aSDavid du Colombier
1157da51d93aSDavid du Colombier static uchar cmptabii[][VLEN] =
1158da51d93aSDavid du Colombier {
1159da51d93aSDavid du Colombier {V_a0, Vins, AMOVL, O_l_hi, O_r0},
1160da51d93aSDavid du Colombier {Vopx, Bop0, O_r0, O_r_hi},
1161da51d93aSDavid du Colombier {V_s0, Vins0, AJNE},
1162da51d93aSDavid du Colombier {V_s1, Vins, AMOVL, O_l_lo, O_r0},
1163da51d93aSDavid du Colombier {Vopx, Bop1, O_r0, O_r_lo},
1164da51d93aSDavid du Colombier {V_s2, Vgo, V_s3, Vgo, V_s4},
1165da51d93aSDavid du Colombier {VT, V_p1, V_p3},
1166da51d93aSDavid du Colombier {VF, V_p0, V_p2},
1167da51d93aSDavid du Colombier {Vgo, V_p4},
1168da51d93aSDavid du Colombier {VT, V_p0, V_p2},
1169da51d93aSDavid du Colombier {VF, V_p1, V_p3},
1170da51d93aSDavid du Colombier {V_f0, Vend},
1171da51d93aSDavid du Colombier };
1172da51d93aSDavid du Colombier
1173da51d93aSDavid du Colombier static uchar (*NEtab[])[VLEN] =
1174da51d93aSDavid du Colombier {
1175da51d93aSDavid du Colombier netab0i, netabii,
1176da51d93aSDavid du Colombier };
1177da51d93aSDavid du Colombier
1178da51d93aSDavid du Colombier static uchar (*cmptab[])[VLEN] =
1179da51d93aSDavid du Colombier {
1180da51d93aSDavid du Colombier cmptab0i, cmptabii,
1181da51d93aSDavid du Colombier };
1182da51d93aSDavid du Colombier
1183da51d93aSDavid du Colombier static uchar GEargs[] = { OGT, OHS };
1184da51d93aSDavid du Colombier static uchar GTargs[] = { OGT, OHI };
1185da51d93aSDavid du Colombier static uchar HIargs[] = { OHI, OHI };
1186da51d93aSDavid du Colombier static uchar HSargs[] = { OHI, OHS };
1187da51d93aSDavid du Colombier
1188da51d93aSDavid du Colombier /* Big Generator */
1189da51d93aSDavid du Colombier static void
biggen(Node * l,Node * r,Node * t,int true,uchar code[][VLEN],uchar * a)1190da51d93aSDavid du Colombier biggen(Node *l, Node *r, Node *t, int true, uchar code[][VLEN], uchar *a)
1191da51d93aSDavid du Colombier {
1192da51d93aSDavid du Colombier int i, j, g, oc, op, lo, ro, to, xo, *xp;
1193da51d93aSDavid du Colombier Type *lt;
1194da51d93aSDavid du Colombier Prog *pr[VOPS];
1195da51d93aSDavid du Colombier Node *ot, *tl, *tr, tmps[2];
1196da51d93aSDavid du Colombier uchar *c, (*cp)[VLEN], args[VARGS];
1197da51d93aSDavid du Colombier
1198da51d93aSDavid du Colombier if(a != nil)
1199da51d93aSDavid du Colombier memmove(args, a, VARGS);
1200da51d93aSDavid du Colombier //print("biggen %d %d %d\n", args[0], args[1], args[2]);
1201da51d93aSDavid du Colombier //if(l) prtree(l, "l");
1202da51d93aSDavid du Colombier //if(r) prtree(r, "r");
1203da51d93aSDavid du Colombier //if(t) prtree(t, "t");
1204da51d93aSDavid du Colombier lo = ro = to = 0;
1205da51d93aSDavid du Colombier cp = code;
1206da51d93aSDavid du Colombier
1207da51d93aSDavid du Colombier for (;;) {
1208da51d93aSDavid du Colombier c = *cp++;
1209da51d93aSDavid du Colombier g = 1;
1210da51d93aSDavid du Colombier i = 0;
1211da51d93aSDavid du Colombier //print("code %d %d %d %d %d\n", c[0], c[1], c[2], c[3], c[4]);
1212da51d93aSDavid du Colombier for(;;) {
1213da51d93aSDavid du Colombier switch(op = c[i]) {
1214da51d93aSDavid du Colombier case Vgo:
1215da51d93aSDavid du Colombier if(g)
1216da51d93aSDavid du Colombier gbranch(OGOTO);
1217da51d93aSDavid du Colombier i++;
1218da51d93aSDavid du Colombier break;
1219da51d93aSDavid du Colombier
1220da51d93aSDavid du Colombier case Vamv:
1221da51d93aSDavid du Colombier i += 3;
1222da51d93aSDavid du Colombier if(i > VLEN) {
1223da51d93aSDavid du Colombier diag(l, "bad Vop");
1224da51d93aSDavid du Colombier return;
1225da51d93aSDavid du Colombier }
1226da51d93aSDavid du Colombier if(g)
1227da51d93aSDavid du Colombier args[c[i - 1]] = args[c[i - 2]];
1228da51d93aSDavid du Colombier break;
1229da51d93aSDavid du Colombier
1230da51d93aSDavid du Colombier case Vzero:
1231da51d93aSDavid du Colombier i += 2;
1232da51d93aSDavid du Colombier if(i > VLEN) {
1233da51d93aSDavid du Colombier diag(l, "bad Vop");
1234da51d93aSDavid du Colombier return;
1235da51d93aSDavid du Colombier }
1236da51d93aSDavid du Colombier j = i - 1;
1237da51d93aSDavid du Colombier goto op;
1238da51d93aSDavid du Colombier
1239da51d93aSDavid du Colombier case Vspazz: // nasty hack to save a reg in SUB
1240da51d93aSDavid du Colombier //print("spazz\n");
1241da51d93aSDavid du Colombier if(g) {
1242da51d93aSDavid du Colombier //print("hi %R lo %R t %R\n", r->right->reg, r->left->reg, tmps[0].reg);
1243da51d93aSDavid du Colombier ot = r->right;
1244da51d93aSDavid du Colombier r->right = r->left;
1245da51d93aSDavid du Colombier tl = new(0, Z, Z);
1246da51d93aSDavid du Colombier *tl = tmps[0];
1247da51d93aSDavid du Colombier r->left = tl;
1248da51d93aSDavid du Colombier tmps[0] = *ot;
1249da51d93aSDavid du Colombier //print("hi %R lo %R t %R\n", r->right->reg, r->left->reg, tmps[0].reg);
1250da51d93aSDavid du Colombier }
1251da51d93aSDavid du Colombier i++;
1252da51d93aSDavid du Colombier break;
1253da51d93aSDavid du Colombier
1254da51d93aSDavid du Colombier case Vmv:
1255375daca8SDavid du Colombier case Vmul:
1256375daca8SDavid du Colombier case Vshll:
1257da51d93aSDavid du Colombier i += 3;
1258da51d93aSDavid du Colombier if(i > VLEN) {
1259da51d93aSDavid du Colombier diag(l, "bad Vop");
1260da51d93aSDavid du Colombier return;
1261da51d93aSDavid du Colombier }
1262da51d93aSDavid du Colombier j = i - 2;
1263da51d93aSDavid du Colombier goto op;
1264da51d93aSDavid du Colombier
1265da51d93aSDavid du Colombier case Vins0:
1266da51d93aSDavid du Colombier i += 2;
1267da51d93aSDavid du Colombier if(i > VLEN) {
1268da51d93aSDavid du Colombier diag(l, "bad Vop");
1269da51d93aSDavid du Colombier return;
1270da51d93aSDavid du Colombier }
1271da51d93aSDavid du Colombier gins(c[i - 1], Z, Z);
1272da51d93aSDavid du Colombier break;
1273da51d93aSDavid du Colombier
1274da51d93aSDavid du Colombier case Vop:
1275da51d93aSDavid du Colombier case Vopx:
1276da51d93aSDavid du Colombier case Vins:
1277da51d93aSDavid du Colombier case Vinsl:
1278da51d93aSDavid du Colombier case Vinsr:
1279da51d93aSDavid du Colombier case Vinsla:
1280da51d93aSDavid du Colombier case Vinsra:
1281da51d93aSDavid du Colombier case Vinsx:
1282da51d93aSDavid du Colombier i += 4;
1283da51d93aSDavid du Colombier if(i > VLEN) {
1284da51d93aSDavid du Colombier diag(l, "bad Vop");
1285da51d93aSDavid du Colombier return;
1286da51d93aSDavid du Colombier }
1287da51d93aSDavid du Colombier j = i - 2;
1288da51d93aSDavid du Colombier goto op;
1289da51d93aSDavid du Colombier
1290da51d93aSDavid du Colombier op:
1291da51d93aSDavid du Colombier if(!g)
1292da51d93aSDavid du Colombier break;
1293da51d93aSDavid du Colombier tl = Z;
1294da51d93aSDavid du Colombier tr = Z;
1295da51d93aSDavid du Colombier for(; j < i; j++) {
1296da51d93aSDavid du Colombier switch(c[j]) {
1297da51d93aSDavid du Colombier case C00:
1298da51d93aSDavid du Colombier ot = nodconst(0);
1299da51d93aSDavid du Colombier break;
1300da51d93aSDavid du Colombier case C01:
1301da51d93aSDavid du Colombier ot = nodconst(1);
1302da51d93aSDavid du Colombier break;
1303da51d93aSDavid du Colombier case C31:
1304da51d93aSDavid du Colombier ot = nodconst(31);
1305da51d93aSDavid du Colombier break;
1306da51d93aSDavid du Colombier case C32:
1307da51d93aSDavid du Colombier ot = nodconst(32);
1308da51d93aSDavid du Colombier break;
1309da51d93aSDavid du Colombier
1310da51d93aSDavid du Colombier case O_l:
1311da51d93aSDavid du Colombier case O_l_lo:
1312da51d93aSDavid du Colombier ot = l; xp = &lo; xo = 0;
1313da51d93aSDavid du Colombier goto op0;
1314da51d93aSDavid du Colombier case O_l_hi:
1315da51d93aSDavid du Colombier ot = l; xp = &lo; xo = SZ_LONG;
1316da51d93aSDavid du Colombier goto op0;
1317da51d93aSDavid du Colombier case O_r:
1318da51d93aSDavid du Colombier case O_r_lo:
1319da51d93aSDavid du Colombier ot = r; xp = &ro; xo = 0;
1320da51d93aSDavid du Colombier goto op0;
1321da51d93aSDavid du Colombier case O_r_hi:
1322da51d93aSDavid du Colombier ot = r; xp = &ro; xo = SZ_LONG;
1323da51d93aSDavid du Colombier goto op0;
1324da51d93aSDavid du Colombier case O_t_lo:
1325da51d93aSDavid du Colombier ot = t; xp = &to; xo = 0;
1326da51d93aSDavid du Colombier goto op0;
1327da51d93aSDavid du Colombier case O_t_hi:
1328da51d93aSDavid du Colombier ot = t; xp = &to; xo = SZ_LONG;
1329da51d93aSDavid du Colombier goto op0;
1330da51d93aSDavid du Colombier case O_l_rp:
1331da51d93aSDavid du Colombier ot = l;
1332da51d93aSDavid du Colombier break;
1333da51d93aSDavid du Colombier case O_r_rp:
1334da51d93aSDavid du Colombier ot = r;
1335da51d93aSDavid du Colombier break;
1336da51d93aSDavid du Colombier case O_t_rp:
1337da51d93aSDavid du Colombier ot = t;
1338da51d93aSDavid du Colombier break;
1339da51d93aSDavid du Colombier case O_r0:
1340da51d93aSDavid du Colombier case O_r1:
1341da51d93aSDavid du Colombier ot = &tmps[c[j] - O_r0];
1342da51d93aSDavid du Colombier break;
1343375daca8SDavid du Colombier case O_Zop:
1344375daca8SDavid du Colombier ot = Z;
1345375daca8SDavid du Colombier break;
1346da51d93aSDavid du Colombier
1347da51d93aSDavid du Colombier op0:
1348da51d93aSDavid du Colombier switch(ot->op) {
1349da51d93aSDavid du Colombier case OCONST:
1350da51d93aSDavid du Colombier if(xo)
1351da51d93aSDavid du Colombier ot = hi64(ot);
1352da51d93aSDavid du Colombier else
1353da51d93aSDavid du Colombier ot = lo64(ot);
1354da51d93aSDavid du Colombier break;
1355da51d93aSDavid du Colombier case OREGPAIR:
1356da51d93aSDavid du Colombier if(xo)
1357da51d93aSDavid du Colombier ot = ot->right;
1358da51d93aSDavid du Colombier else
1359da51d93aSDavid du Colombier ot = ot->left;
1360da51d93aSDavid du Colombier break;
1361da51d93aSDavid du Colombier case OREGISTER:
1362da51d93aSDavid du Colombier break;
1363da51d93aSDavid du Colombier default:
1364da51d93aSDavid du Colombier if(xo != *xp) {
1365da51d93aSDavid du Colombier ot->xoffset += xo - *xp;
1366da51d93aSDavid du Colombier *xp = xo;
1367da51d93aSDavid du Colombier }
1368da51d93aSDavid du Colombier }
1369da51d93aSDavid du Colombier break;
1370da51d93aSDavid du Colombier
1371da51d93aSDavid du Colombier default:
1372da51d93aSDavid du Colombier diag(l, "bad V_lop");
1373da51d93aSDavid du Colombier return;
1374da51d93aSDavid du Colombier }
1375da51d93aSDavid du Colombier if(tl == nil)
1376da51d93aSDavid du Colombier tl = ot;
1377da51d93aSDavid du Colombier else
1378da51d93aSDavid du Colombier tr = ot;
1379da51d93aSDavid du Colombier }
1380da51d93aSDavid du Colombier if(op == Vzero) {
1381da51d93aSDavid du Colombier zeroregm(tl);
1382da51d93aSDavid du Colombier break;
1383da51d93aSDavid du Colombier }
1384da51d93aSDavid du Colombier oc = c[i - 3];
1385da51d93aSDavid du Colombier if(op == Vinsx || op == Vopx) {
1386da51d93aSDavid du Colombier //print("%d -> %d\n", oc, args[oc]);
1387da51d93aSDavid du Colombier oc = args[oc];
1388da51d93aSDavid du Colombier }
1389da51d93aSDavid du Colombier else {
1390da51d93aSDavid du Colombier switch(oc) {
1391da51d93aSDavid du Colombier case O_a0:
1392da51d93aSDavid du Colombier case O_a1:
1393da51d93aSDavid du Colombier oc = args[oc - O_a0];
1394da51d93aSDavid du Colombier break;
1395da51d93aSDavid du Colombier }
1396da51d93aSDavid du Colombier }
1397da51d93aSDavid du Colombier switch(op) {
1398375daca8SDavid du Colombier case Vmul:
1399375daca8SDavid du Colombier mulgen(tr->type, tl, tr);
1400375daca8SDavid du Colombier break;
1401da51d93aSDavid du Colombier case Vmv:
1402da51d93aSDavid du Colombier gmove(tl, tr);
1403da51d93aSDavid du Colombier break;
1404375daca8SDavid du Colombier case Vshll:
1405375daca8SDavid du Colombier shiftit(tr->type, tl, tr);
1406375daca8SDavid du Colombier break;
1407da51d93aSDavid du Colombier case Vop:
1408da51d93aSDavid du Colombier case Vopx:
1409da51d93aSDavid du Colombier gopcode(oc, types[TULONG], tl, tr);
1410da51d93aSDavid du Colombier break;
1411da51d93aSDavid du Colombier case Vins:
1412da51d93aSDavid du Colombier case Vinsx:
1413da51d93aSDavid du Colombier gins(oc, tl, tr);
1414da51d93aSDavid du Colombier break;
1415da51d93aSDavid du Colombier case Vinsl:
1416da51d93aSDavid du Colombier gins(oc, tl, tr->right);
1417da51d93aSDavid du Colombier p->from.index = tr->left->reg;
1418da51d93aSDavid du Colombier break;
1419da51d93aSDavid du Colombier case Vinsr:
1420da51d93aSDavid du Colombier gins(oc, tl, tr->left);
1421da51d93aSDavid du Colombier p->from.index = tr->right->reg;
1422da51d93aSDavid du Colombier break;
1423da51d93aSDavid du Colombier case Vinsla:
1424da51d93aSDavid du Colombier gins(oc, tl, tr + 1);
1425da51d93aSDavid du Colombier p->from.index = tr->reg;
1426da51d93aSDavid du Colombier break;
1427da51d93aSDavid du Colombier case Vinsra:
1428da51d93aSDavid du Colombier gins(oc, tl, tr);
1429da51d93aSDavid du Colombier p->from.index = (tr + 1)->reg;
1430da51d93aSDavid du Colombier break;
1431da51d93aSDavid du Colombier }
1432da51d93aSDavid du Colombier break;
1433da51d93aSDavid du Colombier
1434da51d93aSDavid du Colombier case VT:
1435da51d93aSDavid du Colombier g = true;
1436da51d93aSDavid du Colombier i++;
1437da51d93aSDavid du Colombier break;
1438da51d93aSDavid du Colombier case VF:
1439da51d93aSDavid du Colombier g = !true;
1440da51d93aSDavid du Colombier i++;
1441da51d93aSDavid du Colombier break;
1442da51d93aSDavid du Colombier
1443da51d93aSDavid du Colombier case V_T0: case V_T1:
1444da51d93aSDavid du Colombier g = args[op - V_T0];
1445da51d93aSDavid du Colombier i++;
1446da51d93aSDavid du Colombier break;
1447da51d93aSDavid du Colombier
1448da51d93aSDavid du Colombier case V_F0: case V_F1:
1449da51d93aSDavid du Colombier g = !args[op - V_F0];
1450da51d93aSDavid du Colombier i++;
1451da51d93aSDavid du Colombier break;
1452da51d93aSDavid du Colombier
1453da51d93aSDavid du Colombier case V_C0: case V_C1:
1454da51d93aSDavid du Colombier if(g)
1455da51d93aSDavid du Colombier args[op - V_C0] = 0;
1456da51d93aSDavid du Colombier i++;
1457da51d93aSDavid du Colombier break;
1458da51d93aSDavid du Colombier
1459da51d93aSDavid du Colombier case V_S0: case V_S1:
1460da51d93aSDavid du Colombier if(g)
1461da51d93aSDavid du Colombier args[op - V_S0] = 1;
1462da51d93aSDavid du Colombier i++;
1463da51d93aSDavid du Colombier break;
1464da51d93aSDavid du Colombier
1465da51d93aSDavid du Colombier case V_l_lo_f:
1466da51d93aSDavid du Colombier g = lo64v(l) == 0;
1467da51d93aSDavid du Colombier i++;
1468da51d93aSDavid du Colombier break;
1469da51d93aSDavid du Colombier case V_l_hi_f:
1470da51d93aSDavid du Colombier g = hi64v(l) == 0;
1471da51d93aSDavid du Colombier i++;
1472da51d93aSDavid du Colombier break;
1473da51d93aSDavid du Colombier case V_l_lo_t:
1474da51d93aSDavid du Colombier g = lo64v(l) != 0;
1475da51d93aSDavid du Colombier i++;
1476da51d93aSDavid du Colombier break;
1477da51d93aSDavid du Colombier case V_l_hi_t:
1478da51d93aSDavid du Colombier g = hi64v(l) != 0;
1479da51d93aSDavid du Colombier i++;
1480da51d93aSDavid du Colombier break;
1481da51d93aSDavid du Colombier case V_l_lo_u:
1482da51d93aSDavid du Colombier g = lo64v(l) >= 0;
1483da51d93aSDavid du Colombier i++;
1484da51d93aSDavid du Colombier break;
1485da51d93aSDavid du Colombier case V_l_hi_u:
1486da51d93aSDavid du Colombier g = hi64v(l) >= 0;
1487da51d93aSDavid du Colombier i++;
1488da51d93aSDavid du Colombier break;
1489da51d93aSDavid du Colombier case V_r_lo_f:
1490da51d93aSDavid du Colombier g = lo64v(r) == 0;
1491da51d93aSDavid du Colombier i++;
1492da51d93aSDavid du Colombier break;
1493da51d93aSDavid du Colombier case V_r_hi_f:
1494da51d93aSDavid du Colombier g = hi64v(r) == 0;
1495da51d93aSDavid du Colombier i++;
1496da51d93aSDavid du Colombier break;
1497da51d93aSDavid du Colombier case V_r_lo_t:
1498da51d93aSDavid du Colombier g = lo64v(r) != 0;
1499da51d93aSDavid du Colombier i++;
1500da51d93aSDavid du Colombier break;
1501da51d93aSDavid du Colombier case V_r_hi_t:
1502da51d93aSDavid du Colombier g = hi64v(r) != 0;
1503da51d93aSDavid du Colombier i++;
1504da51d93aSDavid du Colombier break;
1505da51d93aSDavid du Colombier case V_r_lo_u:
1506da51d93aSDavid du Colombier g = lo64v(r) >= 0;
1507da51d93aSDavid du Colombier i++;
1508da51d93aSDavid du Colombier break;
1509da51d93aSDavid du Colombier case V_r_hi_u:
1510da51d93aSDavid du Colombier g = hi64v(r) >= 0;
1511da51d93aSDavid du Colombier i++;
1512da51d93aSDavid du Colombier break;
1513da51d93aSDavid du Colombier
1514da51d93aSDavid du Colombier case Vend:
1515da51d93aSDavid du Colombier goto out;
1516da51d93aSDavid du Colombier
1517da51d93aSDavid du Colombier case V_a0: case V_a1:
1518da51d93aSDavid du Colombier if(g) {
1519da51d93aSDavid du Colombier lt = l->type;
1520da51d93aSDavid du Colombier l->type = types[TULONG];
1521da51d93aSDavid du Colombier regalloc(&tmps[op - V_a0], l, Z);
1522da51d93aSDavid du Colombier l->type = lt;
1523da51d93aSDavid du Colombier }
1524da51d93aSDavid du Colombier i++;
1525da51d93aSDavid du Colombier break;
1526da51d93aSDavid du Colombier
1527da51d93aSDavid du Colombier case V_f0: case V_f1:
1528da51d93aSDavid du Colombier if(g)
1529da51d93aSDavid du Colombier regfree(&tmps[op - V_f0]);
1530da51d93aSDavid du Colombier i++;
1531da51d93aSDavid du Colombier break;
1532da51d93aSDavid du Colombier
1533da51d93aSDavid du Colombier case V_p0: case V_p1: case V_p2: case V_p3: case V_p4:
1534da51d93aSDavid du Colombier if(g)
1535da51d93aSDavid du Colombier patch(pr[op - V_p0], pc);
1536da51d93aSDavid du Colombier i++;
1537da51d93aSDavid du Colombier break;
1538da51d93aSDavid du Colombier
1539da51d93aSDavid du Colombier case V_s0: case V_s1: case V_s2: case V_s3: case V_s4:
1540da51d93aSDavid du Colombier if(g)
1541da51d93aSDavid du Colombier pr[op - V_s0] = p;
1542da51d93aSDavid du Colombier i++;
1543da51d93aSDavid du Colombier break;
1544da51d93aSDavid du Colombier
1545da51d93aSDavid du Colombier default:
1546da51d93aSDavid du Colombier diag(l, "bad biggen: %d", op);
1547da51d93aSDavid du Colombier return;
1548da51d93aSDavid du Colombier }
1549da51d93aSDavid du Colombier if(i == VLEN || c[i] == 0)
1550da51d93aSDavid du Colombier break;
1551da51d93aSDavid du Colombier }
1552da51d93aSDavid du Colombier }
1553da51d93aSDavid du Colombier out:
1554da51d93aSDavid du Colombier if(lo)
1555da51d93aSDavid du Colombier l->xoffset -= lo;
1556da51d93aSDavid du Colombier if(ro)
1557da51d93aSDavid du Colombier r->xoffset -= ro;
1558da51d93aSDavid du Colombier if(to)
1559da51d93aSDavid du Colombier t->xoffset -= to;
1560da51d93aSDavid du Colombier }
1561da51d93aSDavid du Colombier
1562da51d93aSDavid du Colombier int
cgen64(Node * n,Node * nn)1563da51d93aSDavid du Colombier cgen64(Node *n, Node *nn)
1564da51d93aSDavid du Colombier {
1565da51d93aSDavid du Colombier Type *dt;
1566da51d93aSDavid du Colombier uchar *args, (*cp)[VLEN], (**optab)[VLEN];
1567da51d93aSDavid du Colombier int li, ri, lri, dr, si, m, op, sh, cmp, true;
1568375daca8SDavid du Colombier Node *c, *d, *l, *r, *t, *s, nod1, nod2, nod3, nod4, nod5;
1569da51d93aSDavid du Colombier
1570da51d93aSDavid du Colombier if(debug['g']) {
1571da51d93aSDavid du Colombier prtree(nn, "cgen64 lhs");
1572da51d93aSDavid du Colombier prtree(n, "cgen64");
1573375daca8SDavid du Colombier print("AX = %d\n", reg[D_AX]);
1574da51d93aSDavid du Colombier }
1575da51d93aSDavid du Colombier cmp = 0;
1576da51d93aSDavid du Colombier sh = 0;
1577da51d93aSDavid du Colombier
1578da51d93aSDavid du Colombier switch(n->op) {
1579da51d93aSDavid du Colombier case ONEG:
1580da51d93aSDavid du Colombier d = regpair(nn, n);
1581da51d93aSDavid du Colombier sugen(n->left, d, 8);
1582da51d93aSDavid du Colombier gins(ANOTL, Z, d->right);
1583da51d93aSDavid du Colombier gins(ANEGL, Z, d->left);
1584da51d93aSDavid du Colombier gins(ASBBL, nodconst(-1), d->right);
1585da51d93aSDavid du Colombier break;
1586da51d93aSDavid du Colombier
1587da51d93aSDavid du Colombier case OCOM:
1588375daca8SDavid du Colombier if(!vaddr(n->left, 0) || !vaddr(nn, 0))
1589da51d93aSDavid du Colombier d = regpair(nn, n);
1590da51d93aSDavid du Colombier else
1591da51d93aSDavid du Colombier return 0;
1592da51d93aSDavid du Colombier sugen(n->left, d, 8);
1593da51d93aSDavid du Colombier gins(ANOTL, Z, d->left);
1594da51d93aSDavid du Colombier gins(ANOTL, Z, d->right);
1595da51d93aSDavid du Colombier break;
1596da51d93aSDavid du Colombier
1597da51d93aSDavid du Colombier case OADD:
1598da51d93aSDavid du Colombier optab = ADDtab;
1599da51d93aSDavid du Colombier args = ADDargs;
1600da51d93aSDavid du Colombier goto twoop;
1601da51d93aSDavid du Colombier case OAND:
1602da51d93aSDavid du Colombier optab = ANDtab;
1603da51d93aSDavid du Colombier args = ANDargs;
1604da51d93aSDavid du Colombier goto twoop;
1605da51d93aSDavid du Colombier case OOR:
1606da51d93aSDavid du Colombier optab = ORtab;
1607da51d93aSDavid du Colombier args = ORargs;
1608da51d93aSDavid du Colombier goto twoop;
1609da51d93aSDavid du Colombier case OSUB:
1610da51d93aSDavid du Colombier optab = SUBtab;
1611da51d93aSDavid du Colombier args = SUBargs;
1612da51d93aSDavid du Colombier goto twoop;
1613da51d93aSDavid du Colombier case OXOR:
1614da51d93aSDavid du Colombier optab = ORtab;
1615da51d93aSDavid du Colombier args = XORargs;
1616da51d93aSDavid du Colombier goto twoop;
1617da51d93aSDavid du Colombier case OASHL:
1618da51d93aSDavid du Colombier sh = 1;
1619da51d93aSDavid du Colombier args = nil;
1620da51d93aSDavid du Colombier optab = shlltab;
1621da51d93aSDavid du Colombier goto twoop;
1622da51d93aSDavid du Colombier case OLSHR:
1623da51d93aSDavid du Colombier sh = 1;
1624da51d93aSDavid du Colombier args = shrlargs;
1625da51d93aSDavid du Colombier optab = shrltab;
1626da51d93aSDavid du Colombier goto twoop;
1627da51d93aSDavid du Colombier case OASHR:
1628da51d93aSDavid du Colombier sh = 1;
1629da51d93aSDavid du Colombier args = sarlargs;
1630da51d93aSDavid du Colombier optab = shrltab;
1631da51d93aSDavid du Colombier goto twoop;
1632da51d93aSDavid du Colombier case OEQ:
1633da51d93aSDavid du Colombier cmp = 1;
1634da51d93aSDavid du Colombier args = nil;
1635da51d93aSDavid du Colombier optab = nil;
1636da51d93aSDavid du Colombier goto twoop;
1637da51d93aSDavid du Colombier case ONE:
1638da51d93aSDavid du Colombier cmp = 1;
1639da51d93aSDavid du Colombier args = nil;
1640da51d93aSDavid du Colombier optab = nil;
1641da51d93aSDavid du Colombier goto twoop;
1642da51d93aSDavid du Colombier case OLE:
1643da51d93aSDavid du Colombier cmp = 1;
1644da51d93aSDavid du Colombier args = nil;
1645da51d93aSDavid du Colombier optab = nil;
1646da51d93aSDavid du Colombier goto twoop;
1647da51d93aSDavid du Colombier case OLT:
1648da51d93aSDavid du Colombier cmp = 1;
1649da51d93aSDavid du Colombier args = nil;
1650da51d93aSDavid du Colombier optab = nil;
1651da51d93aSDavid du Colombier goto twoop;
1652da51d93aSDavid du Colombier case OGE:
1653da51d93aSDavid du Colombier cmp = 1;
1654da51d93aSDavid du Colombier args = nil;
1655da51d93aSDavid du Colombier optab = nil;
1656da51d93aSDavid du Colombier goto twoop;
1657da51d93aSDavid du Colombier case OGT:
1658da51d93aSDavid du Colombier cmp = 1;
1659da51d93aSDavid du Colombier args = nil;
1660da51d93aSDavid du Colombier optab = nil;
1661da51d93aSDavid du Colombier goto twoop;
1662da51d93aSDavid du Colombier case OHI:
1663da51d93aSDavid du Colombier cmp = 1;
1664da51d93aSDavid du Colombier args = nil;
1665da51d93aSDavid du Colombier optab = nil;
1666da51d93aSDavid du Colombier goto twoop;
1667da51d93aSDavid du Colombier case OHS:
1668da51d93aSDavid du Colombier cmp = 1;
1669da51d93aSDavid du Colombier args = nil;
1670da51d93aSDavid du Colombier optab = nil;
1671da51d93aSDavid du Colombier goto twoop;
1672da51d93aSDavid du Colombier case OLO:
1673da51d93aSDavid du Colombier cmp = 1;
1674da51d93aSDavid du Colombier args = nil;
1675da51d93aSDavid du Colombier optab = nil;
1676da51d93aSDavid du Colombier goto twoop;
1677da51d93aSDavid du Colombier case OLS:
1678da51d93aSDavid du Colombier cmp = 1;
1679da51d93aSDavid du Colombier args = nil;
1680da51d93aSDavid du Colombier optab = nil;
1681da51d93aSDavid du Colombier goto twoop;
1682da51d93aSDavid du Colombier
1683da51d93aSDavid du Colombier twoop:
1684da51d93aSDavid du Colombier dr = nn != Z && nn->op == OREGPAIR;
1685da51d93aSDavid du Colombier l = vfunc(n->left, nn);
1686da51d93aSDavid du Colombier if(sh)
1687da51d93aSDavid du Colombier r = n->right;
1688da51d93aSDavid du Colombier else
1689da51d93aSDavid du Colombier r = vfunc(n->right, nn);
1690375daca8SDavid du Colombier
1691da51d93aSDavid du Colombier li = l->op == ONAME || l->op == OINDREG || l->op == OCONST;
1692da51d93aSDavid du Colombier ri = r->op == ONAME || r->op == OINDREG || r->op == OCONST;
1693da51d93aSDavid du Colombier
1694da51d93aSDavid du Colombier #define IMM(l, r) ((l) | ((r) << 1))
1695da51d93aSDavid du Colombier
1696da51d93aSDavid du Colombier lri = IMM(li, ri);
1697da51d93aSDavid du Colombier
1698da51d93aSDavid du Colombier /* find out what is so easy about some operands */
1699da51d93aSDavid du Colombier if(li)
1700da51d93aSDavid du Colombier li = whatof(l, sh | cmp);
1701da51d93aSDavid du Colombier if(ri)
1702da51d93aSDavid du Colombier ri = whatof(r, cmp);
1703da51d93aSDavid du Colombier
1704da51d93aSDavid du Colombier if(sh)
1705da51d93aSDavid du Colombier goto shift;
1706da51d93aSDavid du Colombier
1707da51d93aSDavid du Colombier if(cmp)
1708da51d93aSDavid du Colombier goto cmp;
1709da51d93aSDavid du Colombier
1710da51d93aSDavid du Colombier /* evaluate hard subexps, stealing nn if possible. */
1711da51d93aSDavid du Colombier switch(lri) {
1712da51d93aSDavid du Colombier case IMM(0, 0):
1713da51d93aSDavid du Colombier bin00:
1714da51d93aSDavid du Colombier if(l->complex > r->complex) {
1715da51d93aSDavid du Colombier if(dr)
1716da51d93aSDavid du Colombier t = nn;
1717da51d93aSDavid du Colombier else
1718da51d93aSDavid du Colombier t = regpair(Z, n);
1719da51d93aSDavid du Colombier sugen(l, t, 8);
1720da51d93aSDavid du Colombier l = t;
1721da51d93aSDavid du Colombier t = regpair(Z, n);
1722da51d93aSDavid du Colombier sugen(r, t, 8);
1723da51d93aSDavid du Colombier r = t;
1724da51d93aSDavid du Colombier }
1725da51d93aSDavid du Colombier else {
1726da51d93aSDavid du Colombier t = regpair(Z, n);
1727da51d93aSDavid du Colombier sugen(r, t, 8);
1728da51d93aSDavid du Colombier r = t;
1729da51d93aSDavid du Colombier if(dr)
1730da51d93aSDavid du Colombier t = nn;
1731da51d93aSDavid du Colombier else
1732da51d93aSDavid du Colombier t = regpair(Z, n);
1733da51d93aSDavid du Colombier sugen(l, t, 8);
1734da51d93aSDavid du Colombier l = t;
1735da51d93aSDavid du Colombier }
1736da51d93aSDavid du Colombier break;
1737da51d93aSDavid du Colombier case IMM(0, 1):
1738da51d93aSDavid du Colombier if(dr)
1739da51d93aSDavid du Colombier t = nn;
1740da51d93aSDavid du Colombier else
1741da51d93aSDavid du Colombier t = regpair(Z, n);
1742da51d93aSDavid du Colombier sugen(l, t, 8);
1743da51d93aSDavid du Colombier l = t;
1744da51d93aSDavid du Colombier break;
1745da51d93aSDavid du Colombier case IMM(1, 0):
1746da51d93aSDavid du Colombier if(n->op == OSUB && l->op == OCONST && hi64v(l) == 0) {
1747da51d93aSDavid du Colombier lri = IMM(0, 0);
1748da51d93aSDavid du Colombier goto bin00;
1749da51d93aSDavid du Colombier }
1750da51d93aSDavid du Colombier if(dr)
1751da51d93aSDavid du Colombier t = nn;
1752da51d93aSDavid du Colombier else
1753da51d93aSDavid du Colombier t = regpair(Z, n);
1754da51d93aSDavid du Colombier sugen(r, t, 8);
1755da51d93aSDavid du Colombier r = t;
1756da51d93aSDavid du Colombier break;
1757da51d93aSDavid du Colombier case IMM(1, 1):
1758da51d93aSDavid du Colombier break;
1759da51d93aSDavid du Colombier }
1760da51d93aSDavid du Colombier
1761da51d93aSDavid du Colombier #define WW(l, r) ((l) | ((r) << 2))
1762da51d93aSDavid du Colombier d = Z;
1763da51d93aSDavid du Colombier dt = nn->type;
1764da51d93aSDavid du Colombier nn->type = types[TLONG];
1765da51d93aSDavid du Colombier
1766da51d93aSDavid du Colombier switch(lri) {
1767da51d93aSDavid du Colombier case IMM(0, 0):
1768da51d93aSDavid du Colombier biggen(l, r, Z, 0, binop00, args);
1769da51d93aSDavid du Colombier break;
1770da51d93aSDavid du Colombier case IMM(0, 1):
1771da51d93aSDavid du Colombier switch(ri) {
1772da51d93aSDavid du Colombier case WNONE:
1773da51d93aSDavid du Colombier diag(r, "bad whatof\n");
1774da51d93aSDavid du Colombier break;
1775da51d93aSDavid du Colombier case WCONST:
1776da51d93aSDavid du Colombier biggen(l, r, Z, 0, optab[B0c], args);
1777da51d93aSDavid du Colombier break;
1778da51d93aSDavid du Colombier case WHARD:
1779da51d93aSDavid du Colombier reglcgen(&nod2, r, Z);
1780da51d93aSDavid du Colombier r = &nod2;
1781da51d93aSDavid du Colombier /* fall thru */
1782da51d93aSDavid du Colombier case WADDR:
1783da51d93aSDavid du Colombier biggen(l, r, Z, 0, binoptmp, args);
1784da51d93aSDavid du Colombier if(ri == WHARD)
1785da51d93aSDavid du Colombier regfree(r);
1786da51d93aSDavid du Colombier break;
1787da51d93aSDavid du Colombier }
1788da51d93aSDavid du Colombier break;
1789da51d93aSDavid du Colombier case IMM(1, 0):
1790da51d93aSDavid du Colombier if(n->op == OSUB) {
1791da51d93aSDavid du Colombier switch(li) {
1792da51d93aSDavid du Colombier case WNONE:
1793da51d93aSDavid du Colombier diag(l, "bad whatof\n");
1794da51d93aSDavid du Colombier break;
1795da51d93aSDavid du Colombier case WHARD:
1796da51d93aSDavid du Colombier reglcgen(&nod2, l, Z);
1797da51d93aSDavid du Colombier l = &nod2;
1798da51d93aSDavid du Colombier /* fall thru */
1799da51d93aSDavid du Colombier case WADDR:
1800da51d93aSDavid du Colombier case WCONST:
1801da51d93aSDavid du Colombier biggen(l, r, Z, 0, sub10, args);
1802da51d93aSDavid du Colombier break;
1803da51d93aSDavid du Colombier }
1804da51d93aSDavid du Colombier if(li == WHARD)
1805da51d93aSDavid du Colombier regfree(l);
1806da51d93aSDavid du Colombier }
1807da51d93aSDavid du Colombier else {
1808da51d93aSDavid du Colombier switch(li) {
1809da51d93aSDavid du Colombier case WNONE:
1810da51d93aSDavid du Colombier diag(l, "bad whatof\n");
1811da51d93aSDavid du Colombier break;
1812da51d93aSDavid du Colombier case WCONST:
1813da51d93aSDavid du Colombier biggen(r, l, Z, 0, optab[B0c], args);
1814da51d93aSDavid du Colombier break;
1815da51d93aSDavid du Colombier case WHARD:
1816da51d93aSDavid du Colombier reglcgen(&nod2, l, Z);
1817da51d93aSDavid du Colombier l = &nod2;
1818da51d93aSDavid du Colombier /* fall thru */
1819da51d93aSDavid du Colombier case WADDR:
1820da51d93aSDavid du Colombier biggen(r, l, Z, 0, binoptmp, args);
1821da51d93aSDavid du Colombier if(li == WHARD)
1822da51d93aSDavid du Colombier regfree(l);
1823da51d93aSDavid du Colombier break;
1824da51d93aSDavid du Colombier }
1825da51d93aSDavid du Colombier }
1826da51d93aSDavid du Colombier break;
1827da51d93aSDavid du Colombier case IMM(1, 1):
1828da51d93aSDavid du Colombier switch(WW(li, ri)) {
1829da51d93aSDavid du Colombier case WW(WCONST, WHARD):
1830da51d93aSDavid du Colombier if(r->op == ONAME && n->op == OAND && reduxv(l))
1831da51d93aSDavid du Colombier ri = WADDR;
1832da51d93aSDavid du Colombier break;
1833da51d93aSDavid du Colombier case WW(WHARD, WCONST):
1834da51d93aSDavid du Colombier if(l->op == ONAME && n->op == OAND && reduxv(r))
1835da51d93aSDavid du Colombier li = WADDR;
1836da51d93aSDavid du Colombier break;
1837da51d93aSDavid du Colombier }
1838da51d93aSDavid du Colombier if(li == WHARD) {
1839da51d93aSDavid du Colombier reglcgen(&nod3, l, Z);
1840da51d93aSDavid du Colombier l = &nod3;
1841da51d93aSDavid du Colombier }
1842da51d93aSDavid du Colombier if(ri == WHARD) {
1843da51d93aSDavid du Colombier reglcgen(&nod2, r, Z);
1844da51d93aSDavid du Colombier r = &nod2;
1845da51d93aSDavid du Colombier }
1846da51d93aSDavid du Colombier d = regpair(nn, n);
1847375daca8SDavid du Colombier instpair(d, Z);
1848da51d93aSDavid du Colombier switch(WW(li, ri)) {
1849da51d93aSDavid du Colombier case WW(WCONST, WADDR):
1850da51d93aSDavid du Colombier case WW(WCONST, WHARD):
1851da51d93aSDavid du Colombier biggen(l, r, d, 0, optab[Bca], args);
1852da51d93aSDavid du Colombier break;
1853da51d93aSDavid du Colombier
1854da51d93aSDavid du Colombier case WW(WADDR, WCONST):
1855da51d93aSDavid du Colombier case WW(WHARD, WCONST):
1856da51d93aSDavid du Colombier biggen(l, r, d, 0, optab[Bac], args);
1857da51d93aSDavid du Colombier break;
1858da51d93aSDavid du Colombier
1859da51d93aSDavid du Colombier case WW(WADDR, WADDR):
1860da51d93aSDavid du Colombier case WW(WADDR, WHARD):
1861da51d93aSDavid du Colombier case WW(WHARD, WADDR):
1862da51d93aSDavid du Colombier case WW(WHARD, WHARD):
1863da51d93aSDavid du Colombier biggen(l, r, d, 0, binop11, args);
1864da51d93aSDavid du Colombier break;
1865da51d93aSDavid du Colombier
1866da51d93aSDavid du Colombier default:
1867da51d93aSDavid du Colombier diag(r, "bad whatof pair %d %d\n", li, ri);
1868da51d93aSDavid du Colombier break;
1869da51d93aSDavid du Colombier }
1870da51d93aSDavid du Colombier if(li == WHARD)
1871da51d93aSDavid du Colombier regfree(l);
1872da51d93aSDavid du Colombier if(ri == WHARD)
1873da51d93aSDavid du Colombier regfree(r);
1874da51d93aSDavid du Colombier break;
1875da51d93aSDavid du Colombier }
1876da51d93aSDavid du Colombier
1877da51d93aSDavid du Colombier nn->type = dt;
1878da51d93aSDavid du Colombier
1879da51d93aSDavid du Colombier if(d != Z)
1880da51d93aSDavid du Colombier goto finished;
1881da51d93aSDavid du Colombier
1882da51d93aSDavid du Colombier switch(lri) {
1883da51d93aSDavid du Colombier case IMM(0, 0):
1884da51d93aSDavid du Colombier freepair(r);
1885da51d93aSDavid du Colombier /* fall thru */;
1886da51d93aSDavid du Colombier case IMM(0, 1):
1887da51d93aSDavid du Colombier if(!dr)
1888da51d93aSDavid du Colombier storepair(l, nn, 1);
1889da51d93aSDavid du Colombier break;
1890da51d93aSDavid du Colombier case IMM(1, 0):
1891da51d93aSDavid du Colombier if(!dr)
1892da51d93aSDavid du Colombier storepair(r, nn, 1);
1893da51d93aSDavid du Colombier break;
1894da51d93aSDavid du Colombier case IMM(1, 1):
1895da51d93aSDavid du Colombier break;
1896da51d93aSDavid du Colombier }
1897da51d93aSDavid du Colombier return 1;
1898da51d93aSDavid du Colombier
1899da51d93aSDavid du Colombier shift:
1900da51d93aSDavid du Colombier c = Z;
1901da51d93aSDavid du Colombier
1902da51d93aSDavid du Colombier /* evaluate hard subexps, stealing nn if possible. */
1903da51d93aSDavid du Colombier /* must also secure CX. not as many optims as binop. */
1904da51d93aSDavid du Colombier switch(lri) {
1905da51d93aSDavid du Colombier case IMM(0, 0):
1906da51d93aSDavid du Colombier imm00:
1907da51d93aSDavid du Colombier if(l->complex + 1 > r->complex) {
1908da51d93aSDavid du Colombier if(dr)
1909da51d93aSDavid du Colombier t = nn;
1910da51d93aSDavid du Colombier else
1911da51d93aSDavid du Colombier t = regpair(Z, l);
1912da51d93aSDavid du Colombier sugen(l, t, 8);
1913da51d93aSDavid du Colombier l = t;
1914da51d93aSDavid du Colombier t = &nod1;
1915375daca8SDavid du Colombier c = snarfreg(l, t, D_CX, r, &nod2);
1916da51d93aSDavid du Colombier cgen(r, t);
1917da51d93aSDavid du Colombier r = t;
1918da51d93aSDavid du Colombier }
1919da51d93aSDavid du Colombier else {
1920da51d93aSDavid du Colombier t = &nod1;
1921375daca8SDavid du Colombier c = snarfreg(nn, t, D_CX, r, &nod2);
1922da51d93aSDavid du Colombier cgen(r, t);
1923da51d93aSDavid du Colombier r = t;
1924da51d93aSDavid du Colombier if(dr)
1925da51d93aSDavid du Colombier t = nn;
1926da51d93aSDavid du Colombier else
1927da51d93aSDavid du Colombier t = regpair(Z, l);
1928da51d93aSDavid du Colombier sugen(l, t, 8);
1929da51d93aSDavid du Colombier l = t;
1930da51d93aSDavid du Colombier }
1931da51d93aSDavid du Colombier break;
1932da51d93aSDavid du Colombier case IMM(0, 1):
1933da51d93aSDavid du Colombier imm01:
1934da51d93aSDavid du Colombier if(ri != WCONST) {
1935da51d93aSDavid du Colombier lri = IMM(0, 0);
1936da51d93aSDavid du Colombier goto imm00;
1937da51d93aSDavid du Colombier }
1938da51d93aSDavid du Colombier if(dr)
1939da51d93aSDavid du Colombier t = nn;
1940da51d93aSDavid du Colombier else
1941da51d93aSDavid du Colombier t = regpair(Z, n);
1942da51d93aSDavid du Colombier sugen(l, t, 8);
1943da51d93aSDavid du Colombier l = t;
1944da51d93aSDavid du Colombier break;
1945da51d93aSDavid du Colombier case IMM(1, 0):
1946da51d93aSDavid du Colombier imm10:
1947da51d93aSDavid du Colombier if(li != WCONST) {
1948da51d93aSDavid du Colombier lri = IMM(0, 0);
1949da51d93aSDavid du Colombier goto imm00;
1950da51d93aSDavid du Colombier }
1951da51d93aSDavid du Colombier t = &nod1;
1952375daca8SDavid du Colombier c = snarfreg(nn, t, D_CX, r, &nod2);
1953da51d93aSDavid du Colombier cgen(r, t);
1954da51d93aSDavid du Colombier r = t;
1955da51d93aSDavid du Colombier break;
1956da51d93aSDavid du Colombier case IMM(1, 1):
1957da51d93aSDavid du Colombier if(ri != WCONST) {
1958da51d93aSDavid du Colombier lri = IMM(1, 0);
1959da51d93aSDavid du Colombier goto imm10;
1960da51d93aSDavid du Colombier }
1961da51d93aSDavid du Colombier if(li == WHARD) {
1962da51d93aSDavid du Colombier lri = IMM(0, 1);
1963da51d93aSDavid du Colombier goto imm01;
1964da51d93aSDavid du Colombier }
1965da51d93aSDavid du Colombier break;
1966da51d93aSDavid du Colombier }
1967da51d93aSDavid du Colombier
1968da51d93aSDavid du Colombier d = Z;
1969da51d93aSDavid du Colombier
1970da51d93aSDavid du Colombier switch(lri) {
1971da51d93aSDavid du Colombier case IMM(0, 0):
1972da51d93aSDavid du Colombier biggen(l, r, Z, 0, optab[S00], args);
1973da51d93aSDavid du Colombier break;
1974da51d93aSDavid du Colombier case IMM(0, 1):
1975da51d93aSDavid du Colombier switch(ri) {
1976da51d93aSDavid du Colombier case WNONE:
1977da51d93aSDavid du Colombier case WADDR:
1978da51d93aSDavid du Colombier case WHARD:
1979da51d93aSDavid du Colombier diag(r, "bad whatof\n");
1980da51d93aSDavid du Colombier break;
1981da51d93aSDavid du Colombier case WCONST:
1982da51d93aSDavid du Colombier m = r->vconst & 63;
1983da51d93aSDavid du Colombier s = nodconst(m);
1984da51d93aSDavid du Colombier if(m < 32)
1985da51d93aSDavid du Colombier cp = optab[Sc0];
1986da51d93aSDavid du Colombier else if(m == 32)
1987da51d93aSDavid du Colombier cp = optab[Sc1];
1988da51d93aSDavid du Colombier else
1989da51d93aSDavid du Colombier cp = optab[Sc2];
1990da51d93aSDavid du Colombier biggen(l, s, Z, 0, cp, args);
1991da51d93aSDavid du Colombier break;
1992da51d93aSDavid du Colombier }
1993da51d93aSDavid du Colombier break;
1994da51d93aSDavid du Colombier case IMM(1, 0):
1995da51d93aSDavid du Colombier /* left is const */
1996da51d93aSDavid du Colombier d = regpair(nn, n);
1997375daca8SDavid du Colombier instpair(d, Z);
1998da51d93aSDavid du Colombier biggen(l, r, d, 0, optab[S10], args);
1999da51d93aSDavid du Colombier regfree(r);
2000da51d93aSDavid du Colombier break;
2001da51d93aSDavid du Colombier case IMM(1, 1):
2002da51d93aSDavid du Colombier d = regpair(nn, n);
2003375daca8SDavid du Colombier instpair(d, Z);
2004da51d93aSDavid du Colombier switch(WW(li, ri)) {
2005da51d93aSDavid du Colombier case WW(WADDR, WCONST):
2006da51d93aSDavid du Colombier m = r->vconst & 63;
2007da51d93aSDavid du Colombier s = nodconst(m);
2008da51d93aSDavid du Colombier if(m < 32) {
2009da51d93aSDavid du Colombier loadpair(l, d);
2010da51d93aSDavid du Colombier l = d;
2011da51d93aSDavid du Colombier cp = optab[Sc0];
2012da51d93aSDavid du Colombier }
2013da51d93aSDavid du Colombier else if(m == 32)
2014da51d93aSDavid du Colombier cp = optab[Sac3];
2015da51d93aSDavid du Colombier else
2016da51d93aSDavid du Colombier cp = optab[Sac4];
2017da51d93aSDavid du Colombier biggen(l, s, d, 0, cp, args);
2018da51d93aSDavid du Colombier break;
2019da51d93aSDavid du Colombier
2020da51d93aSDavid du Colombier default:
2021da51d93aSDavid du Colombier diag(r, "bad whatof pair %d %d\n", li, ri);
2022da51d93aSDavid du Colombier break;
2023da51d93aSDavid du Colombier }
2024da51d93aSDavid du Colombier break;
2025da51d93aSDavid du Colombier }
2026da51d93aSDavid du Colombier
2027da51d93aSDavid du Colombier if(c != Z) {
2028da51d93aSDavid du Colombier gins(AMOVL, c, r);
2029da51d93aSDavid du Colombier regfree(c);
2030da51d93aSDavid du Colombier }
2031da51d93aSDavid du Colombier
20326ede6e3fSDavid du Colombier if(d != Z)
20336ede6e3fSDavid du Colombier goto finished;
20346ede6e3fSDavid du Colombier
2035da51d93aSDavid du Colombier switch(lri) {
2036da51d93aSDavid du Colombier case IMM(0, 0):
2037da51d93aSDavid du Colombier regfree(r);
2038da51d93aSDavid du Colombier /* fall thru */
2039da51d93aSDavid du Colombier case IMM(0, 1):
2040da51d93aSDavid du Colombier if(!dr)
2041da51d93aSDavid du Colombier storepair(l, nn, 1);
2042da51d93aSDavid du Colombier break;
2043da51d93aSDavid du Colombier case IMM(1, 0):
2044da51d93aSDavid du Colombier regfree(r);
2045da51d93aSDavid du Colombier break;
2046da51d93aSDavid du Colombier case IMM(1, 1):
2047da51d93aSDavid du Colombier break;
2048da51d93aSDavid du Colombier }
2049da51d93aSDavid du Colombier return 1;
2050da51d93aSDavid du Colombier
2051da51d93aSDavid du Colombier cmp:
2052da51d93aSDavid du Colombier op = n->op;
2053da51d93aSDavid du Colombier /* evaluate hard subexps */
2054da51d93aSDavid du Colombier switch(lri) {
2055da51d93aSDavid du Colombier case IMM(0, 0):
2056da51d93aSDavid du Colombier if(l->complex > r->complex) {
2057da51d93aSDavid du Colombier t = regpair(Z, l);
2058da51d93aSDavid du Colombier sugen(l, t, 8);
2059da51d93aSDavid du Colombier l = t;
2060da51d93aSDavid du Colombier t = regpair(Z, r);
2061da51d93aSDavid du Colombier sugen(r, t, 8);
2062da51d93aSDavid du Colombier r = t;
2063da51d93aSDavid du Colombier }
2064da51d93aSDavid du Colombier else {
2065da51d93aSDavid du Colombier t = regpair(Z, r);
2066da51d93aSDavid du Colombier sugen(r, t, 8);
2067da51d93aSDavid du Colombier r = t;
2068da51d93aSDavid du Colombier t = regpair(Z, l);
2069da51d93aSDavid du Colombier sugen(l, t, 8);
2070da51d93aSDavid du Colombier l = t;
2071da51d93aSDavid du Colombier }
2072da51d93aSDavid du Colombier break;
2073da51d93aSDavid du Colombier case IMM(1, 0):
2074da51d93aSDavid du Colombier t = r;
2075da51d93aSDavid du Colombier r = l;
2076da51d93aSDavid du Colombier l = t;
2077da51d93aSDavid du Colombier ri = li;
2078da51d93aSDavid du Colombier op = invrel[relindex(op)];
2079da51d93aSDavid du Colombier /* fall thru */
2080da51d93aSDavid du Colombier case IMM(0, 1):
2081da51d93aSDavid du Colombier t = regpair(Z, l);
2082da51d93aSDavid du Colombier sugen(l, t, 8);
2083da51d93aSDavid du Colombier l = t;
2084da51d93aSDavid du Colombier break;
2085da51d93aSDavid du Colombier case IMM(1, 1):
2086da51d93aSDavid du Colombier break;
2087da51d93aSDavid du Colombier }
2088da51d93aSDavid du Colombier
2089da51d93aSDavid du Colombier true = 1;
2090da51d93aSDavid du Colombier optab = cmptab;
2091da51d93aSDavid du Colombier switch(op) {
2092da51d93aSDavid du Colombier case OEQ:
2093da51d93aSDavid du Colombier optab = NEtab;
2094da51d93aSDavid du Colombier true = 0;
2095da51d93aSDavid du Colombier break;
2096da51d93aSDavid du Colombier case ONE:
2097da51d93aSDavid du Colombier optab = NEtab;
2098da51d93aSDavid du Colombier break;
2099da51d93aSDavid du Colombier case OLE:
2100da51d93aSDavid du Colombier args = GTargs;
2101da51d93aSDavid du Colombier true = 0;
2102da51d93aSDavid du Colombier break;
2103da51d93aSDavid du Colombier case OGT:
2104da51d93aSDavid du Colombier args = GTargs;
2105da51d93aSDavid du Colombier break;
2106da51d93aSDavid du Colombier case OLS:
2107da51d93aSDavid du Colombier args = HIargs;
2108da51d93aSDavid du Colombier true = 0;
2109da51d93aSDavid du Colombier break;
2110da51d93aSDavid du Colombier case OHI:
2111da51d93aSDavid du Colombier args = HIargs;
2112da51d93aSDavid du Colombier break;
2113da51d93aSDavid du Colombier case OLT:
2114da51d93aSDavid du Colombier args = GEargs;
2115da51d93aSDavid du Colombier true = 0;
2116da51d93aSDavid du Colombier break;
2117da51d93aSDavid du Colombier case OGE:
2118da51d93aSDavid du Colombier args = GEargs;
2119da51d93aSDavid du Colombier break;
2120da51d93aSDavid du Colombier case OLO:
2121da51d93aSDavid du Colombier args = HSargs;
2122da51d93aSDavid du Colombier true = 0;
2123da51d93aSDavid du Colombier break;
2124da51d93aSDavid du Colombier case OHS:
2125da51d93aSDavid du Colombier args = HSargs;
2126da51d93aSDavid du Colombier break;
2127da51d93aSDavid du Colombier default:
2128da51d93aSDavid du Colombier diag(n, "bad cmp\n");
2129da51d93aSDavid du Colombier SET(optab);
2130da51d93aSDavid du Colombier }
2131da51d93aSDavid du Colombier
2132da51d93aSDavid du Colombier switch(lri) {
2133da51d93aSDavid du Colombier case IMM(0, 0):
2134da51d93aSDavid du Colombier biggen(l, r, Z, true, optab[T0i], args);
2135da51d93aSDavid du Colombier break;
2136da51d93aSDavid du Colombier case IMM(0, 1):
2137da51d93aSDavid du Colombier case IMM(1, 0):
2138da51d93aSDavid du Colombier switch(ri) {
2139da51d93aSDavid du Colombier case WNONE:
2140da51d93aSDavid du Colombier diag(l, "bad whatof\n");
2141da51d93aSDavid du Colombier break;
2142da51d93aSDavid du Colombier case WCONST:
2143da51d93aSDavid du Colombier biggen(l, r, Z, true, optab[T0i], args);
2144da51d93aSDavid du Colombier break;
2145da51d93aSDavid du Colombier case WHARD:
2146da51d93aSDavid du Colombier reglcgen(&nod2, r, Z);
2147da51d93aSDavid du Colombier r = &nod2;
2148da51d93aSDavid du Colombier /* fall thru */
2149da51d93aSDavid du Colombier case WADDR:
2150da51d93aSDavid du Colombier biggen(l, r, Z, true, optab[T0i], args);
2151da51d93aSDavid du Colombier if(ri == WHARD)
2152da51d93aSDavid du Colombier regfree(r);
2153da51d93aSDavid du Colombier break;
2154da51d93aSDavid du Colombier }
2155da51d93aSDavid du Colombier break;
2156da51d93aSDavid du Colombier case IMM(1, 1):
2157da51d93aSDavid du Colombier if(li == WHARD) {
2158da51d93aSDavid du Colombier reglcgen(&nod3, l, Z);
2159da51d93aSDavid du Colombier l = &nod3;
2160da51d93aSDavid du Colombier }
2161da51d93aSDavid du Colombier if(ri == WHARD) {
2162da51d93aSDavid du Colombier reglcgen(&nod2, r, Z);
2163da51d93aSDavid du Colombier r = &nod2;
2164da51d93aSDavid du Colombier }
2165da51d93aSDavid du Colombier biggen(l, r, Z, true, optab[Tii], args);
2166da51d93aSDavid du Colombier if(li == WHARD)
2167da51d93aSDavid du Colombier regfree(l);
2168da51d93aSDavid du Colombier if(ri == WHARD)
2169da51d93aSDavid du Colombier regfree(r);
2170da51d93aSDavid du Colombier break;
2171da51d93aSDavid du Colombier }
2172da51d93aSDavid du Colombier
2173da51d93aSDavid du Colombier switch(lri) {
2174da51d93aSDavid du Colombier case IMM(0, 0):
2175da51d93aSDavid du Colombier freepair(r);
2176da51d93aSDavid du Colombier /* fall thru */;
2177da51d93aSDavid du Colombier case IMM(0, 1):
2178da51d93aSDavid du Colombier case IMM(1, 0):
2179da51d93aSDavid du Colombier freepair(l);
2180da51d93aSDavid du Colombier break;
2181da51d93aSDavid du Colombier case IMM(1, 1):
2182da51d93aSDavid du Colombier break;
2183da51d93aSDavid du Colombier }
2184da51d93aSDavid du Colombier return 1;
2185da51d93aSDavid du Colombier
2186375daca8SDavid du Colombier case OASMUL:
2187375daca8SDavid du Colombier case OASLMUL:
2188375daca8SDavid du Colombier m = 0;
2189375daca8SDavid du Colombier goto mulop;
2190375daca8SDavid du Colombier
2191375daca8SDavid du Colombier case OMUL:
2192375daca8SDavid du Colombier case OLMUL:
2193375daca8SDavid du Colombier m = 1;
2194375daca8SDavid du Colombier goto mulop;
2195375daca8SDavid du Colombier
2196375daca8SDavid du Colombier mulop:
2197375daca8SDavid du Colombier dr = nn != Z && nn->op == OREGPAIR;
2198375daca8SDavid du Colombier l = vfunc(n->left, nn);
2199375daca8SDavid du Colombier r = vfunc(n->right, nn);
2200375daca8SDavid du Colombier if(r->op != OCONST) {
2201375daca8SDavid du Colombier if(l->complex > r->complex) {
2202375daca8SDavid du Colombier if(m) {
2203375daca8SDavid du Colombier t = l;
2204375daca8SDavid du Colombier l = r;
2205375daca8SDavid du Colombier r = t;
2206375daca8SDavid du Colombier }
2207375daca8SDavid du Colombier else if(!vaddr(l, 1)) {
2208375daca8SDavid du Colombier reglcgen(&nod5, l, Z);
2209375daca8SDavid du Colombier l = &nod5;
2210375daca8SDavid du Colombier evacaxdx(l);
2211375daca8SDavid du Colombier }
2212375daca8SDavid du Colombier }
2213375daca8SDavid du Colombier t = regpair(Z, n);
2214375daca8SDavid du Colombier sugen(r, t, 8);
2215375daca8SDavid du Colombier r = t;
2216375daca8SDavid du Colombier evacaxdx(r->left);
2217375daca8SDavid du Colombier evacaxdx(r->right);
2218375daca8SDavid du Colombier if(l->complex <= r->complex && !m && !vaddr(l, 1)) {
2219375daca8SDavid du Colombier reglcgen(&nod5, l, Z);
2220375daca8SDavid du Colombier l = &nod5;
2221375daca8SDavid du Colombier evacaxdx(l);
2222375daca8SDavid du Colombier }
2223375daca8SDavid du Colombier }
2224375daca8SDavid du Colombier if(dr)
2225375daca8SDavid du Colombier t = nn;
2226375daca8SDavid du Colombier else
2227375daca8SDavid du Colombier t = regpair(Z, n);
2228*acc79d09SDavid du Colombier //print("dr=%d ", dr); prtree(t, "t");
2229375daca8SDavid du Colombier c = Z;
2230375daca8SDavid du Colombier d = Z;
2231375daca8SDavid du Colombier if(!nodreg(&nod1, t->left, D_AX)) {
2232375daca8SDavid du Colombier if(t->left->reg != D_AX){
2233375daca8SDavid du Colombier t->left->reg = D_AX;
2234375daca8SDavid du Colombier reg[D_AX]++;
2235375daca8SDavid du Colombier }else if(reg[D_AX] == 0)
2236375daca8SDavid du Colombier fatal(Z, "vlong mul AX botch");
2237375daca8SDavid du Colombier }
2238375daca8SDavid du Colombier if(!nodreg(&nod2, t->right, D_DX)) {
2239375daca8SDavid du Colombier if(t->right->reg != D_DX){
2240375daca8SDavid du Colombier t->right->reg = D_DX;
2241375daca8SDavid du Colombier reg[D_DX]++;
2242375daca8SDavid du Colombier }else if(reg[D_DX] == 0)
2243375daca8SDavid du Colombier fatal(Z, "vlong mul DX botch");
2244375daca8SDavid du Colombier }
2245*acc79d09SDavid du Colombier //prtree(t, "t1"); print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
2246375daca8SDavid du Colombier if(m)
2247375daca8SDavid du Colombier sugen(l, t, 8);
2248375daca8SDavid du Colombier else
2249375daca8SDavid du Colombier loadpair(l, t);
2250*acc79d09SDavid du Colombier //prtree(t, "t2"); print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
2251375daca8SDavid du Colombier if(t->left->reg != D_AX) {
2252375daca8SDavid du Colombier c = &nod3;
2253375daca8SDavid du Colombier regsalloc(c, t->left);
2254375daca8SDavid du Colombier gmove(&nod1, c);
2255375daca8SDavid du Colombier gmove(t->left, &nod1);
2256375daca8SDavid du Colombier zapreg(t->left);
2257375daca8SDavid du Colombier }
2258*acc79d09SDavid du Colombier //print("reg/ax = %d reg/dx = %d\n", reg[D_AX], reg[D_DX]);
2259375daca8SDavid du Colombier if(t->right->reg != D_DX) {
2260375daca8SDavid du Colombier d = &nod4;
2261375daca8SDavid du Colombier regsalloc(d, t->right);
2262375daca8SDavid du Colombier gmove(&nod2, d);
2263*acc79d09SDavid du Colombier if(t->right->reg == D_AX && c != nil){
2264*acc79d09SDavid du Colombier /* need previous value of AX in DX */
2265*acc79d09SDavid du Colombier gmove(c, &nod2);
2266*acc79d09SDavid du Colombier }else
2267375daca8SDavid du Colombier gmove(t->right, &nod2);
2268375daca8SDavid du Colombier zapreg(t->right);
2269375daca8SDavid du Colombier }
2270375daca8SDavid du Colombier if(c != Z || d != Z) {
2271375daca8SDavid du Colombier s = regpair(Z, n);
2272375daca8SDavid du Colombier s->left = &nod1;
2273375daca8SDavid du Colombier s->right = &nod2;
2274375daca8SDavid du Colombier }
2275375daca8SDavid du Colombier else
2276375daca8SDavid du Colombier s = t;
2277*acc79d09SDavid du Colombier reg[D_AX]++; /* don't allow biggen to allocate AX or DX (smashed by MUL) as temp */
2278*acc79d09SDavid du Colombier reg[D_DX]++;
2279375daca8SDavid du Colombier if(r->op == OCONST) {
2280375daca8SDavid du Colombier if(hi64v(r) == 0)
2281375daca8SDavid du Colombier biggen(s, r, Z, 0, mulc32, nil);
2282375daca8SDavid du Colombier else
2283375daca8SDavid du Colombier biggen(s, r, Z, 0, mulc64, nil);
2284375daca8SDavid du Colombier }
2285375daca8SDavid du Colombier else
2286375daca8SDavid du Colombier biggen(s, r, Z, 0, mull, nil);
2287375daca8SDavid du Colombier instpair(t, Z);
2288*acc79d09SDavid du Colombier reg[D_AX]--;
2289*acc79d09SDavid du Colombier reg[D_DX]--;
2290375daca8SDavid du Colombier if(c != Z) {
2291375daca8SDavid du Colombier gmove(&nod1, t->left);
2292375daca8SDavid du Colombier gmove(&nod3, &nod1);
2293375daca8SDavid du Colombier }
2294375daca8SDavid du Colombier if(d != Z) {
2295375daca8SDavid du Colombier gmove(&nod2, t->right);
2296375daca8SDavid du Colombier gmove(&nod4, &nod2);
2297375daca8SDavid du Colombier }
2298*acc79d09SDavid du Colombier
2299375daca8SDavid du Colombier if(r->op == OREGPAIR)
2300375daca8SDavid du Colombier freepair(r);
2301375daca8SDavid du Colombier if(!m)
2302375daca8SDavid du Colombier storepair(t, l, 0);
2303375daca8SDavid du Colombier if(l == &nod5)
2304375daca8SDavid du Colombier regfree(l);
2305*acc79d09SDavid du Colombier
2306375daca8SDavid du Colombier if(!dr) {
2307375daca8SDavid du Colombier if(nn != Z)
2308375daca8SDavid du Colombier storepair(t, nn, 1);
2309375daca8SDavid du Colombier else
2310375daca8SDavid du Colombier freepair(t);
2311375daca8SDavid du Colombier }
2312375daca8SDavid du Colombier return 1;
2313375daca8SDavid du Colombier
2314da51d93aSDavid du Colombier case OASADD:
2315da51d93aSDavid du Colombier args = ADDargs;
2316da51d93aSDavid du Colombier goto vasop;
2317da51d93aSDavid du Colombier case OASAND:
2318da51d93aSDavid du Colombier args = ANDargs;
2319da51d93aSDavid du Colombier goto vasop;
2320da51d93aSDavid du Colombier case OASOR:
2321da51d93aSDavid du Colombier args = ORargs;
2322da51d93aSDavid du Colombier goto vasop;
2323da51d93aSDavid du Colombier case OASSUB:
2324da51d93aSDavid du Colombier args = SUBargs;
2325da51d93aSDavid du Colombier goto vasop;
2326da51d93aSDavid du Colombier case OASXOR:
2327da51d93aSDavid du Colombier args = XORargs;
2328da51d93aSDavid du Colombier goto vasop;
2329da51d93aSDavid du Colombier
2330da51d93aSDavid du Colombier vasop:
2331da51d93aSDavid du Colombier l = n->left;
2332da51d93aSDavid du Colombier r = n->right;
2333da51d93aSDavid du Colombier dr = nn != Z && nn->op == OREGPAIR;
2334da51d93aSDavid du Colombier m = 0;
2335da51d93aSDavid du Colombier if(l->complex > r->complex) {
2336375daca8SDavid du Colombier if(!vaddr(l, 1)) {
2337da51d93aSDavid du Colombier reglcgen(&nod1, l, Z);
2338da51d93aSDavid du Colombier l = &nod1;
2339da51d93aSDavid du Colombier }
2340375daca8SDavid du Colombier if(!vaddr(r, 1) || nn != Z || r->op == OCONST) {
2341da51d93aSDavid du Colombier if(dr)
2342da51d93aSDavid du Colombier t = nn;
2343da51d93aSDavid du Colombier else
2344da51d93aSDavid du Colombier t = regpair(Z, r);
2345da51d93aSDavid du Colombier sugen(r, t, 8);
2346da51d93aSDavid du Colombier r = t;
2347da51d93aSDavid du Colombier m = 1;
2348da51d93aSDavid du Colombier }
2349da51d93aSDavid du Colombier }
2350da51d93aSDavid du Colombier else {
2351375daca8SDavid du Colombier if(!vaddr(r, 1) || nn != Z || r->op == OCONST) {
2352da51d93aSDavid du Colombier if(dr)
2353da51d93aSDavid du Colombier t = nn;
2354da51d93aSDavid du Colombier else
2355da51d93aSDavid du Colombier t = regpair(Z, r);
2356da51d93aSDavid du Colombier sugen(r, t, 8);
2357da51d93aSDavid du Colombier r = t;
2358da51d93aSDavid du Colombier m = 1;
2359da51d93aSDavid du Colombier }
2360375daca8SDavid du Colombier if(!vaddr(l, 1)) {
2361da51d93aSDavid du Colombier reglcgen(&nod1, l, Z);
2362da51d93aSDavid du Colombier l = &nod1;
2363da51d93aSDavid du Colombier }
2364da51d93aSDavid du Colombier }
2365da51d93aSDavid du Colombier if(nn != Z) {
2366da51d93aSDavid du Colombier if(n->op == OASSUB)
2367da51d93aSDavid du Colombier biggen(l, r, Z, 0, sub10, args);
2368da51d93aSDavid du Colombier else
2369da51d93aSDavid du Colombier biggen(r, l, Z, 0, binoptmp, args);
2370da51d93aSDavid du Colombier storepair(r, l, 0);
2371da51d93aSDavid du Colombier }
2372da51d93aSDavid du Colombier else {
2373da51d93aSDavid du Colombier if(m)
2374da51d93aSDavid du Colombier biggen(l, r, Z, 0, binop00, args);
2375da51d93aSDavid du Colombier else
2376da51d93aSDavid du Colombier biggen(l, r, Z, 0, binoptmp, args);
2377da51d93aSDavid du Colombier }
2378da51d93aSDavid du Colombier if(l == &nod1)
2379da51d93aSDavid du Colombier regfree(&nod1);
2380da51d93aSDavid du Colombier if(m) {
2381da51d93aSDavid du Colombier if(nn == Z)
2382da51d93aSDavid du Colombier freepair(r);
2383da51d93aSDavid du Colombier else if(!dr)
2384da51d93aSDavid du Colombier storepair(r, nn, 1);
2385da51d93aSDavid du Colombier }
2386da51d93aSDavid du Colombier return 1;
2387da51d93aSDavid du Colombier
2388da51d93aSDavid du Colombier case OASASHL:
2389da51d93aSDavid du Colombier args = nil;
2390da51d93aSDavid du Colombier optab = asshlltab;
2391da51d93aSDavid du Colombier goto assh;
2392da51d93aSDavid du Colombier case OASLSHR:
2393da51d93aSDavid du Colombier args = shrlargs;
2394da51d93aSDavid du Colombier optab = asshrltab;
2395da51d93aSDavid du Colombier goto assh;
2396da51d93aSDavid du Colombier case OASASHR:
2397da51d93aSDavid du Colombier args = sarlargs;
2398da51d93aSDavid du Colombier optab = asshrltab;
2399da51d93aSDavid du Colombier goto assh;
2400da51d93aSDavid du Colombier
2401da51d93aSDavid du Colombier assh:
2402da51d93aSDavid du Colombier c = Z;
2403da51d93aSDavid du Colombier l = n->left;
2404da51d93aSDavid du Colombier r = n->right;
2405da51d93aSDavid du Colombier if(r->op == OCONST) {
2406da51d93aSDavid du Colombier m = r->vconst & 63;
2407da51d93aSDavid du Colombier if(m < 32)
2408da51d93aSDavid du Colombier m = SAclo;
2409da51d93aSDavid du Colombier else if(m == 32)
2410da51d93aSDavid du Colombier m = SAc32;
2411da51d93aSDavid du Colombier else
2412da51d93aSDavid du Colombier m = SAchi;
2413da51d93aSDavid du Colombier }
2414da51d93aSDavid du Colombier else
2415da51d93aSDavid du Colombier m = SAgen;
2416da51d93aSDavid du Colombier if(l->complex > r->complex) {
2417375daca8SDavid du Colombier if(!vaddr(l, 0)) {
2418da51d93aSDavid du Colombier reglcgen(&nod1, l, Z);
2419da51d93aSDavid du Colombier l = &nod1;
2420da51d93aSDavid du Colombier }
2421da51d93aSDavid du Colombier if(m == SAgen) {
2422da51d93aSDavid du Colombier t = &nod2;
2423da51d93aSDavid du Colombier if(l->reg == D_CX) {
2424da51d93aSDavid du Colombier regalloc(t, r, Z);
2425da51d93aSDavid du Colombier gmove(l, t);
2426da51d93aSDavid du Colombier l->reg = t->reg;
2427da51d93aSDavid du Colombier t->reg = D_CX;
2428da51d93aSDavid du Colombier }
2429375daca8SDavid du Colombier else
2430375daca8SDavid du Colombier c = snarfreg(nn, t, D_CX, r, &nod3);
2431da51d93aSDavid du Colombier cgen(r, t);
2432da51d93aSDavid du Colombier r = t;
2433da51d93aSDavid du Colombier }
2434da51d93aSDavid du Colombier }
2435da51d93aSDavid du Colombier else {
2436da51d93aSDavid du Colombier if(m == SAgen) {
2437da51d93aSDavid du Colombier t = &nod2;
2438375daca8SDavid du Colombier c = snarfreg(nn, t, D_CX, r, &nod3);
2439da51d93aSDavid du Colombier cgen(r, t);
2440da51d93aSDavid du Colombier r = t;
2441da51d93aSDavid du Colombier }
2442375daca8SDavid du Colombier if(!vaddr(l, 0)) {
2443da51d93aSDavid du Colombier reglcgen(&nod1, l, Z);
2444da51d93aSDavid du Colombier l = &nod1;
2445da51d93aSDavid du Colombier }
2446da51d93aSDavid du Colombier }
2447da51d93aSDavid du Colombier
2448da51d93aSDavid du Colombier if(nn != Z) {
2449da51d93aSDavid du Colombier m += SAdgen - SAgen;
2450da51d93aSDavid du Colombier d = regpair(nn, n);
2451375daca8SDavid du Colombier instpair(d, Z);
2452da51d93aSDavid du Colombier biggen(l, r, d, 0, optab[m], args);
2453375daca8SDavid du Colombier if(l == &nod1) {
2454375daca8SDavid du Colombier regfree(&nod1);
2455375daca8SDavid du Colombier l = Z;
2456375daca8SDavid du Colombier }
2457375daca8SDavid du Colombier if(r == &nod2 && c == Z) {
2458375daca8SDavid du Colombier regfree(&nod2);
2459375daca8SDavid du Colombier r = Z;
2460375daca8SDavid du Colombier }
2461da51d93aSDavid du Colombier if(d != nn)
2462da51d93aSDavid du Colombier storepair(d, nn, 1);
2463da51d93aSDavid du Colombier }
2464da51d93aSDavid du Colombier else
2465da51d93aSDavid du Colombier biggen(l, r, Z, 0, optab[m], args);
2466da51d93aSDavid du Colombier
2467da51d93aSDavid du Colombier if(c != Z) {
2468da51d93aSDavid du Colombier gins(AMOVL, c, r);
2469da51d93aSDavid du Colombier regfree(c);
2470da51d93aSDavid du Colombier }
2471da51d93aSDavid du Colombier if(l == &nod1)
2472da51d93aSDavid du Colombier regfree(&nod1);
2473da51d93aSDavid du Colombier if(r == &nod2)
2474da51d93aSDavid du Colombier regfree(&nod2);
2475da51d93aSDavid du Colombier return 1;
2476da51d93aSDavid du Colombier
2477da51d93aSDavid du Colombier case OPOSTINC:
2478da51d93aSDavid du Colombier args = ADDargs;
2479da51d93aSDavid du Colombier cp = incdecpost;
2480da51d93aSDavid du Colombier goto vinc;
2481da51d93aSDavid du Colombier case OPOSTDEC:
2482da51d93aSDavid du Colombier args = SUBargs;
2483da51d93aSDavid du Colombier cp = incdecpost;
2484da51d93aSDavid du Colombier goto vinc;
2485da51d93aSDavid du Colombier case OPREINC:
2486da51d93aSDavid du Colombier args = ADDargs;
2487da51d93aSDavid du Colombier cp = incdecpre;
2488da51d93aSDavid du Colombier goto vinc;
2489da51d93aSDavid du Colombier case OPREDEC:
2490da51d93aSDavid du Colombier args = SUBargs;
2491da51d93aSDavid du Colombier cp = incdecpre;
2492da51d93aSDavid du Colombier goto vinc;
2493da51d93aSDavid du Colombier
2494da51d93aSDavid du Colombier vinc:
2495da51d93aSDavid du Colombier l = n->left;
2496375daca8SDavid du Colombier if(!vaddr(l, 1)) {
2497da51d93aSDavid du Colombier reglcgen(&nod1, l, Z);
2498da51d93aSDavid du Colombier l = &nod1;
2499da51d93aSDavid du Colombier }
2500da51d93aSDavid du Colombier
2501da51d93aSDavid du Colombier if(nn != Z) {
2502da51d93aSDavid du Colombier d = regpair(nn, n);
2503375daca8SDavid du Colombier instpair(d, Z);
2504da51d93aSDavid du Colombier biggen(l, Z, d, 0, cp, args);
2505375daca8SDavid du Colombier if(l == &nod1) {
2506375daca8SDavid du Colombier regfree(&nod1);
2507375daca8SDavid du Colombier l = Z;
2508375daca8SDavid du Colombier }
2509da51d93aSDavid du Colombier if(d != nn)
2510da51d93aSDavid du Colombier storepair(d, nn, 1);
2511da51d93aSDavid du Colombier }
2512da51d93aSDavid du Colombier else
2513da51d93aSDavid du Colombier biggen(l, Z, Z, 0, incdec, args);
2514da51d93aSDavid du Colombier
2515da51d93aSDavid du Colombier if(l == &nod1)
2516da51d93aSDavid du Colombier regfree(&nod1);
2517da51d93aSDavid du Colombier return 1;
2518da51d93aSDavid du Colombier
2519da51d93aSDavid du Colombier case OCAST:
2520da51d93aSDavid du Colombier l = n->left;
2521da51d93aSDavid du Colombier if(typev[l->type->etype]) {
2522375daca8SDavid du Colombier if(!vaddr(l, 1)) {
2523da51d93aSDavid du Colombier if(l->complex + 1 > nn->complex) {
2524da51d93aSDavid du Colombier d = regpair(Z, l);
2525da51d93aSDavid du Colombier sugen(l, d, 8);
2526375daca8SDavid du Colombier if(!vaddr(nn, 1)) {
2527da51d93aSDavid du Colombier reglcgen(&nod1, nn, Z);
2528da51d93aSDavid du Colombier r = &nod1;
2529da51d93aSDavid du Colombier }
2530da51d93aSDavid du Colombier else
2531da51d93aSDavid du Colombier r = nn;
2532da51d93aSDavid du Colombier }
2533da51d93aSDavid du Colombier else {
2534375daca8SDavid du Colombier if(!vaddr(nn, 1)) {
2535da51d93aSDavid du Colombier reglcgen(&nod1, nn, Z);
2536da51d93aSDavid du Colombier r = &nod1;
2537da51d93aSDavid du Colombier }
2538da51d93aSDavid du Colombier else
2539da51d93aSDavid du Colombier r = nn;
2540da51d93aSDavid du Colombier d = regpair(Z, l);
2541da51d93aSDavid du Colombier sugen(l, d, 8);
2542da51d93aSDavid du Colombier }
2543da51d93aSDavid du Colombier // d->left->type = r->type;
2544da51d93aSDavid du Colombier d->left->type = types[TLONG];
2545da51d93aSDavid du Colombier gmove(d->left, r);
2546da51d93aSDavid du Colombier freepair(d);
2547da51d93aSDavid du Colombier }
2548da51d93aSDavid du Colombier else {
2549375daca8SDavid du Colombier if(nn->op != OREGISTER && !vaddr(nn, 1)) {
2550da51d93aSDavid du Colombier reglcgen(&nod1, nn, Z);
2551da51d93aSDavid du Colombier r = &nod1;
2552da51d93aSDavid du Colombier }
2553da51d93aSDavid du Colombier else
2554da51d93aSDavid du Colombier r = nn;
2555da51d93aSDavid du Colombier // l->type = r->type;
2556da51d93aSDavid du Colombier l->type = types[TLONG];
2557da51d93aSDavid du Colombier gmove(l, r);
2558da51d93aSDavid du Colombier }
2559da51d93aSDavid du Colombier if(r != nn)
2560da51d93aSDavid du Colombier regfree(r);
2561da51d93aSDavid du Colombier }
2562da51d93aSDavid du Colombier else {
2563da51d93aSDavid du Colombier if(typeu[l->type->etype] || cond(l->op))
2564da51d93aSDavid du Colombier si = TUNSIGNED;
2565da51d93aSDavid du Colombier else
2566da51d93aSDavid du Colombier si = TSIGNED;
2567da51d93aSDavid du Colombier regalloc(&nod1, l, Z);
2568da51d93aSDavid du Colombier cgen(l, &nod1);
2569da51d93aSDavid du Colombier if(nn->op == OREGPAIR) {
2570375daca8SDavid du Colombier m = instpair(nn, &nod1);
2571da51d93aSDavid du Colombier biggen(&nod1, Z, nn, si == TSIGNED, castrp, nil);
2572da51d93aSDavid du Colombier }
2573da51d93aSDavid du Colombier else {
2574375daca8SDavid du Colombier m = 0;
2575375daca8SDavid du Colombier if(!vaddr(nn, si != TSIGNED)) {
2576da51d93aSDavid du Colombier dt = nn->type;
2577da51d93aSDavid du Colombier nn->type = types[TLONG];
2578da51d93aSDavid du Colombier reglcgen(&nod2, nn, Z);
2579da51d93aSDavid du Colombier nn->type = dt;
2580da51d93aSDavid du Colombier nn = &nod2;
2581da51d93aSDavid du Colombier }
2582da51d93aSDavid du Colombier dt = nn->type;
2583da51d93aSDavid du Colombier nn->type = types[TLONG];
2584da51d93aSDavid du Colombier biggen(&nod1, Z, nn, si == TSIGNED, castrpa, nil);
2585da51d93aSDavid du Colombier nn->type = dt;
2586da51d93aSDavid du Colombier if(nn == &nod2)
2587da51d93aSDavid du Colombier regfree(&nod2);
2588da51d93aSDavid du Colombier }
2589375daca8SDavid du Colombier if(!m)
2590da51d93aSDavid du Colombier regfree(&nod1);
2591da51d93aSDavid du Colombier }
2592da51d93aSDavid du Colombier return 1;
2593da51d93aSDavid du Colombier
2594da51d93aSDavid du Colombier default:
2595da51d93aSDavid du Colombier if(n->op == OREGPAIR) {
2596da51d93aSDavid du Colombier storepair(n, nn, 1);
2597da51d93aSDavid du Colombier return 1;
2598da51d93aSDavid du Colombier }
2599da51d93aSDavid du Colombier if(nn->op == OREGPAIR) {
2600da51d93aSDavid du Colombier loadpair(n, nn);
2601da51d93aSDavid du Colombier return 1;
2602da51d93aSDavid du Colombier }
2603da51d93aSDavid du Colombier return 0;
2604da51d93aSDavid du Colombier }
2605da51d93aSDavid du Colombier finished:
2606da51d93aSDavid du Colombier if(d != nn)
2607da51d93aSDavid du Colombier storepair(d, nn, 1);
2608da51d93aSDavid du Colombier return 1;
2609da51d93aSDavid du Colombier }
2610da51d93aSDavid du Colombier
2611da51d93aSDavid du Colombier void
testv(Node * n,int true)2612da51d93aSDavid du Colombier testv(Node *n, int true)
2613da51d93aSDavid du Colombier {
2614da51d93aSDavid du Colombier Type *t;
26154ac975e2SDavid du Colombier Node *nn, nod, *b;
26164ac975e2SDavid du Colombier
26174ac975e2SDavid du Colombier if(machcap(Z)) {
26184ac975e2SDavid du Colombier b = &nod;
26194ac975e2SDavid du Colombier b->op = true ? ONE : OEQ;
26204ac975e2SDavid du Colombier b->left = n;
26214ac975e2SDavid du Colombier b->right = new(0, Z, Z);
26224ac975e2SDavid du Colombier *b->right = *nodconst(0);
26234ac975e2SDavid du Colombier b->right->type = n->type;
26244ac975e2SDavid du Colombier b->type = types[TLONG];
26254ac975e2SDavid du Colombier cgen64(b, Z);
26264ac975e2SDavid du Colombier return;
26274ac975e2SDavid du Colombier }
2628da51d93aSDavid du Colombier
2629da51d93aSDavid du Colombier switch(n->op) {
2630da51d93aSDavid du Colombier case OINDREG:
2631da51d93aSDavid du Colombier case ONAME:
2632da51d93aSDavid du Colombier biggen(n, Z, Z, true, testi, nil);
2633da51d93aSDavid du Colombier break;
2634da51d93aSDavid du Colombier
2635da51d93aSDavid du Colombier default:
2636da51d93aSDavid du Colombier n = vfunc(n, n);
2637da51d93aSDavid du Colombier if(n->addable >= INDEXED) {
2638da51d93aSDavid du Colombier t = n->type;
2639da51d93aSDavid du Colombier n->type = types[TLONG];
2640da51d93aSDavid du Colombier reglcgen(&nod, n, Z);
2641da51d93aSDavid du Colombier n->type = t;
2642da51d93aSDavid du Colombier n = &nod;
2643da51d93aSDavid du Colombier biggen(n, Z, Z, true, testi, nil);
2644da51d93aSDavid du Colombier if(n == &nod)
2645da51d93aSDavid du Colombier regfree(n);
2646da51d93aSDavid du Colombier }
2647da51d93aSDavid du Colombier else {
2648da51d93aSDavid du Colombier nn = regpair(Z, n);
2649da51d93aSDavid du Colombier sugen(n, nn, 8);
2650da51d93aSDavid du Colombier biggen(nn, Z, Z, true, testi, nil);
2651da51d93aSDavid du Colombier freepair(nn);
2652da51d93aSDavid du Colombier }
2653da51d93aSDavid du Colombier }
2654da51d93aSDavid du Colombier }
2655