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 |
|
---|
46 | struct 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 |
|
---|
1594 | int tablesize = sizeof(table)/sizeof(table[0]);
|
---|