1/*	Id: table.c,v 1.18 2016/01/05 12:23:22 ragge Exp 	*/
2/*	$NetBSD: table.c,v 1.1.1.4 2016/02/09 20:28:23 plunky Exp $	*/
3/*
4 * Copyright (c) 2003 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 * MIPS port by Jan Enoksson (janeno-1@student.ltu.se) and
32 * Simon Olsson (simols-1@student.ltu.se) 2005.
33 *
34 * It appears that the target machine was big endian.  The original
35 * code contained many endian aspects which are now handled in
36 * machine-independent code.
37 *
38 * On MIPS, the assembler does an amazing amount of work for us.
39 * We don't have to worry about PIC, nor about finding the address
40 * of SNAMES.  Whenever possible, we defer the work to the assembler.
41 */
42
43#include "pass2.h"
44
45#define TUWORD TUNSIGNED|TULONG
46#define TSWORD TINT|TLONG
47#define TWORD TUWORD|TSWORD
48
49struct optab table[] = {
50/* First entry must be an empty entry */
51{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
52
53/* PCONVs are usually not necessary */
54{ PCONV,	INAREG,
55	SAREG,	TWORD|TPOINT,
56	SAREG,	TWORD|TPOINT,
57		0,	RLEFT,
58		"	# convert between word and pointer", },
59
60/*
61 * Conversions of integral types (register-register)
62 *
63 * For each deunsigned type, they look something like this:
64 *
65 * signed -> bigger signed      - nothing to do
66 * unsigned -> bigger           - nothing to do
67 *
68 * signed -> bigger unsigned    - clear the top bits (of source type)
69 * signed -> smaller signed     - sign-extend the bits (to dest type)
70 * signed -> smaller unsigned   - clear the top bits (of dest type)
71 * unsigned -> smaller signed   - sign-extend top bits (to dest type)
72 * unsigned -> smaller unsigned - clear the top bits (of dest type)
73 *
74 */
75
76/* convert between int and ptr */
77{ SCONV,	INAREG,
78	SAREG,	TPOINT|TWORD,
79	SAREG,	TWORD|TPOINT,
80		0,	RLEFT,
81		"", },
82
83/* convert between LL and uLL */
84{ SCONV,	INBREG,
85	SBREG,	TLONGLONG|TULONGLONG,
86	SBREG,	TULONGLONG|TLONGLONG,
87		0,	RLEFT,
88		"", },
89
90/* (u)char to (u)char/(u)short/(u)int */
91{ SCONV,	INAREG,
92	SAREG,	TCHAR|TUCHAR,
93	SAREG,	TCHAR|TUCHAR|TWORD|TSHORT|TUSHORT,
94		0,	RLEFT,
95		"", },
96
97/* (u)short to (u)int */
98{ SCONV,	INAREG,
99	SAREG,	TSHORT|TUSHORT,
100	SAREG,	TWORD|TSHORT|TUSHORT,
101		0,	RLEFT,
102		"", },
103
104/* (u)int to (u)int */
105{ SCONV,	INAREG,
106	SAREG,	TWORD,
107	SAREG,	TWORD,
108		0,	RLEFT,
109		"", },
110
111/* (u)int/(u)short to char */
112{ SCONV,	INAREG,
113	SAREG,	TWORD|TSHORT|TUSHORT,
114	SAREG,	TCHAR,
115		NAREG|NASL,	RESC1,
116		"	sll A1,AL,24\n"
117		"	sra A1,A1,24\n", },
118
119/* (u)int/(u)short to uchar */
120{ SCONV,	INAREG,
121	SAREG,	TWORD|TSHORT|TUSHORT,
122	SAREG,	TUCHAR,
123		NAREG|NASL,	RESC1,
124		"	andi A1,AL,255\n", },
125
126/* (u)int to short */
127{ SCONV,	INAREG,
128	SAREG,	TWORD,
129	SAREG,	TSHORT,
130		NAREG|NASL,	RESC1,
131		"	sll A1,AL,16\n"
132		"	sra A1,A1,16\n", },
133
134/* (u)int to ushort */
135{ SCONV,	INAREG,
136	SAREG,	TWORD,
137	SAREG,	TUSHORT,
138		NAREG|NASL,	RESC1,
139		"	andi A1,AL,65535\n", },
140
141/* longlong casts below */
142{ SCONV,	INBREG,
143	SAREG,	TSWORD|TSHORT|TCHAR,
144	SBREG,	TLONGLONG,
145		NBREG,	RESC1,
146		"	move A1,AL	# convert int/short/char to longlong\n"
147		"	sra U1,AL,31\n", },
148
149{ SCONV,	INBREG,
150	SAREG,	TSWORD|TSHORT|TCHAR,
151	SBREG,	TULONGLONG,
152		NBREG,	RESC1,
153		"	move A1,AL	# convert int/short/char to ulonglong\n"
154		"	move U1,$zero\n", },
155
156{ SCONV,	INBREG,
157	SAREG,	TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
158	SBREG,	TLONGLONG|TULONGLONG,
159		NBREG,	RESC1,
160		"	move A1,AL	# convert (u)int/(u)short/(u)char to ulonglong\n"
161		"	move U1,$zero\n", },
162
163{ SCONV,	INAREG,
164	SBREG,	TLONGLONG|TULONGLONG,
165	SAREG,	TWORD,
166		NAREG,	RESC1,
167		"	move A1,AL	# convert (u)longlong to int\n", },
168
169{ SCONV,	INAREG,
170	SBREG,	TLONGLONG|TULONGLONG,
171	SAREG,	TSHORT,
172		NAREG,	RESC1,
173		"	sll A1,AL,16	# convert (u)longlong to short\n"
174		"	sra A1,A1,16\n", },
175
176{ SCONV,	INAREG,
177	SBREG,	TLONGLONG|TULONGLONG,
178	SAREG,	TCHAR,
179		NAREG,	RESC1,
180		"	sll A1,AL,24	# convert (u)longlong to char\n"
181		"	sra A1,A1,24\n", },
182
183{ SCONV,	INAREG,
184	SBREG,	TLONGLONG|TULONGLONG,
185	SAREG,	TUSHORT,
186		NAREG,	RESC1,
187		"	andi A1,AL,65535	# convert (u)longlong to ushort\n", },
188
189{ SCONV,	INAREG,
190	SBREG,	TLONGLONG|TULONGLONG,
191	SAREG,	TUCHAR,
192		NAREG,	RESC1,
193		"	andi A1,AL,255	# convert (u)longlong to uchar\n", },
194
195{ SCONV,	INCREG,
196	SCREG,	TFLOAT,
197	SCREG,	TDOUBLE|TLDOUBLE,
198		NCREG,	RESC1,
199		"	cvt.d.s A1,AL	# convert float to (l)double\n", },
200
201{ SCONV,	INCREG,
202	SCREG,	TDOUBLE|TLDOUBLE,
203	SCREG,	TFLOAT,
204		NCREG,	RESC1,
205		"	cvt.s.d A1,AL	# convert (l)double to float\n", },
206
207{ SCONV,	INCREG,
208	SAREG,	TWORD,
209	SCREG,	TFLOAT,
210		NCREG,	RESC1,
211		"	mtc1 AL,A1	# convert (u)int to float\n"
212		"	nop\n"
213		"	cvt.s.w A1,A1\n", },
214
215{ SCONV,	INCREG,
216	SOREG,	TWORD,
217	SCREG,	TFLOAT,
218		NCREG,	RESC1,
219		"	l.s A1,AL	# convert (u)int to float\n"
220		"	nop\n"
221		"	cvt.s.w A1,A1\n", },
222
223{ SCONV,	INCREG,
224	SAREG,	TWORD,
225	SCREG,	TDOUBLE|TLDOUBLE,
226		NCREG,	RESC1,
227		"	mtc1 AL,A1	# convert (u)int to (l)double\n"
228		"	nop\n"
229		"	cvt.d.w A1,A1\n", },
230
231{ SCONV,	INCREG,
232	SOREG,	TWORD,
233	SCREG,	TDOUBLE|TLDOUBLE,
234		NCREG,	RESC1,
235		"	l.d A1,AL	# convert (u)int to (l)double\n"
236		"	nop\n"
237		"	cvt.d.w A1,A1\n", },
238
239{ SCONV,	INAREG,
240	SCREG,	TFLOAT,
241	SAREG,	TWORD,
242		NCREG|NAREG,	RESC1,
243		"	cvt.w.s A2,AL	# convert float to (u)int\n"
244		"	mfc1 A1,A2\n"
245		"	nop\n", },
246
247{ SCONV,	FOREFF,
248	SCREG,	TFLOAT,
249	SOREG,	TWORD,
250		NCREG,	RDEST,
251		"	cvt.w.s A1,AL	# convert float to (u)int\n"
252		"	s.s A1,AR\n"
253		"	nop\n", },
254
255{ SCONV,	INAREG,
256	SCREG,	TDOUBLE|TLDOUBLE,
257	SAREG,	TWORD,
258		NCREG|NAREG,	RESC1,
259		"	cvt.w.d A2,AL	# convert (l)double to (u)int\n"
260		"	mfc1 A1,A2\n"
261		"	nop\n", },
262
263{ SCONV,	INCREG,
264	SCREG,	TDOUBLE|TLDOUBLE,
265	SCREG,	TDOUBLE|TLDOUBLE,
266		0,	RLEFT,
267		"	# convert between double and ldouble\n", },
268
269{ SCONV,	INCREG,
270	SBREG,	TLONGLONG|TULONGLONG,
271	SCREG,	TFLOAT,
272		NSPECIAL|NCREG,	RESC1,
273		"ZF", },
274
275{ SCONV,	INCREG,
276	SBREG,	TLONGLONG|TULONGLONG,
277	SCREG,	TDOUBLE|TLDOUBLE,
278		NSPECIAL|NCREG,	RESC1,
279		"ZF", },
280
281{ SCONV,	INBREG,
282	SCREG,	TDOUBLE|TLDOUBLE,
283	SBREG,	TLONGLONG|TULONGLONG,
284		NSPECIAL|NBREG,		RESC1,
285		"ZF", },
286
287{ SCONV,	INBREG,
288	SCREG,	TFLOAT,
289	SBREG,	TLONGLONG|TULONGLONG,
290		NSPECIAL|NBREG,		RESC1,
291		"ZF", },
292
293/*
294 * Multiplication and division
295 */
296
297{ MUL,	INAREG,
298	SAREG,	TUWORD|TUSHORT|TUCHAR,
299	SAREG,	TUWORD|TUSHORT|TUCHAR,
300		NAREG|NASR|NASL,	RESC1,
301		"	multu AL,AR	# unsigned multiply\n"
302		"	nop\n"
303		"	nop\n"
304		"	mflo A1\n" },
305
306/* this previous will match on unsigned/unsigned multiplication first */
307{ MUL,	INAREG,
308	SAREG,	TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
309	SAREG,	TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
310		NAREG|NASR|NASL,	RESC1,
311		"	mult AL,AR	# signed multiply\n"
312		"	nop\n"
313		"	nop\n"
314		"	mflo A1\n", },
315
316{ MUL,	INBREG,
317	SBREG,	TLONGLONG|TULONGLONG,
318	SBREG,	TLONGLONG|TULONGLONG,
319		2*NBREG,	RESC1,
320		"	multu AL,AR\n"
321		"	mfhi U1\n"
322		"	mflo A1\n"
323		"	mult AL,UR\n"
324		"	mflo A2\n"
325		"	nop\n"
326		"	nop\n"
327		"	addu A2,U1,A2\n"
328		"	mult UL,AR\n"
329		"	mflo U2\n"
330		"	nop\n"
331		"	nop\n"
332		"	addu U1,A2,U2\n", },
333
334{ MUL,	INCREG,
335	SCREG,	TFLOAT,
336	SCREG,	TFLOAT,
337		NCREG,	RESC1,
338		"	mul.s A1,AL,AR		# floating-point multiply\n", },
339
340{ MUL,	INCREG,
341	SCREG,	TDOUBLE|TLDOUBLE,
342	SCREG,	TDOUBLE|TLDOUBLE,
343		NCREG,	RESC1,
344		"	mul.d	A1,AL,AR	# double-floating-point multiply\n", },
345
346{ DIV,	INAREG,
347	SAREG,	TUWORD|TUSHORT|TUCHAR,
348	SAREG,	TUWORD|TUSHORT|TUCHAR,
349		NAREG|NASR|NASL,	RESC1,
350		"	divu AL,AR	# unsigned division\n"
351		"	mflo A1\n"
352		"	nop\n"
353		"	nop\n", },
354
355/* the previous rule will match unsigned/unsigned first */
356{ DIV,	INAREG,
357	SAREG,	TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
358	SAREG,	TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
359		NAREG|NASR|NASL,	RESC1,
360		"	div AL,AR	# signed division\n"
361		"	mflo A1\n"
362		"	nop\n"
363		"	nop\n", },
364
365{ DIV, INBREG,
366	SBREG,	TLONGLONG|TULONGLONG,
367	SBREG,	TLONGLONG|TULONGLONG,
368		NSPECIAL|NBREG,	RESC1,
369		"ZE", },
370
371{ DIV,	INCREG,
372	SCREG,	TFLOAT,
373	SCREG,	TFLOAT,
374		NCREG,	RESC1,
375		"	div.s A1,AL,AR		# floating-point division\n", },
376
377{ DIV,	INCREG,
378	SCREG,	TDOUBLE|TLDOUBLE,
379	SCREG,	TDOUBLE|TLDOUBLE,
380		NCREG,	RESC1,
381		"	div.d	A1,AL,AR	# double-floating-point division\n", },
382
383{ MOD,  INAREG,
384        SAREG,  TUWORD|TUSHORT|TUCHAR,
385        SAREG,  TUWORD|TUSHORT|TUCHAR,
386                NAREG,  RESC1,
387                "       divu AL,AR	# signed modulo\n"
388		"	mfhi A1\n"
389		"	nop\n"
390		"	nop\n", },
391
392/* the previous rule will match unsigned%unsigned first */
393{ MOD,  INAREG,
394        SAREG,  TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
395        SAREG,  TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
396                NAREG,  RESC1,
397                "	div AL,AR	# signed modulo\n"
398		"	mfhi A1\n"
399		"	nop\n"
400		"	nop\n", },
401
402{ MOD,  INBREG,
403	SBREG,	TLONGLONG|TULONGLONG,
404	SBREG,	TLONGLONG|TULONGLONG,
405                NSPECIAL|NBREG,  RESC1,
406                "ZE", },
407
408/*
409 * Templates for unsigned values needs to come before OPSIMP
410 */
411
412{ PLUS,	INBREG,
413	SBREG,	TULONGLONG|TLONGLONG,
414	SBREG,	TULONGLONG|TLONGLONG,
415		2*NBREG,	RESC1,
416      		"	addu A1,AL,AR	# 64-bit addition\n"
417      		"	sltu A2,A1,AR\n"
418      		"	addu U1,UL,UR\n"
419      		"	addu U1,U1,A2\n", },
420
421{ PLUS,	INAREG,
422	SAREG,	TSWORD|TSHORT|TCHAR,
423	SSCON,	TANY,
424		NAREG|NASL,	RESC1,
425		"	addi A1,AL,AR\n", },
426
427{ PLUS,	INAREG,
428	SAREG,	TUWORD|TPOINT|TUSHORT|TUCHAR,
429	SSCON,	TANY,
430		NAREG|NASL,	RESC1,
431		"	addiu A1,AL,AR\n", },
432
433{ PLUS,	INAREG,
434	SAREG,	TUWORD|TPOINT|TUSHORT|TUCHAR,
435	SAREG,	TUWORD|TUSHORT|TUCHAR,
436		NAREG|NASL,	RESC1,
437      		"	addu A1,AL,AR\n", },
438
439{ PLUS,	INAREG,
440	SAREG,	TSWORD|TSHORT|TCHAR,
441	SAREG,	TSWORD|TSHORT|TCHAR,
442		NAREG|NASL,	RESC1,
443      		"	add A1,AL,AR\n", },
444
445{ PLUS,	INCREG,
446	SCREG,	TFLOAT,
447	SCREG,	TFLOAT,
448		NCREG|NCSL,	RESC1,
449		"	add.s A1,AL,AR\n", },
450
451{ PLUS,	INCREG,
452	SCREG,	TDOUBLE|TLDOUBLE,
453	SCREG,	TDOUBLE|TLDOUBLE,
454		NCREG|NCSL,	RESC1,
455		"	add.d A1,AL,AR\n", },
456
457{ MINUS,	INBREG,
458	SBREG,	TLONGLONG|TULONGLONG,
459	SBREG,	TLONGLONG|TULONGLONG,
460		2*NBREG,	RESC1,
461      		"	sltu A2,AL,AR	# 64-bit subtraction\n"
462      		"	subu A1,AL,AR\n"
463      		"	subu U1,UL,UR\n"
464      		"	subu U1,U1,A2\n", },
465
466{ MINUS,	INAREG,
467	SAREG,	TUWORD|TPOINT|TUSHORT|TUCHAR,
468	SSCON,	TANY,
469		NAREG|NASL,	RESC1,
470		"	subu A1,AL,AR\n", },
471
472{ MINUS,	INAREG,
473	SAREG,	TSWORD|TSHORT|TCHAR,
474	SSCON,	TANY,
475		NAREG|NASL,	RESC1,
476		"	sub A1,AL,AR\n", },
477
478{ MINUS,	INAREG,
479	SAREG,	TSWORD|TSHORT|TCHAR,
480	SAREG,	TSWORD|TSHORT|TCHAR,
481		NAREG|NASL,	RESC1,
482      		"	sub A1,AL,AR\n", },
483
484{ MINUS,	INCREG,
485	SCREG,	TFLOAT,
486	SCREG,	TFLOAT,
487		NCREG|NCSL,	RESC1,
488		"	sub.s A1,AL,AR\n", },
489
490{ MINUS,	INCREG,
491	SCREG,	TDOUBLE|TLDOUBLE,
492	SCREG,	TDOUBLE|TLDOUBLE,
493		NCREG|NCSL,	RESC1,
494		"	sub.d A1,AL,AR\n", },
495
496{ UMINUS,	INAREG,
497	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
498	SANY,	TANY,
499		NAREG|NASL,	RESC1,
500		"	neg A1,AL\n", },
501
502{ UMINUS,	INBREG,
503	SBREG,	TLONGLONG|TULONGLONG,
504	SANY,	TANY,
505		NBREG|NAREG|NBSL,	RESC2,
506		"	subu A1,$zero,AL\n"
507		"	subu U1,$zero,UL\n"
508		"	sltu A2,$zero,A1\n"
509		"	subu U1,U1,A2\n", },
510
511{ UMINUS,	INCREG,
512	SCREG,	TFLOAT,
513	SCREG,	TFLOAT,
514		NCREG|NCSL,	RESC1,
515		"	neg.s A1,AL\n", },
516
517{ UMINUS,	INCREG,
518	SCREG,	TDOUBLE|TLDOUBLE,
519	SCREG,	TDOUBLE|TLDOUBLE,
520		NCREG|NCSL,	RESC1,
521		"	neg.d A1,AL\n", },
522
523/* Simple 'op rd, rs, rt' or 'op rt, rs, imm' operations */
524
525{ OPSIMP,	INBREG,
526	SBREG,	TLONGLONG|TULONGLONG,
527	SBREG,	TLONGLONG|TULONGLONG,
528		NBREG|NBSR|NBSL,	RESC1,
529      		"	O A1,AL,AR\n"
530      		"	O U1,UL,UR\n", },
531
532{ OPSIMP,	INAREG,
533	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
534	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
535		NAREG|NASR|NASL,	RESC1,
536		"	O A1,AL,AR\n", },
537
538{ OPSIMP,	INAREG,
539	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
540	SPCON,	TANY,
541		NAREG|NASL,	RESC1,
542		"	Oi A1,AL,AR\n", },
543
544/*
545 * Shift instructions
546 */
547
548{ RS,	INAREG,
549	SAREG,	TSWORD|TSHORT|TCHAR,
550	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
551		NAREG|NASL,	RESC1,
552		"	sra A1,AL,AR	# shift right by constant\n", },
553
554{ RS,	INAREG,
555	SAREG,	TUWORD|TUSHORT|TUCHAR,
556	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
557		NAREG|NASL,	RESC1,
558		"	srl A1,AL,AR	# shift right by constant\n", },
559
560{ LS,	INAREG,
561	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
562	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
563		NAREG|NASL,	RESC1,
564		"	sll A1,AL,AR	# shift left by constant\n", },
565
566{ RS,	INAREG,
567	SAREG,	TSWORD|TSHORT|TCHAR,
568	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
569		NAREG|NASL,	RESC1,
570		"	srav A1,AL,AR	# shift right by register\n", },
571
572{ RS,	INAREG,
573	SAREG,	TUWORD|TUSHORT|TUCHAR,
574	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
575		NAREG|NASL,	RESC1,
576		"	srlv A1,AL,AR	# shift right by register\n", },
577
578{ LS,	INAREG,
579	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
580	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
581		NAREG|NASL,	RESC1,
582		"	sllv A1,AL,AR	# shift left by register\n", },
583
584{ RS,	INBREG,
585	SBREG,	TLONGLONG|TULONGLONG,
586	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
587		NBREG,	RESC1,
588		"ZO", },
589
590{ LS,	INBREG,
591	SBREG,	TLONGLONG|TULONGLONG,
592	SCON,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
593		NBREG,	RESC1,
594		"ZO", },
595
596{ RS,	INBREG,
597	SBREG,	TLONGLONG|TULONGLONG,
598	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
599		NSPECIAL|NBREG,	RESC1,
600		"ZE", },
601
602{ LS,	INBREG,
603	SBREG,	TLONGLONG|TULONGLONG,
604	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
605		NSPECIAL|NBREG,	RESC1,
606		"ZE", },
607
608/*
609 * Rule for unary one's complement
610 */
611
612{ COMPL,        INAREG,
613        SAREG,  TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
614        SANY,   TANY,
615                NAREG|NASL,   RESC1,
616                "	nor A1,$zero,AL	# complement\n", },
617
618{ COMPL,        INBREG,
619	SBREG,	TLONGLONG|TULONGLONG,
620        SANY,   TANY,
621                NBREG|NBSL,   RESC1,
622                "	nor A1,$zero,AL	# complement\n"
623                "	nor U1,$zero,UL\n", },
624
625/*
626 * The next rules takes care of assignments. "=".
627 */
628
629{ ASSIGN,	FOREFF|INAREG,
630	SOREG|SNAME,	TWORD|TPOINT,
631	SAREG,		TWORD|TPOINT,
632		0,	RDEST,
633		"	sw AR,AL		# store (u)int/(u)long\n"
634		"	nop\n", },
635
636{ ASSIGN,	FOREFF|INAREG,
637	SOREG|SNAME,	TSHORT|TUSHORT,
638	SAREG,		TSHORT|TUSHORT,
639		0,	RDEST,
640        	"	sh AR,AL		# store (u)short\n"
641		"	nop\n", },
642
643{ ASSIGN,	FOREFF|INAREG,
644	SOREG|SNAME,	TCHAR|TUCHAR,
645	SAREG,		TCHAR|TUCHAR,
646		0,	RDEST,
647        	"	sb AR,AL		# store (u)char\n"
648		"	nop\n", },
649
650{ ASSIGN,	FOREFF|INBREG,
651	SOREG|SNAME,	TLONGLONG|TULONGLONG,
652	SBREG,		TLONGLONG|TULONGLONG,
653		0,	RDEST,
654      		"	sw UR,UL		# store (u)longlong\n"
655		"	nop\n"
656      		"	sw AR,AL\n"
657		"	nop\n", },
658
659{ ASSIGN,	FOREFF|INBREG,
660	SBREG,		TLONGLONG|TULONGLONG,
661	SBREG,		TLONGLONG|TULONGLONG,
662		0,	RDEST,
663      		"	move UL,UR		# register move\n"
664      		"	move AL,AR\n", },
665
666{ ASSIGN,	FOREFF|INAREG,
667	SAREG,	TANY,
668	SAREG,	TANY,
669		0,	RDEST,
670        	"	move AL,AR		# register move\n", },
671
672{ ASSIGN,	FOREFF|INCREG,
673	SCREG,	TFLOAT,
674	SCREG,	TFLOAT,
675		0,	RDEST,
676        	"	mov.s AL,AR		# register move\n", },
677
678{ ASSIGN,	FOREFF|INCREG,
679	SCREG,	TDOUBLE|TLDOUBLE,
680	SCREG,	TDOUBLE|TLDOUBLE,
681		0,	RDEST,
682        	"	mov.d AL,AR		# register move\n", },
683
684{ ASSIGN,	FOREFF|INCREG,
685	SNAME|SOREG,	TFLOAT,
686	SCREG,		TFLOAT,
687		0,	RDEST,
688		"	s.s AR,AL		# store floating-point reg to oreg/sname\n"
689		"	nop\n", },
690
691{ ASSIGN,	FOREFF|INCREG,
692	SNAME|SOREG,	TDOUBLE|TLDOUBLE,
693	SCREG,		TDOUBLE|TLDOUBLE,
694		0,	RDEST,
695		"	s.d AR,AL		# store double floating-point reg to oreg/sname\n"
696		"	nop\n", },
697
698{ ASSIGN,	FOREFF|INAREG,
699	SFLD,		TANY,
700	SOREG|SNAME,	TANY,
701		3*NAREG,	RDEST,
702		"	lw A1,AR		# bit-field assignment\n"
703		"	li A3,M\n"
704		"	lw A2,AL\n"
705		"	sll A1,A1,H\n"
706		"	and A1,A1,A3\n"
707		"	nor A3,$zero,A3\n"
708		"	and A2,A2,A3\n"
709		"	or A2,A2,A1\n"
710		"	sw A2,AL\n"
711		"F	lw AD,AR\n"
712		"F	nop\n"
713		"F	sll AD,AD,32-S\n"
714		"F	sra AD,AD,32-S\n", },
715
716/* XXX we can optimise this away */
717{ ASSIGN,	FOREFF|INAREG,
718	SFLD,		TANY,
719	SCON,		TANY,
720		3*NAREG,	RDEST,
721		"	li A1,AR		# bit-field assignment\n"
722		"	lw A2,AL\n"
723		"	li A3,M\n"
724		"	sll A1,A1,H\n"
725		"	and A1,A1,A3\n"
726		"	nor A3,$zero,A3\n"
727		"	and A2,A2,A3\n"
728		"	or A2,A2,A1\n"
729		"	sw A2,AL\n"
730		"F	li AD,AR\n"
731		"F	sll AD,AD,32-S\n"
732		"F	sra AD,AD,32-S\n", },
733
734{ ASSIGN,	FOREFF|INAREG,
735	SFLD,		TANY,
736	SAREG,		TANY,
737		3*NAREG,	RDEST,
738		"	move A1,AR		# bit-field assignment\n"
739		"	lw A2,AL\n"
740		"	li A3,M\n"
741		"	sll A1,A1,H\n"
742		"	and A1,A1,A3\n"
743		"	nor A3,$zero,A3\n"
744		"	and A2,A2,A3\n"
745		"	or A2,A2,A1\n"
746		"	sw A2,AL\n"
747		"F	move AR,AD\n"
748		"F	sll AD,AD,32-S\n"
749		"F	sra AD,AD,32-S\n", },
750
751{ STASG,        INAREG|FOREFF,
752        SOREG|SNAME,	TANY,
753        SAREG,  	TPTRTO|TANY,
754                NSPECIAL,       RDEST,
755                "ZQ", },
756
757/*
758 * Compare instructions
759 */
760
761{ EQ,	FORCC,
762        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
763        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
764                0,      RESCC,
765                "	beq AL,AR,LC\n"
766		"	nop\n", },
767
768{ NE,	FORCC,
769        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
770        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
771                0,      RESCC,
772                "	bne AL,AR,LC\n"
773		"	nop\n", },
774
775{ OPLOG,	FORCC,
776        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
777        SZERO,		TANY,
778                0,      RESCC,
779                "	O AL,LC\n"
780		"	nop\n", },
781
782{ OPLOG,	FORCC,
783        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
784        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
785                NAREG|NASL,     RESCC,
786		"	sub A1,AL,AR\n"
787                "	O A1,LC\n"
788		"	nop\n", },
789
790{ OPLOG,	FORCC,
791        SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
792        SSCON,		TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
793                NAREG|NASL,     RESCC,
794		"	sub A1,AL,AR\n"
795                "	O A1,LC\n"
796		"	nop\n", },
797
798{ OPLOG,	FORCC,
799	SBREG,		TLONGLONG|TULONGLONG,
800	SBREG,		TLONGLONG|TULONGLONG,
801		NAREG,	RESCC,
802		"ZD", },
803
804{ OPLOG,	FORCC,
805	SCREG,	TFLOAT|TDOUBLE|TLDOUBLE,
806	SCREG,	TFLOAT|TDOUBLE|TLDOUBLE,
807		0,	RESCC,
808		"ZG", },
809
810/*
811 * Convert LTYPE to reg.
812 */
813
814{ OPLTYPE,	INAREG,
815	SANY,		TANY,
816	SOREG|SNAME,	TCHAR,
817		NAREG,	RESC1,
818		"	lb A1,AL	# load char to reg\n"
819		"	nop\n", },
820
821{ OPLTYPE,	INAREG,
822	SANY,		TANY,
823	SOREG|SNAME,	TUCHAR,
824		NAREG,	RESC1,
825		"	lbu A1,AL	# load uchar to reg\n"
826		"	nop\n", },
827
828{ OPLTYPE,	INAREG,
829	SANY,		TANY,
830	SOREG|SNAME,	TSHORT,
831		NAREG,	RESC1,
832		"	lh A1,AL	# load short to reg\n"
833		"	nop\n", },
834
835{ OPLTYPE,	INAREG,
836	SANY,		TANY,
837	SOREG|SNAME,	TUSHORT,
838		NAREG,	RESC1,
839		"	lhu A1,AL	# load ushort to reg\n"
840		"	nop\n", },
841
842{ OPLTYPE,	INAREG,
843	SANY,		TANY,
844	SOREG|SNAME,	TWORD|TPOINT,
845		NAREG,	RESC1,
846		"	lw A1,AL	# load (u)int/(u)long to reg\n"
847		"	nop\n", },
848
849{ OPLTYPE,	INBREG,
850	SANY,		TANY,
851	SOREG|SNAME,	TLONGLONG|TULONGLONG,
852		NBREG,	RESC1,
853		"	lw U1,UL	# load (u)longlong to reg\n"
854		"	nop\n"
855		"	lw A1,AL\n"
856      		"	nop\n", },
857
858{ OPLTYPE,	INAREG,
859	SANY,	TANY,
860	SCON,	TPOINT,
861		NAREG,	RESC1,
862		"	la A1,AL	# load constant address to reg\n", },
863
864{ OPLTYPE,	INAREG,
865	SANY,	TANY,
866	SZERO,	TANY,
867		NAREG,	RESC1,
868		"	move A1,$zero	# load 0 to reg\n", },
869
870{ OPLTYPE,	INAREG,
871	SANY,	TANY,
872	SCON,	TANY,
873		NAREG,	RESC1,
874		"	li A1,AL	# load constant to reg\n", },
875
876{ OPLTYPE,	INBREG,
877	SANY,	TANY,
878	SZERO,	TANY,
879		NBREG,	RESC1,
880		"	move A1,$zero	# load 0 to reg\n"
881		"	move U1,$zero\n", },
882
883{ OPLTYPE,	INBREG,
884	SANY,	TANY,
885	SCON,	TANY,
886		NBREG,	RESC1,
887		"	li A1,AL	# load constant to reg\n"
888		"	li U1,UL\n", },
889
890{ OPLTYPE,	INAREG,
891	SANY,	TANY,
892	SANY,	TANY,
893		NAREG,	RESC1,
894		"	move A1,AL\n", },
895
896{ OPLTYPE,	INCREG,
897	SANY,	TANY,
898	SZERO,	TFLOAT,
899		NCREG,	RESC1,
900		"	mtc1 $zero,A1	# load 0 to float reg\n"
901		"	nop\n", },
902
903{ OPLTYPE,	INCREG,
904	SANY,	TANY,
905	SZERO,	TDOUBLE|TLDOUBLE,
906		NCREG,	RESC1,
907		"	mtc1 $zero,A1	# load 0 to (l)double reg\n"
908		"	mtc1 $zero,U1\n"
909		"	nop\n", },
910
911{ OPLTYPE,	INCREG,
912	SANY,	TANY,
913	SOREG|SNAME,	TFLOAT,
914		NCREG,	RESC1,
915		"	l.s A1,AL	# load into floating-point reg\n"
916		"	nop\n", },
917
918{ OPLTYPE,	INCREG,
919	SANY,	TANY,
920	OREG|SNAME,	TDOUBLE|TLDOUBLE,
921		NCREG,	RESC1,
922		"	l.d A1,AL	# load into double floating-point reg\n"
923		"	nop\n", },
924
925/*
926 * Jumps.
927 */
928{ GOTO, 	FOREFF,
929	SCON,	TANY,
930	SANY,	TANY,
931		0,	RNOP,
932		"	j LL		# goto label\n"
933		"	nop\n"
934		"	nop\n", },
935
936/*
937 * Subroutine calls.
938 */
939
940{ CALL,         FOREFF,
941        SCON,		TANY,
942        SANY,           TANY,
943                0,      0,
944                "	subu $sp,$sp,16	# call (args, no result) to scon/sname\n"
945                "	jal CL\n"
946		"	nop\n"
947		"ZC", },
948
949{ UCALL,        FOREFF,
950        SCON,		TANY,
951        SANY,           TANY,
952                0,      0,
953                "	jal CL			# call (no args, no result) to scon/sname\n"
954		"	nop\n", },
955
956{ CALL,         INAREG,
957        SCON,		TANY,
958        SAREG,          TANY,
959                NAREG,     RESC1,  /* should be 0 */
960                "	subu $sp,$sp,16	# call (args, result in v0) to scon/sname\n"
961		"	jal CL\n"
962		"	nop\n"
963		"ZC", },
964
965{ UCALL,        INAREG,
966        SCON,		TANY,
967        SAREG,          TANY,
968                NAREG,     RESC1,  /* should be 0 */
969                "	jal CL   # call (no args, result in v0) to scon/sname\n"
970		"	nop\n",
971 },
972
973{ CALL,         INBREG,
974        SCON,		TANY,
975        SBREG,          TANY,
976                NBREG,     RESC1,  /* should be 0 */
977                "	subu $sp,$sp,16	# call (args, result in v0:v1) to scon/sname\n"
978		"	jal CL\n"
979		"	nop\n"
980		"ZC", },
981
982{ UCALL,        INBREG,
983        SCON,		TANY,
984        SBREG,          TANY,
985                NBREG,     RESC1,  /* should be 0 */
986                "	jal CL   # call (no args, result in v0:v1) to scon/sname\n"
987		"	nop\n",
988 },
989
990{ CALL,         INCREG,
991        SCON,		TANY,
992        SCREG,          TANY,
993                NCREG,     RESC1,  /* should be 0 */
994                "	subu $sp,$sp,16	# call (args, result in f0:f1) to scon/sname\n"
995		"	jal CL\n"
996		"	nop\n"
997		"ZC", },
998
999{ UCALL,        INCREG,
1000        SCON,		TANY,
1001        SCREG,          TANY,
1002                NCREG,     RESC1,  /* should be 0 */
1003                "	jal CL   # call (no args, result in v0:v1) to scon/sname\n"
1004		"	nop\n",
1005 },
1006
1007{ CALL,         FOREFF,
1008        SAREG,		TANY,
1009        SANY,		TANY,
1010                0,      0,
1011                "	subu $sp,$sp,16	# call (args, no result) to reg\n"
1012		"	move $25,AL\n"
1013                "	jal $25\n"
1014		"	nop\n"
1015		"ZC", },
1016
1017{ UCALL,        FOREFF,
1018        SAREG,		TANY,
1019        SANY,		TANY,
1020                0,      0,
1021		"	move $25,AL\n"
1022                "	jal $25			# call (no args, no result) to reg\n"
1023		"	nop\n", },
1024
1025{ CALL,         INAREG,
1026        SAREG,		TANY,
1027        SAREG,		TANY,
1028                NAREG,     RESC1,  /* should be 0 */
1029                "	subu $sp,$sp,16	# call (args, result) to reg\n"
1030		"	move $25,AL\n"
1031                "	jal $25\n"
1032		"	nop\n"
1033		"ZC", },
1034
1035{ UCALL,        INAREG,
1036        SAREG,		TANY,
1037        SAREG,		TANY,
1038                NAREG,     RESC1,  /* should be 0 */
1039		"	move $25,AL\n"
1040                "	jal $25		# call (no args, result) to reg\n"
1041		"	nop\n", },
1042
1043{ CALL,         INBREG,
1044        SAREG,		TANY,
1045        SBREG,		TANY,
1046                NBREG,     RESC1,  /* should be 0 */
1047                "	subu $sp,$sp,16	# call (args, result) to reg\n"
1048		"	move $25,AL\n"
1049                "	jal $25\n"
1050		"	nop\n"
1051		"ZC", },
1052
1053{ UCALL,        INBREG,
1054        SAREG,		TANY,
1055        SBREG,		TANY,
1056                NBREG,     RESC1,  /* should be 0 */
1057		"	move $25,AL\n"
1058                "	jal $25			# call (no args, result) to reg\n"
1059		"	nop\n", },
1060
1061{ CALL,         INCREG,
1062        SAREG,		TANY,
1063        SCREG,		TANY,
1064                NCREG,     RESC1,  /* should be 0 */
1065                "	subu $sp,$sp,16	# call (args, result) to reg\n"
1066		"	move $25,AL\n"
1067                "	jal $25\n"
1068		"	nop\n"
1069		"ZC", },
1070
1071{ UCALL,        INCREG,
1072        SCREG,		TANY,
1073        SCREG,		TANY,
1074                NCREG,     RESC1,  /* should be 0 */
1075		"	move $25,AL\n"
1076                "	jal $25			# call (no args, result) to reg\n"
1077		"	nop\n", },
1078
1079
1080/* struct return */
1081{ USTCALL,      FOREFF,
1082	SCON|SNAME,	TANY,
1083	SANY,   	TANY,
1084		0,	0,
1085		"	jal CL\n"
1086		"	nop\n", },
1087
1088{ USTCALL,      FOREFF,
1089	SAREG,		TANY,
1090	SANY,   	TANY,
1091		0,	0,
1092		"	move $25,AL\n"
1093                "	jal $25\n"
1094		"	nop\n", },
1095
1096{ USTCALL,      INAREG,
1097	SCON|SNAME,	TANY,
1098	SANY,   	TANY,
1099		NAREG|NASL,	RESC1,
1100		"	jal CL\n"
1101		"	nop\n", },
1102
1103{ USTCALL,      INAREG,
1104	SAREG,		TANY,
1105	SANY,   	TANY,
1106		NAREG|NASL,	RESC1,
1107		"	move $25,AL\n"
1108                "	jal $25\n"
1109		"	nop\n", },
1110
1111{ STCALL,      FOREFF,
1112	SCON|SNAME,	TANY,
1113	SANY,   	TANY,
1114		0,	0,
1115                "	subu $sp,$sp,16\n"
1116		"	jal CL\n"
1117		"	nop\n"
1118		"ZC", },
1119
1120{ STCALL,      FOREFF,
1121	SAREG,	TANY,
1122	SANY,   	TANY,
1123		0,	0,
1124                "	subu $sp,$sp,16\n"
1125		"	move $25,AL\n"
1126                "	jal $25\n"
1127		"	nop\n"
1128		"ZC", },
1129
1130{ STCALL,      INAREG,
1131	SCON|SNAME,	TANY,
1132	SANY,   	TANY,
1133		NAREG|NASL,	RESC1,
1134                "	subu $sp,$sp,16\n"
1135		"	jal CL\n"
1136		"	nop\n"
1137		"ZC", },
1138
1139{ STCALL,      INAREG,
1140	SAREG,	TANY,
1141	SANY,   	TANY,
1142		0,	0,
1143                "	subu $sp,$sp,16\n"
1144		"	move $25,AL\n"
1145                "	jal $25\n"
1146		"	nop\n"
1147		"ZC", },
1148
1149
1150/*
1151 *  Function arguments
1152 */
1153
1154#if 0
1155
1156/* intentionally write out the register for (u)short/(u)char */
1157{ FUNARG,       FOREFF,
1158        SAREG,  TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR,
1159        SANY,   TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR,
1160                0,      0,
1161                "	subu $sp,$sp,4		# save function arg to stack\n"
1162		"	sw AL,($sp)\n"
1163		"	#nop\n", },
1164
1165{ FUNARG,	FOREFF,
1166	SBREG,	TLONGLONG|TULONGLONG,
1167	SANY,	TLONGLONG|TULONGLONG,
1168		0,	0,
1169		"	addi $sp,$sp,-8		# save function arg to stack (endian problem here?\n"
1170		"	sw UL,4($sp)\n"
1171		"	sw AL,($sp)\n"
1172		"	#nop\n", },
1173
1174{ FUNARG,	FOREFF,
1175	SCREG,	TFLOAT,
1176	SANY,	TFLOAT,
1177		0,	0,
1178		"	addi $sp,$sp,-4		# save function arg to stack\n"
1179		"	s.s AL,($sp)\n"
1180		"	#nop\n", },
1181
1182{ FUNARG,	FOREFF,
1183	SCREG,	TDOUBLE|TLDOUBLE,
1184	SANY,	TDOUBLE|TLDOUBLE,
1185		0,	0,
1186		"	addi $sp,$sp,-8		# save function arg to stack\n"
1187		"	s.d AL,($sp)\n"
1188		"	#nop\n", },
1189
1190#endif
1191
1192{ STARG,	FOREFF,
1193	SAREG,		TANY,
1194	SANY,		TSTRUCT,
1195		NSPECIAL,	0,
1196		"ZH", },
1197
1198/*
1199 * Indirection operators.
1200 */
1201{ UMUL, INAREG,
1202	SANY,	TPOINT|TWORD,
1203	SOREG,	TPOINT|TWORD,
1204    		NAREG,     RESC1,
1205        	"	lw A1,AL		# word load\n"
1206		"	nop\n", },
1207
1208{ UMUL, INAREG,
1209	SANY,	TSHORT|TUSHORT,
1210	SOREG,	TSHORT|TUSHORT,
1211    		NAREG,     RESC1,
1212        	"	lh A1,AL		# (u)short load\n"
1213		"	nop\n", },
1214
1215{ UMUL, INAREG,
1216	SANY,	TCHAR|TUCHAR,
1217	SOREG,	TCHAR|TUCHAR,
1218    		NAREG,     RESC1,
1219        	"	lb A1,AL		# (u)char load\n"
1220		"	nop\n", },
1221
1222{ UMUL,	INBREG,
1223	SANY,	TLONGLONG|TULONGLONG,
1224	SOREG,	TLONGLONG|TULONGLONG,
1225		NBREG,	RESC1,
1226		"	lw A1,AL		# (u)longlong load - endian problem here?\n"
1227		"	nop\n"
1228		"	lw U1,UL\n"
1229		"	nop\n", },
1230
1231{ UMUL,	INCREG,
1232	SANY,	TFLOAT,
1233	SOREG,	TFLOAT,
1234		NCREG,	RESC1,
1235		"	l.s A1,AL		# float load\n"
1236		"	nop\n", },
1237
1238{ UMUL,	INCREG,
1239	SANY,	TDOUBLE|TLDOUBLE,
1240	SOREG,	TDOUBLE|TLDOUBLE,
1241		NCREG,	RESC1,
1242		"	l.d A1,AL		# float load\n"
1243		"	nop\n", },
1244
1245#if 0
1246{ UMUL,	INCREG,
1247	SANY,	TDOUBLE|TLDOUBLE,
1248	SAREG,	TPOINT,
1249		NCREG,	RESC1,
1250		"	l.d A1,(AL)\n"
1251		"	nop\n", },
1252
1253{ UMUL, INAREG,
1254	SANY,	TPOINT|TWORD,
1255	SNAME,	TPOINT|TWORD,
1256    		NAREG,     RESC1,
1257        	"	la A1,AL		# sname word load\n"
1258		"	lw A1,(A1)\n"
1259		"	nop\n", },
1260
1261{ UMUL, INAREG,
1262	SANY,	TSHORT|TUSHORT,
1263	SNAME,	TSHORT|TUSHORT,
1264    		NAREG,     RESC1,
1265        	"	la A1,AL		# sname (u)short load\n"
1266		"	lh A1,(A1)\n"
1267		"	nop\n", },
1268
1269{ UMUL, INAREG,
1270	SANY,	TCHAR|TUCHAR,
1271	SNAME,	TCHAR|TUCHAR,
1272    		NAREG,     RESC1,
1273        	"	la A1,AL		# sname (u)char load\n"
1274		"	lb A1,(A1)\n"
1275		"	nop\n", },
1276
1277{ UMUL, INBREG,
1278	SANY,	TLONGLONG|TULONGLONG,
1279	SNAME,	TLONGLONG|TULONGLONG,
1280		NBREG|NAREG,	RESC1,
1281		"	la A2,AL		# sname (u)long long load - endian problems here?\n"
1282		"	lw A1,(A1)\n"
1283		"	nop\n"
1284		"	lw U1,4(A1)\n"
1285		"	nop\n", },
1286#endif
1287
1288{ UMUL, INAREG,
1289	SANY,	TPOINT|TWORD,
1290	SAREG,	TPOINT|TWORD,
1291    		NAREG,     RESC1,
1292        	"	lw A1,(AL)		# word load\n"
1293		"	nop\n", },
1294
1295#if 0
1296{ UMUL, INAREG,
1297	SANY,	TSHORT|TUSHORT,
1298	SAREG,	TPTRTO|TSHORT|TUSHORT,
1299    		NAREG,     RESC1,
1300        	"	lh A1,(AL)		# (u)short load\n"
1301		"	nop\n", },
1302
1303{ UMUL, INAREG,
1304	SANY,	TCHAR|TUCHAR,
1305	SAREG,	TPTRTO|TCHAR|TUCHAR,
1306    		NAREG|NASL,     RESC1,
1307        	"	lb A1,(AL)		# (u)char load\n"
1308		"	nop\n", },
1309
1310{ UMUL, INBREG,
1311	SANY,	TLONGLONG|TULONGLONG,
1312	SAREG,	TPTRTO|TLONGLONG|TULONGLONG,
1313		NBREG,	RESC1,
1314		"	lw A1,(AL)		# (u)long long load - endianness problems?\n"
1315		"	nop\n"
1316		"	lw U1,4(AL)"
1317		"	nop\n", },
1318#endif
1319
1320#define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1321
1322{ FLD, DF(FLD), },
1323
1324{ FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" },
1325};
1326
1327int tablesize = sizeof(table)/sizeof(table[0]);
1328