source: mainline/uspace/app/pcc/arch/hppa/table.c@ 0395a7b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0395a7b 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: 18.7 KB
Line 
1/* $OpenBSD: table.c,v 1.2 2007/12/19 20:19:54 otto Exp $ */
2
3/*
4 * Copyright (c) 2007 Michael Shalayeff
5 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include "pass2.h"
32
33#define TLL TLONGLONG|TULONGLONG
34#define ANYSIGNED TINT|TLONG|TSHORT|TCHAR
35#define ANYUSIGNED TUNSIGNED|TULONG|TUSHORT|TUCHAR
36#define ANYFIXED ANYSIGNED|ANYUSIGNED
37#define TUWORD TUNSIGNED|TULONG
38#define TSWORD TINT|TLONG
39#define TWORD TUWORD|TSWORD
40#define THWORD TUSHORT|TSHORT
41#define TBYTE TUCHAR|TCHAR
42
43#define SHINT SAREG /* char, short and int */
44#define ININT INAREG
45#define SHLL SBREG /* shape for long long */
46#define INLL INBREG
47#define SHFL SCREG /* shape for float */
48#define INFL INCREG
49#define SHDBL SDREG /* shape for double */
50#define INDBL INDREG
51
52struct optab table[] = {
53/* First entry must be an empty entry */
54{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
55
56/* PCONVs are usually not necessary */
57{ PCONV, INAREG,
58 SAREG, TWORD|TPOINT,
59 SAREG, TWORD|TPOINT,
60 0, RLEFT,
61 "", },
62/*
63 * A bunch conversions of integral<->integral types
64 * There are lots of them, first in table conversions to itself
65 * and then conversions from each type to the others.
66 */
67
68/* itself to itself, including pointers */
69
70/* convert int,short,char <-> int,short,char. */
71{ SCONV, ININT,
72 SHINT, TBYTE,
73 SHINT, TBYTE,
74 0, RLEFT,
75 "", },
76
77{ SCONV, ININT,
78 SHINT, THWORD,
79 SHINT, THWORD,
80 0, RLEFT,
81 "", },
82
83{ SCONV, ININT,
84 SHINT, TWORD,
85 SHINT, TWORD,
86 0, RLEFT,
87 "", },
88
89/* convert pointers to int. */
90{ SCONV, ININT,
91 SHINT, TWORD|TPOINT,
92 SANY, TWORD,
93 0, RLEFT,
94 "", },
95
96/* convert (u)longlong to (u)longlong. */
97{ SCONV, INLL,
98 SHLL, TLL,
99 SHLL, TLL,
100 0, RLEFT,
101 "", },
102
103/* convert pointers to pointers. */
104{ SCONV, ININT,
105 SHINT, TPOINT,
106 SANY, TPOINT,
107 0, RLEFT,
108 "", },
109
110/* convert double <-> ldouble. nothing to do here (or support quads later) */
111{ SCONV, INDBL,
112 SHDBL, TDOUBLE|TLDOUBLE,
113 SHDBL, TDOUBLE|TLDOUBLE,
114 0, RLEFT,
115 "", },
116
117/* convert float -> double */
118{ SCONV, INFL,
119 SHFL, TFLOAT,
120 SHDBL, TDOUBLE|TLDOUBLE,
121 0, 0,
122 "\tfcnvff,sgl,dbl AL,AR\n", },
123
124/* convert double -> float */
125{ SCONV, INDBL,
126 SHDBL, TDOUBLE|TLDOUBLE,
127 SHFL, TFLOAT,
128 0, 0,
129 "\tfcnvff,dbl,sgl\tAL,AR\n", },
130
131/* convert int,short,char to (u)long long */
132{ SCONV, INLL,
133 SHINT, ANYSIGNED,
134 SANY, TLL,
135 NBREG, RESC1,
136 "\tcopy\tAL,A1\n"
137 "\textrs\tAL,0,1,U1\n", },
138
139/* convert unsigned int,short,char to (u)long long */
140{ SCONV, INLL,
141 SHINT, TWORD,
142 SANY, TLL,
143 NBREG, RESC1,
144 "\tcopy\tAL,A1\n"
145 "\tcopy\t%r0,U1\n", },
146
147/* convert int,short,char (in memory) to float */
148{ SCONV, INFL,
149 SOREG, ANYSIGNED,
150 SHFL, TFLOAT,
151 NCREG, RESC1,
152 "\tfldws\tAL,A1\n"
153 "\tfcnvxf,sgl,sgl\tA1,A1\n", },
154
155/* convert int,short,char (in memory) to double */
156{ SCONV, INDBL,
157 SOREG, TSWORD,
158 SHDBL, TDOUBLE|TLDOUBLE,
159 NDREG, RESC1,
160 "\tfldws\tAL,A1\n"
161 "\tfcnvxf,sgl,dbl\tA1,A1\n", },
162
163/* convert (u)long (in memory) to double */
164{ SCONV, INDBL,
165 SOREG, TLL,
166 SHDBL, TDOUBLE|TLDOUBLE,
167 NDREG, RESC1,
168 "\tfldds\tAL,A1\n"
169 "\tfcnvxf,dbl,dbl\tA1,A1\n", },
170
171/* convert int,short,char (in register) to float */
172{ SCONV, INFL,
173 SHINT, TSWORD,
174 SHFL, TFLOAT,
175 NCREG, RESC1,
176 "\tstw,ma\tAL,4(%sp)\n"
177 "\tfldws,ma\t-4(%sp),A1\n"
178 "\tfcnvxf,sgl,sgl\tA1,A1\n", },
179
180/* convert int,short,char (in register) to double */
181{ SCONV, INDBL,
182 SHINT, TSWORD,
183 SHDBL, TDOUBLE|TLDOUBLE,
184 NDREG, RESC1,
185 "\tstw,ma\tAL,4(%sp)\n"
186 "\tfldws,mb\t-4(%sp),AR\n"
187 "\tfcnvxf,sgl,dbl\tA1,A1\n", },
188
189/* convert (u)long (in register) to double */
190{ SCONV, INDBL,
191 SHLL, TLL,
192 SHDBL, TDOUBLE|TLDOUBLE,
193 NDREG, RESC1,
194 "\tldo\t8(%sp),%sp\n"
195 "\tstw\tAL,-8(%sp)\n"
196 "\tstw\tUL,-4(%sp)\n"
197 "\tfldds,mb\t-8(%sp),A1\n"
198 "\tfcnvxf,dbl,dbl\tA1,A1\n", },
199
200/* convert char to (unsigned) short/int. */
201{ SCONV, ININT,
202 SAREG, TCHAR,
203 SAREG, THWORD|TWORD,
204 NASL|NAREG, RESC1,
205 "\textrs\tAL,31,8,A1\n", },
206
207/* convert unsigned char to (unsigned) short/int. */
208{ SCONV, ININT,
209 SAREG, TUCHAR,
210 SAREG, THWORD|TWORD,
211 NASL|NAREG, RESC1,
212 "\textru\tAL,31,8,A1\n", },
213
214/* convert char to (unsigned) long long. */
215{ SCONV, INLL,
216 SAREG, TCHAR,
217 SBREG, TLL,
218 NBSL|NBREG, RESC1,
219 "\textrs\tAL,31,8,A1\n\textrs\tA1,0,1,U1", },
220
221/* convert unsigned char to (unsigned) long long. */
222{ SCONV, INLL,
223 SAREG, TUCHAR,
224 SBREG, TLL,
225 NBSL|NBREG, RESC1,
226 "\textru\tAL,31,8,A1\n\tcopy\t%r0,U1", },
227
228/* convert short to (unsigned) int. */
229{ SCONV, ININT,
230 SAREG, TSHORT,
231 SAREG, TWORD,
232 NASL|NAREG, RESC1,
233 "\textrs\tAL,31,16,A1\n", },
234
235/* convert unsigned short to (unsigned) int. */
236{ SCONV, ININT,
237 SAREG, TUSHORT,
238 SAREG, THWORD,
239 NASL|NAREG, RESC1,
240 "\textru\tAL,31,16,A1\n", },
241
242/* convert short to (unsigned) long long. */
243{ SCONV, INLL,
244 SAREG, TSHORT,
245 SBREG, TLL,
246 NBSL|NBREG, RESC1,
247 "\textrs\tAL,31,16,A1\n\textrs\tA1,0,1,U1", },
248
249/* convert unsigned short to (unsigned) long long. */
250{ SCONV, INLL,
251 SAREG, TUSHORT,
252 SBREG, TLL,
253 NBSL|NBREG, RESC1,
254 "\textru\tAL,31,16,A1\n\tcopy\t%r0,U1", },
255
256/* convert int,short,char (in memory) to int,short,char */
257{ SCONV, ININT,
258 SOREG, TBYTE,
259 SHINT, TBYTE|TPOINT,
260 NAREG|NASL, RESC1,
261 "\tldb\tAL,A1\n", },
262
263{ SCONV, ININT,
264 SOREG, THWORD,
265 SHINT, THWORD|TPOINT,
266 NAREG|NASL, RESC1,
267 "\tldh\tAL,A1\n", },
268
269{ SCONV, ININT,
270 SOREG, TWORD,
271 SHINT, TWORD|TPOINT,
272 NAREG|NASL, RESC1,
273 "\tldw\tAL,A1\n", },
274
275/* convert (u)long long (in register) to int,short,char */
276{ SCONV, ININT,
277 SHLL, TLL,
278 SHINT, ANYFIXED,
279 NAREG|NASL, RESC1,
280 "\tcopy\tAL,A1\n", },
281
282/* convert (u)long (in memory) to int,short,char */
283{ SCONV, ININT,
284 SOREG, TLL,
285 SHINT, ANYFIXED,
286 NAREG|NASL, RESC1,
287 "\tldw\tAL,A1\n", },
288
289/* convert float (in register) to (u)int */
290{ SCONV, ININT,
291 SHFL, TFLOAT,
292 SHINT, TWORD,
293 NAREG, RESC1,
294 "\tfcnvfxt,sgl,sgl\tAL,AL\n"
295 "\tfstws,ma\tAL,4(%sp)\n"
296 "\tldw,mb\t-4(%sp),A1\n", },
297
298/* convert double (in register) to (u)int */
299{ SCONV, ININT,
300 SHDBL, TDOUBLE|TLDOUBLE,
301 SHINT, TWORD,
302 NCREG|NCSL|NAREG, RESC2,
303 "\tfcnvfxt,dbl,sgl\tAL,A1\n"
304 "\tfstws,ma\tA1,4(%sp)\n"
305 "\tldw,mb\t-4(%sp),A2\n", },
306
307/* convert float (in register) to (u)long */
308{ SCONV, INLL,
309 SHFL, TFLOAT,
310 SHLL, TLL,
311 NDREG|NDSL|NBREG, RESC2,
312 "\tfcnvfxt,sgl,dbl\tAL,A1\n"
313 "\tfstds,ma\tA1,8(%sp)\n"
314 "\tldw\t-8(%sp),A2\n"
315 "\tldw\t-4(%sp),U2\n"
316 "\tldo\t-8(%sp),%sp)\n", },
317
318/* convert double (in register) to (u)long */
319{ SCONV, INLL,
320 SHDBL, TDOUBLE|TLDOUBLE,
321 SHLL, TLL,
322 NBREG, RESC1,
323 "\tfcnvfxt,dbl,dbl\tAL,AL\n"
324 "\tfstds,ma\tAL,8(%sp)\n"
325 "\tldw\t-8(%sp),A1\n"
326 "\tldw\t-4(%sp),U1\n"
327 "\tldo\t-8(%sp),%sp)\n", },
328
329/*
330 * Subroutine calls.
331 */
332
333{ CALL, FOREFF,
334 SAREG, TANY,
335 SANY, TANY,
336 0, 0,
337 "ZP\tblr\t%r0, %rp\n"
338 "\tbv,n\t%r0(AL)\n"
339 "\tnop\nZC", },
340
341{ UCALL, FOREFF,
342 SAREG, TANY,
343 SANY, TANY,
344 0, 0,
345 "ZP\tblr\t%r0, %rp\n"
346 "\tbv,n\t%r0(AL)\n"
347 "\tnop\nZC", },
348
349{ CALL, ININT,
350 SAREG, TANY,
351 SHINT, ANYFIXED|TPOINT,
352 NAREG|NASL, RESC1,
353 "ZP\tblr\t%r0, %rp\n"
354 "\tbv,n\t%r0(AL)\n"
355 "\tnop\nZC", },
356
357{ UCALL, ININT,
358 SAREG, TANY,
359 SHINT, ANYFIXED|TPOINT,
360 NAREG|NASL, RESC1,
361 "ZP\tblr\t%r0, %rp\n"
362 "\tbv,n\t%r0(AL)\n"
363 "\tnop\nZC", },
364
365{ CALL, INLL,
366 SAREG, TANY,
367 SHLL, TLL,
368 NBREG|NBSL, RESC1,
369 "ZP\tblr\t%r0, %rp\n"
370 "\tbv,n\t%r0(AL)\n"
371 "\tnop\nZC", },
372
373{ UCALL, INLL,
374 SAREG, TANY,
375 SHLL, TLL,
376 NBREG|NBSL, RESC1,
377 "ZP\tblr\t%r0, %rp\n"
378 "\tbv,n\t%r0(AL)\n"
379 "\tnop\nZC", },
380
381{ CALL, INFL,
382 SAREG, TANY,
383 SHFL, TFLOAT,
384 NCREG|NCSL, RESC1,
385 "ZP\tblr\t%r0, %rp\n"
386 "\tbv,n\t%r0(AL)\n"
387 "\tnop\nZC", },
388
389{ UCALL, INFL,
390 SAREG, TANY,
391 SHFL, TFLOAT,
392 NCREG|NCSL, RESC1,
393 "ZP\tblr\t%r0, %rp\n"
394 "\tbv,n\t%r0(AL)\n"
395 "\tnop\nZC", },
396
397{ CALL, INDBL,
398 SAREG, TANY,
399 SHDBL, TDOUBLE|TLDOUBLE,
400 NDREG|NDSL, RESC1,
401 "ZP\tblr\t%r0, %rp\n"
402 "\tbv,n\t%r0(AL)\n"
403 "\tnop\nZC", },
404
405{ UCALL, INDBL,
406 SAREG, TANY,
407 SHDBL, TDOUBLE|TLDOUBLE,
408 NDREG|NDSL, RESC1,
409 "ZP\tblr\t%r0, %rp\n"
410 "\tbv,n\t%r0(AL)\n"
411 "\tnop\nZC", },
412
413/*
414 * The next rules handle all binop-style operators.
415 */
416/* TODO fix char/short overflows */
417
418{ PLUS, INLL,
419 SHLL, TLL,
420 SPICON, TANY,
421 NBREG|NBSL, RESC1,
422 "\taddi\tAL,AR,A1\n"
423 "\taddc\tUL,%r0,U1\n", },
424
425{ PLUS, INLL,
426 SHLL, TLL,
427 SHLL, TLL,
428 NBREG|NBSL|NBSR, RESC1,
429 "\tadd\tAL,AR,A1\n"
430 "\taddc\tUL,UR,U1\n", },
431
432{ PLUS, INFL,
433 SHFL, TFLOAT,
434 SHFL, TFLOAT,
435 NCREG|NCSL|NCSR, RESC1,
436 "\tfadd,sgl\tAL,AR,A1\n", },
437
438{ PLUS, INDBL,
439 SHDBL, TDOUBLE|TLDOUBLE,
440 SHDBL, TDOUBLE|TLDOUBLE,
441 NDREG|NDSL|NDSR, RESC1,
442 "\tfadd,dbl\tAL,AR,A1\n", },
443
444{ PLUS, ININT,
445 SHINT, ANYFIXED|TPOINT,
446 SONE, TANY,
447 NAREG|NASL, RESC1,
448 "\tldo\t1(AL),A1\n", },
449
450{ PLUS, ININT,
451 SHINT, ANYFIXED|TPOINT,
452 SPCON, TANY,
453 NAREG|NASL, RESC1,
454 "\tldo\tCR(AL),A1\n", },
455
456{ MINUS, INLL,
457 SHLL, TLL,
458 SPICON, TANY,
459 NBREG|NBSL|NBSR, RESC1,
460 "\tsubi\tAL,AR,A1\n"
461 "\tsubb\tUL,%r0,U1\n", },
462
463{ PLUS, ININT,
464 SHINT, TANY|TPOINT,
465 SPNAME, TANY,
466 NAREG|NASL, RESC1,
467 "\tldo\tAR(AL),A1\n", },
468
469{ MINUS, INLL,
470 SHLL, TLL,
471 SHLL, TLL,
472 NBREG|NBSL|NBSR, RESC1,
473 "\tsub\tAL,AR,A1\n"
474 "\tsubb\tUL,UR,U1\n", },
475
476{ MINUS, INFL,
477 SHFL, TFLOAT,
478 SHFL, TFLOAT,
479 NCREG|NCSL|NCSR, RESC1,
480 "\tfsub,sgl\tAL,AR,A1\n", },
481
482{ MINUS, INDBL,
483 SHDBL, TDOUBLE|TLDOUBLE,
484 SHDBL, TDOUBLE|TLDOUBLE,
485 NDREG|NDSL|NDSR, RESC1,
486 "\tfsub,dbl\tAL,AR,A1\n", },
487
488{ MINUS, ININT,
489 SHINT, ANYFIXED|TPOINT,
490 SONE, TANY,
491 NAREG|NASL, RESC1,
492 "\tldo\t-1(AL),A1\n", },
493
494{ MINUS, ININT,
495 SHINT, ANYFIXED|TPOINT,
496 SPCON, TANY,
497 NAREG|NASL, RESC1,
498 "\tldo\t-CR(AL),A1\n", },
499
500/* Simple reg->reg ops */
501{ OPSIMP, ININT,
502 SAREG, TWORD|TPOINT,
503 SAREG, TWORD|TPOINT,
504 NAREG|NASL, RESC1,
505 "\tO\tAL,AR,A1\n", },
506
507{ OPSIMP, INLL,
508 SHLL, TLL,
509 SHLL, TLL,
510 NBREG|NBSL|NBSR, RESC1,
511 "\tO\tAL,AR,A1\n"
512 "\tO\tUL,UR,U1\n", },
513
514/*
515 * The next rules handle all shift operators.
516 */
517{ LS, ININT,
518 SHINT, ANYFIXED,
519 SCON, ANYFIXED,
520 NAREG|NASL, RESC1,
521 "\tzdep\tAL,31-AR,32-AR,A1\n", },
522
523{ LS, ININT,
524 SHINT, ANYFIXED,
525 SHINT, ANYFIXED,
526 NAREG|NASR, RESC1,
527 "\tsubi\t31,AR,A1\n"
528 "\tmtsar\tA1\n"
529 "\tzvdep\tAL,32,A1\n", },
530
531{ RS, INLL,
532 SHLL, TLONGLONG,
533 SCON, ANYFIXED,
534 NBREG|NBSL, RESC1,
535 "\tshd\tUL,AL,31-AR,A1\n"
536 "\textrs\tUL,31-AR,32,U1\n", },
537
538{ RS, INLL,
539 SHLL, TULONGLONG,
540 SCON, ANYFIXED,
541 NBREG|NBSL, RESC1,
542 "\tshd\tUL,AL,AR,A1\n"
543 "\textru\tUL,31-AR,32,U1\n", },
544
545{ RS, ININT,
546 SHINT, ANYSIGNED,
547 SCON, ANYFIXED,
548 NAREG|NASL, RESC1,
549 "\textrs\tAL,31-AR,32,A1\n", },
550
551{ RS, ININT,
552 SHINT, ANYUSIGNED,
553 SCON, ANYFIXED,
554 NAREG|NASL, RESC1,
555 "\textru\tAL,31-AR,32,A1\n", },
556
557/* TODO the following should be split into mtsar and actual shift parts */
558{ RS, ININT,
559 SHINT, ANYSIGNED,
560 SHINT, ANYFIXED,
561 NAREG|NASR, RESC1,
562 "\tsubi\t31,AR,A1\n"
563 "\tmtsar\tA1\n"
564 "\tvextrs\tAL,32,A1\n", },
565
566{ RS, ININT,
567 SHINT, ANYUSIGNED,
568 SHINT, ANYFIXED,
569 NAREG|NASR, RESC1,
570 "\tsubi\t31,AR,A1\n"
571 "\tmtsar\tA1\n"
572 "\tvextru\tAL,32,A1\n", },
573
574/*
575 * The next rules takes care of assignments. "=".
576 */
577
578{ ASSIGN, FOREFF|INAREG,
579 SAREG, TWORD|TPOINT,
580 SPCON, TANY,
581 0, RDEST,
582 "\tldi\tAR,AL\n", },
583
584{ ASSIGN, FOREFF|INAREG,
585 SOREG, TBYTE,
586 SHINT, TBYTE,
587 0, RDEST,
588 "\tstb\tAR,AL\n", },
589
590{ ASSIGN, FOREFF|INAREG,
591 SOREG, THWORD,
592 SHINT, THWORD,
593 0, RDEST,
594 "\tsth\tAR,AL\n", },
595
596{ ASSIGN, FOREFF|INAREG,
597 SOREG, TWORD|TPOINT,
598 SHINT, TWORD|TPOINT,
599 0, RDEST,
600 "\tstw\tAR,AL\n", },
601
602{ ASSIGN, FOREFF|INLL,
603 SOREG, TLL,
604 SHLL, TLL,
605 0, RDEST,
606 "\tstw\tAR,AL\n"
607 "\tstw\tUR,UL\n", },
608
609{ ASSIGN, FOREFF|INAREG,
610 SHINT, TBYTE,
611 SOREG, TBYTE,
612 0, RDEST,
613 "\tldb\tAR,AL\n", },
614
615{ ASSIGN, FOREFF|INAREG,
616 SHINT, THWORD,
617 SOREG, THWORD,
618 0, RDEST,
619 "\tldh\tAR,AL\n", },
620
621{ ASSIGN, FOREFF|INAREG,
622 SHINT, TWORD|TPOINT,
623 SOREG, TWORD|TPOINT,
624 0, RDEST,
625 "\tldw\tAR,AL\n", },
626
627{ ASSIGN, FOREFF|INLL,
628 SHLL, TLL,
629 SOREG, TLL,
630 0, RDEST,
631 "\tldw\tAR,AL\n"
632 "\tldw\tUR,UL\n", },
633
634{ ASSIGN, FOREFF|ININT,
635 SHINT, TWORD|TPOINT,
636 SHINT, TWORD|TPOINT,
637 0, RDEST,
638 "\tcopy\tAR,AL\n", },
639
640{ ASSIGN, FOREFF|ININT,
641 SHINT, ANYFIXED,
642 SHINT, ANYFIXED,
643 0, RDEST,
644 "\tcopy\tAR,AL\n", },
645
646{ ASSIGN, FOREFF|ININT,
647 SFLD, TANY,
648 SPIMM, TANY,
649 0, RDEST,
650 "\tdepi\tAR,31-H,S,AL\n", },
651
652{ ASSIGN, FOREFF|ININT,
653 SFLD, TANY,
654 SHINT, TANY,
655 0, RDEST,
656 "\tdep\tAR,31-H,S,AL\n", },
657
658{ ASSIGN, FOREFF|INLL,
659 SHLL, TLL,
660 SHLL, TLL,
661 0, RDEST,
662 "\tcopy\tAR,AL\n"
663 "\tcopy\tUR,UL\n", },
664
665{ ASSIGN, FOREFF|INFL,
666 SHFL, TFLOAT,
667 SHFL, TFLOAT,
668 0, RDEST,
669 "\tfcpy,sgl\tAR,AL\n", },
670
671{ ASSIGN, FOREFF|INDBL,
672 SHDBL, TDOUBLE|TLDOUBLE,
673 SHDBL, TDOUBLE|TLDOUBLE,
674 0, RDEST,
675 "\tfcpy,dbl\tAR,AL\n", },
676
677{ ASSIGN, FOREFF|INFL,
678 SHFL, TFLOAT,
679 SOREG, TFLOAT,
680 0, RDEST,
681 "\tfldws\tAR,AL\n", },
682
683{ ASSIGN, FOREFF|INDBL,
684 SHDBL, TDOUBLE|TLDOUBLE,
685 SOREG, TDOUBLE|TLDOUBLE,
686 0, RDEST,
687 "\tfldds\tAR,AL\n", },
688
689{ ASSIGN, FOREFF|INFL,
690 SOREG, TFLOAT,
691 SHFL, TFLOAT,
692 0, RDEST,
693 "\tfstws\tAR,AL\n", },
694
695{ ASSIGN, FOREFF|INDBL,
696 SOREG, TDOUBLE|TLDOUBLE,
697 SHDBL, TDOUBLE|TLDOUBLE,
698 0, RDEST,
699 "\tfstds\tAR,AL\n", },
700
701/*
702 * DIV/MOD/MUL
703 */
704{ DIV, INFL,
705 SHFL, TFLOAT,
706 SHFL, TFLOAT,
707 NCREG|NCSL|NCSR, RESC1,
708 "\tfdiv,sgl\tAL,AR,A1\n", },
709
710{ DIV, INDBL,
711 SHDBL, TDOUBLE|TLDOUBLE,
712 SHDBL, TDOUBLE|TLDOUBLE,
713 NDREG|NDSL|NDSR, RESC1,
714 "\tfdiv,dbl\tAL,AR,A1\n", },
715
716{ MUL, INFL,
717 SHFL, TFLOAT,
718 SHFL, TFLOAT,
719 NCREG|NCSL|NCSR, RESC1,
720 "\tfmul,sgl\tAL,AR,A1\n", },
721
722{ MUL, INDBL,
723 SHDBL, TDOUBLE|TLDOUBLE,
724 SHDBL, TDOUBLE|TLDOUBLE,
725 NDREG|NDSL|NDSR, RESC1,
726 "\tfmul,dbl\tAL,AR,A1\n", },
727
728/*
729 * Indirection operators.
730 */
731{ UMUL, INLL,
732 SANY, TANY,
733 SOREG, TLL,
734 NBREG, RESC1,
735 "\tldw\tAL,A1\n"
736 "\tldw\tUL,U1\n", },
737
738{ UMUL, ININT,
739 SANY, TPOINT|TWORD,
740 SOREG, TPOINT|TWORD,
741 NAREG|NASL, RESC1,
742 "\tldw\tAL,A1\n", },
743
744{ UMUL, ININT,
745 SANY, TANY,
746 SOREG, THWORD,
747 NAREG|NASL, RESC1,
748 "\tldh\tAL,A1\n", },
749
750{ UMUL, ININT,
751 SANY, TANY,
752 SOREG, TBYTE,
753 NAREG|NASL, RESC1,
754 "\tldb\tAL,A1\n", },
755
756{ UMUL, INDBL,
757 SANY, TANY,
758 SOREG, TDOUBLE|TLDOUBLE,
759 NDREG|NDSL, RESC1,
760 "\tfldds\tAL,A1\n", },
761
762{ UMUL, INFL,
763 SANY, TANY,
764 SOREG, TFLOAT,
765 NCREG|NCSL, RESC1,
766 "\tfldws\tAL,A1\n", },
767
768/*
769 * Logical/branching operators
770 */
771{ OPLOG, FORCC,
772 SHLL, TLL,
773 SHLL, TLL,
774 0, 0,
775 "ZD", },
776
777{ OPLOG, FORCC,
778 SHINT, ANYFIXED|TPOINT,
779 SPIMM, ANYFIXED|TPOINT,
780 0, 0,
781 "\tcomib,O\tAR,AL,LC\n\tnop\n", },
782
783{ OPLOG, FORCC,
784 SHINT, ANYFIXED|TPOINT,
785 SHINT, ANYFIXED|TPOINT,
786 0, 0,
787 "\tcomb,O\tAR,AL,LC\n\tnop\n", },
788
789{ OPLOG, FORCC,
790 SHFL, TFLOAT,
791 SHFL, TFLOAT,
792 0, RESCC,
793 "\tfcmp,sgl,!O\tAR,AL\n"
794 "\tftest\n"
795 "\tb\tLC\n"
796 "\tnop", },
797
798{ OPLOG, FORCC,
799 SHDBL, TDOUBLE|TLDOUBLE,
800 SHDBL, TDOUBLE|TLDOUBLE,
801 0, RESCC,
802 "\tfcmp,dbl,!O\tAR,AL\n"
803 "\tftest\n"
804 "\tb\tLC\n"
805 "\tnop", },
806
807/*
808 * Jumps.
809 */
810{ GOTO, FOREFF,
811 SCON, TANY,
812 SANY, TANY,
813 0, RNOP,
814 "\tb\tLL\n\tnop\n", },
815
816#ifdef GCC_COMPAT
817{ GOTO, FOREFF,
818 SAREG, TANY,
819 SANY, TANY,
820 0, RNOP,
821 "\tbv\t%r0(AL)\n\tnop\n", },
822#endif
823
824
825/*
826 * Convert LTYPE to reg.
827 */
828
829{ OPLTYPE, INAREG,
830 SAREG, TANY,
831 SNAME, TANY,
832 0, RDEST,
833 "\taddil\tUR,%r27\n", },
834
835{ OPLTYPE, INAREG,
836 SAREG, TANY,
837 SCON, TPOINT,
838 0, RDEST,
839 "\taddil\tUR,%r27\n", },
840
841{ OPLTYPE, INLL,
842 SANY, TANY,
843 SOREG, TLL,
844 NBREG|NBSL, RESC1,
845 "\tldw\tAL,A1\n"
846 "\tldw\tUL,U1\n", },
847
848{ OPLTYPE, INAREG,
849 SANY, TANY,
850 SOREG, TWORD|TPOINT,
851 NAREG|NASL, RESC1,
852 "\tldw\tAL,A1\n", },
853
854{ OPLTYPE, INAREG,
855 SANY, TANY,
856 SAREG, TWORD|TPOINT,
857 NAREG|NASL, RESC1,
858 "\tcopy\tAL,A1\n", },
859
860{ OPLTYPE, INAREG,
861 SANY, TANY,
862 SPCNHI, ANYFIXED,
863 NAREG, RESC1,
864 "\tldil\tUR,A1\n", },
865
866{ OPLTYPE, INAREG,
867 SANY, TANY,
868 SPCON, ANYFIXED,
869 NAREG, RESC1,
870 "\tldi\tAR,A1\n", },
871
872{ OPLTYPE, INLL,
873 SANY, TANY,
874 SPCON, TLL,
875 NBREG, RESC1,
876 "\tldi\tAR,A1\n"
877 "\tcopy\t%r0,U1\n", },
878
879{ OPLTYPE, ININT,
880 SANY, TANY,
881 SCON, TWORD,
882 NAREG, RESC1,
883 "\tldil\tUR,A1\n"
884 "\tldo\tAR(A1),A1\n", },
885
886{ OPLTYPE, INLL,
887 SHLL, TLL,
888 SPCNHW, TLL,
889 NBREG, RESC1,
890 "\tldil\tUR>>32,U1\n"
891 "\tldo\tAR>>32(U1),U1\n"
892 "\tcopy\t%r0,A1\n", },
893
894{ OPLTYPE, INLL,
895 SHLL, TLL,
896 SPCNLW, TLL,
897 NBREG, RESC1,
898 "\tcopy\t%r0,U1\n"
899 "\tldil\tUR,A1\n"
900 "\tldo\tAR(A1),A1\n", },
901
902{ OPLTYPE, INLL,
903 SHLL, TLL,
904 SCON, TLL,
905 NBREG, RESC1,
906 "\tldil\tUR,A1\n"
907 "\tldo\tAR(A1),A1\n"
908 "\tldil\tUR>>32,U1\n"
909 "\tldo\tAR>>32(U1),U1\n", },
910
911{ OPLTYPE, INCREG,
912 SANY, TFLOAT,
913 SHFL, TFLOAT,
914 NCREG, RESC1,
915 "\tfldws\tAL,A1\n", },
916
917{ OPLTYPE, INDREG,
918 SANY, TDOUBLE|TLDOUBLE,
919 SHDBL, TDOUBLE|TLDOUBLE,
920 NDREG, RESC1,
921 "\tfldds\tAL,A1\n", },
922
923/*
924 * Negate a word.
925 */
926{ UMINUS, INLL,
927 SHLL, TLL,
928 SHLL, TLL,
929 NBREG|NBSL, RESC1,
930 "\tsub\t%r0,AL,A1\n"
931 "\tsubb\t%r0,UL,A1\n", },
932
933{ UMINUS, ININT,
934 SHINT, TWORD,
935 SHINT, TWORD,
936 NAREG|NASL, RESC1,
937 "\tsub\t%r0,AL,A1\n", },
938
939{ UMINUS, INFL,
940 SHFL, TFLOAT,
941 SHFL, TFLOAT,
942 NCREG|NCSL, RESC1,
943 "\tfsub,sgl\t%fr0,AL,A1\n", },
944
945{ UMINUS, INDBL,
946 SHDBL, TDOUBLE|TLDOUBLE,
947 SHDBL, TDOUBLE|TLDOUBLE,
948 NDREG|NDSL, RESC1,
949 "\tfsub,dbl\t%fr0,AL,A1\n", },
950
951{ COMPL, INLL,
952 SHLL, TLL,
953 SANY, TANY,
954 NBREG|NBSL, RESC1,
955 "\tuaddcm\t%r0,AL,A1\n"
956 "\tuaddcm\t%r0,UL,U1\n", },
957
958{ COMPL, ININT,
959 SHINT, ANYFIXED,
960 SANY, TANY,
961 NAREG|NASL, RESC1,
962 "\tuaddcm\t%r0,AL,A1\n", },
963
964/*
965 * Arguments to functions.
966 */
967
968{ STARG, FOREFF,
969 SAREG|SOREG|SNAME|SCON, TANY,
970 SANY, TSTRUCT,
971 NAREG | RNULL, 0,
972 "ZS", },
973
974/*
975 * struct field ops
976 */
977{ FLD, ININT,
978 SHINT, TANY,
979 SFLD, ANYSIGNED,
980 NAREG|NASL, RESC1,
981 "\textrs\tAL,31-H,S,A1\n", },
982
983{ FLD, ININT,
984 SHINT, TANY,
985 SFLD, ANYUSIGNED,
986 NAREG|NASL, RESC1,
987 "\textru\tAL,31-H,S,A1\n", },
988
989# define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
990
991{ UMUL, DF( UMUL ), },
992
993{ ASSIGN, DF(ASSIGN), },
994
995{ STASG, DF(STASG), },
996
997{ FLD, DF(FLD), },
998
999{ OPLEAF, DF(NAME), },
1000
1001/* { INIT, DF(INIT), }, */
1002
1003{ OPUNARY, DF(UMINUS), },
1004
1005{ OPANY, DF(BITYPE), },
1006
1007{ FREE, FREE,
1008 FREE, FREE,
1009 FREE, FREE,
1010 FREE, FREE,
1011 "HELP; I'm in trouble\n" },
1012};
1013
1014int tablesize = sizeof(table)/sizeof(table[0]);
Note: See TracBrowser for help on using the repository browser.