xref: /plan9/sys/src/cmd/8c/cgen64.c (revision acc79d098086ac6ce367557c3bc2ea2f8047cc2b)
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