1/*	Id: table.c,v 1.3 2014/06/03 20:19:50 ragge Exp 	*/
2/*	$NetBSD$	*/
3/*
4 * Copyright (c) 2006 Anders Magnusson (ragge@ludd.luth.se).
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software without specific prior written permission
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30
31# include "pass2.h"
32
33# define ANYSIGNED TINT|TLONG|TSHORT|TCHAR
34# define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR
35# define ANYFIXED ANYSIGNED|ANYUSIGNED
36# define ANYREG (INAREG|INBREG|INCREG)
37# define TUWORD TUNSIGNED|TULONG
38# define TSWORD TINT|TLONG
39# define TWORD TUWORD|TSWORD
40
41struct optab table[] = {
42/* First entry must be an empty entry */
43{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
44
45/*
46 * All ASSIGN entries.
47 */
48/* reg->reg */
49{ ASSIGN,	FOREFF|INAREG|INBREG,
50	SAREG|SBREG,	TWORD|TPOINT,
51	SAREG|SBREG,	TWORD|TPOINT,
52		0,	RDEST,
53		"	mov AR,AL\n", },
54/* reg->mem */
55{ ASSIGN,	FOREFF|INAREG|INBREG,
56	SNAME|SOREG,	TWORD|TPOINT,
57	SAREG|SBREG,	TWORD|TPOINT,
58		0,	RDEST,
59		"	sta AR,AL\n", },
60/* mem->reg */
61{ ASSIGN,	FOREFF|INAREG|INBREG,
62	SAREG|SBREG,	TWORD|TPOINT,
63	SNAME|SOREG,	TWORD|TPOINT,
64		0,	RDEST,
65		"	lda AL,AR\n", },
66
67/*
68 * LEAF type movements.
69 */
70/* 0 -> reg */
71{ OPLTYPE,	INAREG|INBREG,
72	SANY,	TANY,
73	SZERO,	TWORD,
74		NAREG,	RESC1,
75		"	subo A1,A1\n", },
76
77/* 1 -> reg */
78{ OPLTYPE,	INAREG|INBREG,
79	SANY,	TANY,
80	SONE,	TWORD,
81		NAREG|NBREG,	RESC1,
82		"	subzl A1,A1	# 1\n", },
83
84/* constant -> reg */
85{ OPLTYPE,	INAREG|INBREG,
86	SANY,	TANY,
87	SCON,	TWORD|TPOINT,
88		NAREG|NBREG,	RESC1,
89		"	lda A1,AR\n", },
90
91/* mem -> reg */
92{ OPLTYPE,	INAREG,
93	SANY,		TANY,
94	SNAME|SOREG,	TWORD,
95		NAREG,	RESC1,
96		"	lda A1,AR\n", },
97
98/* reg -> A-reg */
99{ OPLTYPE,	INAREG,
100	SANY,		TANY,
101	SAREG|SBREG,	TWORD,
102		NAREG,	RESC1,
103		"	mov AR,A1\n", },
104
105/* reg -> B-reg */
106{ OPLTYPE,	INBREG,
107	SANY,		TANY,
108	SAREG|SBREG,	TWORD,
109		NBREG,	RESC1,
110		"	mov AR,A1\n", },
111
112{ OPLTYPE,	INBREG,
113	SANY,		TANY,
114	SNAME|SOREG,	TPOINT,
115		NBREG,	RESC1,
116		"	lda A1,AR\n", },
117
118{ OPLTYPE,	INBREG,
119	SANY,		TANY,
120	SLDFPSP,	TANY,
121		NBREG,	RESC1,
122		"	lda A1,AR\n", },
123
124/*
125 * Simple ops.
126 */
127{ PLUS,		INBREG|INAREG,
128	SAREG|SBREG,	TWORD|TPOINT,
129	SONE,		TANY,
130		0,	RLEFT,
131		"	inc AL,AL\n", },
132
133{ OPSIMP,	INBREG|INAREG|FOREFF,
134	SAREG|SBREG,	TWORD|TPOINT,
135	SAREG|SBREG,	TWORD|TPOINT,
136		0,	RLEFT,
137		"	O AR,AL\n", },
138
139/*
140 * Indirections
141 */
142{ UMUL,	INAREG,
143	SANY,	TPOINT|TWORD,
144	SOREG,	TPOINT|TWORD,
145		NAREG|NASL,	RESC1,
146		"	lda A1,AL #\n", },
147
148{ UMUL,	INAREG,
149	SANY,	TPOINT|TWORD,
150	SOREG,	TCHAR|TUCHAR,
151		NAREG|NASL,	RESC1,
152		"	lda A1,AL #\n", },
153
154{ UMUL,	INBREG,
155	SANY,	TPOINT|TWORD,
156	SOREG,	TPOINT|TWORD,
157		NBREG|NBSL,	RESC1,
158		"	lda A1,AL  # #\n", },
159
160#if 0
161
162/* PCONVs are usually not necessary */
163{ PCONV,	INAREG,
164	SAREG,	TWORD|TPOINT,
165	SAREG,	TWORD|TPOINT,
166		0,	RLEFT,
167		"", },
168
169/*
170 * A bunch conversions of integral<->integral types
171 * There are lots of them, first in table conversions to itself
172 * and then conversions from each type to the others.
173 */
174
175/* itself to itself, including pointers */
176
177/* convert (u)char to (u)char. */
178{ SCONV,	INCH,
179	SHCH,	TCHAR|TUCHAR,
180	SHCH,	TCHAR|TUCHAR,
181		0,	RLEFT,
182		"", },
183
184/* convert pointers to int. */
185{ SCONV,	ININT,
186	SHINT,	TPOINT|TWORD,
187	SANY,	TWORD,
188		0,	RLEFT,
189		"", },
190
191/* convert (u)longlong to (u)longlong. */
192{ SCONV,	INLL,
193	SHLL,	TLL,
194	SHLL,	TLL,
195		0,	RLEFT,
196		"", },
197
198/* convert double <-> float. nothing to do here */
199{ SCONV,	INFL,
200	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
201	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
202		0,	RLEFT,
203		"", },
204
205/* convert pointers to pointers. */
206{ SCONV,	ININT,
207	SHINT,	TPOINT,
208	SANY,	TPOINT,
209		0,	RLEFT,
210		"", },
211
212/* char to something */
213
214/* convert char to (unsigned) short. */
215{ SCONV,	ININT,
216	SBREG|SOREG|SNAME,	TCHAR,
217	SAREG,	TSHORT|TUSHORT,
218		NASL|NAREG,	RESC1,
219		"	movsbw AL,A1\n", },
220
221/* convert unsigned char to (u)short. */
222{ SCONV,	ININT,
223	SHCH|SOREG|SNAME,	TUCHAR,
224	SAREG,	TSHORT|TUSHORT,
225		NASL|NAREG,	RESC1,
226		"	movzbw AL,A1\n", },
227
228/* convert signed char to int (or pointer). */
229{ SCONV,	ININT,
230	SHCH|SOREG|SNAME,	TCHAR,
231	SAREG,	TWORD|TPOINT,
232		NASL|NAREG,	RESC1,
233		"	movsbl AL,A1\n", },
234
235/* convert unsigned char to (u)int. */
236{ SCONV,	ININT,
237	SHCH|SOREG|SNAME,	TUCHAR,
238	SAREG,	TWORD,
239		NASL|NAREG,	RESC1,
240		"	movzbl AL,A1\n", },
241
242/* convert char to (u)long long */
243{ SCONV,	INLL,
244	SHCH|SOREG|SNAME,	TCHAR,
245	SANY,	TLL,
246		NSPECIAL|NAREG|NASL,	RESC1,
247		"	movsbl AL,%eax\n	cltd\n", },
248
249/* convert unsigned char to (u)long long */
250{ SCONV,	INLL,
251	SHCH|SOREG|SNAME,	TUCHAR,
252	SANY,			TLL,
253		NCREG|NCSL,	RESC1,
254		"	movzbl AL,A1\n	xorl U1,U1\n", },
255
256/* convert char (in register) to double XXX - use NTEMP */
257{ SCONV,	INFL,
258	SHCH|SOREG|SNAME,	TCHAR,
259	SHFL,			TLDOUBLE|TDOUBLE|TFLOAT,
260		NAREG|NASL|NDREG,	RESC2,
261		"	movsbl AL,A1\n	pushl A1\n"
262		"	fildl (%esp)\n	addl $4,%esp\n", },
263
264/* convert (u)char (in register) to double XXX - use NTEMP */
265{ SCONV,	INFL,
266	SHCH|SOREG|SNAME,	TUCHAR,
267	SHFL,			TLDOUBLE|TDOUBLE|TFLOAT,
268		NAREG|NASL|NDREG,	RESC2,
269		"	movzbl AL,A1\n	pushl A1\n"
270		"	fildl (%esp)\n	addl $4,%esp\n", },
271
272/* short to something */
273
274/* convert short (in memory) to char */
275{ SCONV,	INCH,
276	SNAME|SOREG,	TSHORT|TUSHORT,
277	SHCH,		TCHAR|TUCHAR,
278		NBREG|NBSL,	RESC1,
279		"	movb AL,A1\n", },
280
281/* convert short (in reg) to char. */
282{ SCONV,	INCH,
283	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
284	SHCH,			TCHAR|TUCHAR,
285		NSPECIAL|NBREG|NBSL,	RESC1,
286		"ZM", },
287
288/* convert short to (u)int. */
289{ SCONV,	ININT,
290	SAREG|SOREG|SNAME,	TSHORT,
291	SAREG,	TWORD,
292		NASL|NAREG,	RESC1,
293		"	movswl AL,A1\n", },
294
295/* convert unsigned short to (u)int. */
296{ SCONV,	ININT,
297	SAREG|SOREG|SNAME,	TUSHORT,
298	SAREG,	TWORD,
299		NASL|NAREG,	RESC1,
300		"	movzwl AL,A1\n", },
301
302/* convert short to (u)long long */
303{ SCONV,	INLL,
304	SAREG|SOREG|SNAME,	TSHORT,
305	SHLL,			TLL,
306		NSPECIAL|NCREG|NCSL,	RESC1,
307		"	movswl AL,%eax\n	cltd\n", },
308
309/* convert unsigned short to (u)long long */
310{ SCONV,	INLL,
311	SAREG|SOREG|SNAME,	TUSHORT,
312	SHLL,			TLL,
313		NCREG|NCSL,	RESC1,
314		"	movzwl AL,A1\n	xorl U1,U1\n", },
315
316/* convert short (in memory) to float/double */
317{ SCONV,	INFL,
318	SOREG|SNAME,	TSHORT,
319	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
320		NDREG,	RESC1,
321		"	fild AL\n", },
322
323/* convert short (in register) to float/double */
324{ SCONV,	INFL,
325	SAREG,	TSHORT,
326	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
327		NTEMP|NDREG,	RESC1,
328		"	pushw AL\n	fild (%esp)\n	addl $2,%esp\n", },
329
330/* convert unsigned short to double XXX - use NTEMP */
331{ SCONV,	INFL,
332	SAREG|SOREG|SNAME,	TUSHORT,
333	SHFL,			TLDOUBLE|TDOUBLE|TFLOAT,
334		NAREG|NASL|NDREG|NTEMP,	RESC2,
335		"	movzwl AL,A1\n	pushl A1\n"
336		"	fildl (%esp)\n	addl $4,%esp\n", },
337
338/* int to something */
339
340/* convert int to char. This is done when register is loaded */
341{ SCONV,	INCH,
342	SAREG,	TWORD,
343	SANY,	TCHAR|TUCHAR,
344		NSPECIAL|NBREG|NBSL,	RESC1,
345		"ZM", },
346
347/* convert int to short. Nothing to do */
348{ SCONV,	INAREG,
349	SAREG,	TWORD,
350	SANY,	TSHORT|TUSHORT,
351		0,	RLEFT,
352		"", },
353
354/* convert int to long long */
355{ SCONV,	INLL,
356	SAREG,	TWORD|TPOINT,
357	SCREG,	TLONGLONG,
358		NSPECIAL|NCREG|NCSL,	RESC1,
359		"	cltd\n", },
360
361/* convert int to unsigned long long */
362{ SCONV,	INLL,
363	SAREG|SOREG|SNAME,	TWORD|TPOINT,
364	SHLL,	TULONGLONG,
365		NCSL|NCREG,	RESC1,
366		"	movl AL,A1\n	xorl U1,U1\n", },
367
368/* convert int (in memory) to double */
369{ SCONV,	INFL,
370	SOREG|SNAME,	TWORD,
371	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
372		NDREG,	RESC1,
373		"	fildl AL\n", },
374
375/* convert int (in register) to double */
376{ SCONV,	INFL,
377	SAREG,	TWORD,
378	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
379		NTEMP|NDREG,	RESC1,
380		"	pushl AL\n	fildl (%esp)\n	addl $4,%esp\n", },
381
382/* long long to something */
383
384/* convert (u)long long to (u)char (mem->reg) */
385{ SCONV,	INCH,
386	SOREG|SNAME,	TLL,
387	SANY,	TCHAR|TUCHAR,
388		NAREG|NASL,	RESC1,
389		"	movb AL,A1\n", },
390
391/* convert (u)long long to (u)char (reg->reg, hopefully nothing) */
392{ SCONV,	INCH,
393	SHLL,	TLL,
394	SANY,	TCHAR|TUCHAR,
395		NAREG|NASL,	RESC1,
396		"ZS", },
397
398/* convert (u)long long to (u)short (mem->reg) */
399{ SCONV,	INAREG,
400	SOREG|SNAME,	TLL,
401	SAREG,	TSHORT|TUSHORT,
402		NAREG|NASL,	RESC1,
403		"	movw AL,A1\n", },
404
405/* convert (u)long long to (u)short (reg->reg, hopefully nothing) */
406{ SCONV,	INAREG,
407	SHLL|SOREG|SNAME,	TLL,
408	SAREG,	TSHORT|TUSHORT,
409		NAREG|NASL,	RESC1,
410		"ZS", },
411
412/* convert long long to int (mem->reg) */
413{ SCONV,	INAREG,
414	SOREG|SNAME,	TLL,
415	SAREG,	TWORD|TPOINT,
416		NAREG|NASL,	RESC1,
417		"	movl AL,A1\n", },
418
419/* convert long long to int (reg->reg, hopefully nothing) */
420{ SCONV,	INAREG,
421	SHLL|SOREG|SNAME,	TLL,
422	SAREG,	TWORD|TPOINT,
423		NAREG|NASL,	RESC1,
424		"ZS", },
425
426/* convert long long (in memory) to floating */
427{ SCONV,	INFL,
428	SOREG|SNAME,	TLONGLONG,
429	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
430		NDREG,	RESC1,
431		"	fildq AL\n", },
432
433/* convert long long (in register) to floating */
434{ SCONV,	INFL,
435	SHLL,	TLONGLONG,
436	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
437		NTEMP|NDREG,	RESC1,
438		"	pushl UL\n	pushl AL\n"
439		"	fildq (%esp)\n	addl $8,%esp\n", },
440
441/* convert unsigned long long to floating */
442{ SCONV,	INFL,
443	SCREG,	TULONGLONG,
444	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
445		NDREG,	RESC1,
446		"ZJ", },
447
448/* float to something */
449
450#if 0 /* go via int by adding an extra sconv in clocal() */
451/* convert float/double to (u) char. XXX should use NTEMP here */
452{ SCONV,	INCH,
453	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
454	SHCH,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
455		NBREG,	RESC1,
456		"	subl $4,%esp\n	fistpl (%esp)\n	popl A1\n", },
457
458/* convert float/double to (u) int/short/char. XXX should use NTEMP here */
459{ SCONV,	INCH,
460	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
461	SHCH,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
462		NCREG,	RESC1,
463		"	subl $4,%esp\n	fistpl (%esp)\n	popl A1\n", },
464#endif
465
466/* convert float/double to (u)int. XXX should use NTEMP here */
467{ SCONV,	INAREG,
468	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
469	SAREG,	TWORD,
470		NAREG,	RESC1,
471		"	subl $4,%esp\n	fistpl (%esp)\n	popl A1\n", },
472
473/* convert float/double (in register) to (unsigned) long long */
474/* XXX - unsigned is not handled correct */
475{ SCONV,	INLL,
476	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
477	SHLL,	TLONGLONG|TULONGLONG,
478		NCREG,	RESC1,
479		"	subl $8,%esp\n	fistpq (%esp)\n"
480		"	popl A1\n	popl U1\n", },
481
482/* slut sconv */
483#endif
484
485/*
486 * Subroutine calls.
487 */
488
489{ CALL,		FOREFF,
490	SCON,	TANY,
491	SANY,	TANY,
492		0,	0,
493		"	jsr CL\nZC", },
494
495{ UCALL,	FOREFF,
496	SCON,	TANY,
497	SANY,	TANY,
498		0,	0,
499		"	jsr CL\n", },
500
501{ CALL,		INAREG|FOREFF,
502	SCON,	TANY,
503	SANY,	TANY,
504		NAREG|NASL,	RESC1,
505		"	jsr CL\nZC", },
506
507{ UCALL,	INAREG|FOREFF,
508	SCON,	TANY,
509	SANY,	TANY,
510		NAREG|NASL,	RESC1,
511		"	jsr CL\n", },
512
513#if 0
514{ CALL,	INAREG,
515	SCON,	TANY,
516	SAREG,	TWORD|TPOINT,
517		NAREG|NASL,	RESC1,	/* should be 0 */
518		"	call CL\nZC", },
519
520{ UCALL,	INAREG,
521	SCON,	TANY,
522	SAREG,	TWORD|TPOINT,
523		NAREG|NASL,	RESC1,	/* should be 0 */
524		"	call CL\n", },
525
526{ CALL,	INBREG,
527	SCON,	TANY,
528	SBREG,	TCHAR|TUCHAR,
529		NBREG,	RESC1,	/* should be 0 */
530		"	call CL\nZC", },
531
532{ UCALL,	INBREG,
533	SCON,	TANY,
534	SBREG,	TCHAR|TUCHAR,
535		NBREG,	RESC1,	/* should be 0 */
536		"	call CL\n", },
537
538{ CALL,		INCREG,
539	SCON,	TANY,
540	SCREG,	TANY,
541		NCREG|NCSL,	RESC1,	/* should be 0 */
542		"	call CL\nZC", },
543
544{ UCALL,	INCREG,
545	SCON,	TANY,
546	SCREG,	TANY,
547		NCREG|NCSL,	RESC1,	/* should be 0 */
548		"	call CL\n", },
549
550{ CALL,	INDREG,
551	SCON,	TANY,
552	SDREG,	TANY,
553		NDREG|NDSL,	RESC1,	/* should be 0 */
554		"	call CL\nZC", },
555
556{ UCALL,	INDREG,
557	SCON,	TANY,
558	SDREG,	TANY,
559		NDREG|NDSL,	RESC1,	/* should be 0 */
560		"	call CL\nZC", },
561
562{ CALL,		FOREFF,
563	SAREG,	TANY,
564	SANY,	TANY,
565		0,	0,
566		"	call *AL\nZC", },
567
568{ UCALL,	FOREFF,
569	SAREG,	TANY,
570	SANY,	TANY,
571		0,	0,
572		"	call *AL\nZC", },
573
574{ CALL,		INAREG,
575	SAREG,	TANY,
576	SANY,	TANY,
577		NAREG|NASL,	RESC1,	/* should be 0 */
578		"	call *AL\nZC", },
579
580{ UCALL,	INAREG,
581	SAREG,	TANY,
582	SANY,	TANY,
583		NAREG|NASL,	RESC1,	/* should be 0 */
584		"	call *AL\nZC", },
585
586{ CALL,		INBREG,
587	SAREG,	TANY,
588	SANY,	TANY,
589		NBREG|NBSL,	RESC1,	/* should be 0 */
590		"	call *AL\nZC", },
591
592{ UCALL,	INBREG,
593	SAREG,	TANY,
594	SANY,	TANY,
595		NBREG|NBSL,	RESC1,	/* should be 0 */
596		"	call *AL\nZC", },
597
598{ CALL,		INCREG,
599	SAREG,	TANY,
600	SANY,	TANY,
601		NCREG|NCSL,	RESC1,	/* should be 0 */
602		"	call *AL\nZC", },
603
604{ UCALL,	INCREG,
605	SAREG,	TANY,
606	SANY,	TANY,
607		NCREG|NCSL,	RESC1,	/* should be 0 */
608		"	call *AL\nZC", },
609
610{ CALL,		INDREG,
611	SAREG,	TANY,
612	SANY,	TANY,
613		NDREG|NDSL,	RESC1,	/* should be 0 */
614		"	call *AL\nZC", },
615
616{ UCALL,	INDREG,
617	SAREG,	TANY,
618	SANY,	TANY,
619		NDREG|NDSL,	RESC1,	/* should be 0 */
620		"	call *AL\nZC", },
621
622/* struct return */
623{ USTCALL,	FOREFF,
624	SCON,	TANY,
625	SANY,	TANY,
626		NAREG|NASL,	0,
627		"ZP	call CL\nZC", },
628
629{ USTCALL,	INAREG,
630	SCON,	TANY,
631	SANY,	TANY,
632		NAREG|NASL,	RESC1,	/* should be 0 */
633		"ZP	call CL\nZC", },
634
635{ USTCALL,	INAREG,
636	SNAME|SAREG,	TANY,
637	SANY,	TANY,
638		NAREG|NASL,	RESC1,	/* should be 0 */
639		"ZP	call *AL\nZC", },
640
641{ STCALL,	FOREFF,
642	SCON,	TANY,
643	SANY,	TANY,
644		NAREG|NASL,	0,
645		"ZP	call CL\nZC", },
646
647{ STCALL,	INAREG,
648	SCON,	TANY,
649	SANY,	TANY,
650		NAREG|NASL,	RESC1,	/* should be 0 */
651		"ZP	call CL\nZC", },
652
653{ STCALL,	INAREG,
654	SNAME|SAREG,	TANY,
655	SANY,	TANY,
656		NAREG|NASL,	RESC1,	/* should be 0 */
657		"ZP	call *AL\nZC", },
658
659/*
660 * The next rules handle all binop-style operators.
661 */
662/* Special treatment for long long */
663{ PLUS,		INLL|FOREFF,
664	SHLL,		TLL,
665	SHLL|SNAME|SOREG,	TLL,
666		0,	RLEFT,
667		"	addl AR,AL\n	adcl UR,UL\n", },
668
669/* Special treatment for long long  XXX - fix commutative check */
670{ PLUS,		INLL|FOREFF,
671	SHLL|SNAME|SOREG,	TLL,
672	SHLL,			TLL,
673		0,	RRIGHT,
674		"	addl AL,AR\n	adcl UL,UR\n", },
675
676{ PLUS,		INFL,
677	SHFL,		TDOUBLE,
678	SNAME|SOREG,	TDOUBLE,
679		0,	RLEFT,
680		"	faddl AR\n", },
681
682{ PLUS,		INFL|FOREFF,
683	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
684	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
685		0,	RLEFT,
686		"	faddp\n", },
687
688{ PLUS,		INAREG,
689	SAREG|SNAME|SOREG,	TWORD|TPOINT,
690	SONE,	TANY,
691		0,	RLEFT,
692		"	incl AL\n", },
693
694{ PLUS,		INAREG,
695	SAREG,	TWORD|TPOINT,
696	SCON,	TANY,
697		NAREG|NASL,	RESC1,
698		"	leal CR(AL),A1\n", },
699
700{ PLUS,		INCH,
701	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
702	SONE,	TANY,
703		0,	RLEFT,
704		"	incb AL\n", },
705
706{ PLUS,		INAREG,
707	SAREG,	TWORD,
708	SAREG,	TWORD,
709		NAREG|NASL|NASR,	RESC1,
710		"	leal (AL,AR),A1\n", },
711
712
713/* address as register offset, negative */
714{ MINUS,	INAREG,
715	SAREG,	TWORD|TPOINT,
716	SPCON,	TANY,
717		NAREG|NASL,	RESC1,
718		"	leal -CR(AL),A1\n", },
719
720{ MINUS,	INLL|FOREFF,
721	SHLL,	TLL,
722	SHLL|SNAME|SOREG,	TLL,
723		0,	RLEFT,
724		"	subl AR,AL\n	sbbl UR,UL\n", },
725
726{ MINUS,	INFL,
727	SHFL,	TDOUBLE,
728	SNAME|SOREG,	TDOUBLE,
729		0,	RLEFT,
730		"	fsubl AR\n", },
731
732{ MINUS,	INFL|FOREFF,
733	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
734	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
735		0,	RLEFT,
736		"	fsubZAp\n", },
737
738/* Simple r/m->reg ops */
739{ OPSIMP,	INAREG|FOREFF,
740	SAREG,			TWORD|TPOINT,
741	SAREG|SNAME|SOREG,	TWORD|TPOINT,
742		0,	RLEFT,
743		"	Ol AR,AL\n", },
744
745{ OPSIMP,	INAREG|FOREFF,
746	SHINT,		TSHORT|TUSHORT,
747	SHINT|SNAME|SOREG,	TSHORT|TUSHORT,
748		0,	RLEFT,
749		"	Ow AR,AL\n", },
750
751{ OPSIMP,	INCH|FOREFF,
752	SHCH,		TCHAR|TUCHAR,
753	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
754		0,	RLEFT,
755		"	Ob AR,AL\n", },
756
757{ OPSIMP,	INAREG|FOREFF,
758	SAREG,	TWORD|TPOINT,
759	SCON,	TWORD|TPOINT,
760		0,	RLEFT,
761		"	Ol AR,AL\n", },
762
763{ OPSIMP,	INAREG|FOREFF,
764	SHINT|SNAME|SOREG,	TSHORT|TUSHORT,
765	SCON,	TANY,
766		0,	RLEFT,
767		"	Ow AR,AL\n", },
768
769{ OPSIMP,	INCH|FOREFF,
770	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
771	SCON,	TANY,
772		0,	RLEFT,
773		"	Ob AR,AL\n", },
774
775{ OPSIMP,	INLL|FOREFF,
776	SHLL,	TLL,
777	SHLL|SNAME|SOREG,	TLL,
778		0,	RLEFT,
779		"	Ol AR,AL\n	Ol UR,UL\n", },
780
781
782/*
783 * The next rules handle all shift operators.
784 */
785/* (u)longlong left shift is emulated */
786{ LS,	INCREG,
787	SCREG|SNAME|SOREG|SCON, TLL,
788	SAREG|SNAME|SOREG|SCON, TINT, /* will be int */
789		NSPECIAL|NCREG|NCSL|NCSR,	RESC1,
790		"ZO", },
791
792{ LS,	INAREG|FOREFF,
793	SAREG|SNAME|SOREG,	TWORD,
794	SHCH,		TCHAR|TUCHAR,
795		NSPECIAL,	RLEFT,
796		"	sall AR,AL\n", },
797
798{ LS,	INAREG|FOREFF,
799	SAREG,	TWORD,
800	SCON,	TANY,
801		0,	RLEFT,
802		"	sall AR,AL\n", },
803
804{ LS,	INAREG|FOREFF,
805	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
806	SHCH,			TCHAR|TUCHAR,
807		NSPECIAL,	RLEFT,
808		"	shlw AR,AL\n", },
809
810{ LS,	INAREG|FOREFF,
811	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
812	SCON,	TANY,
813		0,	RLEFT,
814		"	shlw AR,AL\n", },
815
816{ LS,	INCH|FOREFF,
817	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
818	SHCH,			TCHAR|TUCHAR,
819		NSPECIAL,	RLEFT,
820		"	salb AR,AL\n", },
821
822{ LS,	INCH|FOREFF,
823	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
824	SCON,			TANY,
825		0,	RLEFT,
826		"	salb AR,AL\n", },
827
828/* (u)longlong right shift is emulated */
829{ RS,	INCREG,
830	SCREG|SNAME|SOREG|SCON, TLL,
831	SAREG|SNAME|SOREG|SCON, TINT, /* will be int */
832		NSPECIAL|NCREG|NCSL|NCSR,	RESC1,
833		"ZO", },
834
835{ RS,	INAREG|FOREFF,
836	SAREG|SNAME|SOREG,	TSWORD,
837	SHCH,			TCHAR|TUCHAR,
838		NSPECIAL,	RLEFT,
839		"	sarl AR,AL\n", },
840
841{ RS,	INAREG|FOREFF,
842	SAREG|SNAME|SOREG,	TSWORD,
843	SCON,			TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT,
844		0,		RLEFT,
845		"	sarl AR,AL\n", },
846
847{ RS,	INAREG|FOREFF,
848	SAREG|SNAME|SOREG,	TUWORD,
849	SHCH,			TCHAR|TUCHAR,
850		NSPECIAL,	RLEFT,
851		"	shrl AR,AL\n", },
852
853{ RS,	INAREG|FOREFF,
854	SAREG|SNAME|SOREG,	TUWORD,
855	SCON,			TWORD|TCHAR|TUCHAR|TSHORT|TUSHORT,
856		0,		RLEFT,
857		"	shrl AR,AL\n", },
858
859{ RS,	INAREG|FOREFF,
860	SAREG|SNAME|SOREG,	TSHORT,
861	SHCH,			TCHAR|TUCHAR,
862		NSPECIAL,	RLEFT,
863		"	sarw AR,AL\n", },
864
865{ RS,	INAREG|FOREFF,
866	SAREG|SNAME|SOREG,	TSHORT,
867	SCON,			TANY,
868		0,		RLEFT,
869		"	sarw AR,AL\n", },
870
871{ RS,	INAREG|FOREFF,
872	SAREG|SNAME|SOREG,	TUSHORT,
873	SHCH,			TCHAR|TUCHAR,
874		NSPECIAL,	RLEFT,
875		"	shrw AR,AL\n", },
876
877{ RS,	INAREG|FOREFF,
878	SAREG|SNAME|SOREG,	TUSHORT,
879	SCON,			TANY,
880		0,		RLEFT,
881		"	shrw AR,AL\n", },
882
883{ RS,	INCH|FOREFF,
884	SHCH|SNAME|SOREG,	TCHAR,
885	SHCH,			TCHAR|TUCHAR,
886		NSPECIAL,	RLEFT,
887		"	sarb AR,AL\n", },
888
889{ RS,	INCH|FOREFF,
890	SHCH|SNAME|SOREG,	TCHAR,
891	SCON,			TANY,
892		0,		RLEFT,
893		"	sarb AR,AL\n", },
894
895{ RS,	INCH|FOREFF,
896	SHCH|SNAME|SOREG,	TUCHAR,
897	SHCH,			TCHAR|TUCHAR,
898		NSPECIAL,	RLEFT,
899		"	shrb AR,AL\n", },
900
901{ RS,	INCH|FOREFF,
902	SHCH|SNAME|SOREG,	TUCHAR,
903	SCON,			TANY,
904		0,		RLEFT,
905		"	shrb AR,AL\n", },
906
907/*
908 * The next rules takes care of assignments. "=".
909 */
910{ ASSIGN,	FOREFF,
911	SHLL|SNAME|SOREG,	TLL,
912	SCON,		TANY,
913		0,	0,
914		"	movl AR,AL\n	movl UR,UL\n", },
915
916{ ASSIGN,	FOREFF|INLL,
917	SHLL,		TLL,
918	SCON,		TANY,
919		0,	RDEST,
920		"	movl AR,AL\n	movl UR,UL\n", },
921
922{ ASSIGN,	FOREFF,
923	SAREG|SNAME|SOREG,	TWORD|TPOINT,
924	SCON,		TANY,
925		0,	0,
926		"	movl AR,AL\n", },
927
928{ ASSIGN,	FOREFF|INAREG,
929	SAREG,	TWORD|TPOINT,
930	SCON,		TANY,
931		0,	RDEST,
932		"	movl AR,AL\n", },
933
934{ ASSIGN,	FOREFF,
935	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
936	SCON,		TANY,
937		0,	0,
938		"	movw AR,AL\n", },
939
940{ ASSIGN,	FOREFF|INAREG,
941	SAREG,	TSHORT|TUSHORT,
942	SCON,		TANY,
943		0,	RDEST,
944		"	movw AR,AL\n", },
945
946{ ASSIGN,	FOREFF,
947	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
948	SCON,		TANY,
949		0,	0,
950		"	movb AR,AL\n", },
951
952{ ASSIGN,	FOREFF|INCH,
953	SHCH,		TCHAR|TUCHAR,
954	SCON,		TANY,
955		0,	RDEST,
956		"	movb AR,AL\n", },
957
958{ ASSIGN,	FOREFF|INLL,
959	SHLL|SNAME|SOREG,	TLL,
960	SHLL,			TLL,
961		0,	RDEST,
962		"	movl AR,AL\n	movl UR,UL\n", },
963
964{ ASSIGN,	FOREFF|INAREG,
965	SAREG|SNAME|SOREG,	TWORD|TPOINT,
966	SAREG,		TWORD|TPOINT,
967		0,	RDEST,
968		"	movl AR,AL\n", },
969
970{ ASSIGN,	FOREFF|INAREG,
971	SAREG,			TWORD|TPOINT,
972	SAREG|SNAME|SOREG,	TWORD|TPOINT,
973		0,	RDEST,
974		"	movl AR,AL\n", },
975
976{ ASSIGN,	FOREFF|INAREG,
977	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
978	SAREG,		TSHORT|TUSHORT,
979		0,	RDEST,
980		"	movw AR,AL\n", },
981
982{ ASSIGN,	FOREFF|INCH,
983	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
984	SHCH,		TCHAR|TUCHAR|TWORD,
985		0,	RDEST,
986		"	movb AR,AL\n", },
987
988{ ASSIGN,	FOREFF|INAREG,
989	SFLD,		TANY,
990	SAREG,	TANY,
991		NAREG,	RDEST,
992		"ZE", },
993
994{ ASSIGN,	FOREFF,
995	SFLD,		TANY,
996	SAREG|SNAME|SOREG|SCON,	TANY,
997		NAREG,	0,
998		"ZE", },
999
1000{ ASSIGN,	INDREG|FOREFF,
1001	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1002	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1003		0,	RDEST,
1004		"", }, /* This will always be in the correct register */
1005
1006/* order of table entries is very important here! */
1007{ ASSIGN,	INFL,
1008	SNAME|SOREG,	TLDOUBLE,
1009	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1010		0,	RDEST,
1011		"	fstt AL\n", },
1012
1013{ ASSIGN,	FOREFF,
1014	SNAME|SOREG,	TLDOUBLE,
1015	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1016		0,	0,
1017		"	fstpt AL\n", },
1018
1019{ ASSIGN,	INFL,
1020	SNAME|SOREG,	TDOUBLE,
1021	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1022		0,	RDEST,
1023		"	fstl AL\n", },
1024
1025{ ASSIGN,	FOREFF,
1026	SNAME|SOREG,	TDOUBLE,
1027	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1028		0,	0,
1029		"	fstpl AL\n", },
1030
1031{ ASSIGN,	INFL,
1032	SNAME|SOREG,	TFLOAT,
1033	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1034		0,	RDEST,
1035		"	fsts AL\n", },
1036
1037{ ASSIGN,	FOREFF,
1038	SNAME|SOREG,	TFLOAT,
1039	SHFL,	TFLOAT|TDOUBLE|TLDOUBLE,
1040		0,	0,
1041		"	fstps AL\n", },
1042/* end very important order */
1043
1044{ ASSIGN,	INFL|FOREFF,
1045	SHFL,		TLDOUBLE,
1046	SHFL|SOREG|SNAME,	TLDOUBLE,
1047		0,	RDEST,
1048		"	fldt AR\n", },
1049
1050{ ASSIGN,	INFL|FOREFF,
1051	SHFL,		TDOUBLE,
1052	SHFL|SOREG|SNAME,	TDOUBLE,
1053		0,	RDEST,
1054		"	fldl AR\n", },
1055
1056{ ASSIGN,	INFL|FOREFF,
1057	SHFL,		TFLOAT,
1058	SHFL|SOREG|SNAME,	TFLOAT,
1059		0,	RDEST,
1060		"	flds AR\n", },
1061
1062/* Do not generate memcpy if return from funcall */
1063#if 0
1064{ STASG,	INAREG|FOREFF,
1065	SOREG|SNAME|SAREG,	TPTRTO|TSTRUCT,
1066	SFUNCALL,	TPTRTO|TSTRUCT,
1067		0,	RRIGHT,
1068		"", },
1069#endif
1070
1071{ STASG,	INAREG|FOREFF,
1072	SOREG|SNAME,	TANY,
1073	SAREG|SOREG|SNAME,	TPTRTO|TANY,
1074		NSPECIAL,	RRIGHT,
1075		"ZQ", },
1076
1077/*
1078 * DIV/MOD/MUL
1079 */
1080/* long long div is emulated */
1081{ DIV,	INCREG,
1082	SCREG|SNAME|SOREG|SCON, TLL,
1083	SCREG|SNAME|SOREG|SCON, TLL,
1084		NSPECIAL|NCREG|NCSL|NCSR,	RESC1,
1085		"ZO", },
1086
1087{ DIV,	INAREG,
1088	SAREG,			TSWORD,
1089	SAREG|SNAME|SOREG,	TWORD,
1090		NSPECIAL,	RDEST,
1091		"	cltd\n	idivl AR\n", },
1092
1093{ DIV,	INAREG,
1094	SAREG,			TUWORD|TPOINT,
1095	SAREG|SNAME|SOREG,	TUWORD|TPOINT,
1096		NSPECIAL,	RDEST,
1097		"	xorl %edx,%edx\n	divl AR\n", },
1098
1099{ DIV,	INAREG,
1100	SAREG,			TUSHORT,
1101	SAREG|SNAME|SOREG,	TUSHORT,
1102		NSPECIAL,	RDEST,
1103		"	xorl %edx,%edx\n	divw AR\n", },
1104
1105{ DIV,	INCH,
1106	SHCH,			TUCHAR,
1107	SHCH|SNAME|SOREG,	TUCHAR,
1108		NSPECIAL,	RDEST,
1109		"	xorb %ah,%ah\n	divb AR\n", },
1110
1111{ DIV,	INFL,
1112	SHFL,		TDOUBLE,
1113	SNAME|SOREG,	TDOUBLE,
1114		0,	RLEFT,
1115		"	fdivl AR\n", },
1116
1117{ DIV,	INFL,
1118	SHFL,		TLDOUBLE|TDOUBLE|TFLOAT,
1119	SHFL,		TLDOUBLE|TDOUBLE|TFLOAT,
1120		0,	RLEFT,
1121		"	fdivZAp\n", },
1122
1123/* (u)longlong mod is emulated */
1124{ MOD,	INCREG,
1125	SCREG|SNAME|SOREG|SCON, TLL,
1126	SCREG|SNAME|SOREG|SCON, TLL,
1127		NSPECIAL|NCREG|NCSL|NCSR,	RESC1,
1128		"ZO", },
1129
1130{ MOD,	INAREG,
1131	SAREG,			TSWORD,
1132	SAREG|SNAME|SOREG,	TSWORD,
1133		NAREG|NSPECIAL,	RESC1,
1134		"	cltd\n	idivl AR\n", },
1135
1136{ MOD,	INAREG,
1137	SAREG,			TUWORD|TPOINT,
1138	SAREG|SNAME|SOREG,	TUWORD|TPOINT,
1139		NAREG|NSPECIAL,	RESC1,
1140		"	xorl %edx,%edx\n	divl AR\n", },
1141
1142{ MOD,	INAREG,
1143	SAREG,			TUSHORT,
1144	SAREG|SNAME|SOREG,	TUSHORT,
1145		NAREG|NSPECIAL,	RESC1,
1146		"	xorl %edx,%edx\n	divw AR\n", },
1147
1148{ MOD,	INCH,
1149	SHCH,			TUCHAR,
1150	SHCH|SNAME|SOREG,	TUCHAR,
1151		NBREG|NSPECIAL,	RESC1,
1152		"	xorb %ah,%ah\n	divb AR\n", },
1153
1154/* (u)longlong mul is emulated */
1155{ MUL,	INCREG,
1156	SCREG|SNAME|SOREG|SCON, TLL,
1157	SCREG|SNAME|SOREG|SCON, TLL,
1158		NSPECIAL|NCREG|NCSL|NCSR,	RESC1,
1159		"ZO", },
1160
1161{ MUL,	INAREG,
1162	SAREG,				TWORD|TPOINT,
1163	SAREG|SNAME|SOREG|SCON,		TWORD|TPOINT,
1164		0,	RLEFT,
1165		"	imull AR,AL\n", },
1166
1167{ MUL,	INAREG,
1168	SAREG,			TSHORT|TUSHORT,
1169	SAREG|SNAME|SOREG,	TSHORT|TUSHORT,
1170		0,	RLEFT,
1171		"	imulw AR,AL\n", },
1172
1173{ MUL,	INCH,
1174	SHCH,			TCHAR|TUCHAR,
1175	SHCH|SNAME|SOREG,	TCHAR|TUCHAR,
1176		NSPECIAL,	RDEST,
1177		"	imulb AR\n", },
1178
1179{ MUL,	INFL,
1180	SHFL,		TDOUBLE,
1181	SNAME|SOREG,	TDOUBLE,
1182		0,	RLEFT,
1183		"	fmull AR\n", },
1184
1185{ MUL,	INFL,
1186	SHFL,		TLDOUBLE|TDOUBLE|TFLOAT,
1187	SHFL,		TLDOUBLE|TDOUBLE|TFLOAT,
1188		0,	RLEFT,
1189		"	fmulp\n", },
1190
1191/*
1192 * Indirection operators.
1193 */
1194{ UMUL,	INLL,
1195	SANY,	TANY,
1196	SOREG,	TLL,
1197		NCREG|NCSL,	RESC1,
1198		"	movl UL,U1\n	movl AL,A1\n", },
1199
1200{ UMUL,	INAREG,
1201	SANY,	TPOINT|TWORD,
1202	SOREG,	TPOINT|TWORD,
1203		NAREG|NASL,	RESC1,
1204		"	movl AL,A1\n", },
1205
1206{ UMUL,	INCH,
1207	SANY,	TANY,
1208	SOREG,	TCHAR|TUCHAR,
1209		NBREG|NBSL,	RESC1,
1210		"	movb AL,A1\n", },
1211
1212{ UMUL,	INAREG,
1213	SANY,	TANY,
1214	SOREG,	TSHORT|TUSHORT,
1215		NAREG|NASL,	RESC1,
1216		"	movw AL,A1\n", },
1217
1218{ UMUL,	INFL,
1219	SANY,	TANY,
1220	SOREG,	TLDOUBLE,
1221		NDREG|NDSL,	RESC1,
1222		"	fldt AL\n", },
1223
1224{ UMUL,	INFL,
1225	SANY,	TANY,
1226	SOREG,	TDOUBLE,
1227		NDREG|NDSL,	RESC1,
1228		"	fldl AL\n", },
1229
1230{ UMUL,	INFL,
1231	SANY,	TANY,
1232	SOREG,	TFLOAT,
1233		NDREG|NDSL,	RESC1,
1234		"	flds AL\n", },
1235
1236/*
1237 * Logical/branching operators
1238 */
1239
1240/* Comparisions, take care of everything */
1241{ OPLOG,	FORCC,
1242	SHLL|SOREG|SNAME,	TLL,
1243	SHLL,			TLL,
1244		0,	0,
1245		"ZD", },
1246
1247{ OPLOG,	FORCC,
1248	SAREG|SOREG|SNAME,	TWORD|TPOINT,
1249	SCON|SAREG,	TWORD|TPOINT,
1250		0, 	RESCC,
1251		"	cmpl AR,AL\n", },
1252
1253{ OPLOG,	FORCC,
1254	SCON|SAREG,	TWORD|TPOINT,
1255	SAREG|SOREG|SNAME,	TWORD|TPOINT,
1256		0, 	RESCC,
1257		"	cmpl AR,AL\n", },
1258
1259{ OPLOG,	FORCC,
1260	SAREG|SOREG|SNAME,	TSHORT|TUSHORT,
1261	SCON|SAREG,	TANY,
1262		0, 	RESCC,
1263		"	cmpw AR,AL\n", },
1264
1265{ OPLOG,	FORCC,
1266	SBREG|SOREG|SNAME,	TCHAR|TUCHAR,
1267	SCON|SBREG,	TANY,
1268		0, 	RESCC,
1269		"	cmpb AR,AL\n", },
1270
1271{ OPLOG,	FORCC,
1272	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
1273	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
1274		NSPECIAL, 	0,
1275		"ZG", },
1276
1277{ OPLOG,	FORCC,
1278	SOREG|SNAME,	TDOUBLE|TFLOAT,
1279	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
1280		NSPECIAL, 	0,
1281		"ZG", },
1282
1283#if 0
1284/* Ppro and later only */
1285{ OPLOG,	FORCC,
1286	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
1287	SDREG,	TLDOUBLE|TDOUBLE|TFLOAT,
1288		0, 	RESCC,
1289		"ZA	fucomip %st,%st(1)\n", },
1290#endif
1291
1292{ OPLOG,	FORCC,
1293	SANY,	TANY,
1294	SANY,	TANY,
1295		REWRITE,	0,
1296		"diediedie!", },
1297
1298/* AND/OR/ER/NOT */
1299{ AND,	INAREG|FOREFF,
1300	SAREG|SOREG|SNAME,	TWORD,
1301	SCON|SAREG,		TWORD,
1302		0,	RLEFT,
1303		"	andl AR,AL\n", },
1304
1305{ AND,	INCREG|FOREFF,
1306	SCREG,			TLL,
1307	SCREG|SOREG|SNAME,	TLL,
1308		0,	RLEFT,
1309		"	andl AR,AL\n	andl UR,UL\n", },
1310
1311{ AND,	INAREG|FOREFF,
1312	SAREG,			TWORD,
1313	SAREG|SOREG|SNAME,	TWORD,
1314		0,	RLEFT,
1315		"	andl AR,AL\n", },
1316
1317{ AND,	INAREG|FOREFF,
1318	SAREG|SOREG|SNAME,	TSHORT|TUSHORT,
1319	SCON|SAREG,		TSHORT|TUSHORT,
1320		0,	RLEFT,
1321		"	andw AR,AL\n", },
1322
1323{ AND,	INAREG|FOREFF,
1324	SAREG,			TSHORT|TUSHORT,
1325	SAREG|SOREG|SNAME,	TSHORT|TUSHORT,
1326		0,	RLEFT,
1327		"	andw AR,AL\n", },
1328
1329{ AND,	INBREG|FOREFF,
1330	SBREG|SOREG|SNAME,	TCHAR|TUCHAR,
1331	SCON|SBREG,		TCHAR|TUCHAR,
1332		0,	RLEFT,
1333		"	andb AR,AL\n", },
1334
1335{ AND,	INBREG|FOREFF,
1336	SBREG,			TCHAR|TUCHAR,
1337	SBREG|SOREG|SNAME,	TCHAR|TUCHAR,
1338		0,	RLEFT,
1339		"	andb AR,AL\n", },
1340/* AND/OR/ER/NOT */
1341
1342/*
1343 * Jumps.
1344 */
1345{ GOTO, 	FOREFF,
1346	SCON,	TANY,
1347	SANY,	TANY,
1348		0,	RNOP,
1349		"	jmp LL\n", },
1350
1351#ifdef GCC_COMPAT
1352{ GOTO, 	FOREFF,
1353	SAREG,	TANY,
1354	SANY,	TANY,
1355		0,	RNOP,
1356		"	jmp *AL\n", },
1357#endif
1358
1359/*
1360 * Convert LTYPE to reg.
1361 */
1362{ OPLTYPE,	INLL,
1363	SANY,	TANY,
1364	SCREG|SCON|SOREG|SNAME,	TLL,
1365		NCREG,	RESC1,
1366		"	movl UL,U1\n	movl AL,A1\n", },
1367
1368{ OPLTYPE,	INAREG,
1369	SANY,	TANY,
1370	SAREG|SCON|SOREG|SNAME,	TWORD|TPOINT,
1371		NAREG|NASL,	RESC1,
1372		"	movl AL,A1\n", },
1373
1374{ OPLTYPE,	INBREG,
1375	SANY,	TANY,
1376	SBREG|SOREG|SNAME|SCON,	TCHAR|TUCHAR,
1377		NBREG,	RESC1,
1378		"	movb AL,A1\n", },
1379
1380{ OPLTYPE,	INAREG,
1381	SANY,	TANY,
1382	SAREG|SOREG|SNAME|SCON,	TSHORT|TUSHORT,
1383		NAREG,	RESC1,
1384		"	movw AL,A1\n", },
1385
1386{ OPLTYPE,	INDREG,
1387	SANY,		TLDOUBLE,
1388	SOREG|SNAME,	TLDOUBLE,
1389		NDREG,	RESC1,
1390		"	fldt AL\n", },
1391
1392{ OPLTYPE,	INDREG,
1393	SANY,		TDOUBLE,
1394	SOREG|SNAME,	TDOUBLE,
1395		NDREG,	RESC1,
1396		"	fldl AL\n", },
1397
1398{ OPLTYPE,	INDREG,
1399	SANY,		TFLOAT,
1400	SOREG|SNAME,	TFLOAT,
1401		NDREG,	RESC1,
1402		"	flds AL\n", },
1403
1404/* Only used in ?: constructs. The stack already contains correct value */
1405{ OPLTYPE,	INDREG,
1406	SANY,	TFLOAT|TDOUBLE|TLDOUBLE,
1407	SDREG,	TFLOAT|TDOUBLE|TLDOUBLE,
1408		NDREG,	RESC1,
1409		"", },
1410
1411/*
1412 * Negate a word.
1413 */
1414
1415{ UMINUS,	INCREG|FOREFF,
1416	SCREG,	TLL,
1417	SCREG,	TLL,
1418		0,	RLEFT,
1419		"	negl AL\n	adcl $0,UL\n	negl UL\n", },
1420
1421{ UMINUS,	INAREG|FOREFF,
1422	SAREG,	TWORD|TPOINT,
1423	SAREG,	TWORD|TPOINT,
1424		0,	RLEFT,
1425		"	negl AL\n", },
1426
1427{ UMINUS,	INAREG|FOREFF,
1428	SAREG,	TSHORT|TUSHORT,
1429	SAREG,	TSHORT|TUSHORT,
1430		0,	RLEFT,
1431		"	negw AL\n", },
1432
1433{ UMINUS,	INBREG|FOREFF,
1434	SBREG,	TCHAR|TUCHAR,
1435	SBREG,	TCHAR|TUCHAR,
1436		0,	RLEFT,
1437		"	negb AL\n", },
1438
1439{ UMINUS,	INFL|FOREFF,
1440	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
1441	SHFL,	TLDOUBLE|TDOUBLE|TFLOAT,
1442		0,	RLEFT,
1443		"	fchs\n", },
1444
1445{ COMPL,	INCREG,
1446	SCREG,	TLL,
1447	SANY,	TANY,
1448		0,	RLEFT,
1449		"	notl AL\n	notl UL\n", },
1450
1451{ COMPL,	INAREG,
1452	SAREG,	TWORD,
1453	SANY,	TANY,
1454		0,	RLEFT,
1455		"	notl AL\n", },
1456
1457{ COMPL,	INAREG,
1458	SAREG,	TSHORT|TUSHORT,
1459	SANY,	TANY,
1460		0,	RLEFT,
1461		"	notw AL\n", },
1462
1463{ COMPL,	INBREG,
1464	SBREG,	TCHAR|TUCHAR,
1465	SANY,	TANY,
1466		0,	RLEFT,
1467		"	notb AL\n", },
1468
1469/*
1470 * Arguments to functions.
1471 */
1472{ FUNARG,	FOREFF,
1473	SCON|SCREG|SNAME|SOREG,	TLL,
1474	SANY,	TLL,
1475		0,	RNULL,
1476		"	pushl UL\n	pushl AL\n", },
1477#endif
1478
1479{ FUNARG,	FOREFF,
1480	SAREG|SBREG,	TCHAR|TUCHAR|TWORD|TPOINT,
1481	SANY,		TCHAR|TUCHAR|TWORD|TPOINT,
1482		0,	RNULL,
1483		"	sta AL,@sp\n", },
1484
1485#if 0
1486{ FUNARG,	FOREFF,
1487	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1488	SANY,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1489		0,	RNULL,
1490		"	pushl AL\n", },
1491
1492{ FUNARG,	FOREFF,
1493	SAREG|SNAME|SOREG,	TSHORT,
1494	SANY,	TSHORT,
1495		NAREG,	0,
1496		"	movswl AL,ZN\n	pushl ZN\n", },
1497
1498{ FUNARG,	FOREFF,
1499	SAREG|SNAME|SOREG,	TUSHORT,
1500	SANY,	TUSHORT,
1501		NAREG,	0,
1502		"	movzwl AL,ZN\n	pushl ZN\n", },
1503
1504{ FUNARG,	FOREFF,
1505	SHCH|SNAME|SOREG,	TCHAR,
1506	SANY,			TCHAR,
1507		NAREG,	0,
1508		"	movsbl AL,A1\n	pushl A1\n", },
1509
1510{ FUNARG,	FOREFF,
1511	SHCH|SNAME|SOREG,	TUCHAR,
1512	SANY,	TUCHAR,
1513		NAREG,	0,
1514		"	movzbl AL,A1\n	pushl A1\n", },
1515
1516{ FUNARG,	FOREFF,
1517	SNAME|SOREG,	TDOUBLE,
1518	SANY,	TDOUBLE,
1519		0,	0,
1520		"	pushl UL\n	pushl AL\n", },
1521
1522{ FUNARG,	FOREFF,
1523	SDREG,	TDOUBLE,
1524	SANY,		TDOUBLE,
1525		0,	0,
1526		"	subl $8,%esp\n	fstpl (%esp)\n", },
1527
1528{ FUNARG,	FOREFF,
1529	SNAME|SOREG,	TFLOAT,
1530	SANY,		TFLOAT,
1531		0,	0,
1532		"	pushl AL\n", },
1533
1534{ FUNARG,	FOREFF,
1535	SDREG,	TFLOAT,
1536	SANY,		TFLOAT,
1537		0,	0,
1538		"	subl $4,%esp\n	fstps (%esp)\n", },
1539
1540{ FUNARG,	FOREFF,
1541	SDREG,	TLDOUBLE,
1542	SANY,		TLDOUBLE,
1543		0,	0,
1544		"	subl $12,%esp\n	fstpt (%esp)\n", },
1545
1546{ STARG,	FOREFF,
1547	SAREG|SOREG|SNAME|SCON,	TANY,
1548	SANY,	TSTRUCT,
1549		NSPECIAL|NAREG,	0,
1550		"ZF", },
1551
1552#endif
1553
1554# define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1555
1556{ UMUL, DF( UMUL ), },
1557
1558{ ASSIGN, DF(ASSIGN), },
1559
1560{ STASG, DF(STASG), },
1561
1562{ FLD, DF(FLD), },
1563
1564{ OPLEAF, DF(NAME), },
1565
1566{ OPUNARY, DF(UMINUS), },
1567
1568{ OPANY, DF(BITYPE), },
1569
1570{ FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" },
1571};
1572
1573int tablesize = sizeof(table)/sizeof(table[0]);
1574