xref: /netbsd/external/bsd/pcc/dist/pcc/arch/arm/table.c (revision 6550d01e)
1 /*	Id: table.c,v 1.19 2008/05/16 02:20:36 gmcgarry Exp 	*/
2 /*	$NetBSD: table.c,v 1.1.1.2 2010/06/03 18:57:11 plunky Exp $	*/
3 /*-
4  * Copyright (c) 2007 Gregory McGarry <g.mcgarry@ieee.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  * A template has five logical sections:
21  *
22  *	1) subtree (operator); goal to achieve (cookie)
23  *	2) left node descendent of operator (node class; type)
24  *	3) right node descendent of operator (node class; type)
25  *	4) resource requirements (number of scratch registers);
26  *	   subtree rewriting rule
27  *	5) emitted instructions
28  */
29 
30 #include "pass2.h"
31 
32 #define TUWORD	TUNSIGNED|TULONG
33 #define TSWORD	TINT|TLONG
34 #define TWORD	TUWORD|TSWORD
35 
36 struct optab table[] = {
37 /* First entry must be an empty entry */
38 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
39 
40 /* PCONVs are not necessary */
41 { PCONV,	INAREG,
42 	SAREG,	TWORD|TPOINT,
43 	SAREG,	TWORD|TPOINT,
44 		0,	RLEFT,
45 		COM "pointer conversion\n", },
46 
47 
48 /*
49  * Conversions of integral types
50  *
51  * For each deunsigned type, they look something like this:
52  *
53  * signed -> bigger signed	- nothing to do
54  * signed -> bigger unsigned	- clear the top bits (of source type)
55  *
56  * signed -> smaller signed	- sign-extend the bits (to dest type)
57  * signed -> smaller unsigned	- clear the top bits (of dest type)
58  * unsigned -> smaller signed	- sign-extend top bits (to dest type)
59  * unsigned -> smaller unsigned	- clear the top bits (of dest type)
60  *
61  * unsigned -> bigger		- nothing to do
62  */
63 
64 { SCONV,	INAREG,
65 	SAREG,	TCHAR,
66 	SAREG,	TSWORD|TSHORT,
67 		0,	RLEFT,
68 		COM "convert char to short/int\n", },
69 
70 { SCONV,	INAREG,
71 	SAREG,	TCHAR,
72 	SAREG,	TUWORD|TUSHORT|TUCHAR,
73 		NAREG|NASL,	RESC1,
74 		"	and A1,AL,#255" COM "convert char to uchar/ushort/uint\n", },
75 
76 { SCONV,	INAREG | FEATURE_EXTEND,
77 	SAREG,	TUCHAR,
78 	SAREG,	TCHAR,
79 		NAREG|NASL,	RESC1,
80 		"	sxtb A1,AL" COM "convert uchar to char\n", },
81 
82 { SCONV,	INAREG,
83 	SAREG,	TUCHAR,
84 	SAREG,	TCHAR,
85 		NAREG|NASL,	RESC1,
86 		"	mov A1,AL,asl #24" COM "convert uchar to char\n"
87 		"	mov A1,A1,asr #24\n", },
88 
89 { SCONV,	INAREG,
90 	SAREG,	TUCHAR,
91 	SAREG,	TWORD|TSHORT|TUSHORT,
92 		0,	RLEFT,
93 		COM "convert uchar to (u)short/(u)int\n", },
94 
95 { SCONV,	INAREG,
96 	SAREG,	TSHORT,
97 	SAREG,	TSWORD,
98 		0,	RLEFT,
99 		COM "convert short to int\n", },
100 
101 { SCONV,	INAREG | FEATURE_EXTEND,
102 	SAREG,	TSHORT,
103 	SAREG,	TUWORD|TUSHORT,
104 		NAREG|NASL,	RESC1,
105 		"	uxth A1,AL" COM "convert short to uint\n", },
106 
107 { SCONV,	INAREG,
108 	SAREG,	TSHORT,
109 	SAREG,	TUWORD|TUSHORT,
110 		NAREG|NASL,	RESC1,
111 		"	mov A1,AL,asl #16" COM "convert short to uint\n"
112 		"	mov A1,AL,lsr #16\n", },
113 
114 { SCONV,	INAREG | FEATURE_EXTEND,
115 	SAREG,	TUSHORT,
116 	SAREG,	TSHORT,
117 		NAREG|NASL,	RESC1,
118 		"	sxth A1,AL" COM "convert ushort to short\n", },
119 
120 { SCONV,	INAREG,
121 	SAREG,	TUSHORT,
122 	SAREG,	TSHORT,
123 		NAREG|NASL,	RESC1,
124 		"	mov A1,AL,asl #16" COM "convert ushort to short\n"
125 		"	mov A1,A1,asr #16\n", },
126 
127 { SCONV,	INAREG | FEATURE_EXTEND,
128 	SAREG,	TSHORT|TUSHORT,
129 	SAREG,	TCHAR,
130 		NAREG|NASL,	RESC1,
131 		"	sxtb A1,AL" COM "convert (u)short to char\n", },
132 
133 { SCONV,	INAREG,
134 	SAREG,	TSHORT|TUSHORT,
135 	SAREG,	TCHAR,
136 		NAREG|NASL,	RESC1,
137 		"	mov A1,AL,asl #24" COM "convert (u)short to char\n"
138 		"	mov A1,A1,asr #24\n", },
139 
140 { SCONV,	INAREG,
141 	SAREG,	TSHORT|TUSHORT,
142 	SAREG,	TCHAR,
143 		NAREG|NASL,	RESC1,
144 		"	sxtb A1,AL" COM "convert (u)short to char\n", },
145 
146 { SCONV,	INAREG,
147 	SAREG,	TSHORT|TUSHORT,
148 	SAREG,	TUCHAR,
149 		NAREG|NASL,	RESC1,
150 		"	and A1,AL,#255" COM "convert (u)short to uchar\n", },
151 
152 { SCONV,	INAREG,
153 	SAREG,	TUSHORT,
154 	SAREG,	TWORD,
155 		0,	RLEFT,
156 		COM "convert ushort to (u)int\n", },
157 
158 { SCONV,	INAREG | FEATURE_EXTEND,
159 	SAREG,	TWORD,
160 	SAREG,	TCHAR,
161 		NAREG|NASL,	RESC1,
162 		"	sxtb A1,AL" COM "convert (u)int to char\n", },
163 
164 { SCONV,	INAREG,
165 	SAREG,	TWORD,
166 	SAREG,	TCHAR,
167 		NAREG|NASL,	RESC1,
168 		"	mov A1,AL,asl #24" COM "convert (u)int to char\n"
169 		"	mov A1,A1,asr #24\n", },
170 
171 { SCONV,	INAREG | FEATURE_EXTEND,
172 	SAREG,	TWORD,
173 	SAREG,	TSHORT,
174 		NAREG|NASL,	RESC1,
175 		"	sxth A1,AL" COM "convert (u)int to short\n", },
176 
177 { SCONV,	INAREG,
178 	SAREG,	TWORD,
179 	SAREG,	TSHORT,
180 		NAREG|NASL,	RESC1,
181 		"	mov A1,AL,asl #16" COM "convert (u)int to short\n"
182 		"	mov A1,A1,asr #16\n", },
183 
184 { SCONV,	INAREG,
185 	SAREG,	TWORD,
186 	SAREG,	TUCHAR,
187 		NAREG|NASL,	RESC1,
188 		"	and A1,AL,#255" COM "convert uchar to char\n", },
189 
190 { SCONV,	INAREG | FEATURE_EXTEND,
191 	SAREG,	TWORD,
192 	SAREG,	TUSHORT,
193 		NAREG|NASL,	RESC1,
194 		"	uxth A1,AL" COM "convert int to ushort\n", },
195 
196 { SCONV,	INAREG,
197 	SAREG,	TWORD,
198 	SAREG,	TUSHORT,
199 		NAREG|NASL,	RESC1,
200 		"	mov A1,AL,asl #16" COM "convert int to ushort\n"
201 		"	mov A1,AL,lsr #16\n", },
202 
203 { SCONV,	INAREG,
204 	SAREG,	TPOINT|TWORD,
205 	SAREG,	TWORD|TPOINT,
206 		0,	RLEFT,
207 		COM "convert between pointers and words\n", },
208 
209 { SCONV,	INBREG,
210 	SBREG,	TLONGLONG|TULONGLONG,
211 	SBREG,	TLONGLONG|TULONGLONG,
212 		0,	RLEFT,
213 		COM "convert (u)longlong to (u)longlong\n", },
214 
215 /* convert (u)char/(u)short/(u)int to longlong */
216 { SCONV,	INBREG,
217 	SAREG,	TCHAR|TUCHAR|TSHORT|TUSHORT|TWORD,
218 	SBREG,	TLONGLONG|TULONGLONG,
219 		NBREG|NBSL,		RESC1,
220 		"	mov A1,AL" COM "convert (u)char/(u)short/(u)int to (u)longlong\n"
221 		"	mov U1,AL,asr #31\n", },
222 
223 { SCONV,	INAREG | FEATURE_EXTEND,
224 	SBREG,	TLONGLONG|TULONGLONG,
225 	SAREG,	TCHAR,
226 		NAREG,		RESC1,
227 		"	sxtb A1,AL" COM "convert (u)longlong to char\n", },
228 
229 { SCONV,	INAREG,
230 	SBREG,	TLONGLONG|TULONGLONG,
231 	SAREG,	TCHAR,
232 		NAREG,		RESC1,
233 		"	mov A1,AL,asl #24" COM "convert (u)longlong to char\n"
234 		"	mov A1,A1,asr #24\n", },
235 
236 { SCONV,	INAREG | FEATURE_EXTEND,
237 	SBREG,	TLONGLONG|TULONGLONG,
238 	SAREG,	TSHORT,
239 		NAREG,		RESC1,
240 		"	sxth A1,AL" COM "convert (u)longlong to short\n", },
241 
242 { SCONV,	INAREG,
243 	SBREG,	TLONGLONG|TULONGLONG,
244 	SAREG,	TSHORT,
245 		NAREG,		RESC1,
246 		"	mov A1,AL,asl #16" COM "convert (u)longlong to short\n"
247 		"	mov A1,A1,asr #16\n", },
248 
249 { SCONV,	INAREG,
250 	SBREG,	TLONGLONG|TULONGLONG,
251 	SAREG,	TWORD,
252 		NAREG,		RESC1,
253 		"	mov A1,AL" COM "convert (u)longlong to (u)int\n", },
254 
255 { SCONV,	INAREG,
256 	SBREG,	TLONGLONG|TULONGLONG,
257 	SAREG,	TUCHAR,
258 		NAREG,		RESC1,
259 		"	and A1,AL,#255" COM "convert (u)longlong to uchar\n", },
260 
261 { SCONV,	INAREG | FEATURE_EXTEND,
262 	SBREG,	TLONGLONG|TULONGLONG,
263 	SAREG,	TUSHORT,
264 		NAREG,		RESC1,
265 		"	uxth A1,AL" COM "convert (u)longlong to ushort\n", },
266 
267 { SCONV,	INAREG,
268 	SBREG,	TLONGLONG|TULONGLONG,
269 	SAREG,	TUSHORT,
270 		NAREG,		RESC1,
271 		"	mov A1,AL,asl #16" COM "convert (u)longlong to ushort\n"
272 		"	mov A1,A1,lsr #16\n", },
273 
274 /* conversions on load from memory */
275 
276 /* char */
277 { SCONV,	INAREG,
278 	SOREG,	TCHAR,
279 	SAREG,	TWORD,
280 		NASL|NAREG,	RESC1,
281 		"	ldrsb A1,AL" COM "convert char to int/long\n", },
282 
283 /* uchar */
284 { SCONV,	INAREG,
285 	SOREG,	TUCHAR,
286 	SAREG,	TWORD,
287 		NASL|NAREG,	RESC1,
288 		"	ldrb A1,AL" COM "convert uchar to int/long\n", },
289 
290 /* short */
291 { SCONV,	INAREG | FEATURE_HALFWORDS,
292 	SOREG,	TSHORT,
293 	SAREG,	TWORD,
294 		NASL|NAREG,	RESC1,
295 		"	ldrsh A1,AL" COM "convert short to int/long\n", },
296 
297 /* ushort */
298 { SCONV,	INAREG | FEATURE_HALFWORDS,
299 	SOREG,	TSHORT,
300 	SAREG,	TWORD,
301 		NASL|NAREG,	RESC1,
302 		"	ldrh A1,AL" COM "convert ushort to int/long\n", },
303 
304 /* short */
305 { SCONV,	INAREG,
306 	SOREG,	TSHORT|TUSHORT,
307 	SAREG,	TWORD,
308 		2*NAREG|NASL,	RESC1,
309 		"ZH", },
310 
311 { SCONV,	INAREG | FEATURE_FPA,
312 	SCREG,	TFLOAT,
313 	SAREG,	TWORD,
314 		NAREG,		RESC1,
315 		"	fix AL,AR" COM "convert float to int\n", },
316 
317 { SCONV,	INAREG | FEATURE_VFP,
318 	SCREG,	TFLOAT,
319 	SAREG,	TSWORD,
320 		NAREG,		RESC1,
321 		"	ftosis AL,AR" COM "convert float to int\n", },
322 
323 { SCONV,	INAREG | FEATURE_VFP,
324 	SCREG,	TFLOAT,
325 	SAREG,	TSWORD,
326 		NAREG,		RESC1,
327 		"	ftouis AL,AR" COM "convert float to int\n", },
328 
329 { SCONV,	INAREG,
330 	SAREG,	TFLOAT,
331 	SAREG,	TWORD,
332 		NSPECIAL|NAREG,		RESC1,
333 		"ZF", },
334 
335 { SCONV,	INBREG | FEATURE_FPA,
336 	SCREG,	TFLOAT,
337 	SBREG,	TULONGLONG|TLONGLONG,
338 		NBREG,		RESC1,
339 		COM "unimplemented\n", },
340 
341 { SCONV,	INBREG | FEATURE_VFP,
342 	SCREG,	TFLOAT,
343 	SBREG,	TULONGLONG|TLONGLONG,
344 		NBREG,		RESC1,
345 		COM "unimplemented\n", },
346 
347 { SCONV,	INBREG,
348 	SAREG,	TFLOAT,
349 	SBREG,	TULONGLONG|TLONGLONG,
350 		NSPECIAL|NBREG,		RESC1,
351 		"ZF", },
352 
353 { SCONV,	INAREG | FEATURE_FPA,
354 	SCREG,	TDOUBLE|TLDOUBLE,
355 	SAREG,	TWORD,
356 		NAREG,		RESC1,
357 		"	fix AL,AR" COM "convert double/ldouble to int\n", },
358 
359 { SCONV,	INAREG | FEATURE_VFP,
360 	SCREG,	TDOUBLE|TLDOUBLE,
361 	SAREG,	TSWORD,
362 		NAREG,		RESC1,
363 		"	ftosid AL,AR" COM "convert double/ldouble to int\n", },
364 
365 { SCONV,	INAREG | FEATURE_VFP,
366 	SCREG,	TDOUBLE|TLDOUBLE,
367 	SAREG,	TUWORD,
368 		NAREG,		RESC1,
369 		"	ftouid AL,AR" COM "convert double/ldouble to int\n", },
370 
371 { SCONV,	INAREG,
372 	SBREG,	TDOUBLE|TLDOUBLE,
373 	SAREG,	TWORD,
374 		NSPECIAL|NAREG,		RESC1,
375 		"ZF", },
376 
377 { SCONV,	INBREG | FEATURE_FPA,
378 	SCREG,	TDOUBLE|TLDOUBLE,
379 	SBREG,	TLONGLONG|TULONGLONG,
380 		NBREG,		RESC1,
381 		COM "unimplemented\n", },
382 
383 { SCONV,	INBREG | FEATURE_VFP,
384 	SCREG,	TDOUBLE|TLDOUBLE,
385 	SBREG,	TULONGLONG|TLONGLONG,
386 		NBREG,		RESC1,
387 		COM "unimplemented\n", },
388 
389 { SCONV,	INBREG,
390 	SBREG,	TDOUBLE|TLDOUBLE,
391 	SBREG,	TULONGLONG|TLONGLONG,
392 		NSPECIAL|NBREG,		RESC1,
393 		"ZF", },
394 
395 { SCONV,	INCREG | FEATURE_FPA,
396 	SAREG,	TWORD,
397 	SCREG,	TFLOAT,
398 		NCREG,		RESC1,
399 		"	flts AL,AR" COM "convert int to float\n" },
400 
401 { SCONV,	INCREG | FEATURE_VFP,
402 	SAREG,	TSWORD,
403 	SCREG,	TFLOAT,
404 		NCREG,		RESC1,
405 		"	fsitos AL,AR" COM "convert int to float\n" },
406 
407 { SCONV,	INCREG | FEATURE_VFP,
408 	SAREG,	TUWORD,
409 	SCREG,	TFLOAT,
410 		NCREG,		RESC1,
411 		"	fuitos AL,AR" COM "convert int to float\n" },
412 
413 { SCONV,	INAREG,
414 	SAREG,	TWORD,
415 	SAREG,	TFLOAT,
416 		NSPECIAL|NAREG,		RESC1,
417 		"ZF", },
418 
419 { SCONV,	INCREG | FEATURE_FPA,
420 	SBREG,	TULONGLONG|TLONGLONG,
421 	SCREG,	TFLOAT,
422 		NCREG,		RESC1,
423 		COM "unimplemented\n", },
424 
425 { SCONV,	INCREG | FEATURE_VFP,
426 	SBREG,	TULONGLONG|TLONGLONG,
427 	SCREG,	TFLOAT,
428 		NCREG,		RESC1,
429 		COM "unimplemented\n", },
430 
431 { SCONV,	INAREG,
432 	SBREG,	TULONGLONG|TLONGLONG,
433 	SAREG,	TFLOAT,
434 		NAREG,		RESC1,
435 		COM "unimplemented\n", },
436 
437 { SCONV,	INCREG | FEATURE_FPA,
438 	SAREG,	TWORD,
439 	SCREG,	TDOUBLE,
440 		NCREG,		RESC1,
441 		"	fltd AL,AR" COM "convert int to double\n" },
442 
443 { SCONV,	INCREG | FEATURE_VFP,
444 	SAREG,	TSWORD,
445 	SCREG,	TDOUBLE,
446 		NCREG,		RESC1,
447 		"	fsitod AL,AR" COM "convert int to double\n" },
448 
449 { SCONV,	INCREG | FEATURE_VFP,
450 	SAREG,	TUWORD,
451 	SCREG,	TDOUBLE,
452 		NCREG,		RESC1,
453 		"	fuitod AL,AR" COM "convert int to double\n" },
454 
455 { SCONV,	INBREG,
456 	SAREG,	TWORD,
457 	SBREG,	TDOUBLE,
458 		NSPECIAL|NBREG,		RESC1,
459 		"ZF", },
460 
461 { SCONV,	INCREG | FEATURE_FPA,
462 	SBREG,	TLONGLONG|TULONGLONG,
463 	SCREG,	TDOUBLE,
464 		NCREG,		RESC1,
465 		COM "unimplemented\n", },
466 
467 { SCONV,	INCREG | FEATURE_VFP,
468 	SBREG,	TLONGLONG|TULONGLONG,
469 	SCREG,	TDOUBLE,
470 		NCREG,		RESC1,
471 		COM "unimplemented\n", },
472 
473 { SCONV,	INBREG,
474 	SBREG,	TLONGLONG|TULONGLONG,
475 	SBREG,	TDOUBLE,
476 		NSPECIAL|NBREG,		RESC1,
477 		"ZF", },
478 
479 { SCONV,	INCREG | FEATURE_FPA,
480 	SAREG,	TWORD,
481 	SCREG,	TLDOUBLE,
482 		NCREG,		RESC1,
483 		"	flte AL,AR" COM "convert int to ldouble\n" },
484 
485 { SCONV,	INCREG | FEATURE_VFP,
486 	SAREG,	TSWORD,
487 	SCREG,	TLDOUBLE,
488 		NCREG,		RESC1,
489 		"	fsitod AL,AR" COM "convert int to ldouble\n" },
490 
491 { SCONV,	INCREG | FEATURE_VFP,
492 	SAREG,	TUWORD,
493 	SCREG,	TLDOUBLE,
494 		NCREG,		RESC1,
495 		"	fuitod AL,AR" COM "convert uint to ldouble\n" },
496 
497 { SCONV,	INBREG,
498 	SAREG,	TWORD,
499 	SBREG,	TLDOUBLE,
500 		NSPECIAL|NBREG,		RESC1,
501 		"ZF", },
502 
503 { SCONV,	INCREG | FEATURE_FPA,
504 	SBREG,	TLONGLONG|TULONGLONG,
505 	SCREG,	TLDOUBLE,
506 		NCREG,		RESC1,
507 		COM "unimplemented\n", },
508 
509 { SCONV,	INCREG | FEATURE_VFP,
510 	SBREG,	TLONGLONG|TULONGLONG,
511 	SCREG,	TLDOUBLE,
512 		NCREG,		RESC1,
513 		COM "unimplemented\n", },
514 
515 { SCONV,	INBREG,
516 	SBREG,	TLONGLONG|TULONGLONG,
517 	SBREG,	TLDOUBLE,
518 		NSPECIAL|NBREG,		RESC1,
519 		"ZF", },
520 
521 { SCONV,	INCREG | FEATURE_FPA,
522 	SCREG,	TDOUBLE|TLDOUBLE,
523 	SCREG,	TFLOAT,
524 		NCREG,		RESC1,
525 		COM "unimplemented\n", },
526 
527 { SCONV,	INCREG | FEATURE_VFP,
528 	SCREG,	TDOUBLE|TLDOUBLE,
529 	SCREG,	TFLOAT,
530 		NCREG,		RESC1,
531 		"	fcvtds AL,AR" COM "convert float to double\n" },
532 
533 { SCONV,	INAREG,
534 	SBREG,	TDOUBLE|TLDOUBLE,
535 	SAREG,	TFLOAT,
536 		NSPECIAL|NAREG,		RESC1,
537 		"ZF", },
538 
539 { SCONV,	INCREG | FEATURE_FPA,
540 	SCREG,	TFLOAT,
541 	SCREG,	TDOUBLE|TLDOUBLE,
542 		NCREG,		RESC1,
543 		COM "unimplemented\n", },
544 
545 { SCONV,	INCREG | FEATURE_VFP,
546 	SCREG,	TFLOAT,
547 	SCREG,	TDOUBLE|TLDOUBLE,
548 		NCREG,		RESC1,
549 		"	fcvtsd AL,AR" COM "convert float to double\n" },
550 
551 { SCONV,	INBREG,
552 	SAREG,	TFLOAT,
553 	SBREG,	TDOUBLE|TLDOUBLE,
554 		NSPECIAL|NBREG,		RESC1,
555 		"ZF", },
556 
557 { SCONV,	INCREG | FEATURE_FPA,
558 	SCREG,	TDOUBLE|TLDOUBLE,
559 	SCREG,	TDOUBLE|TLDOUBLE,
560 		0,		RLEFT,
561 		COM "convert (l)double to (l)double", },
562 
563 { SCONV,	INCREG | FEATURE_VFP,
564 	SCREG,	TDOUBLE|TLDOUBLE,
565 	SCREG,	TDOUBLE|TLDOUBLE,
566 		0,		RLEFT,
567 		COM "convert (l)double to (l)double", },
568 
569 { SCONV,	INBREG,
570 	SBREG,	TDOUBLE|TLDOUBLE,
571 	SBREG,	TDOUBLE|TLDOUBLE,
572 		0,		RLEFT,
573 		COM "convert (l)double to (l)double", },
574 
575 /*
576  * Subroutine calls.
577  */
578 
579 { CALL,		FOREFF,
580 	SCON|SNAME,	TANY,
581 	SANY,		TANY,
582 		0,	0,
583 		"	bl CL" COM "call (args, no result) to scon/sname (CL)\n"
584 		"ZC", },
585 
586 { UCALL,	FOREFF,
587 	SCON|SNAME,	TANY,
588 	SANY,		TANY,
589 		0,	0,
590 		"	bl CL" COM "call (no args, no result) to scon/sname (CL)\n", },
591 
592 { CALL,		INAREG,
593 	SCON|SNAME,	TANY,
594 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
595 		NAREG|NASL,	RESC1,	/* should be 0 */
596 		"	bl CL" COM "call (args, result in r0) to scon/sname (CL)\n"
597 		"ZC", },
598 
599 { CALL,		INBREG,
600 	SCON|SNAME,	TANY,
601 	SBREG,		TLONGLONG|TULONGLONG,
602 		NBREG|NBSL,	RESC1,	/* should be 0 */
603 		"	bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
604 		"ZC", },
605 
606 { CALL,		INCREG | FEATURE_FPA,
607 	SCON|SNAME,	TANY,
608 	SCREG,		TFLOAT,
609 		NCREG|NCSL,	RESC1,	/* should be 0 */
610 		"	bl CL" COM "call (args, result r0) to scon/sname (CL)\n"
611 		"ZC", },
612 
613 { CALL,		INCREG | FEATURE_FPA,
614 	SCON|SNAME,	TANY,
615 	SCREG,		TDOUBLE|TLDOUBLE,
616 		NCREG|NCSL,	RESC1,	/* should be 0 */
617 		"	bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
618 		"ZC", },
619 
620 { CALL,		INAREG,
621 	SCON|SNAME,	TANY,
622 	SAREG,		TFLOAT,
623 		NAREG|NASL,	RESC1,	/* should be 0 */
624 		"	bl CL" COM "call (args, result r0) to scon/sname (CL)\n"
625 		"ZC", },
626 
627 { CALL,		INBREG,
628 	SCON|SNAME,	TANY,
629 	SBREG,		TDOUBLE|TLDOUBLE,
630 		NBREG|NBSL,	RESC1,	/* should be 0 */
631 		"	bl CL" COM "call (args, result in r0:r1) to scon/sname (CL)\n"
632 		"ZC", },
633 
634 { UCALL,	INAREG,
635 	SCON|SNAME,	TANY,
636 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
637 		NAREG|NASL,	RESC1,	/* should be 0 */
638 		"	bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", },
639 
640 { UCALL,	INBREG,
641 	SCON|SNAME,	TANY,
642 	SBREG,		TLONGLONG|TULONGLONG,
643 		NBREG|NBSL,	RESC1,	/* should be 0 */
644 		"	bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", },
645 
646 { UCALL,	INCREG | FEATURE_FPA,
647 	SCON|SNAME,	TANY,
648 	SCREG,		TFLOAT,
649 		NCREG|NCSL,	RESC1,	/* should be 0 */
650 		"	bl CL" COM "call (no args, result in r0) to scon/sname (CL)\n", },
651 
652 { UCALL,	INCREG | FEATURE_FPA,
653 	SCON|SNAME,	TANY,
654 	SCREG,		TDOUBLE|TLDOUBLE,
655 		NCREG|NCSL,	RESC1,	/* should be 0 */
656 		"	bl CL" COM "call (no args, result in r0:r1) to scon/sname (CL)\n", },
657 
658 { CALL,		FOREFF,
659 	SAREG,	TANY,
660 	SANY,	TANY,
661 		0,	0,
662 		"	mov lr,pc\n"
663 		"	mov pc,AL\n"
664 		"ZC", },
665 
666 { UCALL,	FOREFF,
667 	SAREG,	TANY,
668 	SANY,	TANY,
669 		0,	0,
670 		"	mov lr,pc\n"
671 		"	mov pc,AL\n", },
672 
673 { CALL,		INAREG,
674 	SAREG,	TANY,
675 	SANY,	TANY,
676 		NAREG,	RESC1,
677 		"	mov lr,pc\n"
678 		"	mov pc,AL\n"
679 		"ZC", },
680 
681 { UCALL,	INAREG,
682 	SAREG,	TANY,
683 	SANY,	TANY,
684 		NAREG,	RESC1,
685 		"	mov lr,pc\n"
686 		"	mov pc,AL\n", },
687 
688 { CALL,		INBREG,
689 	SAREG,	TANY,
690 	SANY,	TANY,
691 		NBREG,	RESC1,
692 		"	mov lr,pc\n"
693 		"	mov pc,AL\n"
694 		"ZC", },
695 
696 { UCALL,	INBREG,
697 	SAREG,	TANY,
698 	SANY,	TANY,
699 		NBREG,	RESC1,
700 		"	mov lr,pc\n"
701 		"	mov pc,AL\n", },
702 
703 /* struct return */
704 { USTCALL,	FOREFF,
705 	SCON,	TANY,
706 	SANY,	TANY,
707 		0,	0,
708 		"	bl CL\n", },
709 
710 { USTCALL,	INAREG,
711 	SCON,	TANY,
712 	SANY,	TANY,
713 		NAREG|NASL,	RESC1,	/* should be 0 */
714 		"	bl CL\n", },
715 
716 { USTCALL,	INAREG,
717 	SNAME|SAREG,	TANY,
718 	SANY,		TANY,
719 		NAREG|NASL,	RESC1,	/* should be 0 */
720 		"	mov lr,pc\n"
721 		"	mov pc,AL\n", },
722 
723 { STCALL,	FOREFF,
724 	SCON,	TANY,
725 	SANY,	TANY,
726 		0,	0,
727 		"	bl CL\n"
728 		"ZC", },
729 
730 { STCALL,	INAREG,
731 	SCON,	TANY,
732 	SANY,	TANY,
733 		NAREG|NASL,	RESC1,	/* should be 0 */
734 		"	bl CL\n"
735 		"ZC", },
736 
737 { STCALL,	INAREG,
738 	SNAME|SAREG,	TANY,
739 	SANY,	TANY,
740 		NAREG|NASL,	RESC1,	/* should be 0 */
741 		"	mov lr,pc\n"
742 		"	mov pc,AL\n"
743 		"ZC", },
744 
745 /*
746  * The next rules handle all binop-style operators.
747  */
748 
749 { PLUS,		INAREG,
750 	SAREG,	TWORD|TPOINT,
751 	SCCON,	TANY,
752 		NAREG,	RESC1,
753 		"	add A1,AL,AR" COM "addition of constant\n", },
754 
755 { PLUS,		INBREG,
756 	SBREG,	TLONGLONG|TULONGLONG,
757 	SSCON,	TANY,
758 		NBREG|NBSL,	RESC1,
759 		"	adds A1,AL,AR" COM "64-bit addition of constant\n"
760 		"	adc U1,UL,UR\n", },
761 
762 { PLUS,		INAREG,
763 	SAREG,	TWORD|TPOINT,
764 	SAREG,	TWORD|TPOINT,
765 		NAREG|NASL,	RESC1,
766 		"	add A1,AL,AR" COM "addition\n", },
767 
768 { PLUS,		INBREG,
769 	SBREG,	TLONGLONG|TULONGLONG,
770 	SBREG,	TLONGLONG|TULONGLONG,
771 		NBREG|NBSL,	RESC1,
772 		"	adds A1,AL,AR" COM "64-bit addition\n"
773 		"	adc U1,UL,UR\n", },
774 
775 { PLUS,		INCREG | FEATURE_FPA,
776 	SCREG,	TFLOAT,
777 	SCREG,	TFLOAT,
778 		NCREG,	RESC1,
779 		"	adfs A1,AL,AR" COM "float add\n", },
780 
781 { PLUS,		INCREG | FEATURE_VFP,
782 	SCREG,	TFLOAT,
783 	SCREG,	TFLOAT,
784 		NCREG,	RESC1,
785 		"	fadds A1,AL,AR" COM "float add\n", },
786 
787 { PLUS,		INAREG,
788 	SAREG,	TFLOAT,
789 	SAREG,	TFLOAT,
790 		NSPECIAL|NAREG,	RESC1,
791 		"ZF", },
792 
793 { PLUS,		INCREG | FEATURE_FPA,
794 	SCREG,	TDOUBLE,
795 	SCREG,	TDOUBLE,
796 		NCREG,	RESC1,
797 		"	adfd A1,AL,AR" COM "double add\n", },
798 
799 { PLUS,		INCREG | FEATURE_VFP,
800 	SCREG,	TDOUBLE,
801 	SCREG,	TDOUBLE,
802 		NCREG,	RESC1,
803 		"	faddd A1,AL,AR" COM "double add\n", },
804 
805 { PLUS,		INBREG,
806 	SBREG,	TDOUBLE,
807 	SBREG,	TDOUBLE,
808 		NSPECIAL|NBREG,	RESC1,
809 		"ZF", },
810 
811 { PLUS,		INCREG | FEATURE_FPA,
812 	SCREG,	TLDOUBLE,
813 	SCREG,	TLDOUBLE,
814 		NCREG,	RESC1,
815 		"	adfe A1,AL,AR" COM "ldouble add\n", },
816 
817 { PLUS,		INCREG | FEATURE_VFP,
818 	SCREG,	TLDOUBLE,
819 	SCREG,	TLDOUBLE,
820 		NCREG,	RESC1,
821 		"	faddd A1,AL,AR" COM "ldouble add\n", },
822 
823 { PLUS,		INBREG,
824 	SBREG,	TLDOUBLE,
825 	SBREG,	TLDOUBLE,
826 		NSPECIAL|NBREG,	RESC1,
827 		"ZF", },
828 
829 { MINUS,	INAREG,
830 	SAREG,	TWORD|TPOINT,
831 	SCCON,	TANY,
832 		NAREG|NASL,	RESC1,
833 		"	sub A1,AL,AR" COM "subtraction of constant\n", },
834 
835 { MINUS,	INAREG,
836 	SAREG,	TWORD|TPOINT,
837 	SAREG,	TWORD|TPOINT,
838 		NAREG|NASL,	RESC1,
839 		"	sub A1,AL,AR" COM "subtraction\n", },
840 
841 { MINUS,	INBREG,
842 	SBREG,	TLONGLONG|TULONGLONG,
843 	SCCON,	TANY,
844 		NBREG|NBSL,	RESC1,
845 		"	subs A1,AL,AR" COM "64-bit subtraction of constant\n"
846 		"	rsc  U1,UL,AR\n", },
847 
848 { MINUS,	INBREG,
849 	SBREG,	TLONGLONG|TULONGLONG,
850 	SBREG,	TLONGLONG|TULONGLONG,
851 		NBREG|NBSL,	RESC1,
852 		"	subs A1,AL,AR" COM "64-bit subtraction\n"
853 		"	sbc  U1,UL,AR\n", },
854 
855 { MINUS,	INCREG | FEATURE_FPA,
856 	SCREG,	TFLOAT,
857 	SCREG,	TFLOAT,
858 		NCREG,	RESC1,
859 		"	sufs A1,AL,AR" COM "float subtraction\n", },
860 
861 { MINUS,	INCREG | FEATURE_VFP,
862 	SCREG,	TFLOAT,
863 	SCREG,	TFLOAT,
864 		NCREG,	RESC1,
865 		"	fsubs A1,AL,AR" COM "float subtraction\n", },
866 
867 { MINUS,	INAREG,
868 	SAREG,	TFLOAT,
869 	SAREG,	TFLOAT,
870 		NSPECIAL|NAREG,	RESC1,
871 		"ZF", },
872 
873 { MINUS,	INCREG | FEATURE_FPA,
874 	SCREG,	TDOUBLE,
875 	SCREG,	TDOUBLE,
876 		NCREG,	RESC1,
877 		"	sufd A1,AL,AR" COM "double subtraction\n", },
878 
879 { MINUS,	INCREG | FEATURE_VFP,
880 	SCREG,	TDOUBLE,
881 	SCREG,	TDOUBLE,
882 		NCREG,	RESC1,
883 		"	fsubd A1,AL,AR" COM "double subtraction\n", },
884 
885 { MINUS,	INBREG,
886 	SBREG,	TDOUBLE,
887 	SBREG,	TDOUBLE,
888 		NSPECIAL|NBREG,	RESC1,
889 		"ZF", },
890 
891 { MINUS,	INCREG | FEATURE_FPA,
892 	SCREG,	TLDOUBLE,
893 	SCREG,	TLDOUBLE,
894 		NCREG,	RESC1,
895 		"	sufe A1,AL,AR" COM "ldouble subtraction\n", },
896 
897 { MINUS,	INCREG | FEATURE_VFP,
898 	SCREG,	TLDOUBLE,
899 	SCREG,	TLDOUBLE,
900 		NCREG,	RESC1,
901 		"	fsubd A1,AL,AR" COM "double subtraction\n", },
902 
903 { MINUS,	INBREG,
904 	SBREG,	TLDOUBLE,
905 	SBREG,	TLDOUBLE,
906 		NSPECIAL|NBREG,	RESC1,
907 		"ZF", },
908 
909 /*
910  * The next rules handle all shift operators.
911  */
912 
913 { LS,	INAREG,
914 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
915 	SAREG,	TANY,
916 		NAREG|NASL,	RESC1,
917 		"	mov A1,AL,asl AR" COM "left shift\n", },
918 
919 { LS,	INAREG,
920 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
921 	SCCON,	TANY,
922 		NAREG|NASL,	RESC1,
923 		"	mov A1,AL,asl AR" COM "left shift by constant\n", },
924 
925 { LS,	INBREG,
926 	SBREG,	TLONGLONG|TULONGLONG,
927 	SCON,	TANY,
928 		NBREG,	RESC1,
929 		"ZO" },
930 
931 { LS,	INBREG,
932 	SBREG,	TLONGLONG|TULONGLONG,
933 	SAREG,	TANY,
934 		NSPECIAL|NBREG,	RESC1,
935 		"ZE" },
936 
937 { RS,	INAREG,
938 	SAREG,	TSWORD|TSHORT|TCHAR,
939 	SAREG,	TANY,
940 		NAREG|NASL,	RESC1,
941 		"	mov A1,AL,asr AR" COM "right shift\n", },
942 
943 { RS,	INAREG,
944 	SAREG,	TUWORD|TUSHORT|TUCHAR,
945 	SAREG,	TANY,
946 		NAREG|NASL,	RESC1,
947 		"	mov A1,AL,lsr AR" COM "right shift\n", },
948 
949 { RS,	INAREG,
950 	SAREG,	TSWORD|TSHORT|TCHAR,
951 	SCCON,	TANY,
952 		NAREG|NASL,	RESC1,
953 		"	mov A1,AL,asr AR" COM "right shift by constant\n", },
954 
955 { RS,	INAREG,
956 	SAREG,	TUWORD|TUSHORT|TUCHAR,
957 	SCCON,	TANY,
958 		NAREG|NASL,	RESC1,
959 		"	mov A1,AL,lsr AR" COM "right shift by constant\n", },
960 
961 { RS,	INBREG,
962 	SBREG,	TLONGLONG|TULONGLONG,
963 	SCON,	TANY,
964 		NBREG,	RESC1,
965 		"ZO" },
966 
967 { RS,	INBREG,
968 	SBREG,	TLONGLONG|TULONGLONG,
969 	SAREG,	TANY,
970 		NSPECIAL|NBREG,	RESC1,
971 		"ZE" },
972 
973 
974 /*
975  * The next rules takes care of assignments. "=".
976  */
977 
978 { ASSIGN,	FOREFF|INAREG,
979 	SOREG|SNAME,	TWORD|TPOINT,
980 	SAREG,		TWORD|TPOINT,
981 		0,	RDEST,
982 		"	str AR,AL" COM "assign word\n", },
983 
984 { ASSIGN,	FOREFF|INBREG,
985 	SOREG|SNAME,	TLONGLONG|TULONGLONG,
986 	SBREG,		TLONGLONG|TULONGLONG,
987 		0,	RDEST,
988 		"	str AR,AL" COM "assign 64-bit value\n"
989 		"	str UR,UL\n", },
990 
991 /* XXX don't know if this works */
992 { ASSIGN,	FOREFF|INBREG,
993 	SAREG,		TPTRTO|TLONGLONG|TULONGLONG,
994 	SBREG,		TLONGLONG|TULONGLONG,
995 		0,	RDEST,
996 		"	stmdb AL,{AR-UR}" COM "assign 64-bit value\n", },
997 
998 { ASSIGN,	FOREFF|INAREG,
999 	SOREG|SNAME,	TCHAR|TUCHAR,
1000 	SAREG,		TCHAR|TUCHAR,
1001 		0,	RDEST,
1002 		"	strb AR,AL" COM "assign (u)char\n", },
1003 
1004 { ASSIGN,	FOREFF|INAREG | FEATURE_HALFWORDS,
1005 	SOREG|SNAME,	TSHORT|TUSHORT,
1006 	SAREG,		TSHORT|TUSHORT,
1007 		0,	RDEST,
1008 		"	strh AR,AL" COM "assign (u)short\n", },
1009 
1010 { ASSIGN,	FOREFF|INAREG,
1011 	SOREG|SNAME,	TSHORT|TUSHORT,
1012 	SAREG,		TSHORT|TUSHORT,
1013 		NAREG|NASL,	RDEST,
1014 		"ZH", },
1015 
1016 { ASSIGN, 	FOREFF|INCREG | FEATURE_FPA,
1017 	SOREG|SNAME,	TFLOAT,
1018 	SCREG,		TFLOAT,
1019 		0,	RDEST,
1020 		"	stfs AR,AL" COM "assign float\n", },
1021 
1022 { ASSIGN, 	FOREFF|INCREG | FEATURE_VFP,
1023 	SOREG|SNAME,	TFLOAT,
1024 	SCREG,		TFLOAT,
1025 		0,	RDEST,
1026 		COM "unimplemented\n", },
1027 
1028 { ASSIGN, 	FOREFF|INAREG,
1029 	SOREG|SNAME,	TFLOAT,
1030 	SAREG,		TFLOAT,
1031 		0,	RDEST,
1032 		"	str AR,AL" COM "assign float (soft-float)\n", },
1033 
1034 { ASSIGN, 	FOREFF|INCREG | FEATURE_FPA,
1035 	SOREG|SNAME,	TDOUBLE,
1036 	SCREG,		TDOUBLE,
1037 		0,	RDEST,
1038 		"	stfd AR,AL" COM "assign double\n", },
1039 
1040 { ASSIGN, 	FOREFF|INCREG | FEATURE_VFP,
1041 	SOREG|SNAME,	TDOUBLE,
1042 	SCREG,		TDOUBLE,
1043 		0,	RDEST,
1044 		COM "unimplemented\n", },
1045 
1046 { ASSIGN, 	FOREFF|INBREG,
1047 	SOREG|SNAME,	TDOUBLE,
1048 	SBREG,		TDOUBLE,
1049 		0,	RDEST,
1050 		"	str AR,AL" COM "assign double (soft-float)\n"
1051 		"	str UR,UL\n", },
1052 
1053 { ASSIGN, 	FOREFF|INCREG | FEATURE_FPA,
1054 	SOREG|SNAME,	TLDOUBLE,
1055 	SCREG,		TLDOUBLE,
1056 		0,	RDEST,
1057 		"	stfe AR,AL" COM "assign ldouble\n", },
1058 
1059 { ASSIGN, 	FOREFF|INCREG | FEATURE_VFP,
1060 	SOREG|SNAME,	TLDOUBLE,
1061 	SCREG,		TLDOUBLE,
1062 		0,	RDEST,
1063 		COM "not implemented", },
1064 
1065 { ASSIGN, 	FOREFF|INBREG,
1066 	SOREG|SNAME,	TLDOUBLE,
1067 	SBREG,		TLDOUBLE,
1068 		0,	RDEST,
1069 		"	str AR,AL" COM "assign ldouble (soft-float)\n"
1070 		"	str UR,UL\n", },
1071 
1072 /* assign register to register */
1073 { ASSIGN,	FOREFF|INAREG,
1074 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1075 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1076 		0,	RDEST,
1077 		"	mov AL,AR" COM "assign AR to AL\n", },
1078 
1079 { ASSIGN,      FOREFF|INBREG,
1080         SBREG,	TLONGLONG|TULONGLONG,
1081         SBREG,	TLONGLONG|TULONGLONG,
1082                 0,	RDEST,
1083 		"	mov AL,AR" COM "assign UR:AR to UL:AL\n"
1084                 "	mov UL,UR\n", },
1085 
1086 { ASSIGN,	FOREFF|INCREG | FEATURE_FPA,
1087 	SCREG,	TFLOAT,
1088 	SCREG,	TFLOAT,
1089 		0,	RDEST,
1090 		"	mvf AL,AR" COM "assign float reg to float reg\n", },
1091 
1092 { ASSIGN,	FOREFF|INCREG | FEATURE_VFP,
1093 	SCREG,	TFLOAT,
1094 	SCREG,	TFLOAT,
1095 		0,	RDEST,
1096 		"	fcpys AL,AR" COM "assign float reg to float reg\n", },
1097 
1098 { ASSIGN,	FOREFF|INAREG,
1099 	SAREG,	TFLOAT,
1100 	SAREG,	TFLOAT,
1101 		0,	RDEST,
1102 		"	mov AL,AR" COM "assign float reg to float reg\n", },
1103 
1104 { ASSIGN,	FOREFF|INCREG | FEATURE_FPA,
1105 	SCREG,	TDOUBLE|TLDOUBLE,
1106 	SCREG,	TDOUBLE|TLDOUBLE,
1107 		0,	RDEST,
1108 		"	mvf AL,AR" COM "assign float reg to float reg\n", },
1109 
1110 { ASSIGN,	FOREFF|INCREG | FEATURE_VFP,
1111 	SCREG,	TDOUBLE|TLDOUBLE,
1112 	SCREG,	TDOUBLE|TLDOUBLE,
1113 		0,	RDEST,
1114 		"	fcpyd AL,AR" COM "assign float reg to float reg\n", },
1115 
1116 { ASSIGN,	FOREFF|INBREG,
1117 	SBREG,	TDOUBLE|TLDOUBLE,
1118 	SBREG,	TDOUBLE|TLDOUBLE,
1119 		0,	RDEST,
1120 		"	mov AL,AR" COM "assign (l)double reg to (l)double reg\n"
1121 		"	mov UL,UR\n", },
1122 
1123 { ASSIGN,	FOREFF|INAREG,
1124 	SFLD,		TANY,
1125 	SOREG|SNAME,	TANY,
1126 		3*NAREG,	RDEST,
1127 		"	ldr A1,AR" COM "bit-field assignment\n"
1128 		"	ldr A2,AL\n"
1129 		"	ldr A3,=M\n"
1130 		"	mov A1,A1,asl H\n"
1131 		"	and A1,A1,A3\n"
1132 		"	bic A2,A2,A3\n"
1133 		"	orr A3,A2,A1\n"
1134 		"	str A3,AL\n"
1135 		"F	ldr AD,AR\n"
1136 		"FZB", },
1137 
1138 { ASSIGN,	FOREFF|INAREG,
1139 	SFLD,	TANY,
1140 	SAREG,	TANY,
1141 		3*NAREG,	RDEST,
1142 		"	ldr A2,AL" COM "bit-field assignment\n"
1143 		"	ldr A3,=M\n"
1144 		"	mov A1,AR,asl H\n"
1145 		"	and A1,A1,A3\n"
1146 		"	bic A2,A2,A3\n"
1147 		"	orr A3,A2,A1\n"
1148 		"	str A3,AL\n"
1149 		"F	mov AD,AR\n"
1150 		"FZB", },
1151 
1152 { STASG,	INAREG|FOREFF,
1153 	SOREG|SNAME,	TANY,
1154 	SAREG,		TPTRTO|TANY,
1155 		NSPECIAL,	RRIGHT,
1156 		"ZQ", },
1157 
1158 /*
1159  * DIV/MOD/MUL
1160  */
1161 
1162 { DIV,	INAREG,
1163 	SAREG,	TWORD,
1164 	SAREG,	TWORD,
1165 		NSPECIAL|NAREG|NASL,	RESC1,
1166 		"ZE", },
1167 
1168 { DIV,	INBREG,
1169 	SBREG,	TLONGLONG|TULONGLONG,
1170 	SBREG,	TLONGLONG|TULONGLONG,
1171 		NSPECIAL|NBREG|NBSL,	RESC1,
1172 		"ZE", },
1173 
1174 { DIV,	INCREG | FEATURE_FPA,
1175 	SCREG,		TFLOAT,
1176 	SCREG,		TFLOAT,
1177 		NCREG,	RESC1,
1178 		"	dvfs A1,AL,AL" COM "fast (float) divide\n", },
1179 
1180 { DIV,	INCREG | FEATURE_VFP,
1181 	SCREG,		TFLOAT,
1182 	SCREG,		TFLOAT,
1183 		NCREG,	RESC1,
1184 		"	fdivs A1,AL,AL" COM "fast (float) divide\n", },
1185 
1186 { DIV,	INAREG,
1187 	SAREG,		TFLOAT,
1188 	SAREG,		TFLOAT,
1189 		NSPECIAL|NAREG,	RESC1,
1190 		"ZF", },
1191 
1192 { DIV,	INCREG | FEATURE_FPA,
1193 	SCREG,		TDOUBLE,
1194 	SCREG,		TDOUBLE,
1195 		NCREG,	RESC1,
1196 		"	dvfd A1,AL,AL" COM "double divide\n", },
1197 
1198 { DIV,	INCREG | FEATURE_VFP,
1199 	SCREG,		TDOUBLE,
1200 	SCREG,		TDOUBLE,
1201 		NCREG,	RESC1,
1202 		"	fdivd A1,AL,AL" COM "double divide\n", },
1203 
1204 { DIV,	INBREG,
1205 	SBREG,		TDOUBLE,
1206 	SBREG,		TDOUBLE,
1207 		NSPECIAL|NBREG,	RESC1,
1208 		"ZF", },
1209 
1210 { DIV,	INCREG | FEATURE_FPA,
1211 	SCREG,		TLDOUBLE,
1212 	SCREG,		TLDOUBLE,
1213 		NCREG,	RESC1,
1214 		"	dvfe A1,AL,AR" COM "long double load\n", },
1215 
1216 { DIV,	INCREG | FEATURE_VFP,
1217 	SCREG,		TLDOUBLE,
1218 	SCREG,		TLDOUBLE,
1219 		NCREG,	RESC1,
1220 		"	fdivd A1,AL,AL" COM "double divide\n", },
1221 
1222 { DIV,	INBREG,
1223 	SBREG,		TLDOUBLE,
1224 	SBREG,		TLDOUBLE,
1225 		NSPECIAL|NBREG,	RESC1,
1226 		"ZF", },
1227 
1228 { MOD,	INAREG,
1229 	SAREG,	TWORD,
1230 	SAREG,	TWORD,
1231 		NSPECIAL|NAREG,	RESC1,
1232 		"ZE", },
1233 
1234 { MOD,	INBREG,
1235 	SBREG,	TLONGLONG|TULONGLONG,
1236 	SBREG,	TLONGLONG|TULONGLONG,
1237 		NSPECIAL|NBREG,	RESC1,
1238 		"ZE", },
1239 
1240 { MUL,	INAREG | FEATURE_MUL,
1241 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1242 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1243 		NAREG,	RESC1,
1244 		"	mul A1,AL,AR\n", },
1245 
1246 { MUL,	INAREG,
1247 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1248 	SAREG,		TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1249 		NSPECIAL|NAREG,	RESC1,
1250 		"ZE", },
1251 
1252 { MUL,	INBREG | FEATURE_MULL,
1253 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1254 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1255 		NBREG,	RESC1,
1256 		"	smull U1,A1,AL,AR\n", },
1257 
1258 { MUL,	INBREG | FEATURE_MUL,
1259 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1260 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1261 		NBREG,	RESC1,
1262 		"	mul A1,AL,AR\n"
1263 		"	mov U1,A1,asr #31\n", },
1264 
1265 { MUL,	INBREG,
1266 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1267 	SAREG,		TUWORD|TPOINT|TUSHORT|TUCHAR,
1268 		NSPECIAL|NBREG,	RESC1,
1269 		"ZE", },
1270 
1271 { MUL,	INBREG | FEATURE_MULL,
1272 	SAREG,		TSWORD|TSHORT|TCHAR,
1273 	SAREG,		TSWORD|TSHORT|TCHAR,
1274 		NBREG,	RESC1,
1275 		"	umull U1,A1,AL,AR\n", },
1276 
1277 { MUL,	INBREG | FEATURE_MUL,
1278 	SAREG,		TSWORD|TSHORT|TCHAR,
1279 	SAREG,		TSWORD|TSHORT|TCHAR,
1280 		NBREG,	RESC1,
1281 		"	mul A1,AL,AR\n"
1282 		"	mov U1,#0\n", },
1283 
1284 { MUL,	INBREG,
1285 	SAREG,		TSWORD|TSHORT|TCHAR,
1286 	SAREG,		TSWORD|TSHORT|TCHAR,
1287 		NSPECIAL|NBREG,	RESC1,
1288 		"ZE", },
1289 
1290 { MUL,	INBREG | FEATURE_MULL,
1291 	SBREG,		TLONGLONG|TULONGLONG,
1292 	SBREG,		TLONGLONG|TULONGLONG,
1293 		NBREG,	RESC1,
1294 		"	umull U1,A1,AL,AR\n", },
1295 
1296 { MUL,	INBREG | FEATURE_MUL,
1297 	SBREG,		TLONGLONG|TULONGLONG,
1298 	SBREG,		TLONGLONG|TULONGLONG,
1299 		NBREG,	RESC1,
1300 		"	mul A1,AL,AR\n"
1301 		"	mov U1,A1,asr #31\n", },
1302 
1303 { MUL,	INBREG,
1304 	SBREG,		TLONGLONG|TULONGLONG,
1305 	SBREG,		TLONGLONG|TULONGLONG,
1306 		NSPECIAL|NBREG,	RESC1,
1307 		"ZE", },
1308 
1309 { MUL,	INCREG | FEATURE_FPA,
1310 	SCREG,		TFLOAT,
1311 	SCREG,		TFLOAT,
1312 		NCREG,	RESC1,
1313 		"	fmls A1,AL,AL" COM "fast (float) multiply\n", },
1314 
1315 { MUL,	INCREG | FEATURE_VFP,
1316 	SCREG,		TFLOAT,
1317 	SCREG,		TFLOAT,
1318 		NCREG,	RESC1,
1319 		"	fmuls A1,AL,AL" COM "float multiply\n", },
1320 
1321 { MUL,	INAREG,
1322 	SAREG,		TFLOAT,
1323 	SAREG,		TFLOAT,
1324 		NSPECIAL|NAREG,	RESC1,
1325 		"ZF", },
1326 
1327 { MUL,	INCREG | FEATURE_FPA,
1328 	SCREG,		TDOUBLE|TLDOUBLE,
1329 	SCREG,		TDOUBLE|TLDOUBLE,
1330 		NCREG,	RESC1,
1331 		"	mufd A1,AL,AL" COM "fast (l)double multiply\n", },
1332 
1333 { MUL,	INCREG | FEATURE_VFP,
1334 	SCREG,		TDOUBLE|TLDOUBLE,
1335 	SCREG,		TDOUBLE|TLDOUBLE,
1336 		NCREG,	RESC1,
1337 		"	muld A1,AL,AL" COM "(l)double multiply\n", },
1338 
1339 { MUL,	INBREG,
1340 	SBREG,		TDOUBLE|TLDOUBLE,
1341 	SBREG,		TDOUBLE|TLDOUBLE,
1342 		NSPECIAL|NBREG,	RESC1,
1343 		"ZF", },
1344 
1345 /*
1346  * Indirection operators.
1347  */
1348 
1349 { UMUL,	INAREG,
1350 	SANY,		TANY,
1351 	SOREG|SNAME,	TWORD|TPOINT,
1352 		NAREG,	RESC1,
1353 		"	ldr A1,AL" COM "word load\n", },
1354 
1355 { UMUL,	INAREG,
1356 	SANY,		TANY,
1357 	SOREG|SNAME,	TCHAR,
1358 		NAREG,	RESC1,
1359 		"	ldrsb A1,AL" COM "char load\n", },
1360 
1361 { UMUL,	INAREG,
1362 	SANY,		TANY,
1363 	SOREG|SNAME,	TUCHAR,
1364 		NAREG,	RESC1,
1365 		"	ldrb A1,AL" COM "uchar load\n", },
1366 
1367 { UMUL,	INAREG | FEATURE_HALFWORDS,
1368 	SANY,		TANY,
1369 	SOREG|SNAME,	TUSHORT,
1370 		NAREG,	RESC1,
1371 		"	ldrh A1,AL" COM "short load\n", },
1372 
1373 { UMUL,	INAREG | FEATURE_HALFWORDS,
1374 	SANY,		TANY,
1375 	SOREG|SNAME,	TSHORT,
1376 		NAREG,	RESC1,
1377 		"	ldrsh A1,AL" COM "short load\n", },
1378 
1379 { UMUL,	INAREG,
1380 	SANY,		TANY,
1381 	SOREG|SNAME,	TSHORT|TUSHORT,
1382 		2*NAREG|NASL,	RESC1,
1383 		"ZH", },
1384 
1385 { UMUL, INBREG,
1386 	SANY,		TANY,
1387 	SOREG|SNAME,	TLONGLONG|TULONGLONG,
1388 		NBREG,	RESC1,
1389 		"	ldr A1,AL" COM "64-bit load\n"
1390 		"	ldr U1,UL\n", },
1391 
1392 { UMUL, INCREG | FEATURE_FPA,
1393 	SANY,		TANY,
1394 	SOREG|SNAME,	TFLOAT,
1395 		NCREG,	RESC1,
1396 		"	ldfs A1,AL" COM "float load\n", },
1397 
1398 { UMUL, INCREG | FEATURE_VFP,
1399 	SANY,		TANY,
1400 	SOREG|SNAME,	TFLOAT,
1401 		NCREG,	RESC1,
1402 		COM "not implemented\n", },
1403 
1404 { UMUL, INAREG,
1405 	SANY,		TANY,
1406 	SOREG|SNAME,	TFLOAT,
1407 		NAREG,	RESC1,
1408 		"	ldr A1,AL" COM "float load\n", },
1409 
1410 { UMUL, INCREG | FEATURE_FPA,
1411 	SANY,		TANY,
1412 	SOREG|SNAME,	TDOUBLE,
1413 		NCREG,	RESC1,
1414 		"	ldfd A1,AL" COM "double load\n", },
1415 
1416 { UMUL, INCREG | FEATURE_VFP,
1417 	SANY,		TANY,
1418 	SOREG|SNAME,	TDOUBLE,
1419 		NCREG,	RESC1,
1420 		COM "not implemented\n", },
1421 
1422 { UMUL, INBREG,
1423 	SANY,		TANY,
1424 	SOREG|SNAME,	TDOUBLE,
1425 		NBREG,	RESC1,
1426 		"	ldr A1,AL" COM "double load\n"
1427 		"	ldr U1,UL\n", },
1428 
1429 { UMUL, INCREG | FEATURE_FPA,
1430 	SANY,		TANY,
1431 	SOREG|SNAME,	TLDOUBLE,
1432 		NCREG,	RESC1,
1433 		"	ldfe A1,AL" COM "long double load\n", },
1434 
1435 { UMUL, INCREG | FEATURE_VFP,
1436 	SANY,		TANY,
1437 	SOREG|SNAME,	TLDOUBLE,
1438 		NCREG,	RESC1,
1439 		COM "not implemented\n", },
1440 
1441 { UMUL, INBREG,
1442 	SANY,		TANY,
1443 	SOREG|SNAME,	TLDOUBLE,
1444 		NBREG,	RESC1,
1445 		"	ldr A1,AL" COM "long double load (soft-float)\n"
1446 		"	ldr U1,UL\n", },
1447 
1448 /*
1449  * Logical/branching operators
1450  */
1451 
1452 /* compare with register */
1453 { OPLOG,	FORCC,
1454 	SAREG,	TSWORD|TSHORT|TCHAR,
1455 	SAREG,	TSWORD|TSHORT|TCHAR,
1456 		0, 	RESCC,
1457 		"	cmp AL,AR" COM "AR-AL (sets flags)\n", },
1458 
1459 /* compare with register */
1460 { OPLOG,	FORCC,
1461 	SAREG,	TUWORD|TPOINT|TUSHORT|TUCHAR,
1462 	SAREG,	TUWORD|TPOINT|TUSHORT|TUCHAR,
1463 		0, 	RESCC,
1464 		"	cmp AL,AR" COM "AR-AL (sets flags)\n", },
1465 
1466 /* compare with register */
1467 { OPLOG,	FORCC,
1468 	SBREG,	TLONGLONG|TULONGLONG,
1469 	SBREG,	TLONGLONG|TULONGLONG,
1470 		0, 	RESCC,
1471 		"ZD", },
1472 
1473 { OPLOG,	FORCC | FEATURE_FPA,
1474 	SCREG,	TFLOAT,
1475 	SCREG,	TFLOAT,
1476 		NSPECIAL,	RESCC,
1477 		"	cmfs AL,AR" COM "float compare\n", },
1478 
1479 { OPLOG,	FORCC | FEATURE_VFP,
1480 	SCREG,	TFLOAT,
1481 	SCREG,	TFLOAT,
1482 		0,	RESCC,
1483 		"	fcmps AL,AR" COM "float compare\n", },
1484 
1485 { OPLOG,	FORCC,
1486 	SAREG,	TFLOAT,
1487 	SAREG,	TFLOAT,
1488 		NSPECIAL,	RESCC,
1489 		"ZF", },
1490 
1491 { OPLOG,	FORCC | FEATURE_FPA,
1492 	SCREG,	TDOUBLE,
1493 	SCREG,	TDOUBLE,
1494 		NSPECIAL,	RESCC,
1495 		"	cmfd AL,AR" COM "double compare\n", },
1496 
1497 { OPLOG,	FORCC | FEATURE_VFP,
1498 	SCREG,	TDOUBLE,
1499 	SCREG,	TDOUBLE,
1500 		0,	RESCC,
1501 		"	fcmpd AL,AR" COM "double compare\n", },
1502 
1503 { OPLOG,	FORCC,
1504 	SBREG,	TDOUBLE,
1505 	SBREG,	TDOUBLE,
1506 		NSPECIAL,	RESCC,
1507 		"ZF", },
1508 
1509 { OPLOG,	FORCC | FEATURE_FPA,
1510 	SCREG,	TLDOUBLE,
1511 	SCREG,	TLDOUBLE,
1512 		NSPECIAL,	RESCC,
1513 		"	cmfe AL,AR" COM "ldouble compare\n", },
1514 
1515 { OPLOG,	FORCC | FEATURE_VFP,
1516 	SCREG,	TLDOUBLE,
1517 	SCREG,	TLDOUBLE,
1518 		0,	RESCC,
1519 		"	fcmpd AL,AR" COM "double compare\n", },
1520 
1521 { OPLOG,	FORCC,
1522 	SBREG,	TLDOUBLE,
1523 	SBREG,	TLDOUBLE,
1524 		NSPECIAL,	RESCC,
1525 		"ZF", },
1526 
1527 /* AND/OR/ER */
1528 { AND,	INBREG,
1529 	SBREG,	TLONGLONG|TULONGLONG,
1530 	SBREG,	TLONGLONG|TULONGLONG,
1531 		NBREG|NBSL,	RESC1|RESCC,
1532 		"	and A1,AL,AR" COM "64-bit and\n"
1533 		"	and U1,UL,UR\n", },
1534 
1535 { OR,	INBREG,
1536 	SBREG,	TLONGLONG|TULONGLONG,
1537 	SBREG,	TLONGLONG|TULONGLONG,
1538 		NBREG|NBSL,	RESC1,
1539 		"	orr A1,AL,AR" COM "64-bit or\n"
1540 		"	orr U1,UL,UR\n" },
1541 
1542 { ER,	INBREG,
1543 	SBREG,	TLONGLONG|TULONGLONG,
1544 	SBREG,	TLONGLONG|TULONGLONG,
1545 		NBREG|NBSL,	RESC1,
1546 		"	eor A1,AL,AR" COM "64-bit xor\n"
1547 		"	eor U1,UL,UR\n" },
1548 
1549 { OPSIMP,	INAREG,
1550 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1551 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1552 		NAREG|NASL,	RESC1|RESCC,
1553 		"	O A1,AL,AR\n", },
1554 
1555 { OPSIMP,	INAREG|FORCC,
1556 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1557 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1558 		NAREG|NASL,	RESC1,
1559 		"	Os A1,AL,AR\n", },
1560 
1561 
1562 /*
1563  * Jumps.
1564  */
1565 { GOTO, 	FOREFF,
1566 	SCON,	TANY,
1567 	SANY,	TANY,
1568 		0,	RNOP,
1569 		"	b LL\n", },
1570 
1571 #if 0
1572 { GOTO, 	FOREFF,
1573 	SAREG,	TANY,
1574 	SANY,	TANY,
1575 		0,	RNOP,
1576 		"	mov pc,AL\n", },
1577 #endif
1578 
1579 /*
1580  * Convert LTYPE to reg.
1581  */
1582 
1583 { OPLTYPE,	INAREG,
1584 	SANY,		TANY,
1585 	SOREG|SNAME,	TWORD|TPOINT,
1586 		NAREG,	RESC1,
1587 		"	ldr A1,AL" COM "load word from memory\n", },
1588 
1589 { OPLTYPE,      INBREG,
1590         SANY,   	TANY,
1591         SOREG|SNAME,	TLONGLONG|TULONGLONG,
1592                 NBREG,  RESC1,
1593                 "	ldr A1,AL" COM "load long long from memory\n"
1594 		"	ldr U1,UL\n", },
1595 
1596 { OPLTYPE,	INAREG,
1597 	SANY,		TANY,
1598 	SOREG|SNAME,	TCHAR,
1599 		NAREG,	RESC1,
1600 		"	ldrsb A1,AL" COM "load char from memory\n" },
1601 
1602 { OPLTYPE,	INAREG,
1603 	SANY,		TANY,
1604 	SOREG|SNAME,	TUCHAR,
1605 		NAREG,	RESC1,
1606 		"	ldrb A1,AL" COM "load uchar from memory\n", },
1607 
1608 { OPLTYPE,	INAREG | FEATURE_HALFWORDS,
1609 	SANY,		TANY,
1610 	SOREG|SNAME,	TSHORT,
1611 		NAREG,	RESC1,
1612 		"	ldrsh A1,AL" COM "load short from memory\n", },
1613 
1614 { OPLTYPE,	INAREG | FEATURE_HALFWORDS,
1615 	SANY,		TANY,
1616 	SOREG|SNAME,	TUSHORT,
1617 		NAREG,	RESC1,
1618 		"	ldrh A1,AL" COM "load ushort from memory\n", },
1619 
1620 { OPLTYPE,	INAREG,
1621 	SANY,		TANY,
1622 	SOREG|SNAME,	TSHORT|TUSHORT,
1623 		2*NAREG,	RESC1,
1624 		"ZH", },
1625 
1626 #if 0
1627 { OPLTYPE,	INAREG,
1628 	SANY,		TANY,
1629 	SCON,		TPOINT,
1630 		NAREG,	RESC1,
1631 		"	ldr A1,AL" COM "load integer constant\n", },
1632 #endif
1633 
1634 { OPLTYPE,	INAREG,
1635 	SANY,		TANY,
1636 	SCON,		TANY,
1637 		NAREG,	RESC1,
1638 		"ZI", },
1639 
1640 { OPLTYPE,	INBREG,
1641 	SANY,	TANY,
1642 	SCON,	TANY,
1643 		NBREG,	RESC1,
1644 		"ZJ", },
1645 
1646 { OPLTYPE,	INAREG,
1647 	SANY,	TANY,
1648 	SAREG,	TANY,
1649 		NAREG,	RESC1,
1650 		"	mov A1,AL" COM "load AL into A1\n" },
1651 
1652 { OPLTYPE,      INBREG,
1653         SANY,   TANY,
1654         SBREG,	TLONGLONG|TULONGLONG,
1655                 NBREG,  RESC1,
1656 		"	mov A1,AL" COM "load UL:AL into U1:A1\n"
1657                 "       mov U1,UL\n", },
1658 
1659 { OPLTYPE,	INCREG | FEATURE_FPA,
1660 	SANY,		TANY,
1661 	SOREG|SNAME,	TFLOAT,
1662 		NCREG,	RESC1,
1663 		"	ldfs A1,AL" COM "load float\n", },
1664 
1665 { OPLTYPE,	INCREG | FEATURE_VFP,
1666 	SANY,		TANY,
1667 	SOREG|SNAME,	TFLOAT,
1668 		NCREG,	RESC1,
1669 		COM "not implemented\n", },
1670 
1671 { OPLTYPE,	INAREG,
1672 	SANY,		TANY,
1673 	SOREG|SNAME,	TFLOAT,
1674 		NAREG,	RESC1,
1675 		"	ldr A1,AL" COM "load float (soft-float)\n", },
1676 
1677 { OPLTYPE,	INCREG | FEATURE_FPA,
1678 	SANY,		TANY,
1679 	SOREG|SNAME,	TDOUBLE,
1680 		NCREG,	RESC1,
1681 		"	ldfd A1,AL" COM "load double\n", },
1682 
1683 { OPLTYPE,	INCREG | FEATURE_VFP,
1684 	SANY,		TANY,
1685 	SOREG|SNAME,	TDOUBLE,
1686 		NCREG,	RESC1,
1687 		COM "not implemented\n" },
1688 
1689 { OPLTYPE,	INBREG,
1690 	SANY,		TANY,
1691 	SOREG|SNAME,	TDOUBLE,
1692 		NBREG,	RESC1,
1693 		"	ldr A1,AL" COM "load double (soft-float)\n"
1694 		"	ldr U1,UL\n", },
1695 
1696 { OPLTYPE,	INCREG | FEATURE_FPA,
1697 	SANY,		TANY,
1698 	SOREG|SNAME,	TLDOUBLE,
1699 		NCREG,	RESC1,
1700 		"	ldfe A1,AL" COM "load ldouble\n", },
1701 
1702 { OPLTYPE,	INCREG | FEATURE_VFP,
1703 	SANY,		TANY,
1704 	SOREG|SNAME,	TLDOUBLE,
1705 		NCREG,	RESC1,
1706 		COM "not implemented\n", },
1707 
1708 { OPLTYPE,	INBREG,
1709 	SANY,		TANY,
1710 	SOREG|SNAME,	TLDOUBLE,
1711 		NBREG,	RESC1,
1712 		"	ldr A1,AL" COM "load ldouble (soft-float)\n"
1713 		"	ldr U1,UL\n", },
1714 
1715 /*
1716  * Negate a word.
1717  */
1718 
1719 { UMINUS,	INAREG,
1720 	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1721 	SAREG,	TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1722 		NAREG|NASL,	RESC1,
1723 		"	rsb A1,AL,#0" COM "negation\n", },
1724 
1725 { UMINUS,	INBREG,
1726 	SBREG,	TLONGLONG|TULONGLONG,
1727 	SBREG,	TLONGLONG|TULONGLONG,
1728 		NBREG|NBSL,	RESC1,
1729 		"	rsbs A1,AL,#0" COM "64-bit negation\n"
1730 		"	rsc U1,UL,#0\n", },
1731 
1732 { UMINUS,	INCREG | FEATURE_FPA,
1733 	SCREG,	TFLOAT,
1734 	SCREG,	TFLOAT,
1735 		NCREG,	RESC1,
1736 		"	mvfs A1,AL" COM "float negation\n", },
1737 
1738 { UMINUS,	INCREG | FEATURE_VFP,
1739 	SCREG,	TFLOAT,
1740 	SCREG,	TFLOAT,
1741 		NCREG,	RESC1,
1742 		"	negs A1,AL" COM "float negation\n", },
1743 
1744 { UMINUS,	INAREG,
1745 	SAREG,	TFLOAT,
1746 	SAREG,	TFLOAT,
1747 		NSPECIAL|NAREG,	RESC1,
1748 		"ZF", },
1749 
1750 { UMINUS,	INCREG | FEATURE_FPA,
1751 	SCREG,	TDOUBLE,
1752 	SCREG,	TDOUBLE,
1753 		NCREG,	RESC1,
1754 		"	mvfd A1,AL" COM "double negation\n", },
1755 
1756 { UMINUS,	INCREG | FEATURE_VFP,
1757 	SCREG,	TDOUBLE,
1758 	SCREG,	TDOUBLE,
1759 		NCREG,	RESC1,
1760 		"	negd A1,AL" COM "double negation\n", },
1761 
1762 { UMINUS,	INBREG,
1763 	SBREG,	TDOUBLE,
1764 	SBREG,	TDOUBLE,
1765 		NSPECIAL|NBREG,	RESC1,
1766 		"ZF", },
1767 
1768 { UMINUS,	INCREG | FEATURE_FPA,
1769 	SCREG,	TLDOUBLE,
1770 	SCREG,	TLDOUBLE,
1771 		NCREG,	RESC1,
1772 		"	mvfe A1,AL" COM "ldouble negation\n", },
1773 
1774 { UMINUS,	INCREG | FEATURE_VFP,
1775 	SCREG,	TLDOUBLE,
1776 	SCREG,	TLDOUBLE,
1777 		NCREG,	RESC1,
1778 		"	negd A1,AL" COM "ldouble negation\n", },
1779 
1780 { UMINUS,	INBREG,
1781 	SBREG,	TLDOUBLE,
1782 	SBREG,	TLDOUBLE,
1783 		NSPECIAL|NBREG,	RESC1,
1784 		"ZF", },
1785 
1786 { COMPL,	INAREG,
1787 	SAREG,	TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1788 	SANY,	TANY,
1789 		NAREG|NASL,	RESC1,
1790 		"	mvn A1,AL" COM "complement\n", },
1791 
1792 { COMPL,	INBREG,
1793 	SBREG,	TLONGLONG|TULONGLONG,
1794 	SANY,	TANY,
1795 		NBREG|NBSL,	RESC1,
1796 		"	mvn A1,AL" COM "64-bit complement\n"
1797 		"	mvn U1,UL\n", },
1798 
1799 /*
1800  * Arguments to functions.
1801  */
1802 
1803 { FUNARG,       FOREFF,
1804         SAREG,  TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1805         SANY,   TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1806                 0,      0,
1807 		"	stmfd sp!,{AL}" COM "save function arg to stack\n", },
1808 
1809 { FUNARG,       FOREFF,
1810         SBREG,  TLONGLONG|TULONGLONG,
1811         SANY,	TLONGLONG|TULONGLONG,
1812                 0,      0,
1813 		"	stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
1814 
1815 { FUNARG,	FOREFF,
1816 	SCREG,	TFLOAT,
1817 	SANY,	TFLOAT,
1818 		0,	0,
1819 		"	stmfd sp!,{AL}" COM "save function arg to stack\n", },
1820 
1821 { FUNARG,       FOREFF,
1822         SCREG,  TDOUBLE|TLDOUBLE,
1823         SANY,  TDOUBLE|TLDOUBLE,
1824                 0,      0,
1825 		"	stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
1826 
1827 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1828 
1829 { UMUL, DF( UMUL ), },
1830 
1831 { ASSIGN, DF(ASSIGN), },
1832 
1833 { STASG, DF(STASG), },
1834 
1835 { FLD, DF(FLD), },
1836 
1837 { OPLEAF, DF(NAME), },
1838 
1839 /* { INIT, DF(INIT), }, */
1840 
1841 { OPUNARY, DF(UMINUS), },
1842 
1843 { OPANY, DF(BITYPE), },
1844 
1845 { FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	FREE,	"help; I'm in trouble\n" },
1846 };
1847 
1848 int tablesize = sizeof(table)/sizeof(table[0]);
1849