1 /* $Id: table.c,v 1.45 2011/02/18 17:08:31 ragge Exp $ */
3 * Copyright (c) 2008 Michael Shalayeff
4 * Copyright (c) 2008 Anders Magnusson (ragge@ludd.ltu.se).
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
39 # define TWORD TUWORD|TSWORD
40 #define TANYINT TLL|ANYFIXED
41 #define SHINT SAREG /* Any integer */
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 */
58 SAREG
|SOREG
|SNAME
, TUWORD
,
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 */
74 /* 32-bit to smaller */
81 /* 16-bit to smaller */
83 SAREG
, TSHORT
|TUSHORT
,
84 SAREG
, TUSHORT
|TUCHAR
|TSHORT
|TCHAR
,
96 * Casts from memory to same or smaller register is equally simple.
98 /* 64-bit to smaller */
100 SNAME
|SOREG
, TLL
|TPOINT
,
105 /* 32-bit to smaller */
112 /* 16-bit to smaller */
114 SNAME
|SOREG
, TSHORT
|TUSHORT
,
115 SAREG
, TUSHORT
|TUCHAR
|TSHORT
|TCHAR
,
121 SNAME
|SOREG
, TCHAR
|TUCHAR
,
127 /* char to something */
129 /* convert char to (unsigned) short. */
131 SAREG
|SOREG
|SNAME
, TCHAR
,
132 SAREG
, TSHORT
|TUSHORT
,
134 " movsbw AL,A1\n", },
136 /* convert unsigned char to (u)short. */
138 SAREG
|SOREG
|SNAME
, TUCHAR
,
139 SAREG
, TSHORT
|TUSHORT
,
141 " movzbw AL,A1\n", },
143 /* convert signed char to int (or pointer). */
145 SAREG
|SOREG
|SNAME
, TCHAR
,
148 " movsbl AL,A1\n", },
150 /* convert unsigned char to (u)int. */
152 SAREG
|SOREG
|SNAME
, TUCHAR
,
155 " movzbl AL,A1\n", },
157 /* convert char to (u)long long */
159 SAREG
|SOREG
|SNAME
, TCHAR
,
162 " movsbq AL,A1\n", },
164 /* convert unsigned char to (u)long long */
166 SAREG
|SOREG
|SNAME
, TUCHAR
,
169 " movzbq AL,A1\n", },
171 /* short to something */
173 /* convert short to (u)int. */
175 SAREG
|SOREG
|SNAME
, TSHORT
,
178 " movswl AL,A1\n", },
180 /* convert unsigned short to (u)int. */
182 SAREG
|SOREG
|SNAME
, TUSHORT
,
185 " movzwl AL,A1\n", },
187 /* convert short to (u)long long */
189 SAREG
|SOREG
|SNAME
, TSHORT
,
192 " movswq AL,A1\n", },
194 /* convert unsigned short to (u)long long */
196 SAREG
|SOREG
|SNAME
, TUSHORT
,
199 " movzwq AL,A1\n", },
201 /* int to something */
203 /* convert signed int to (u)long long */
208 " movslq AL,A1\n", },
210 /* convert unsigned int to (u)long long */
212 SAREG
|SOREG
|SNAME
, TUWORD
,
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).
243 /* convert int/long to float/double */
245 SAREG
|SOREG
|SNAME
, TINT
|TLONG
,
246 SBREG
, TFLOAT
|TDOUBLE
,
248 " cvtsi2sZfZq AL,A1\n", },
250 /* convert unsigned int to float/double */
252 SAREG
|SOREG
|SNAME
, TUNSIGNED
,
253 SBREG
, TFLOAT
|TDOUBLE
,
255 " movl AL,Z1\n cvtsi2sZfq A1,A2\n", },
257 /* convert unsigned long to float/double */
259 SAREG
|SOREG
|SNAME
, TULONG
,
260 SBREG
, TFLOAT
|TDOUBLE
,
261 NAREG
*2|NASL
|NBREG
, RESC3
,
264 /* convert float/double to (u)char/(u)short/int */
266 SBREG
|SOREG
|SNAME
, TFLOAT
|TDOUBLE
,
267 SAREG
, TCHAR
|TUCHAR
|TSHORT
|TUSHORT
|INT
,
269 " cvttsZg2si AL,A1\n", },
271 /* convert float/double to unsigned int/long */
273 SBREG
|SOREG
|SNAME
, TFLOAT
|TDOUBLE
,
274 SAREG
, TUNSIGNED
|TLONG
,
276 " cvttsZg2siq AL,Z8\n", },
278 /* convert float to double */
280 SBREG
|SNAME
|SOREG
, TFLOAT
,
283 " cvtss2sd AL,A1\n", },
285 /* convert double to float */
287 SBREG
|SNAME
|SOREG
, TDOUBLE
,
290 " cvtsd2ss AL,A1\n", },
292 /* x87 conversions */
293 /* float -> ldouble */
298 "\tsubq $4,%rsp\n\tmovss AL,(%rsp)\n"
299 "\tflds (%rsp)\n\taddq $4,%rsp\n", },
301 /* double -> ldouble */
306 "\tsubq $8,%rsp\n\tmovsd AL,(%rsp)\n"
307 "\tfldl (%rsp)\n\taddq $8,%rsp\n", },
309 /* ldouble -> double */
314 "\tsubq $8,%rsp\n\tfstpl (%rsp)\n"
315 "\tmovsd (%rsp),A1\n\taddq $8,%rsp\n", },
317 /* ldouble -> float */
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 */
332 /* convert unsigned int to long double */
336 NAREG
|NASL
|NCREG
, RESC2
,
341 " addq $16,%rsp\n", },
343 /* convert int (in register) to long double */
351 " addq $4,%rsp\n", },
353 /* unsigned long (in reg) to long double */
363 " movl $1602224128,(%rsp)\n"
368 /* unsigned long (in mem) to long double */
376 " push $1602224128\n"
381 /* convert float/double to unsigned long */
383 SBREG
, TFLOAT
|TDOUBLE
,
385 (NAREG
*2)|NBREG
, RESC1
,
388 /* long double to unsigned long */
390 SCREG
|SNAME
|SOREG
, TLDOUBLE
,
395 /* ldouble -> long XXX merge with int */
403 " movb $12,1(%rsp)\n"
408 " addq $16,%rsp\n", },
410 /* ldouble -> (u)int */
413 SAREG
, TINT
|TUNSIGNED
,
418 " movb $12,1(%rsp)\n"
423 " addq $16,%rsp\n", },
425 /* long (in mem) -> ldouble */
432 /* long (in reg) -> ldouble */
440 " addq $16,%rsp\n", },
464 SAREG
, TLL
|ANYFIXED
|TPOINT
,
465 NAREG
|NASL
, RESC1
, /* should be 0 */
470 SAREG
, TLL
|ANYFIXED
|TPOINT
,
471 NAREG
|NASL
, RESC1
, /* should be 0 */
477 NBREG
|NBSL
, RESC1
, /* should be 0 */
483 NBREG
|NBSL
, RESC1
, /* should be 0 */
489 NCREG
|NCSL
, RESC1
, /* should be 0 */
495 NCREG
|NCSL
, RESC1
, /* should be 0 */
514 NAREG
|NASL
, RESC1
, /* should be 0 */
520 NAREG
|NASL
, RESC1
, /* should be 0 */
526 NBREG
|NBSL
, RESC1
, /* should be 0 */
532 NBREG
|NBSL
, RESC1
, /* should be 0 */
538 NCREG
|NCSL
, RESC1
, /* should be 0 */
544 NCREG
|NCSL
, RESC1
, /* should be 0 */
557 NAREG
|NASL
, RESC1
, /* should be 0 */
563 NAREG
|NASL
, RESC1
, /* should be 0 */
564 "ZP call *AL\nZC", },
575 NAREG
|NASL
, RESC1
, /* should be 0 */
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 */
589 SBREG
, TFLOAT
|TDOUBLE
,
590 SBREG
|SNAME
|SOREG
, TFLOAT
|TDOUBLE
,
592 " addsZf AR,AL\n", },
594 { PLUS
, INCREG
|FOREFF
,
601 { PLUS
, INAREG
|FOREFF
,
602 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
607 { PLUS
, INAREG
|FOREFF
,
608 SAREG
|SNAME
|SOREG
, TWORD
,
617 " leaq CR(AL),A1\n", },
620 /* older binutils are missing leal */
625 " leal CR(AL),A1\n", },
628 { PLUS
, INAREG
|FOREFF
,
629 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
634 { PLUS
, INAREG
|FOREFF
,
635 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
641 /* older binutils are missing leal */
645 NAREG
|NASL
|NASR
, RESC1
,
646 " leal (AL,AR),A1\n", },
649 { MINUS
, INAREG
|FOREFF
,
650 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
655 { MINUS
, INAREG
|FOREFF
,
656 SAREG
|SNAME
|SOREG
, TWORD
,
661 { MINUS
, INAREG
|FOREFF
,
662 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
667 { MINUS
, INAREG
|FOREFF
,
668 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
673 /* address as register offset, negative */
678 " leaq -CR(AL),A1\n", },
680 { MINUS
, INBREG
|FOREFF
,
681 SBREG
, TDOUBLE
|TFLOAT
,
682 SBREG
|SNAME
|SOREG
, TDOUBLE
|TFLOAT
,
684 " subsZf AR,AL\n", },
686 { MINUS
, INCREG
|FOREFF
,
692 /* Simple r/m->reg ops */
694 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
695 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
701 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
703 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
708 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
709 SAREG
|SNAME
|SOREG
, TWORD
,
715 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
717 SAREG
|SNAME
|SOREG
, TWORD
,
722 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
723 SHINT
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
724 SHINT
, TSHORT
|TUSHORT
,
729 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
730 SHINT
, TSHORT
|TUSHORT
,
731 SHINT
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
736 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
738 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
743 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
745 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
750 #ifdef notdef /* amd64 lacks immediate 64-bit simple ops */
751 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
752 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
758 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
759 SAREG
|SNAME
|SOREG
, TWORD
,
764 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
765 SHINT
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
770 { OPSIMP
, INAREG
|FOREFF
|FORCC
,
771 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
777 * The next rules handle all shift operators.
781 SAREG
|SNAME
|SOREG
, TLL
,
788 SAREG
|SNAME
|SOREG
, TLL
,
795 SAREG
|SNAME
|SOREG
, TWORD
,
802 SAREG
|SNAME
|SOREG
, TWORD
,
809 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
816 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
822 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
828 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
834 SAREG
|SNAME
|SOREG
, TLONG
|TLONGLONG
,
840 SAREG
|SNAME
|SOREG
, TLONG
|TLONGLONG
,
846 SAREG
|SNAME
|SOREG
, TULONG
|TULONGLONG
,
852 SAREG
|SNAME
|SOREG
, TULONG
|TULONGLONG
,
858 SAREG
|SNAME
|SOREG
, TSWORD
,
864 SAREG
|SNAME
|SOREG
, TSWORD
,
870 SAREG
|SNAME
|SOREG
, TUWORD
,
876 SAREG
|SNAME
|SOREG
, TUWORD
,
882 SAREG
|SNAME
|SOREG
, TSHORT
,
888 SAREG
|SNAME
|SOREG
, TSHORT
,
894 SAREG
|SNAME
|SOREG
, TUSHORT
,
900 SAREG
|SNAME
|SOREG
, TUSHORT
,
906 SAREG
|SNAME
|SOREG
, TCHAR
,
912 SAREG
|SNAME
|SOREG
, TCHAR
,
918 SAREG
|SNAME
|SOREG
, TUCHAR
,
924 SAREG
|SNAME
|SOREG
, TUCHAR
,
930 * The next rules takes care of assignments. "=".
932 { ASSIGN
, FORCC
|FOREFF
|INAREG
,
938 { ASSIGN
, FOREFF
|INAREG
,
942 " movabs AR,AL\n", },
944 { ASSIGN
, FORCC
|FOREFF
|INAREG
,
951 SAREG
|SNAME
|SOREG
, TWORD
,
956 { ASSIGN
, FOREFF
|INAREG
,
962 { ASSIGN
, FORCC
|FOREFF
|INAREG
,
963 SAREG
, TSHORT
|TUSHORT
,
969 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
974 { ASSIGN
, FOREFF
|INAREG
,
975 SAREG
, TSHORT
|TUSHORT
,
981 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
986 { ASSIGN
, FOREFF
|INAREG
,
992 { ASSIGN
, FOREFF
|INAREG
,
993 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
998 { ASSIGN
, FOREFF
|INAREG
,
999 SAREG
|SNAME
|SOREG
, TWORD
,
1004 { ASSIGN
, FOREFF
|INAREG
,
1006 SAREG
|SNAME
|SOREG
, TWORD
,
1010 { ASSIGN
, FOREFF
|INAREG
,
1012 SAREG
|SNAME
|SOREG
, TPOINT
,
1016 { ASSIGN
, FOREFF
|INAREG
,
1017 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
1018 SAREG
, TSHORT
|TUSHORT
,
1022 { ASSIGN
, FOREFF
|INAREG
,
1023 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
1024 SAREG
, TCHAR
|TUCHAR
|TWORD
,
1028 { ASSIGN
, FOREFF
|INAREG
,
1030 SAREG
|SCON
, TCHAR
|TUCHAR
,
1041 { ASSIGN
, FOREFF
|INAREG
,
1042 SFLD
, TSHORT
|TUSHORT
,
1043 SAREG
|SCON
, TSHORT
|TUSHORT
,
1054 { ASSIGN
, FOREFF
|INAREG
,
1056 SAREG
|SNAME
|SOREG
|SCON
, TWORD
,
1066 { ASSIGN
, FOREFF
|INAREG
,
1068 SAREG
|SNAME
|SOREG
|SCON
, TLL
,
1080 { ASSIGN
, INBREG
|FOREFF
,
1081 SBREG
, TFLOAT
|TDOUBLE
,
1082 SBREG
|SOREG
|SNAME
, TFLOAT
|TDOUBLE
,
1084 " movsZf AR,AL\n", },
1086 { ASSIGN
, INBREG
|FOREFF
,
1087 SBREG
|SOREG
|SNAME
, TFLOAT
|TDOUBLE
,
1088 SBREG
, TFLOAT
|TDOUBLE
,
1090 " movsZf AR,AL\n", },
1093 { ASSIGN
, INDREG
|FOREFF
,
1097 "", }, /* This will always be in the correct register */
1099 /* order of table entries is very important here! */
1101 SNAME
|SOREG
, TLDOUBLE
,
1104 " fstpt AL\n fldt AL\n", }, /* XXX */
1107 SNAME
|SOREG
, TLDOUBLE
,
1112 /* end very important order */
1114 { ASSIGN
, INFL
|FOREFF
,
1116 SHFL
|SOREG
|SNAME
, TLDOUBLE
,
1122 /* Do not generate memcpy if return from funcall */
1124 { STASG
, INAREG
|FOREFF
,
1125 SOREG
|SNAME
|SAREG
, TPTRTO
|TSTRUCT
,
1126 SFUNCALL
, TPTRTO
|TSTRUCT
,
1131 { STASG
, INAREG
|FOREFF
,
1142 SAREG
|SNAME
|SOREG
, TLL
,
1144 " cqto\n idivq AR\n", },
1147 SAREG
, TULONG
|TPOINT
,
1148 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
1150 " xorq %rdx,%rdx\n divq AR\n", },
1154 SAREG
|SNAME
|SOREG
, TWORD
,
1156 " cltd\n idivl AR\n", },
1160 SAREG
|SNAME
|SOREG
, TWORD
,
1162 " xorl %edx,%edx\n divl AR\n", },
1166 SAREG
|SNAME
|SOREG
, TUSHORT
,
1168 " xorl %edx,%edx\n divw AR\n", },
1172 SAREG
|SNAME
|SOREG
, TUCHAR
,
1174 " xorb %ah,%ah\n divb AR\n", },
1177 SBREG
, TFLOAT
|TDOUBLE
,
1178 SBREG
|SNAME
|SOREG
, TFLOAT
|TDOUBLE
,
1180 " divsZf AR,AL\n", },
1190 SAREG
|SNAME
|SOREG
, TLONG
,
1191 NAREG
|NSPECIAL
, RESC1
,
1192 " cqto\n idivq AR\n", },
1196 SAREG
|SNAME
|SOREG
, TULONG
|TPOINT
,
1197 NAREG
|NSPECIAL
, RESC1
,
1198 " xorq %rdx,%rdx\n divq AR\n", },
1202 SAREG
|SNAME
|SOREG
, TSWORD
,
1203 NAREG
|NSPECIAL
, RESC1
,
1204 " cltd\n idivl AR\n", },
1208 SAREG
|SNAME
|SOREG
, TUWORD
,
1209 NAREG
|NSPECIAL
, RESC1
,
1210 " xorl %edx,%edx\n divl AR\n", },
1214 SAREG
|SNAME
|SOREG
, TUSHORT
,
1215 NAREG
|NSPECIAL
, RESC1
,
1216 " xorl %edx,%edx\n divw AR\n", },
1220 SAREG
|SNAME
|SOREG
, TUCHAR
,
1221 NAREG
|NSPECIAL
, RESC1
,
1222 " xorb %ah,%ah\n divb AR\n movb %ah,%al\n", },
1226 SAREG
|SNAME
|SOREG
, TLL
|TPOINT
,
1228 " imulq AR,AL\n", },
1232 SAREG
|SNAME
|SOREG
|SCON
, TWORD
,
1234 " imull AR,AL\n", },
1237 SAREG
, TSHORT
|TUSHORT
,
1238 SAREG
|SNAME
|SOREG
, TSHORT
|TUSHORT
,
1240 " imulw AR,AL\n", },
1243 SAREG
, TCHAR
|TUCHAR
,
1244 SAREG
|SNAME
|SOREG
, TCHAR
|TUCHAR
,
1249 SBREG
, TFLOAT
|TDOUBLE
,
1250 SBREG
|SNAME
|SOREG
, TFLOAT
|TDOUBLE
,
1252 " mulsZf AR,AL\n", },
1261 * Indirection operators.
1277 SOREG
, TCHAR
|TUCHAR
,
1283 SOREG
, TSHORT
|TUSHORT
,
1289 SOREG
, TFLOAT
|TDOUBLE
,
1291 " movsZf AL,A1\n", },
1300 * Logical/branching operators
1303 /* Comparisions, take care of everything */
1307 SAREG
|SOREG
|SNAME
, TLL
|TPOINT
,
1312 SAREG
|SOREG
|SNAME
, TLL
|TPOINT
,
1318 SAREG
|SOREG
|SNAME
, TLL
|TPOINT
,
1324 SAREG
|SOREG
|SNAME
, TWORD
,
1331 SAREG
|SOREG
|SNAME
, TWORD
,
1336 SAREG
|SOREG
|SNAME
, TSHORT
|TUSHORT
,
1342 SAREG
|SOREG
|SNAME
, TCHAR
|TUCHAR
,
1348 SBREG
, TDOUBLE
|TFLOAT
,
1349 SBREG
|SNAME
|SOREG
, TDOUBLE
|TFLOAT
,
1351 " ucomisZg AR,AL\nZU\n", },
1367 { AND
, INAREG
|FOREFF
,
1368 SAREG
|SOREG
|SNAME
, TLL
,
1373 { AND
, INAREG
|FOREFF
,
1374 SAREG
|SOREG
|SNAME
, TLL
,
1379 { AND
, INAREG
|FOREFF
,
1381 SAREG
|SOREG
|SNAME
, TLL
,
1385 { AND
, INAREG
|FOREFF
,
1386 SAREG
|SOREG
|SNAME
, TWORD
,
1391 { AND
, INAREG
|FOREFF
,
1393 SAREG
|SOREG
|SNAME
, TWORD
,
1397 { AND
, INAREG
|FOREFF
,
1398 SAREG
|SOREG
|SNAME
, TSHORT
|TUSHORT
,
1399 SCON
|SAREG
, TSHORT
|TUSHORT
,
1403 { AND
, INAREG
|FOREFF
,
1404 SAREG
, TSHORT
|TUSHORT
,
1405 SAREG
|SOREG
|SNAME
, TSHORT
|TUSHORT
,
1409 { AND
, INAREG
|FOREFF
,
1410 SAREG
|SOREG
|SNAME
, TCHAR
|TUCHAR
,
1411 SCON
|SAREG
, TCHAR
|TUCHAR
,
1415 { AND
, INAREG
|FOREFF
,
1416 SAREG
, TCHAR
|TUCHAR
,
1417 SAREG
|SOREG
|SNAME
, TCHAR
|TUCHAR
,
1431 #if defined(GCC_COMPAT) || defined(LANG_F77)
1440 * Convert LTYPE to reg.
1442 { OPLTYPE
, FORCC
|INAREG
,
1450 SAREG
|SCON
|SOREG
|SNAME
, TLL
|TPOINT
,
1454 { OPLTYPE
, FORCC
|INAREG
,
1462 SAREG
|SCON
|SOREG
|SNAME
, TWORD
,
1468 SAREG
|SOREG
|SNAME
|SCON
, TCHAR
|TUCHAR
,
1472 { OPLTYPE
, FORCC
|INAREG
,
1473 SAREG
, TSHORT
|TUSHORT
,
1480 SAREG
|SOREG
|SNAME
|SCON
, TSHORT
|TUSHORT
,
1485 SANY
, TFLOAT
|TDOUBLE
,
1486 SOREG
|SNAME
|SBREG
, TFLOAT
|TDOUBLE
,
1488 " movsZf AL,A1\n", },
1493 SOREG
|SNAME
, TLDOUBLE
,
1501 { UMINUS
, INAREG
|FOREFF
,
1507 { UMINUS
, INAREG
|FOREFF
,
1513 { UMINUS
, INAREG
|FOREFF
,
1514 SAREG
, TSHORT
|TUSHORT
,
1515 SAREG
, TSHORT
|TUSHORT
,
1519 { UMINUS
, INAREG
|FOREFF
,
1520 SAREG
, TCHAR
|TUCHAR
,
1521 SAREG
, TCHAR
|TUCHAR
,
1526 SBREG
, TDOUBLE
|TFLOAT
,
1527 SBREG
, TDOUBLE
|TFLOAT
,
1529 " xorpZf LC(%rip),AL\n", },
1550 SAREG
, TSHORT
|TUSHORT
,
1556 SAREG
, TCHAR
|TUCHAR
,
1562 SAREG
|SOREG
|SNAME
|SCON
, TANY
,
1573 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1575 { UMUL
, DF( UMUL
), },
1577 { ASSIGN
, DF(ASSIGN
), },
1579 { STASG
, DF(STASG
), },
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]);