source: mainline/uspace/app/pcc/arch/amd64/table.c@ 423e5e87

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 423e5e87 was a7de7182, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 14 years ago

Added pcc source tree (contents of pcc-1.0.0.tgz)

  • Property mode set to 100644
File size: 29.2 KB
Line 
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.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30
31# include "pass2.h"
32
33#define 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 */
45
46struct optab table[] = {
47/* First entry must be an empty entry */
48{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
49
50/* PCONVs are usually not necessary */
51{ PCONV, INAREG,
52 SAREG, TLL|TPOINT,
53 SAREG, TLL|TPOINT,
54 0, RLEFT,
55 "", },
56
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 */
62
63
64/*
65 * On amd64 casts from larger to smaller integer type in register do nothing.
66 */
67/* 64-bit to smaller */
68{ SCONV, INAREG,
69 SAREG, TLL|TPOINT,
70 SAREG, TANYINT,
71 0, RLEFT,
72 "", },
73
74/* 32-bit to smaller */
75{ SCONV, INAREG,
76 SAREG, TWORD,
77 SAREG, ANYFIXED,
78 0, RLEFT,
79 "", },
80
81/* 16-bit to smaller */
82{ SCONV, INAREG,
83 SAREG, TSHORT|TUSHORT,
84 SAREG, TUSHORT|TUCHAR|TSHORT|TCHAR,
85 0, RLEFT,
86 "", },
87
88/* 8-bit to 8-bit */
89{ SCONV, INAREG,
90 SAREG, TCHAR|TUCHAR,
91 SAREG, TUCHAR|TCHAR,
92 0, RLEFT,
93 "", },
94
95/*
96 * Casts from memory to same or smaller register is equally simple.
97 */
98/* 64-bit to smaller */
99{ SCONV, INAREG,
100 SNAME|SOREG, TLL|TPOINT,
101 SAREG, TANYINT,
102 NAREG, RESC1,
103 " movZR AL,A1\n", },
104
105/* 32-bit to smaller */
106{ SCONV, INAREG,
107 SNAME|SOREG, TWORD,
108 SAREG, ANYFIXED,
109 NAREG, RESC1,
110 " movZR AL,A1\n", },
111
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", },
118
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", },
125
126
127/* char to something */
128
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", },
135
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", },
142
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", },
149
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", },
156
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", },
163
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", },
170
171/* short to something */
172
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", },
179
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", },
186
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", },
193
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", },
200
201/* int to something */
202
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", },
209
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 */
216
217/*
218 * Floating point casts. amd64 uses xmm for float/double and x87
219 * for long double calculations.
220 *
221 * Types smaller than int are casted to int/(unsigned).
222 */
223/* no casts */
224{ SCONV, INBREG,
225 SBREG, TFLOAT,
226 SBREG, TFLOAT,
227 0, RLEFT,
228 "", },
229
230{ SCONV, INBREG,
231 SBREG, TDOUBLE,
232 SBREG, TDOUBLE,
233 0, RLEFT,
234 "", },
235
236{ SCONV, INCREG,
237 SCREG, TLDOUBLE,
238 SCREG, TLDOUBLE,
239 0, RLEFT,
240 "", },
241
242
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", },
249
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", },
256
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", },
263
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", },
270
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", },
277
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", },
284
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", },
291
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", },
300
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", },
308
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", },
316
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", },
324
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", },
331
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", },
342
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", },
352
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", },
367
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", },
380
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", },
387
388/* long double to unsigned long */
389{ SCONV, INAREG,
390 SCREG|SNAME|SOREG, TLDOUBLE,
391 SAREG, TULONG,
392 NAREG, RESC1,
393 "ZB", },
394
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", },
409
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", },
424
425/* long (in mem) -> ldouble */
426{ SCONV, INCREG,
427 SNAME|SOREG, TLONG,
428 SCREG, TLDOUBLE,
429 NCREG, RESC1,
430 " fildll AL\n", },
431
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", },
441
442
443
444/* slut sconv */
445
446/*
447 * Subroutine calls.
448 */
449
450{ CALL, FOREFF,
451 SCON, TANY,
452 SANY, TANY,
453 0, 0,
454 " call CL\nZC", },
455
456{ UCALL, FOREFF,
457 SCON, TANY,
458 SANY, TANY,
459 0, 0,
460 " call CL\n", },
461
462{ CALL, INAREG,
463 SCON, TANY,
464 SAREG, TLL|ANYFIXED|TPOINT,
465 NAREG|NASL, RESC1, /* should be 0 */
466 " call CL\nZC", },
467
468{ UCALL, INAREG,
469 SCON, TANY,
470 SAREG, TLL|ANYFIXED|TPOINT,
471 NAREG|NASL, RESC1, /* should be 0 */
472 " call CL\n", },
473
474{ CALL, INBREG,
475 SCON, TANY,
476 SBREG, TANY,
477 NBREG|NBSL, RESC1, /* should be 0 */
478 " call CL\nZC", },
479
480{ UCALL, INBREG,
481 SCON, TANY,
482 SBREG, TANY,
483 NBREG|NBSL, RESC1, /* should be 0 */
484 " call CL\nZC", },
485
486{ CALL, INCREG,
487 SCON, TANY,
488 SCREG, TANY,
489 NCREG|NCSL, RESC1, /* should be 0 */
490 " call CL\nZC", },
491
492{ UCALL, INCREG,
493 SCON, TANY,
494 SCREG, TANY,
495 NCREG|NCSL, RESC1, /* should be 0 */
496 " call CL\nZC", },
497
498
499{ CALL, FOREFF,
500 SAREG, TANY,
501 SANY, TANY,
502 0, 0,
503 " call *AL\nZC", },
504
505{ UCALL, FOREFF,
506 SAREG, TANY,
507 SANY, TANY,
508 0, 0,
509 " call *AL\nZC", },
510
511{ CALL, INAREG,
512 SAREG, TANY,
513 SANY, TANY,
514 NAREG|NASL, RESC1, /* should be 0 */
515 " call *AL\nZC", },
516
517{ UCALL, INAREG,
518 SAREG, TANY,
519 SANY, TANY,
520 NAREG|NASL, RESC1, /* should be 0 */
521 " call *AL\nZC", },
522
523{ CALL, INBREG,
524 SAREG, TANY,
525 SANY, TANY,
526 NBREG|NBSL, RESC1, /* should be 0 */
527 " call *AL\nZC", },
528
529{ UCALL, INBREG,
530 SAREG, TANY,
531 SANY, TANY,
532 NBREG|NBSL, RESC1, /* should be 0 */
533 " call *AL\nZC", },
534
535{ CALL, INCREG,
536 SAREG, TANY,
537 SANY, TANY,
538 NCREG|NCSL, RESC1, /* should be 0 */
539 " call *AL\nZC", },
540
541{ UCALL, INCREG,
542 SAREG, TANY,
543 SANY, TANY,
544 NCREG|NCSL, RESC1, /* should be 0 */
545 " call *AL\nZC", },
546
547/* struct return */
548{ USTCALL, FOREFF,
549 SCON, TANY,
550 SANY, TANY,
551 NAREG|NASL, 0,
552 "ZP call CL\nZC", },
553
554{ USTCALL, INAREG,
555 SCON, TANY,
556 SANY, TANY,
557 NAREG|NASL, RESC1, /* should be 0 */
558 "ZP call CL\nZC", },
559
560{ USTCALL, INAREG,
561 SNAME|SAREG, TANY,
562 SANY, TANY,
563 NAREG|NASL, RESC1, /* should be 0 */
564 "ZP call *AL\nZC", },
565
566{ STCALL, FOREFF,
567 SCON, TANY,
568 SANY, TANY,
569 NAREG|NASL, 0,
570 "ZP call CL\nZC", },
571
572{ STCALL, INAREG,
573 SCON, TANY,
574 SANY, TANY,
575 NAREG|NASL, RESC1, /* should be 0 */
576 "ZP call CL\nZC", },
577
578{ STCALL, INAREG,
579 SNAME|SAREG, TANY,
580 SANY, TANY,
581 NAREG|NASL, RESC1, /* should be 0 */
582 "ZP call *AL\nZC", },
583
584/*
585 * The next rules handle all binop-style operators.
586 */
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", },
593
594{ PLUS, INCREG|FOREFF,
595 SHFL, TLDOUBLE,
596 SHFL, TLDOUBLE,
597 0, RLEFT,
598 " faddp\n", },
599
600
601{ PLUS, INAREG|FOREFF,
602 SAREG|SNAME|SOREG, TLL|TPOINT,
603 SONE, TANY,
604 0, RLEFT,
605 " incq AL\n", },
606
607{ PLUS, INAREG|FOREFF,
608 SAREG|SNAME|SOREG, TWORD,
609 SONE, TANY,
610 0, RLEFT,
611 " incl AL\n", },
612
613{ PLUS, INAREG,
614 SAREG, TLL|TPOINT,
615 SCON, TWORD,
616 NAREG|NASL, RESC1,
617 " leaq CR(AL),A1\n", },
618
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
627
628{ PLUS, INAREG|FOREFF,
629 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
630 SONE, TANY,
631 0, RLEFT,
632 " incw AL\n", },
633
634{ PLUS, INAREG|FOREFF,
635 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
636 SONE, TANY,
637 0, RLEFT,
638 " incb AL\n", },
639
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
648
649{ MINUS, INAREG|FOREFF,
650 SAREG|SNAME|SOREG, TLL|TPOINT,
651 SONE, TANY,
652 0, RLEFT,
653 " decq AL\n", },
654
655{ MINUS, INAREG|FOREFF,
656 SAREG|SNAME|SOREG, TWORD,
657 SONE, TANY,
658 0, RLEFT,
659 " decl AL\n", },
660
661{ MINUS, INAREG|FOREFF,
662 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
663 SONE, TANY,
664 0, RLEFT,
665 " decw AL\n", },
666
667{ MINUS, INAREG|FOREFF,
668 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
669 SONE, TANY,
670 0, RLEFT,
671 " decb AL\n", },
672
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", },
679
680{ MINUS, INBREG|FOREFF,
681 SBREG, TDOUBLE|TFLOAT,
682 SBREG|SNAME|SOREG, TDOUBLE|TFLOAT,
683 0, RLEFT,
684 " subsZf AR,AL\n", },
685
686{ MINUS, INCREG|FOREFF,
687 SHFL, TLDOUBLE,
688 SHFL, TLDOUBLE,
689 0, RLEFT,
690 " fsubZAp\n", },
691
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", },
699
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", },
706
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", },
713
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", },
720
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", },
727
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", },
734
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", },
741
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", },
748
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
757
758{ OPSIMP, INAREG|FOREFF|FORCC,
759 SAREG|SNAME|SOREG, TWORD,
760 SCON, TANY,
761 0, RLEFT|RESCC,
762 " Ol AR,AL\n", },
763
764{ OPSIMP, INAREG|FOREFF|FORCC,
765 SHINT|SNAME|SOREG, TSHORT|TUSHORT,
766 SCON, TANY,
767 0, RLEFT|RESCC,
768 " Ow AR,AL\n", },
769
770{ OPSIMP, INAREG|FOREFF|FORCC,
771 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
772 SCON, TANY,
773 0, RLEFT|RESCC,
774 " Ob AR,AL\n", },
775
776/*
777 * The next rules handle all shift operators.
778 */
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", },
785
786/* r/m <<= const */
787{ LS, INAREG|FOREFF,
788 SAREG|SNAME|SOREG, TLL,
789 SCON, TANY,
790 0, RLEFT,
791 " salq AR,AL\n", },
792
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", },
799
800/* r/m <<= const */
801{ LS, INAREG|FOREFF,
802 SAREG|SNAME|SOREG, TWORD,
803 SCON, TANY,
804 0, RLEFT,
805 " sall AR,AL\n", },
806
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", },
813
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", },
820
821{ LS, INAREG|FOREFF,
822 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
823 SAREG, TCHAR|TUCHAR,
824 NSPECIAL, RLEFT,
825 " salb AR,AL\n", },
826
827{ LS, INAREG|FOREFF,
828 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
829 SCON, TANY,
830 0, RLEFT,
831 " salb AR,AL\n", },
832
833{ RS, INAREG|FOREFF,
834 SAREG|SNAME|SOREG, TLONG|TLONGLONG,
835 SAREG, TCHAR|TUCHAR,
836 NSPECIAL, RLEFT,
837 " sarq AR,AL\n", },
838
839{ RS, INAREG|FOREFF,
840 SAREG|SNAME|SOREG, TLONG|TLONGLONG,
841 SCON, TANY,
842 0, RLEFT,
843 " sarq AR,AL\n", },
844
845{ RS, INAREG|FOREFF,
846 SAREG|SNAME|SOREG, TULONG|TULONGLONG,
847 SAREG, TCHAR|TUCHAR,
848 NSPECIAL, RLEFT,
849 " shrq AR,AL\n", },
850
851{ RS, INAREG|FOREFF,
852 SAREG|SNAME|SOREG, TULONG|TULONGLONG,
853 SCON, TANY,
854 0, RLEFT,
855 " shrq AR,AL\n", },
856
857{ RS, INAREG|FOREFF,
858 SAREG|SNAME|SOREG, TSWORD,
859 SAREG, TCHAR|TUCHAR,
860 NSPECIAL, RLEFT,
861 " sarl AR,AL\n", },
862
863{ RS, INAREG|FOREFF,
864 SAREG|SNAME|SOREG, TSWORD,
865 SCON, TANY,
866 0, RLEFT,
867 " sarl AR,AL\n", },
868
869{ RS, INAREG|FOREFF,
870 SAREG|SNAME|SOREG, TUWORD,
871 SAREG, TCHAR|TUCHAR,
872 NSPECIAL, RLEFT,
873 " shrl AR,AL\n", },
874
875{ RS, INAREG|FOREFF,
876 SAREG|SNAME|SOREG, TUWORD,
877 SCON, TANY,
878 0, RLEFT,
879 " shrl AR,AL\n", },
880
881{ RS, INAREG|FOREFF,
882 SAREG|SNAME|SOREG, TSHORT,
883 SAREG, TCHAR|TUCHAR,
884 NSPECIAL, RLEFT,
885 " sarw AR,AL\n", },
886
887{ RS, INAREG|FOREFF,
888 SAREG|SNAME|SOREG, TSHORT,
889 SCON, TANY,
890 0, RLEFT,
891 " sarw AR,AL\n", },
892
893{ RS, INAREG|FOREFF,
894 SAREG|SNAME|SOREG, TUSHORT,
895 SAREG, TCHAR|TUCHAR,
896 NSPECIAL, RLEFT,
897 " shrw AR,AL\n", },
898
899{ RS, INAREG|FOREFF,
900 SAREG|SNAME|SOREG, TUSHORT,
901 SCON, TANY,
902 0, RLEFT,
903 " shrw AR,AL\n", },
904
905{ RS, INAREG|FOREFF,
906 SAREG|SNAME|SOREG, TCHAR,
907 SAREG, TCHAR|TUCHAR,
908 NSPECIAL, RLEFT,
909 " sarb AR,AL\n", },
910
911{ RS, INAREG|FOREFF,
912 SAREG|SNAME|SOREG, TCHAR,
913 SCON, TANY,
914 0, RLEFT,
915 " sarb AR,AL\n", },
916
917{ RS, INAREG|FOREFF,
918 SAREG|SNAME|SOREG, TUCHAR,
919 SAREG, TCHAR|TUCHAR,
920 NSPECIAL, RLEFT,
921 " shrb AR,AL\n", },
922
923{ RS, INAREG|FOREFF,
924 SAREG|SNAME|SOREG, TUCHAR,
925 SCON, TANY,
926 0, RLEFT,
927 " shrb AR,AL\n", },
928
929/*
930 * The next rules takes care of assignments. "=".
931 */
932{ ASSIGN, FORCC|FOREFF|INAREG,
933 SAREG, TLL|TPOINT,
934 SMIXOR, TANY,
935 0, RDEST,
936 " xorq AL,AL\n", },
937
938{ ASSIGN, FOREFF|INAREG,
939 SAREG, TLL|TPOINT,
940 SCON, TANY,
941 0, RDEST,
942 " movabs AR,AL\n", },
943
944{ ASSIGN, FORCC|FOREFF|INAREG,
945 SAREG, TWORD,
946 SMIXOR, TANY,
947 0, RDEST,
948 " xorl AL,AL\n", },
949
950{ ASSIGN, FOREFF,
951 SAREG|SNAME|SOREG, TWORD,
952 SCON, TANY,
953 0, 0,
954 " movl AR,AL\n", },
955
956{ ASSIGN, FOREFF|INAREG,
957 SAREG, TWORD,
958 SCON, TANY,
959 0, RDEST,
960 " movl AR,AL\n", },
961
962{ ASSIGN, FORCC|FOREFF|INAREG,
963 SAREG, TSHORT|TUSHORT,
964 SMIXOR, TANY,
965 0, RDEST,
966 " xorw AL,AL\n", },
967
968{ ASSIGN, FOREFF,
969 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
970 SCON, TANY,
971 0, 0,
972 " movw AR,AL\n", },
973
974{ ASSIGN, FOREFF|INAREG,
975 SAREG, TSHORT|TUSHORT,
976 SCON, TANY,
977 0, RDEST,
978 " movw AR,AL\n", },
979
980{ ASSIGN, FOREFF,
981 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
982 SCON, TANY,
983 0, 0,
984 " movb AR,AL\n", },
985
986{ ASSIGN, FOREFF|INAREG,
987 SAREG, TCHAR|TUCHAR,
988 SCON, TANY,
989 0, RDEST,
990 " movb AR,AL\n", },
991
992{ ASSIGN, FOREFF|INAREG,
993 SAREG|SNAME|SOREG, TLL|TPOINT,
994 SAREG, TLL|TPOINT,
995 0, RDEST,
996 " movq AR,AL\n", },
997
998{ ASSIGN, FOREFF|INAREG,
999 SAREG|SNAME|SOREG, TWORD,
1000 SAREG, TWORD,
1001 0, RDEST,
1002 " movl AR,AL\n", },
1003
1004{ ASSIGN, FOREFF|INAREG,
1005 SAREG, TWORD,
1006 SAREG|SNAME|SOREG, TWORD,
1007 0, RDEST,
1008 " movl AR,AL\n", },
1009
1010{ ASSIGN, FOREFF|INAREG,
1011 SAREG, TPOINT,
1012 SAREG|SNAME|SOREG, TPOINT,
1013 0, RDEST,
1014 " movq AR,AL\n", },
1015
1016{ ASSIGN, FOREFF|INAREG,
1017 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
1018 SAREG, TSHORT|TUSHORT,
1019 0, RDEST,
1020 " movw AR,AL\n", },
1021
1022{ ASSIGN, FOREFF|INAREG,
1023 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
1024 SAREG, TCHAR|TUCHAR|TWORD,
1025 0, RDEST,
1026 " movb AR,AL\n", },
1027
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", },
1040
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", },
1053
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", },
1065
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", },
1079
1080{ ASSIGN, INBREG|FOREFF,
1081 SBREG, TFLOAT|TDOUBLE,
1082 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
1083 0, RDEST,
1084 " movsZf AR,AL\n", },
1085
1086{ ASSIGN, INBREG|FOREFF,
1087 SBREG|SOREG|SNAME, TFLOAT|TDOUBLE,
1088 SBREG, TFLOAT|TDOUBLE,
1089 0, RDEST,
1090 " movsZf AR,AL\n", },
1091
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 */
1098
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 */
1105
1106{ ASSIGN, FOREFF,
1107 SNAME|SOREG, TLDOUBLE,
1108 SHFL, TLDOUBLE,
1109 0, 0,
1110 " fstpt AL\n", },
1111
1112/* end very important order */
1113
1114{ ASSIGN, INFL|FOREFF,
1115 SHFL, TLDOUBLE,
1116 SHFL|SOREG|SNAME, TLDOUBLE,
1117 0, RDEST,
1118 " fldt AR\n", },
1119
1120/* end x87 */
1121
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
1130
1131{ STASG, INAREG|FOREFF,
1132 SOREG|SNAME, TANY,
1133 SAREG, TPTRTO|TANY,
1134 NSPECIAL, RDEST,
1135 "ZQ", },
1136
1137/*
1138 * DIV/MOD/MUL
1139 */
1140{ DIV, INAREG,
1141 SAREG, TLONG,
1142 SAREG|SNAME|SOREG, TLL,
1143 NSPECIAL, RDEST,
1144 " cqto\n idivq AR\n", },
1145
1146{ DIV, INAREG,
1147 SAREG, TULONG|TPOINT,
1148 SAREG|SNAME|SOREG, TLL|TPOINT,
1149 NSPECIAL, RDEST,
1150 " xorq %rdx,%rdx\n divq AR\n", },
1151
1152{ DIV, INAREG,
1153 SAREG, TSWORD,
1154 SAREG|SNAME|SOREG, TWORD,
1155 NSPECIAL, RDEST,
1156 " cltd\n idivl AR\n", },
1157
1158{ DIV, INAREG,
1159 SAREG, TUWORD,
1160 SAREG|SNAME|SOREG, TWORD,
1161 NSPECIAL, RDEST,
1162 " xorl %edx,%edx\n divl AR\n", },
1163
1164{ DIV, INAREG,
1165 SAREG, TUSHORT,
1166 SAREG|SNAME|SOREG, TUSHORT,
1167 NSPECIAL, RDEST,
1168 " xorl %edx,%edx\n divw AR\n", },
1169
1170{ DIV, INAREG,
1171 SAREG, TUCHAR,
1172 SAREG|SNAME|SOREG, TUCHAR,
1173 NSPECIAL, RDEST,
1174 " xorb %ah,%ah\n divb AR\n", },
1175
1176{ DIV, INBREG,
1177 SBREG, TFLOAT|TDOUBLE,
1178 SBREG|SNAME|SOREG, TFLOAT|TDOUBLE,
1179 0, RLEFT,
1180 " divsZf AR,AL\n", },
1181
1182{ DIV, INCREG,
1183 SHFL, TLDOUBLE,
1184 SHFL, TLDOUBLE,
1185 0, RLEFT,
1186 " fdivZAp\n", },
1187
1188{ MOD, INAREG,
1189 SAREG, TLONG,
1190 SAREG|SNAME|SOREG, TLONG,
1191 NAREG|NSPECIAL, RESC1,
1192 " cqto\n idivq AR\n", },
1193
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", },
1199
1200{ MOD, INAREG,
1201 SAREG, TSWORD,
1202 SAREG|SNAME|SOREG, TSWORD,
1203 NAREG|NSPECIAL, RESC1,
1204 " cltd\n idivl AR\n", },
1205
1206{ MOD, INAREG,
1207 SAREG, TWORD,
1208 SAREG|SNAME|SOREG, TUWORD,
1209 NAREG|NSPECIAL, RESC1,
1210 " xorl %edx,%edx\n divl AR\n", },
1211
1212{ MOD, INAREG,
1213 SAREG, TUSHORT,
1214 SAREG|SNAME|SOREG, TUSHORT,
1215 NAREG|NSPECIAL, RESC1,
1216 " xorl %edx,%edx\n divw AR\n", },
1217
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", },
1223
1224{ MUL, INAREG,
1225 SAREG, TLL|TPOINT,
1226 SAREG|SNAME|SOREG, TLL|TPOINT,
1227 0, RLEFT,
1228 " imulq AR,AL\n", },
1229
1230{ MUL, INAREG,
1231 SAREG, TWORD,
1232 SAREG|SNAME|SOREG|SCON, TWORD,
1233 0, RLEFT,
1234 " imull AR,AL\n", },
1235
1236{ MUL, INAREG,
1237 SAREG, TSHORT|TUSHORT,
1238 SAREG|SNAME|SOREG, TSHORT|TUSHORT,
1239 0, RLEFT,
1240 " imulw AR,AL\n", },
1241
1242{ MUL, INAREG,
1243 SAREG, TCHAR|TUCHAR,
1244 SAREG|SNAME|SOREG, TCHAR|TUCHAR,
1245 NSPECIAL, RLEFT,
1246 " imulb AR\n", },
1247
1248{ MUL, INBREG,
1249 SBREG, TFLOAT|TDOUBLE,
1250 SBREG|SNAME|SOREG, TFLOAT|TDOUBLE,
1251 0, RLEFT,
1252 " mulsZf AR,AL\n", },
1253
1254{ MUL, INCREG,
1255 SHFL, TLDOUBLE,
1256 SHFL, TLDOUBLE,
1257 0, RLEFT,
1258 " fmulp\n", },
1259
1260/*
1261 * Indirection operators.
1262 */
1263{ UMUL, INAREG,
1264 SANY, TANY,
1265 SOREG, TLL|TPOINT,
1266 NAREG, RESC1,
1267 " movq AL,A1\n", },
1268
1269{ UMUL, INAREG,
1270 SANY, TWORD,
1271 SOREG, TWORD,
1272 NAREG|NASL, RESC1,
1273 " movl AL,A1\n", },
1274
1275{ UMUL, INAREG,
1276 SANY, TANY,
1277 SOREG, TCHAR|TUCHAR,
1278 NAREG|NASL, RESC1,
1279 " movb AL,A1\n", },
1280
1281{ UMUL, INAREG,
1282 SANY, TANY,
1283 SOREG, TSHORT|TUSHORT,
1284 NAREG|NASL, RESC1,
1285 " movw AL,A1\n", },
1286
1287{ UMUL, INBREG,
1288 SANY, TANY,
1289 SOREG, TFLOAT|TDOUBLE,
1290 NBREG|NBSL, RESC1,
1291 " movsZf AL,A1\n", },
1292
1293{ UMUL, INCREG,
1294 SANY, TANY,
1295 SOREG, TLDOUBLE,
1296 NCREG|NCSL, RESC1,
1297 " fldt AL\n", },
1298
1299/*
1300 * Logical/branching operators
1301 */
1302
1303/* Comparisions, take care of everything */
1304
1305{ OPLOG, FORCC,
1306 SAREG, TLL|TPOINT,
1307 SAREG|SOREG|SNAME, TLL|TPOINT,
1308 0, RESCC,
1309 " cmpq AR,AL\n", },
1310
1311{ OPLOG, FORCC,
1312 SAREG|SOREG|SNAME, TLL|TPOINT,
1313 SAREG, TLL|TPOINT,
1314 0, RESCC,
1315 " cmpq AR,AL\n", },
1316
1317{ OPLOG, FORCC,
1318 SAREG|SOREG|SNAME, TLL|TPOINT,
1319 SCON32, TANY,
1320 0, RESCC,
1321 " cmpq AR,AL\n", },
1322
1323{ OPLOG, FORCC,
1324 SAREG|SOREG|SNAME, TWORD,
1325 SCON|SAREG, TWORD,
1326 0, RESCC,
1327 " cmpl AR,AL\n", },
1328
1329{ OPLOG, FORCC,
1330 SCON|SAREG, TWORD,
1331 SAREG|SOREG|SNAME, TWORD,
1332 0, RESCC,
1333 " cmpl AR,AL\n", },
1334
1335{ OPLOG, FORCC,
1336 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1337 SCON|SAREG, TANY,
1338 0, RESCC,
1339 " cmpw AR,AL\n", },
1340
1341{ OPLOG, FORCC,
1342 SAREG|SOREG|SNAME, TCHAR|TUCHAR,
1343 SCON|SAREG, TANY,
1344 0, RESCC,
1345 " cmpb AR,AL\n", },
1346
1347{ OPLOG, FORCC,
1348 SBREG, TDOUBLE|TFLOAT,
1349 SBREG|SNAME|SOREG, TDOUBLE|TFLOAT,
1350 0, RNOP,
1351 " ucomisZg AR,AL\nZU\n", },
1352
1353/* x87 */
1354{ OPLOG, FORCC,
1355 SCREG, TLDOUBLE,
1356 SCREG, TLDOUBLE,
1357 0, RNOP,
1358 "ZG", },
1359
1360{ OPLOG, FORCC,
1361 SANY, TANY,
1362 SANY, TANY,
1363 REWRITE, 0,
1364 "diediedie!", },
1365
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", },
1372
1373{ AND, INAREG|FOREFF,
1374 SAREG|SOREG|SNAME, TLL,
1375 SAREG, TLL,
1376 0, RLEFT,
1377 " andq AR,AL\n", },
1378
1379{ AND, INAREG|FOREFF,
1380 SAREG, TLL,
1381 SAREG|SOREG|SNAME, TLL,
1382 0, RLEFT,
1383 " andq AR,AL\n", },
1384
1385{ AND, INAREG|FOREFF,
1386 SAREG|SOREG|SNAME, TWORD,
1387 SCON|SAREG, TWORD,
1388 0, RLEFT,
1389 " andl AR,AL\n", },
1390
1391{ AND, INAREG|FOREFF,
1392 SAREG, TWORD,
1393 SAREG|SOREG|SNAME, TWORD,
1394 0, RLEFT,
1395 " andl AR,AL\n", },
1396
1397{ AND, INAREG|FOREFF,
1398 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1399 SCON|SAREG, TSHORT|TUSHORT,
1400 0, RLEFT,
1401 " andw AR,AL\n", },
1402
1403{ AND, INAREG|FOREFF,
1404 SAREG, TSHORT|TUSHORT,
1405 SAREG|SOREG|SNAME, TSHORT|TUSHORT,
1406 0, RLEFT,
1407 " andw AR,AL\n", },
1408
1409{ AND, INAREG|FOREFF,
1410 SAREG|SOREG|SNAME, TCHAR|TUCHAR,
1411 SCON|SAREG, TCHAR|TUCHAR,
1412 0, RLEFT,
1413 " andb AR,AL\n", },
1414
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 */
1421
1422/*
1423 * Jumps.
1424 */
1425{ GOTO, FOREFF,
1426 SCON, TANY,
1427 SANY, TANY,
1428 0, RNOP,
1429 " jmp LL\n", },
1430
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
1438
1439/*
1440 * Convert LTYPE to reg.
1441 */
1442{ OPLTYPE, FORCC|INAREG,
1443 SAREG, TLL|TPOINT,
1444 SMIXOR, TANY,
1445 NAREG, RESC1,
1446 " xorq A1,A1\n", },
1447
1448{ OPLTYPE, INAREG,
1449 SANY, TANY,
1450 SAREG|SCON|SOREG|SNAME, TLL|TPOINT,
1451 NAREG, RESC1,
1452 " movq AL,A1\n", },
1453
1454{ OPLTYPE, FORCC|INAREG,
1455 SAREG, TWORD,
1456 SMIXOR, TANY,
1457 NAREG|NASL, RESC1,
1458 " xorl A1,A1\n", },
1459
1460{ OPLTYPE, INAREG,
1461 SANY, TANY,
1462 SAREG|SCON|SOREG|SNAME, TWORD,
1463 NAREG|NASL, RESC1,
1464 " movl AL,A1\n", },
1465
1466{ OPLTYPE, INAREG,
1467 SANY, TANY,
1468 SAREG|SOREG|SNAME|SCON, TCHAR|TUCHAR,
1469 NAREG, RESC1,
1470 " movb AL,A1\n", },
1471
1472{ OPLTYPE, FORCC|INAREG,
1473 SAREG, TSHORT|TUSHORT,
1474 SMIXOR, TANY,
1475 NAREG, RESC1,
1476 " xorw A1,A1\n", },
1477
1478{ OPLTYPE, INAREG,
1479 SANY, TANY,
1480 SAREG|SOREG|SNAME|SCON, TSHORT|TUSHORT,
1481 NAREG, RESC1,
1482 " movw AL,A1\n", },
1483
1484{ OPLTYPE, INBREG,
1485 SANY, TFLOAT|TDOUBLE,
1486 SOREG|SNAME|SBREG, TFLOAT|TDOUBLE,
1487 NBREG, RESC1,
1488 " movsZf AL,A1\n", },
1489
1490/* x87 entry */
1491{ OPLTYPE, INCREG,
1492 SANY, TLDOUBLE,
1493 SOREG|SNAME, TLDOUBLE,
1494 NCREG, RESC1,
1495 " fldt AL\n", },
1496
1497/*
1498 * Negate a word.
1499 */
1500
1501{ UMINUS, INAREG|FOREFF,
1502 SAREG, TLL|TPOINT,
1503 SAREG, TLL|TPOINT,
1504 0, RLEFT,
1505 " negq AL\n", },
1506
1507{ UMINUS, INAREG|FOREFF,
1508 SAREG, TWORD,
1509 SAREG, TWORD,
1510 0, RLEFT,
1511 " negl AL\n", },
1512
1513{ UMINUS, INAREG|FOREFF,
1514 SAREG, TSHORT|TUSHORT,
1515 SAREG, TSHORT|TUSHORT,
1516 0, RLEFT,
1517 " negw AL\n", },
1518
1519{ UMINUS, INAREG|FOREFF,
1520 SAREG, TCHAR|TUCHAR,
1521 SAREG, TCHAR|TUCHAR,
1522 0, RLEFT,
1523 " negb AL\n", },
1524
1525{ UMINUS, INBREG,
1526 SBREG, TDOUBLE|TFLOAT,
1527 SBREG, TDOUBLE|TFLOAT,
1528 0, RLEFT,
1529 " xorpZf LC(%rip),AL\n", },
1530
1531{ UMINUS, INCREG,
1532 SCREG, TLDOUBLE,
1533 SCREG, TLDOUBLE,
1534 0, RLEFT,
1535 " fchs\n", },
1536
1537{ COMPL, INAREG,
1538 SAREG, TLL,
1539 SANY, TANY,
1540 0, RLEFT,
1541 " notq AL\n", },
1542
1543{ COMPL, INAREG,
1544 SAREG, TWORD,
1545 SANY, TANY,
1546 0, RLEFT,
1547 " notl AL\n", },
1548
1549{ COMPL, INAREG,
1550 SAREG, TSHORT|TUSHORT,
1551 SANY, TANY,
1552 0, RLEFT,
1553 " notw AL\n", },
1554
1555{ COMPL, INAREG,
1556 SAREG, TCHAR|TUCHAR,
1557 SANY, TANY,
1558 0, RLEFT,
1559 " notb AL\n", },
1560
1561{ STARG, FOREFF,
1562 SAREG|SOREG|SNAME|SCON, TANY,
1563 SANY, TSTRUCT,
1564 NSPECIAL, 0,
1565 "ZF", },
1566
1567{ ADDROF, INAREG,
1568 SNAME, TANY,
1569 SANY, TANY,
1570 NAREG, RESC1,
1571 " leaq AL,A1\n", },
1572
1573# define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1574
1575{ UMUL, DF( UMUL ), },
1576
1577{ ASSIGN, DF(ASSIGN), },
1578
1579{ STASG, DF(STASG), },
1580
1581{ FLD, DF(FLD), },
1582
1583{ OPLEAF, DF(NAME), },
1584
1585/* { INIT, DF(INIT), }, */
1586
1587{ OPUNARY, DF(UMINUS), },
1588
1589{ OPANY, DF(BITYPE), },
1590
1591{ FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
1592};
1593
1594int tablesize = sizeof(table)/sizeof(table[0]);
Note: See TracBrowser for help on using the repository browser.