* add p cc
[mascara-docs.git] / compilers / pcc / pcc-1.0.0 / arch / amd64 / table.c
blob757b602c0676679704274dc1efdb39a50c74c8bf
1 /* $Id: table.c,v 1.45 2011/02/18 17:08:31 ragge Exp $ */
2 /*
3 * Copyright (c) 2008 Michael Shalayeff
4 * Copyright (c) 2008 Anders Magnusson (ragge@ludd.ltu.se).
5 * All rights reserved.
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
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.
31 # include "pass2.h"
33 #define TLL TLONG|TULONG
34 # define ANYSIGNED TINT|TSHORT|TCHAR
35 # define ANYUSIGNED TUNSIGNED|TUSHORT|TUCHAR
36 # define ANYFIXED ANYSIGNED|ANYUSIGNED
37 # define TUWORD TUNSIGNED
38 # define TSWORD TINT
39 # define TWORD TUWORD|TSWORD
40 #define TANYINT TLL|ANYFIXED
41 #define SHINT SAREG /* Any integer */
42 #define ININT INAREG
43 #define SHFL SCREG /* shape for long double */
44 #define INFL INCREG /* shape for long double */
46 struct optab table[] = {
47 /* First entry must be an empty entry */
48 { -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
50 /* PCONVs are usually not necessary */
51 { PCONV, INAREG,
52 SAREG, TLL|TPOINT,
53 SAREG, TLL|TPOINT,
54 0, RLEFT,
55 "", },
57 { PCONV, INAREG,
58 SAREG|SOREG|SNAME, TUWORD,
59 SAREG, TPOINT,
60 NASL|NAREG, RESC1,
61 " movl AL,Z1\n", },/* amd64 zero-extends 32-bit movl */
65 * On amd64 casts from larger to smaller integer type in register do nothing.
67 /* 64-bit to smaller */
68 { SCONV, INAREG,
69 SAREG, TLL|TPOINT,
70 SAREG, TANYINT,
71 0, RLEFT,
72 "", },
74 /* 32-bit to smaller */
75 { SCONV, INAREG,
76 SAREG, TWORD,
77 SAREG, ANYFIXED,
78 0, RLEFT,
79 "", },
81 /* 16-bit to smaller */
82 { SCONV, INAREG,
83 SAREG, TSHORT|TUSHORT,
84 SAREG, TUSHORT|TUCHAR|TSHORT|TCHAR,
85 0, RLEFT,
86 "", },
88 /* 8-bit to 8-bit */
89 { SCONV, INAREG,
90 SAREG, TCHAR|TUCHAR,
91 SAREG, TUCHAR|TCHAR,
92 0, RLEFT,
93 "", },
96 * Casts from memory to same or smaller register is equally simple.
98 /* 64-bit to smaller */
99 { SCONV, INAREG,
100 SNAME|SOREG, TLL|TPOINT,
101 SAREG, TANYINT,
102 NAREG, RESC1,
103 " movZR AL,A1\n", },
105 /* 32-bit to smaller */
106 { SCONV, INAREG,
107 SNAME|SOREG, TWORD,
108 SAREG, ANYFIXED,
109 NAREG, RESC1,
110 " movZR AL,A1\n", },
112 /* 16-bit to smaller */
113 { SCONV, INAREG,
114 SNAME|SOREG, TSHORT|TUSHORT,
115 SAREG, TUSHORT|TUCHAR|TSHORT|TCHAR,
116 NAREG, RESC1,
117 " movZR AL,A1\n", },
119 /* 8-bit to 8-bit */
120 { SCONV, INAREG,
121 SNAME|SOREG, TCHAR|TUCHAR,
122 SAREG, TUCHAR|TCHAR,
123 NAREG, RESC1,
124 " movZR AL,A1\n", },
127 /* char to something */
129 /* convert char to (unsigned) short. */
130 { SCONV, ININT,
131 SAREG|SOREG|SNAME, TCHAR,
132 SAREG, TSHORT|TUSHORT,
133 NASL|NAREG, RESC1,
134 " movsbw AL,A1\n", },
136 /* convert unsigned char to (u)short. */
137 { SCONV, ININT,
138 SAREG|SOREG|SNAME, TUCHAR,
139 SAREG, TSHORT|TUSHORT,
140 NASL|NAREG, RESC1,
141 " movzbw AL,A1\n", },
143 /* convert signed char to int (or pointer). */
144 { SCONV, ININT,
145 SAREG|SOREG|SNAME, TCHAR,
146 SAREG, TWORD|TPOINT,
147 NASL|NAREG, RESC1,
148 " movsbl AL,A1\n", },
150 /* convert unsigned char to (u)int. */
151 { SCONV, ININT,
152 SAREG|SOREG|SNAME, TUCHAR,
153 SAREG, TWORD,
154 NASL|NAREG, RESC1,
155 " movzbl AL,A1\n", },
157 /* convert char to (u)long long */
158 { SCONV, INAREG,
159 SAREG|SOREG|SNAME, TCHAR,
160 SANY, TLL,
161 NAREG|NASL, RESC1,
162 " movsbq AL,A1\n", },
164 /* convert unsigned char to (u)long long */
165 { SCONV, INAREG,
166 SAREG|SOREG|SNAME, TUCHAR,
167 SANY, TLL,
168 NAREG|NASL, RESC1,
169 " movzbq AL,A1\n", },
171 /* short to something */
173 /* convert short to (u)int. */
174 { SCONV, ININT,
175 SAREG|SOREG|SNAME, TSHORT,
176 SAREG, TWORD,
177 NASL|NAREG, RESC1,
178 " movswl AL,A1\n", },
180 /* convert unsigned short to (u)int. */
181 { SCONV, ININT,
182 SAREG|SOREG|SNAME, TUSHORT,
183 SAREG, TWORD,
184 NASL|NAREG, RESC1,
185 " movzwl AL,A1\n", },
187 /* convert short to (u)long long */
188 { SCONV, INAREG,
189 SAREG|SOREG|SNAME, TSHORT,
190 SAREG, TLL,
191 NAREG|NASL, RESC1,
192 " movswq AL,A1\n", },
194 /* convert unsigned short to (u)long long */
195 { SCONV, INAREG,
196 SAREG|SOREG|SNAME, TUSHORT,
197 SAREG, TLL,
198 NAREG|NASL, RESC1,
199 " movzwq AL,A1\n", },
201 /* int to something */
203 /* convert signed int to (u)long long */
204 { SCONV, INAREG,
205 SAREG, TSWORD,
206 SAREG, TLL,
207 NASL|NAREG, RESC1,
208 " movslq AL,A1\n", },
210 /* convert unsigned int to (u)long long */
211 { SCONV, INAREG,
212 SAREG|SOREG|SNAME, TUWORD,
213 SAREG, TLL,
214 NASL|NAREG, RESC1,
215 " movl AL,Z1\n", },/* amd64 zero-extends 32-bit movl */
218 * Floating point casts. amd64 uses xmm for float/double and x87
219 * for long double calculations.
221 * Types smaller than int are casted to int/(unsigned).
223 /* no casts */
224 { SCONV, INBREG,
225 SBREG, TFLOAT,
226 SBREG, TFLOAT,
227 0, RLEFT,
228 "", },
230 { SCONV, INBREG,
231 SBREG, TDOUBLE,
232 SBREG, TDOUBLE,
233 0, RLEFT,
234 "", },
236 { SCONV, INCREG,
237 SCREG, TLDOUBLE,
238 SCREG, TLDOUBLE,
239 0, RLEFT,
240 "", },
243 /* convert int/long to float/double */
244 { SCONV, INBREG,
245 SAREG|SOREG|SNAME, TINT|TLONG,
246 SBREG, TFLOAT|TDOUBLE,
247 NBREG, RESC1,
248 " cvtsi2sZfZq AL,A1\n", },
250 /* convert unsigned int to float/double */
251 { SCONV, INBREG,
252 SAREG|SOREG|SNAME, TUNSIGNED,
253 SBREG, TFLOAT|TDOUBLE,
254 NAREG|NBREG, RESC2,
255 " movl AL,Z1\n cvtsi2sZfq A1,A2\n", },
257 /* convert unsigned long to float/double */
258 { SCONV, INBREG,
259 SAREG|SOREG|SNAME, TULONG,
260 SBREG, TFLOAT|TDOUBLE,
261 NAREG*2|NASL|NBREG, RESC3,
262 "Zj", },
264 /* convert float/double to (u)char/(u)short/int */
265 { SCONV, INAREG,
266 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
267 SAREG, TCHAR|TUCHAR|TSHORT|TUSHORT|INT,
268 NAREG, RESC1,
269 " cvttsZg2si AL,A1\n", },
271 /* convert float/double to unsigned int/long */
272 { SCONV, INAREG,
273 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
274 SAREG, TUNSIGNED|TLONG,
275 NAREG, RESC1,
276 " cvttsZg2siq AL,Z8\n", },
278 /* convert float to double */
279 { SCONV, INBREG,
280 SBREG|SNAME|SOREG, TFLOAT,
281 SBREG, TDOUBLE,
282 NBREG|NBSL, RESC1,
283 " cvtss2sd AL,A1\n", },
285 /* convert double to float */
286 { SCONV, INBREG,
287 SBREG|SNAME|SOREG, TDOUBLE,
288 SBREG, TFLOAT,
289 NBREG|NBSL, RESC1,
290 " cvtsd2ss AL,A1\n", },
292 /* x87 conversions */
293 /* float -> ldouble */
294 { SCONV, INCREG,
295 SBREG, TFLOAT,
296 SCREG, TLDOUBLE,
297 NCREG, RESC1,
298 "\tsubq $4,%rsp\n\tmovss AL,(%rsp)\n"
299 "\tflds (%rsp)\n\taddq $4,%rsp\n", },
301 /* double -> ldouble */
302 { SCONV, INCREG,
303 SBREG, TDOUBLE,
304 SCREG, TLDOUBLE,
305 NCREG, RESC1,
306 "\tsubq $8,%rsp\n\tmovsd AL,(%rsp)\n"
307 "\tfldl (%rsp)\n\taddq $8,%rsp\n", },
309 /* ldouble -> double */
310 { SCONV, INBREG,
311 SCREG, TLDOUBLE,
312 SBREG, TDOUBLE,
313 NBREG, RESC1,
314 "\tsubq $8,%rsp\n\tfstpl (%rsp)\n"
315 "\tmovsd (%rsp),A1\n\taddq $8,%rsp\n", },
317 /* ldouble -> float */
318 { SCONV, INBREG,
319 SCREG, TLDOUBLE,
320 SBREG, TFLOAT,
321 NBREG, RESC1,
322 "\tsubq $4,%rsp\n\tfstps (%rsp)\n"
323 "\tmovss (%rsp),A1\n\taddq $4,%rsp\n", },
325 /* convert int (in memory) to long double */
326 { SCONV, INCREG,
327 SOREG|SNAME, TSWORD,
328 SCREG, TLDOUBLE,
329 NCREG, RESC1,
330 " fildl AL\n", },
332 /* convert unsigned int to long double */
333 { SCONV, INCREG,
334 SAREG, TUWORD,
335 SCREG, TLDOUBLE,
336 NAREG|NASL|NCREG, RESC2,
337 " subq $16,%rsp\n"
338 " movl AL,Z1\n"
339 " movq A1,(%rsp)\n"
340 " fildll (%rsp)\n"
341 " addq $16,%rsp\n", },
343 /* convert int (in register) to long double */
344 { SCONV, INCREG,
345 SAREG, TSWORD,
346 SCREG, TLDOUBLE,
347 NCREG, RESC1,
348 " subq $4,%rsp\n"
349 " movl AL,(%rsp)\n"
350 " fildl (%rsp)\n"
351 " addq $4,%rsp\n", },
353 /* unsigned long (in reg) to long double */
354 { SCONV, INCREG,
355 SAREG, TULONG,
356 SCREG, TLDOUBLE,
357 NCREG, RESC1,
358 " subq $16,%rsp\n"
359 " movq AL,(%rsp)\n"
360 " fildll (%rsp)\n"
361 " cmpq $0,AL\n"
362 " jns 1f\n"
363 " movl $1602224128,(%rsp)\n"
364 " fadds (%rsp)\n"
365 " addq $16,%rsp\n"
366 "1:\n", },
368 /* unsigned long (in mem) to long double */
369 { SCONV, INCREG,
370 SNAME|SOREG, TULONG,
371 SCREG, TLDOUBLE,
372 NCREG, RESC1,
373 " fildll AL\n"
374 " cmpq $0,AL\n"
375 " jns 1f\n"
376 " push $1602224128\n"
377 " fadds (%rsp)\n"
378 " addq $8,%rsp\n"
379 "1:\n", },
381 /* convert float/double to unsigned long */
382 { SCONV, INAREG,
383 SBREG, TFLOAT|TDOUBLE,
384 SAREG, TULONG,
385 (NAREG*2)|NBREG, RESC1,
386 "Zb\n", },
388 /* long double to unsigned long */
389 { SCONV, INAREG,
390 SCREG|SNAME|SOREG, TLDOUBLE,
391 SAREG, TULONG,
392 NAREG, RESC1,
393 "ZB", },
395 /* ldouble -> long XXX merge with int */
396 { SCONV, INAREG,
397 SCREG, TLDOUBLE,
398 SAREG, TLONG,
399 NAREG, RESC1,
400 " subq $16,%rsp\n"
401 " fnstcw (%rsp)\n"
402 " fnstcw 4(%rsp)\n"
403 " movb $12,1(%rsp)\n"
404 " fldcw (%rsp)\n"
405 " fistpll 8(%rsp)\n"
406 " movq 8(%rsp),A1\n"
407 " fldcw 4(%rsp)\n"
408 " addq $16,%rsp\n", },
410 /* ldouble -> (u)int */
411 { SCONV, INAREG,
412 SCREG, TLDOUBLE,
413 SAREG, TINT|TUNSIGNED,
414 NAREG, RESC1,
415 " subq $16,%rsp\n"
416 " fnstcw (%rsp)\n"
417 " fnstcw 4(%rsp)\n"
418 " movb $12,1(%rsp)\n"
419 " fldcw (%rsp)\n"
420 " fistpl 8(%rsp)\n"
421 " movl 8(%rsp),A1\n"
422 " fldcw 4(%rsp)\n"
423 " addq $16,%rsp\n", },
425 /* long (in mem) -> ldouble */
426 { SCONV, INCREG,
427 SNAME|SOREG, TLONG,
428 SCREG, TLDOUBLE,
429 NCREG, RESC1,
430 " fildll AL\n", },
432 /* long (in reg) -> ldouble */
433 { SCONV, INCREG,
434 SAREG, TLONG,
435 SCREG, TLDOUBLE,
436 NCREG, RESC1,
437 " subq $16,%rsp\n"
438 " movq AL,(%rsp)\n"
439 " fildll (%rsp)\n"
440 " addq $16,%rsp\n", },
444 /* slut sconv */
447 * Subroutine calls.
450 { CALL, FOREFF,
451 SCON, TANY,
452 SANY, TANY,
453 0, 0,
454 " call CL\nZC", },
456 { UCALL, FOREFF,
457 SCON, TANY,
458 SANY, TANY,
459 0, 0,
460 " call CL\n", },
462 { CALL, INAREG,
463 SCON, TANY,
464 SAREG, TLL|ANYFIXED|TPOINT,
465 NAREG|NASL, RESC1, /* should be 0 */
466 " call CL\nZC", },
468 { UCALL, INAREG,
469 SCON, TANY,
470 SAREG, TLL|ANYFIXED|TPOINT,
471 NAREG|NASL, RESC1, /* should be 0 */
472 " call CL\n", },
474 { CALL, INBREG,
475 SCON, TANY,
476 SBREG, TANY,
477 NBREG|NBSL, RESC1, /* should be 0 */
478 " call CL\nZC", },
480 { UCALL, INBREG,
481 SCON, TANY,
482 SBREG, TANY,
483 NBREG|NBSL, RESC1, /* should be 0 */
484 " call CL\nZC", },
486 { CALL, INCREG,
487 SCON, TANY,
488 SCREG, TANY,
489 NCREG|NCSL, RESC1, /* should be 0 */
490 " call CL\nZC", },
492 { UCALL, INCREG,
493 SCON, TANY,
494 SCREG, TANY,
495 NCREG|NCSL, RESC1, /* should be 0 */
496 " call CL\nZC", },
499 { CALL, FOREFF,
500 SAREG, TANY,
501 SANY, TANY,
502 0, 0,
503 " call *AL\nZC", },
505 { UCALL, FOREFF,
506 SAREG, TANY,
507 SANY, TANY,
508 0, 0,
509 " call *AL\nZC", },
511 { CALL, INAREG,
512 SAREG, TANY,
513 SANY, TANY,
514 NAREG|NASL, RESC1, /* should be 0 */
515 " call *AL\nZC", },
517 { UCALL, INAREG,
518 SAREG, TANY,
519 SANY, TANY,
520 NAREG|NASL, RESC1, /* should be 0 */
521 " call *AL\nZC", },
523 { CALL, INBREG,
524 SAREG, TANY,
525 SANY, TANY,
526 NBREG|NBSL, RESC1, /* should be 0 */
527 " call *AL\nZC", },
529 { UCALL, INBREG,
530 SAREG, TANY,
531 SANY, TANY,
532 NBREG|NBSL, RESC1, /* should be 0 */
533 " call *AL\nZC", },
535 { CALL, INCREG,
536 SAREG, TANY,
537 SANY, TANY,
538 NCREG|NCSL, RESC1, /* should be 0 */
539 " call *AL\nZC", },
541 { UCALL, INCREG,
542 SAREG, TANY,
543 SANY, TANY,
544 NCREG|NCSL, RESC1, /* should be 0 */
545 " call *AL\nZC", },
547 /* struct return */
548 { USTCALL, FOREFF,
549 SCON, TANY,
550 SANY, TANY,
551 NAREG|NASL, 0,
552 "ZP call CL\nZC", },
554 { USTCALL, INAREG,
555 SCON, TANY,
556 SANY, TANY,
557 NAREG|NASL, RESC1, /* should be 0 */
558 "ZP call CL\nZC", },
560 { USTCALL, INAREG,
561 SNAME|SAREG, TANY,
562 SANY, TANY,
563 NAREG|NASL, RESC1, /* should be 0 */
564 "ZP call *AL\nZC", },
566 { STCALL, FOREFF,
567 SCON, TANY,
568 SANY, TANY,
569 NAREG|NASL, 0,
570 "ZP call CL\nZC", },
572 { STCALL, INAREG,
573 SCON, TANY,
574 SANY, TANY,
575 NAREG|NASL, RESC1, /* should be 0 */
576 "ZP call CL\nZC", },
578 { STCALL, INAREG,
579 SNAME|SAREG, TANY,
580 SANY, TANY,
581 NAREG|NASL, RESC1, /* should be 0 */
582 "ZP call *AL\nZC", },
585 * The next rules handle all binop-style operators.
587 /* floating point add */
588 { PLUS, INBREG,
589 SBREG, TFLOAT|TDOUBLE,
590 SBREG|SNAME|SOREG, TFLOAT|TDOUBLE,
591 0, RLEFT,
592 " addsZf AR,AL\n", },
594 { PLUS, INCREG|FOREFF,
595 SHFL, TLDOUBLE,
596 SHFL, TLDOUBLE,
597 0, RLEFT,
598 " faddp\n", },
601 { PLUS, INAREG|FOREFF,
602 SAREG|SNAME|SOREG, TLL|TPOINT,
603 SONE, TANY,
604 0, RLEFT,
605 " incq AL\n", },
607 { PLUS, INAREG|FOREFF,
608 SAREG|SNAME|SOREG, TWORD,
609 SONE, TANY,
610 0, RLEFT,
611 " incl AL\n", },
613 { PLUS, INAREG,
614 SAREG, TLL|TPOINT,
615 SCON, TWORD,
616 NAREG|NASL, RESC1,
617 " leaq CR(AL),A1\n", },
619 #ifdef notdef
620 /* older binutils are missing leal */
621 { PLUS, INAREG,
622 SAREG, TWORD,
623 SCON, TANY,
624 NAREG|NASL, RESC1,
625 " leal CR(AL),A1\n", },
626 #endif
628 { PLUS, INAREG|FOREFF,
629 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
630 SONE, TANY,
631 0, RLEFT,
632 " incw AL\n", },
634 { PLUS, INAREG|FOREFF,
635 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
636 SONE, TANY,
637 0, RLEFT,
638 " incb AL\n", },
640 #ifdef notdef
641 /* older binutils are missing leal */
642 { PLUS, INAREG,
643 SAREG, TWORD,
644 SAREG, TWORD,
645 NAREG|NASL|NASR, RESC1,
646 " leal (AL,AR),A1\n", },
647 #endif
649 { MINUS, INAREG|FOREFF,
650 SAREG|SNAME|SOREG, TLL|TPOINT,
651 SONE, TANY,
652 0, RLEFT,
653 " decq AL\n", },
655 { MINUS, INAREG|FOREFF,
656 SAREG|SNAME|SOREG, TWORD,
657 SONE, TANY,
658 0, RLEFT,
659 " decl AL\n", },
661 { MINUS, INAREG|FOREFF,
662 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
663 SONE, TANY,
664 0, RLEFT,
665 " decw AL\n", },
667 { MINUS, INAREG|FOREFF,
668 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
669 SONE, TANY,
670 0, RLEFT,
671 " decb AL\n", },
673 /* address as register offset, negative */
674 { MINUS, INAREG,
675 SAREG, TLL|TPOINT,
676 SPCON, TANY,
677 NAREG|NASL, RESC1,
678 " leaq -CR(AL),A1\n", },
680 { MINUS, INBREG|FOREFF,
681 SBREG, TDOUBLE|TFLOAT,
682 SBREG|SNAME|SOREG, TDOUBLE|TFLOAT,
683 0, RLEFT,
684 " subsZf AR,AL\n", },
686 { MINUS, INCREG|FOREFF,
687 SHFL, TLDOUBLE,
688 SHFL, TLDOUBLE,
689 0, RLEFT,
690 " fsubZAp\n", },
692 /* Simple r/m->reg ops */
693 /* m/r |= r */
694 { OPSIMP, INAREG|FOREFF|FORCC,
695 SAREG|SNAME|SOREG, TLL|TPOINT,
696 SAREG, TLL|TPOINT,
697 0, RLEFT|RESCC,
698 " Oq AR,AL\n", },
700 /* r |= r/m */
701 { OPSIMP, INAREG|FOREFF|FORCC,
702 SAREG, TLL|TPOINT,
703 SAREG|SNAME|SOREG, TLL|TPOINT,
704 0, RLEFT|RESCC,
705 " Oq AR,AL\n", },
707 /* m/r |= r */
708 { OPSIMP, INAREG|FOREFF|FORCC,
709 SAREG|SNAME|SOREG, TWORD,
710 SAREG, TWORD,
711 0, RLEFT|RESCC,
712 " Ol AR,AL\n", },
714 /* r |= r/m */
715 { OPSIMP, INAREG|FOREFF|FORCC,
716 SAREG, TWORD,
717 SAREG|SNAME|SOREG, TWORD,
718 0, RLEFT|RESCC,
719 " Ol AR,AL\n", },
721 /* m/r |= r */
722 { OPSIMP, INAREG|FOREFF|FORCC,
723 SHINT|SNAME|SOREG, TSHORT|TUSHORT,
724 SHINT, TSHORT|TUSHORT,
725 0, RLEFT|RESCC,
726 " Ow AR,AL\n", },
728 /* r |= r/m */
729 { OPSIMP, INAREG|FOREFF|FORCC,
730 SHINT, TSHORT|TUSHORT,
731 SHINT|SNAME|SOREG, TSHORT|TUSHORT,
732 0, RLEFT|RESCC,
733 " Ow AR,AL\n", },
735 /* m/r |= r */
736 { OPSIMP, INAREG|FOREFF|FORCC,
737 SAREG, TCHAR|TUCHAR,
738 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
739 0, RLEFT|RESCC,
740 " Ob AR,AL\n", },
742 /* r |= r/m */
743 { OPSIMP, INAREG|FOREFF|FORCC,
744 SAREG, TCHAR|TUCHAR,
745 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
746 0, RLEFT|RESCC,
747 " Ob AR,AL\n", },
749 /* m/r |= const */
750 #ifdef notdef /* amd64 lacks immediate 64-bit simple ops */
751 { OPSIMP, INAREG|FOREFF|FORCC,
752 SAREG|SNAME|SOREG, TLL|TPOINT,
753 SCON, TANY,
754 0, RLEFT|RESCC,
755 " Oq AR,AL\n", },
756 #endif
758 { OPSIMP, INAREG|FOREFF|FORCC,
759 SAREG|SNAME|SOREG, TWORD,
760 SCON, TANY,
761 0, RLEFT|RESCC,
762 " Ol AR,AL\n", },
764 { OPSIMP, INAREG|FOREFF|FORCC,
765 SHINT|SNAME|SOREG, TSHORT|TUSHORT,
766 SCON, TANY,
767 0, RLEFT|RESCC,
768 " Ow AR,AL\n", },
770 { OPSIMP, INAREG|FOREFF|FORCC,
771 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
772 SCON, TANY,
773 0, RLEFT|RESCC,
774 " Ob AR,AL\n", },
777 * The next rules handle all shift operators.
779 /* r/m <<= r */
780 { LS, INAREG|FOREFF,
781 SAREG|SNAME|SOREG, TLL,
782 SAREG, TCHAR|TUCHAR,
783 NSPECIAL, RLEFT,
784 " salq AR,AL\n", },
786 /* r/m <<= const */
787 { LS, INAREG|FOREFF,
788 SAREG|SNAME|SOREG, TLL,
789 SCON, TANY,
790 0, RLEFT,
791 " salq AR,AL\n", },
793 /* r/m <<= r */
794 { LS, INAREG|FOREFF,
795 SAREG|SNAME|SOREG, TWORD,
796 SAREG, TCHAR|TUCHAR,
797 NSPECIAL, RLEFT,
798 " sall AR,AL\n", },
800 /* r/m <<= const */
801 { LS, INAREG|FOREFF,
802 SAREG|SNAME|SOREG, TWORD,
803 SCON, TANY,
804 0, RLEFT,
805 " sall AR,AL\n", },
807 /* r/m <<= r */
808 { LS, INAREG|FOREFF,
809 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
810 SAREG, TCHAR|TUCHAR,
811 NSPECIAL, RLEFT,
812 " shlw AR,AL\n", },
814 /* r/m <<= const */
815 { LS, INAREG|FOREFF,
816 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
817 SCON, TANY,
818 0, RLEFT,
819 " shlw AR,AL\n", },
821 { LS, INAREG|FOREFF,
822 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
823 SAREG, TCHAR|TUCHAR,
824 NSPECIAL, RLEFT,
825 " salb AR,AL\n", },
827 { LS, INAREG|FOREFF,
828 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
829 SCON, TANY,
830 0, RLEFT,
831 " salb AR,AL\n", },
833 { RS, INAREG|FOREFF,
834 SAREG|SNAME|SOREG, TLONG|TLONGLONG,
835 SAREG, TCHAR|TUCHAR,
836 NSPECIAL, RLEFT,
837 " sarq AR,AL\n", },
839 { RS, INAREG|FOREFF,
840 SAREG|SNAME|SOREG, TLONG|TLONGLONG,
841 SCON, TANY,
842 0, RLEFT,
843 " sarq AR,AL\n", },
845 { RS, INAREG|FOREFF,
846 SAREG|SNAME|SOREG, TULONG|TULONGLONG,
847 SAREG, TCHAR|TUCHAR,
848 NSPECIAL, RLEFT,
849 " shrq AR,AL\n", },
851 { RS, INAREG|FOREFF,
852 SAREG|SNAME|SOREG, TULONG|TULONGLONG,
853 SCON, TANY,
854 0, RLEFT,
855 " shrq AR,AL\n", },
857 { RS, INAREG|FOREFF,
858 SAREG|SNAME|SOREG, TSWORD,
859 SAREG, TCHAR|TUCHAR,
860 NSPECIAL, RLEFT,
861 " sarl AR,AL\n", },
863 { RS, INAREG|FOREFF,
864 SAREG|SNAME|SOREG, TSWORD,
865 SCON, TANY,
866 0, RLEFT,
867 " sarl AR,AL\n", },
869 { RS, INAREG|FOREFF,
870 SAREG|SNAME|SOREG, TUWORD,
871 SAREG, TCHAR|TUCHAR,
872 NSPECIAL, RLEFT,
873 " shrl AR,AL\n", },
875 { RS, INAREG|FOREFF,
876 SAREG|SNAME|SOREG, TUWORD,
877 SCON, TANY,
878 0, RLEFT,
879 " shrl AR,AL\n", },
881 { RS, INAREG|FOREFF,
882 SAREG|SNAME|SOREG, TSHORT,
883 SAREG, TCHAR|TUCHAR,
884 NSPECIAL, RLEFT,
885 " sarw AR,AL\n", },
887 { RS, INAREG|FOREFF,
888 SAREG|SNAME|SOREG, TSHORT,
889 SCON, TANY,
890 0, RLEFT,
891 " sarw AR,AL\n", },
893 { RS, INAREG|FOREFF,
894 SAREG|SNAME|SOREG, TUSHORT,
895 SAREG, TCHAR|TUCHAR,
896 NSPECIAL, RLEFT,
897 " shrw AR,AL\n", },
899 { RS, INAREG|FOREFF,
900 SAREG|SNAME|SOREG, TUSHORT,
901 SCON, TANY,
902 0, RLEFT,
903 " shrw AR,AL\n", },
905 { RS, INAREG|FOREFF,
906 SAREG|SNAME|SOREG, TCHAR,
907 SAREG, TCHAR|TUCHAR,
908 NSPECIAL, RLEFT,
909 " sarb AR,AL\n", },
911 { RS, INAREG|FOREFF,
912 SAREG|SNAME|SOREG, TCHAR,
913 SCON, TANY,
914 0, RLEFT,
915 " sarb AR,AL\n", },
917 { RS, INAREG|FOREFF,
918 SAREG|SNAME|SOREG, TUCHAR,
919 SAREG, TCHAR|TUCHAR,
920 NSPECIAL, RLEFT,
921 " shrb AR,AL\n", },
923 { RS, INAREG|FOREFF,
924 SAREG|SNAME|SOREG, TUCHAR,
925 SCON, TANY,
926 0, RLEFT,
927 " shrb AR,AL\n", },
930 * The next rules takes care of assignments. "=".
932 { ASSIGN, FORCC|FOREFF|INAREG,
933 SAREG, TLL|TPOINT,
934 SMIXOR, TANY,
935 0, RDEST,
936 " xorq AL,AL\n", },
938 { ASSIGN, FOREFF|INAREG,
939 SAREG, TLL|TPOINT,
940 SCON, TANY,
941 0, RDEST,
942 " movabs AR,AL\n", },
944 { ASSIGN, FORCC|FOREFF|INAREG,
945 SAREG, TWORD,
946 SMIXOR, TANY,
947 0, RDEST,
948 " xorl AL,AL\n", },
950 { ASSIGN, FOREFF,
951 SAREG|SNAME|SOREG, TWORD,
952 SCON, TANY,
953 0, 0,
954 " movl AR,AL\n", },
956 { ASSIGN, FOREFF|INAREG,
957 SAREG, TWORD,
958 SCON, TANY,
959 0, RDEST,
960 " movl AR,AL\n", },
962 { ASSIGN, FORCC|FOREFF|INAREG,
963 SAREG, TSHORT|TUSHORT,
964 SMIXOR, TANY,
965 0, RDEST,
966 " xorw AL,AL\n", },
968 { ASSIGN, FOREFF,
969 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
970 SCON, TANY,
971 0, 0,
972 " movw AR,AL\n", },
974 { ASSIGN, FOREFF|INAREG,
975 SAREG, TSHORT|TUSHORT,
976 SCON, TANY,
977 0, RDEST,
978 " movw AR,AL\n", },
980 { ASSIGN, FOREFF,
981 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
982 SCON, TANY,
983 0, 0,
984 " movb AR,AL\n", },
986 { ASSIGN, FOREFF|INAREG,
987 SAREG, TCHAR|TUCHAR,
988 SCON, TANY,
989 0, RDEST,
990 " movb AR,AL\n", },
992 { ASSIGN, FOREFF|INAREG,
993 SAREG|SNAME|SOREG, TLL|TPOINT,
994 SAREG, TLL|TPOINT,
995 0, RDEST,
996 " movq AR,AL\n", },
998 { ASSIGN, FOREFF|INAREG,
999 SAREG|SNAME|SOREG, TWORD,
1000 SAREG, TWORD,
1001 0, RDEST,
1002 " movl AR,AL\n", },
1004 { ASSIGN, FOREFF|INAREG,
1005 SAREG, TWORD,
1006 SAREG|SNAME|SOREG, TWORD,
1007 0, RDEST,
1008 " movl AR,AL\n", },
1010 { ASSIGN, FOREFF|INAREG,
1011 SAREG, TPOINT,
1012 SAREG|SNAME|SOREG, TPOINT,
1013 0, RDEST,
1014 " movq AR,AL\n", },
1016 { ASSIGN, FOREFF|INAREG,
1017 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
1018 SAREG, TSHORT|TUSHORT,
1019 0, RDEST,
1020 " movw AR,AL\n", },
1022 { ASSIGN, FOREFF|INAREG,
1023 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
1024 SAREG, TCHAR|TUCHAR|TWORD,
1025 0, RDEST,
1026 " movb AR,AL\n", },
1028 { ASSIGN, FOREFF|INAREG,
1029 SFLD, TCHAR|TUCHAR,
1030 SAREG|SCON, TCHAR|TUCHAR,
1031 NAREG*2, RDEST,
1032 " movb AR,A2\n"
1033 " movzbl A2,ZN\n"
1034 " andl $N,AL\n"
1035 " sall $H,ZN\n"
1036 " andl $M,ZN\n"
1037 " orl ZN,AL\n"
1038 "F movb AR,AD\n"
1039 "FZE", },
1041 { ASSIGN, FOREFF|INAREG,
1042 SFLD, TSHORT|TUSHORT,
1043 SAREG|SCON, TSHORT|TUSHORT,
1044 NAREG, RDEST,
1045 " movw AR,A1\n"
1046 " movzwl A1,ZN\n"
1047 " andl $N,AL\n"
1048 " sall $H,ZN\n"
1049 " andl $M,ZN\n"
1050 " orl ZN,AL\n"
1051 "F movw AR,AD\n"
1052 "FZE", },
1054 { ASSIGN, FOREFF|INAREG,
1055 SFLD, TWORD,
1056 SAREG|SNAME|SOREG|SCON, TWORD,
1057 NAREG, RDEST,
1058 " movl AR,A1\n"
1059 " andl $N,AL\n"
1060 " sall $H,A1\n"
1061 " andl $M,A1\n"
1062 " orl A1,AL\n"
1063 "F movl AR,AD\n"
1064 "FZE", },
1066 { ASSIGN, FOREFF|INAREG,
1067 SFLD, TLL,
1068 SAREG|SNAME|SOREG|SCON, TLL,
1069 NAREG*2, RDEST,
1070 " movq AR,A1\n"
1071 " movq $N,A2\n"
1072 " andq A2,AL\n"
1073 " salq $H,A1\n"
1074 " movq $M,A2\n"
1075 " andq A2,A1\n"
1076 " orq A1,AL\n"
1077 "F movq AR,AD\n"
1078 "FZE", },
1080 { ASSIGN, INBREG|FOREFF,
1081 SBREG, TFLOAT|TDOUBLE,
1082 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
1083 0, RDEST,
1084 " movsZf AR,AL\n", },
1086 { ASSIGN, INBREG|FOREFF,
1087 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
1088 SBREG, TFLOAT|TDOUBLE,
1089 0, RDEST,
1090 " movsZf AR,AL\n", },
1092 /* x87 entries */
1093 { ASSIGN, INDREG|FOREFF,
1094 SHFL, TLDOUBLE,
1095 SHFL, TLDOUBLE,
1096 0, RDEST,
1097 "", }, /* This will always be in the correct register */
1099 /* order of table entries is very important here! */
1100 { ASSIGN, INFL,
1101 SNAME|SOREG, TLDOUBLE,
1102 SHFL, TLDOUBLE,
1103 0, RDEST,
1104 " fstpt AL\n fldt AL\n", }, /* XXX */
1106 { ASSIGN, FOREFF,
1107 SNAME|SOREG, TLDOUBLE,
1108 SHFL, TLDOUBLE,
1109 0, 0,
1110 " fstpt AL\n", },
1112 /* end very important order */
1114 { ASSIGN, INFL|FOREFF,
1115 SHFL, TLDOUBLE,
1116 SHFL|SOREG|SNAME, TLDOUBLE,
1117 0, RDEST,
1118 " fldt AR\n", },
1120 /* end x87 */
1122 /* Do not generate memcpy if return from funcall */
1123 #if 0
1124 { STASG, INAREG|FOREFF,
1125 SOREG|SNAME|SAREG, TPTRTO|TSTRUCT,
1126 SFUNCALL, TPTRTO|TSTRUCT,
1127 0, RRIGHT,
1128 "", },
1129 #endif
1131 { STASG, INAREG|FOREFF,
1132 SOREG|SNAME, TANY,
1133 SAREG, TPTRTO|TANY,
1134 NSPECIAL, RDEST,
1135 "ZQ", },
1138 * DIV/MOD/MUL
1140 { DIV, INAREG,
1141 SAREG, TLONG,
1142 SAREG|SNAME|SOREG, TLL,
1143 NSPECIAL, RDEST,
1144 " cqto\n idivq AR\n", },
1146 { DIV, INAREG,
1147 SAREG, TULONG|TPOINT,
1148 SAREG|SNAME|SOREG, TLL|TPOINT,
1149 NSPECIAL, RDEST,
1150 " xorq %rdx,%rdx\n divq AR\n", },
1152 { DIV, INAREG,
1153 SAREG, TSWORD,
1154 SAREG|SNAME|SOREG, TWORD,
1155 NSPECIAL, RDEST,
1156 " cltd\n idivl AR\n", },
1158 { DIV, INAREG,
1159 SAREG, TUWORD,
1160 SAREG|SNAME|SOREG, TWORD,
1161 NSPECIAL, RDEST,
1162 " xorl %edx,%edx\n divl AR\n", },
1164 { DIV, INAREG,
1165 SAREG, TUSHORT,
1166 SAREG|SNAME|SOREG, TUSHORT,
1167 NSPECIAL, RDEST,
1168 " xorl %edx,%edx\n divw AR\n", },
1170 { DIV, INAREG,
1171 SAREG, TUCHAR,
1172 SAREG|SNAME|SOREG, TUCHAR,
1173 NSPECIAL, RDEST,
1174 " xorb %ah,%ah\n divb AR\n", },
1176 { DIV, INBREG,
1177 SBREG, TFLOAT|TDOUBLE,
1178 SBREG|SNAME|SOREG, TFLOAT|TDOUBLE,
1179 0, RLEFT,
1180 " divsZf AR,AL\n", },
1182 { DIV, INCREG,
1183 SHFL, TLDOUBLE,
1184 SHFL, TLDOUBLE,
1185 0, RLEFT,
1186 " fdivZAp\n", },
1188 { MOD, INAREG,
1189 SAREG, TLONG,
1190 SAREG|SNAME|SOREG, TLONG,
1191 NAREG|NSPECIAL, RESC1,
1192 " cqto\n idivq AR\n", },
1194 { MOD, INAREG,
1195 SAREG, TLL|TPOINT,
1196 SAREG|SNAME|SOREG, TULONG|TPOINT,
1197 NAREG|NSPECIAL, RESC1,
1198 " xorq %rdx,%rdx\n divq AR\n", },
1200 { MOD, INAREG,
1201 SAREG, TSWORD,
1202 SAREG|SNAME|SOREG, TSWORD,
1203 NAREG|NSPECIAL, RESC1,
1204 " cltd\n idivl AR\n", },
1206 { MOD, INAREG,
1207 SAREG, TWORD,
1208 SAREG|SNAME|SOREG, TUWORD,
1209 NAREG|NSPECIAL, RESC1,
1210 " xorl %edx,%edx\n divl AR\n", },
1212 { MOD, INAREG,
1213 SAREG, TUSHORT,
1214 SAREG|SNAME|SOREG, TUSHORT,
1215 NAREG|NSPECIAL, RESC1,
1216 " xorl %edx,%edx\n divw AR\n", },
1218 { MOD, INAREG,
1219 SAREG, TUCHAR,
1220 SAREG|SNAME|SOREG, TUCHAR,
1221 NAREG|NSPECIAL, RESC1,
1222 " xorb %ah,%ah\n divb AR\n movb %ah,%al\n", },
1224 { MUL, INAREG,
1225 SAREG, TLL|TPOINT,
1226 SAREG|SNAME|SOREG, TLL|TPOINT,
1227 0, RLEFT,
1228 " imulq AR,AL\n", },
1230 { MUL, INAREG,
1231 SAREG, TWORD,
1232 SAREG|SNAME|SOREG|SCON, TWORD,
1233 0, RLEFT,
1234 " imull AR,AL\n", },
1236 { MUL, INAREG,
1237 SAREG, TSHORT|TUSHORT,
1238 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
1239 0, RLEFT,
1240 " imulw AR,AL\n", },
1242 { MUL, INAREG,
1243 SAREG, TCHAR|TUCHAR,
1244 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
1245 NSPECIAL, RLEFT,
1246 " imulb AR\n", },
1248 { MUL, INBREG,
1249 SBREG, TFLOAT|TDOUBLE,
1250 SBREG|SNAME|SOREG, TFLOAT|TDOUBLE,
1251 0, RLEFT,
1252 " mulsZf AR,AL\n", },
1254 { MUL, INCREG,
1255 SHFL, TLDOUBLE,
1256 SHFL, TLDOUBLE,
1257 0, RLEFT,
1258 " fmulp\n", },
1261 * Indirection operators.
1263 { UMUL, INAREG,
1264 SANY, TANY,
1265 SOREG, TLL|TPOINT,
1266 NAREG, RESC1,
1267 " movq AL,A1\n", },
1269 { UMUL, INAREG,
1270 SANY, TWORD,
1271 SOREG, TWORD,
1272 NAREG|NASL, RESC1,
1273 " movl AL,A1\n", },
1275 { UMUL, INAREG,
1276 SANY, TANY,
1277 SOREG, TCHAR|TUCHAR,
1278 NAREG|NASL, RESC1,
1279 " movb AL,A1\n", },
1281 { UMUL, INAREG,
1282 SANY, TANY,
1283 SOREG, TSHORT|TUSHORT,
1284 NAREG|NASL, RESC1,
1285 " movw AL,A1\n", },
1287 { UMUL, INBREG,
1288 SANY, TANY,
1289 SOREG, TFLOAT|TDOUBLE,
1290 NBREG|NBSL, RESC1,
1291 " movsZf AL,A1\n", },
1293 { UMUL, INCREG,
1294 SANY, TANY,
1295 SOREG, TLDOUBLE,
1296 NCREG|NCSL, RESC1,
1297 " fldt AL\n", },
1300 * Logical/branching operators
1303 /* Comparisions, take care of everything */
1305 { OPLOG, FORCC,
1306 SAREG, TLL|TPOINT,
1307 SAREG|SOREG|SNAME, TLL|TPOINT,
1308 0, RESCC,
1309 " cmpq AR,AL\n", },
1311 { OPLOG, FORCC,
1312 SAREG|SOREG|SNAME, TLL|TPOINT,
1313 SAREG, TLL|TPOINT,
1314 0, RESCC,
1315 " cmpq AR,AL\n", },
1317 { OPLOG, FORCC,
1318 SAREG|SOREG|SNAME, TLL|TPOINT,
1319 SCON32, TANY,
1320 0, RESCC,
1321 " cmpq AR,AL\n", },
1323 { OPLOG, FORCC,
1324 SAREG|SOREG|SNAME, TWORD,
1325 SCON|SAREG, TWORD,
1326 0, RESCC,
1327 " cmpl AR,AL\n", },
1329 { OPLOG, FORCC,
1330 SCON|SAREG, TWORD,
1331 SAREG|SOREG|SNAME, TWORD,
1332 0, RESCC,
1333 " cmpl AR,AL\n", },
1335 { OPLOG, FORCC,
1336 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1337 SCON|SAREG, TANY,
1338 0, RESCC,
1339 " cmpw AR,AL\n", },
1341 { OPLOG, FORCC,
1342 SAREG|SOREG|SNAME, TCHAR|TUCHAR,
1343 SCON|SAREG, TANY,
1344 0, RESCC,
1345 " cmpb AR,AL\n", },
1347 { OPLOG, FORCC,
1348 SBREG, TDOUBLE|TFLOAT,
1349 SBREG|SNAME|SOREG, TDOUBLE|TFLOAT,
1350 0, RNOP,
1351 " ucomisZg AR,AL\nZU\n", },
1353 /* x87 */
1354 { OPLOG, FORCC,
1355 SCREG, TLDOUBLE,
1356 SCREG, TLDOUBLE,
1357 0, RNOP,
1358 "ZG", },
1360 { OPLOG, FORCC,
1361 SANY, TANY,
1362 SANY, TANY,
1363 REWRITE, 0,
1364 "diediedie!", },
1366 /* AND/OR/ER/NOT */
1367 { AND, INAREG|FOREFF,
1368 SAREG|SOREG|SNAME, TLL,
1369 SCON, TWORD,
1370 0, RLEFT,
1371 " andq AR,AL\n", },
1373 { AND, INAREG|FOREFF,
1374 SAREG|SOREG|SNAME, TLL,
1375 SAREG, TLL,
1376 0, RLEFT,
1377 " andq AR,AL\n", },
1379 { AND, INAREG|FOREFF,
1380 SAREG, TLL,
1381 SAREG|SOREG|SNAME, TLL,
1382 0, RLEFT,
1383 " andq AR,AL\n", },
1385 { AND, INAREG|FOREFF,
1386 SAREG|SOREG|SNAME, TWORD,
1387 SCON|SAREG, TWORD,
1388 0, RLEFT,
1389 " andl AR,AL\n", },
1391 { AND, INAREG|FOREFF,
1392 SAREG, TWORD,
1393 SAREG|SOREG|SNAME, TWORD,
1394 0, RLEFT,
1395 " andl AR,AL\n", },
1397 { AND, INAREG|FOREFF,
1398 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1399 SCON|SAREG, TSHORT|TUSHORT,
1400 0, RLEFT,
1401 " andw AR,AL\n", },
1403 { AND, INAREG|FOREFF,
1404 SAREG, TSHORT|TUSHORT,
1405 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1406 0, RLEFT,
1407 " andw AR,AL\n", },
1409 { AND, INAREG|FOREFF,
1410 SAREG|SOREG|SNAME, TCHAR|TUCHAR,
1411 SCON|SAREG, TCHAR|TUCHAR,
1412 0, RLEFT,
1413 " andb AR,AL\n", },
1415 { AND, INAREG|FOREFF,
1416 SAREG, TCHAR|TUCHAR,
1417 SAREG|SOREG|SNAME, TCHAR|TUCHAR,
1418 0, RLEFT,
1419 " andb AR,AL\n", },
1420 /* AND/OR/ER/NOT */
1423 * Jumps.
1425 { GOTO, FOREFF,
1426 SCON, TANY,
1427 SANY, TANY,
1428 0, RNOP,
1429 " jmp LL\n", },
1431 #if defined(GCC_COMPAT) || defined(LANG_F77)
1432 { GOTO, FOREFF,
1433 SAREG, TANY,
1434 SANY, TANY,
1435 0, RNOP,
1436 " jmp *AL\n", },
1437 #endif
1440 * Convert LTYPE to reg.
1442 { OPLTYPE, FORCC|INAREG,
1443 SAREG, TLL|TPOINT,
1444 SMIXOR, TANY,
1445 NAREG, RESC1,
1446 " xorq A1,A1\n", },
1448 { OPLTYPE, INAREG,
1449 SANY, TANY,
1450 SAREG|SCON|SOREG|SNAME, TLL|TPOINT,
1451 NAREG, RESC1,
1452 " movq AL,A1\n", },
1454 { OPLTYPE, FORCC|INAREG,
1455 SAREG, TWORD,
1456 SMIXOR, TANY,
1457 NAREG|NASL, RESC1,
1458 " xorl A1,A1\n", },
1460 { OPLTYPE, INAREG,
1461 SANY, TANY,
1462 SAREG|SCON|SOREG|SNAME, TWORD,
1463 NAREG|NASL, RESC1,
1464 " movl AL,A1\n", },
1466 { OPLTYPE, INAREG,
1467 SANY, TANY,
1468 SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR,
1469 NAREG, RESC1,
1470 " movb AL,A1\n", },
1472 { OPLTYPE, FORCC|INAREG,
1473 SAREG, TSHORT|TUSHORT,
1474 SMIXOR, TANY,
1475 NAREG, RESC1,
1476 " xorw A1,A1\n", },
1478 { OPLTYPE, INAREG,
1479 SANY, TANY,
1480 SAREG|SOREG|SNAME|SCON, TSHORT|TUSHORT,
1481 NAREG, RESC1,
1482 " movw AL,A1\n", },
1484 { OPLTYPE, INBREG,
1485 SANY, TFLOAT|TDOUBLE,
1486 SOREG|SNAME|SBREG, TFLOAT|TDOUBLE,
1487 NBREG, RESC1,
1488 " movsZf AL,A1\n", },
1490 /* x87 entry */
1491 { OPLTYPE, INCREG,
1492 SANY, TLDOUBLE,
1493 SOREG|SNAME, TLDOUBLE,
1494 NCREG, RESC1,
1495 " fldt AL\n", },
1498 * Negate a word.
1501 { UMINUS, INAREG|FOREFF,
1502 SAREG, TLL|TPOINT,
1503 SAREG, TLL|TPOINT,
1504 0, RLEFT,
1505 " negq AL\n", },
1507 { UMINUS, INAREG|FOREFF,
1508 SAREG, TWORD,
1509 SAREG, TWORD,
1510 0, RLEFT,
1511 " negl AL\n", },
1513 { UMINUS, INAREG|FOREFF,
1514 SAREG, TSHORT|TUSHORT,
1515 SAREG, TSHORT|TUSHORT,
1516 0, RLEFT,
1517 " negw AL\n", },
1519 { UMINUS, INAREG|FOREFF,
1520 SAREG, TCHAR|TUCHAR,
1521 SAREG, TCHAR|TUCHAR,
1522 0, RLEFT,
1523 " negb AL\n", },
1525 { UMINUS, INBREG,
1526 SBREG, TDOUBLE|TFLOAT,
1527 SBREG, TDOUBLE|TFLOAT,
1528 0, RLEFT,
1529 " xorpZf LC(%rip),AL\n", },
1531 { UMINUS, INCREG,
1532 SCREG, TLDOUBLE,
1533 SCREG, TLDOUBLE,
1534 0, RLEFT,
1535 " fchs\n", },
1537 { COMPL, INAREG,
1538 SAREG, TLL,
1539 SANY, TANY,
1540 0, RLEFT,
1541 " notq AL\n", },
1543 { COMPL, INAREG,
1544 SAREG, TWORD,
1545 SANY, TANY,
1546 0, RLEFT,
1547 " notl AL\n", },
1549 { COMPL, INAREG,
1550 SAREG, TSHORT|TUSHORT,
1551 SANY, TANY,
1552 0, RLEFT,
1553 " notw AL\n", },
1555 { COMPL, INAREG,
1556 SAREG, TCHAR|TUCHAR,
1557 SANY, TANY,
1558 0, RLEFT,
1559 " notb AL\n", },
1561 { STARG, FOREFF,
1562 SAREG|SOREG|SNAME|SCON, TANY,
1563 SANY, TSTRUCT,
1564 NSPECIAL, 0,
1565 "ZF", },
1567 { ADDROF, INAREG,
1568 SNAME, TANY,
1569 SANY, TANY,
1570 NAREG, RESC1,
1571 " leaq AL,A1\n", },
1573 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1575 { UMUL, DF( UMUL ), },
1577 { ASSIGN, DF(ASSIGN), },
1579 { STASG, DF(STASG), },
1581 { FLD, DF(FLD), },
1583 { OPLEAF, DF(NAME), },
1585 /* { INIT, DF(INIT), }, */
1587 { OPUNARY, DF(UMINUS), },
1589 { OPANY, DF(BITYPE), },
1591 { FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
1594 int tablesize = sizeof(table)/sizeof(table[0]);