source: mainline/uspace/app/pcc/arch/mips/table.c@ a7de7182

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a7de7182 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: 34.0 KB
Line 
1/* $Id: table.c,v 1.14 2010/09/19 13:54:41 ragge Exp $ */
2/*
3 * Copyright (c) 2003 Anders Magnusson (ragge@ludd.luth.se).
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/*
30 * MIPS port by Jan Enoksson (janeno-1@student.ltu.se) and
31 * Simon Olsson (simols-1@student.ltu.se) 2005.
32 *
33 * It appears that the target machine was big endian. The original
34 * code contained many endian aspects which are now handled in
35 * machine-independent code.
36 *
37 * On MIPS, the assembler does an amazing amount of work for us.
38 * We don't have to worry about PIC, nor about finding the address
39 * of SNAMES. Whenever possible, we defer the work to the assembler.
40 */
41
42#include "pass2.h"
43
44#define TUWORD TUNSIGNED|TULONG
45#define TSWORD TINT|TLONG
46#define TWORD TUWORD|TSWORD
47
48struct optab table[] = {
49/* First entry must be an empty entry */
50{ -1, FOREFF, SANY, TANY, SANY, TANY, 0, 0, "", },
51
52/* PCONVs are usually not necessary */
53{ PCONV, INAREG,
54 SAREG, TWORD|TPOINT,
55 SAREG, TWORD|TPOINT,
56 0, RLEFT,
57 " # convert between word and pointer", },
58
59/*
60 * Conversions of integral<->integral types
61 */
62
63{ SCONV, INAREG,
64 SOREG, TCHAR,
65 SAREG, TSWORD|TSHORT,
66 NAREG, RESC1,
67 " lb A1,AL # convert oreg char to short/int\n"
68 " nop\n", },
69
70{ SCONV, INAREG,
71 SOREG, TCHAR,
72 SAREG, TUWORD|TUSHORT|TUCHAR,
73 NAREG, RESC1,
74 " lbu A1,AL # convert oreg char to uchar/ushort/uint\n"
75 " nop\n", },
76
77{ SCONV, INAREG,
78 SOREG, TUCHAR,
79 SAREG, TWORD|TSHORT|TUSHORT,
80 NAREG, RESC1,
81 " lbu A1,AL # convert oreg uchar to (u)short/(u)int\n"
82 " nop\n", },
83
84{ SCONV, INBREG,
85 SOREG, TCHAR,
86 SBREG, TLONGLONG,
87 NBREG, RESC1,
88 " lb A1,AL # convert oreg char to longlong\n"
89 " nop\n"
90 " sra U1,A1,31\n", },
91
92/* chor -> ulonglong handled later */
93
94{ SCONV, INBREG,
95 SOREG, TUCHAR,
96 SBREG, TLONGLONG|TULONGLONG,
97 NBREG, RESC1,
98 " lbu A1,AL # convert oreg uchar to (u)longlong\n"
99 " move U1,$zero\n", },
100
101{ SCONV, INAREG,
102 SOREG, TSHORT|TUSHORT,
103 SAREG, TCHAR,
104 NAREG, RESC1,
105 " lb A1,AL # convert oreg (u)short to char (endianness problem?)\n"
106 " nop\n", },
107
108{ SCONV, INAREG,
109 SOREG, TSHORT|TUSHORT,
110 SAREG, TUCHAR,
111 NAREG, RESC1,
112 " lbu A1,AL # convert oreg (u)short to uchar (endianness problem?)\n"
113 " nop\n", },
114
115{ SCONV, INAREG,
116 SOREG, TSHORT,
117 SAREG, TSWORD,
118 NAREG, RESC1,
119 " lh A1,AL # convert oreg short to int\n"
120 " nop\n", },
121
122{ SCONV, INAREG,
123 SOREG, TSHORT,
124 SAREG, TUWORD,
125 NAREG, RESC1,
126 " lhu A1,AL # convert oreg short to uint\n"
127 " nop\n", },
128
129{ SCONV, INAREG,
130 SOREG, TUSHORT,
131 SAREG, TWORD,
132 NAREG, RESC1,
133 " lhu A1,AL # convert oreg ushort to (u)int\n"
134 " nop\n", },
135
136{ SCONV, INBREG,
137 SOREG, TSHORT,
138 SBREG, TLONGLONG,
139 NBREG, RESC1,
140 " lh A1,AL # convert oreg short to longlong\n"
141 " nop\n"
142 " sra U1,A1,31\n", },
143
144{ SCONV, INBREG,
145 SOREG, TSHORT,
146 SBREG, TULONGLONG,
147 NBREG, RESC1,
148 " lhu A1,AL # convert oreg short to ulonglong\n"
149 " nop\n"
150 " move U1,$zero\n", },
151
152{ SCONV, INBREG,
153 SOREG, TUSHORT,
154 SBREG, TLONGLONG|TULONGLONG,
155 NBREG, RESC1,
156 " lhu A1,AL # convert oreg ushort to (u)longlong\n"
157 " move U1,$zero\n", },
158
159{ SCONV, INAREG,
160 SOREG, TWORD,
161 SAREG, TCHAR,
162 NAREG, RESC1,
163 " lb A1,AL # convert oreg word to char (endianness problem here?)\n"
164 " nop\n", },
165
166{ SCONV, INAREG,
167 SOREG, TWORD,
168 SAREG, TUCHAR,
169 NAREG, RESC1,
170 " lbu A1,AL # convert oreg word to uchar (endianness problem here?)\n"
171 " nop\n", },
172
173{ SCONV, INAREG,
174 SOREG, TWORD,
175 SAREG, TSHORT,
176 NAREG, RESC1,
177 " lh A1,AL # convert oreg word to short (endianness problem here?)\n"
178 " nop\n", },
179
180/* convert (u)long to ushort */
181{ SCONV, INAREG,
182 SOREG, TWORD,
183 SAREG, TUSHORT,
184 NAREG, RESC1,
185 " lhu A1,AL # convert oreg word to ushort (endianness problem here?)\n"
186 " nop\n", },
187
188{ SCONV, INBREG,
189 SOREG, TSWORD,
190 SBREG, TLONGLONG|TULONGLONG,
191 NBREG, RESC1,
192 " lw A1,AL # convert oreg int/long to (u)llong (endianness problem here?)\n"
193 " nop\n"
194 " sra U1,A1,31\n" },
195
196{ SCONV, INBREG,
197 SOREG, TUWORD,
198 SBREG, TLONGLONG|TULONGLONG,
199 NBREG, RESC1,
200 " lw A1,AL # convert oreg (u)int to (u)llong (endianness problem here?)\n"
201 " move U1,$zero\n", },
202
203{ SCONV, INAREG,
204 SOREG, TLONGLONG|TULONGLONG,
205 SAREG, TCHAR,
206 NAREG, RESC1,
207 " lb A1,AL # convert oreg (u)llong to char (endianness problem here?)\n"
208 " nop\n", },
209
210{ SCONV, INAREG,
211 SOREG, TLONGLONG|TULONGLONG,
212 SAREG, TUCHAR,
213 NAREG, RESC1,
214 " lbu A1,AL # convert oreg (u)llong to uchar (endianness problem?)\n"
215 " nop\n", },
216
217{ SCONV, INAREG,
218 SOREG, TLONGLONG|TULONGLONG,
219 SAREG, TSHORT,
220 NAREG, RESC1,
221 " lh A1,AL # convert oreg (u)llong to short (endianness problem?)\n"
222 " nop\n", },
223
224{ SCONV, INAREG,
225 SOREG, TLONGLONG|TULONGLONG,
226 SAREG, TUSHORT,
227 NAREG, RESC1,
228 " lhu A1,AL # convert oreg (u)llong to ushort (endianness problem here?)\n"
229 " nop\n", },
230
231{ SCONV, INAREG,
232 SOREG, TLONGLONG|TULONGLONG,
233 SAREG, TWORD,
234 NAREG, RESC1,
235 " lw A1,AL # convert oreg (u)llong to (u)int (endianness problem here?)\n"
236 " nop\n", },
237
238/*
239 * Conversions of integral types (register-register)
240 *
241 * For each deunsigned type, they look something like this:
242 *
243 * signed -> bigger signed - nothing to do
244 * signed -> bigger unsigned - clear the top bits (of source type)
245 *
246 * signed -> smaller signed - sign-extend the bits (to dest type)
247 * signed -> smaller unsigned - clear the top bits (of dest type)
248 * unsigned -> smaller signed - sign-extend top bits (to dest type)
249 * unsigned -> smaller unsigned - clear the top bits (of dest type)
250 *
251 * unsigned -> bigger - nothing to do
252 */
253
254{ SCONV, INAREG,
255 SAREG, TPOINT|TWORD,
256 SAREG, TPOINT|TWORD,
257 0, RLEFT,
258 " # convert int to int\n", },
259
260{ SCONV, INBREG,
261 SBREG, TLONGLONG|TULONGLONG,
262 SBREG, TLONGLONG|TULONGLONG,
263 0, RLEFT,
264 " # convert (u)longlong to (u)longlong", },
265
266{ SCONV, INAREG,
267 SAREG, TCHAR,
268 SAREG, TSWORD|TSHORT,
269 0, RLEFT,
270 " # convert char to short/int\n", },
271
272{ SCONV, INAREG,
273 SAREG, TCHAR,
274 SAREG, TUWORD|TUSHORT|TUCHAR,
275 NAREG|NASL, RESC1,
276 " andi A1,AL,255 # convert char to uchar/ushort/uint\n", },
277
278{ SCONV, INAREG,
279 SAREG, TUCHAR,
280 SAREG, TCHAR,
281 NAREG|NASL, RESC1,
282 " sll A1,AL,24 # convert uchar to char\n"
283 " sra A1,A1,24\n", },
284
285{ SCONV, INAREG,
286 SAREG, TUCHAR,
287 SAREG, TWORD|TSHORT|TUSHORT,
288 0, RLEFT,
289 " # convert uchar to (u)short/(u)int\n", },
290
291{ SCONV, INAREG,
292 SAREG, TSHORT,
293 SAREG, TCHAR,
294 NAREG|NASL, RESC1,
295 " sll A1,AL,24 # convert short to char\n"
296 " sra A1,A1,24\n", },
297
298{ SCONV, INAREG,
299 SAREG, TSHORT,
300 SAREG, TUCHAR,
301 NAREG|NASL, RESC1,
302 " andi A1,AL,255 # convert short to uchar\n", },
303
304{ SCONV, INAREG,
305 SAREG, TSHORT,
306 SAREG, TUWORD|TUSHORT,
307 NAREG|NASL, RESC1,
308 " andi A1,AL,65535 # convert short to ushort\n", },
309
310{ SCONV, INAREG,
311 SAREG, TSHORT,
312 SAREG, TSWORD,
313 NAREG|NASL, RESC1,
314 " sll A1,AL,16 # convert short to ushort\n"
315 " sra A1,A1,16\n", },
316
317{ SCONV, INAREG,
318 SAREG, TUSHORT,
319 SAREG, TCHAR,
320 NAREG|NASL, RESC1,
321 " sll A1,AL,24 # convert short to char\n"
322 " sra A1,A1,24\n", },
323
324{ SCONV, INAREG,
325 SAREG, TUSHORT,
326 SAREG, TUCHAR,
327 NAREG|NASL, RESC1,
328 " andi A1,AL,255 # convert ushort to char\n", },
329
330{ SCONV, INAREG,
331 SAREG, TUSHORT,
332 SAREG, TSHORT,
333 NAREG|NASL, RESC1,
334 " sll A1,AL,16 # convert short to ushort\n"
335 " sra A1,A1,16\n", },
336
337{ SCONV, INAREG,
338 SAREG, TUSHORT,
339 SAREG, TWORD,
340 0, RDEST,
341 " # convert ushort to (u)int\n", },
342
343{ SCONV, INAREG,
344 SAREG, TSWORD,
345 SAREG, TCHAR,
346 NAREG|NASL, RESC1,
347 " sll A1,AL,8 # convert int to char\n"
348 " sra A1,A1,8\n", },
349
350{ SCONV, INAREG,
351 SAREG, TSWORD,
352 SAREG, TUCHAR,
353 NAREG|NASL, RESC1,
354 " andi A1,AL,255 # convert int to uchar\n", },
355
356{ SCONV, INAREG,
357 SAREG, TSWORD,
358 SAREG, TSHORT,
359 NAREG|NASL, RESC1,
360 " sll A1,AL,16 # convert int to short\n"
361 " sra A1,A1,16\n", },
362
363{ SCONV, INAREG,
364 SAREG, TSWORD,
365 SAREG, TUSHORT,
366 NAREG|NASL, RESC1,
367 " andi A1,AL,65535 # convert int to ushort\n", },
368
369{ SCONV, INAREG,
370 SAREG, TUWORD,
371 SAREG, TCHAR,
372 NAREG|NASL, RESC1,
373 " sll A1,AL,24 # convert int to char\n"
374 " sra A1,A1,24\n", },
375
376{ SCONV, INAREG,
377 SAREG, TUWORD,
378 SAREG, TUCHAR,
379 NAREG|NASL, RESC1,
380 " andi A1,AL,255 # convert int to uchar\n", },
381
382{ SCONV, INAREG,
383 SAREG, TUWORD,
384 SAREG, TSHORT,
385 NAREG|NASL, RESC1,
386 " sll A1,AL,16 # convert int to short\n"
387 " sra A1,A1,16\n", },
388
389{ SCONV, INAREG,
390 SAREG, TUWORD,
391 SAREG, TUSHORT,
392 NAREG|NASL, RESC1,
393 " andi A1,AL,65535 # convert int to ushort\n", },
394
395{ SCONV, INBREG,
396 SAREG, TSWORD|TSHORT|TCHAR,
397 SBREG, TLONGLONG,
398 NBREG, RESC1,
399 " move A1,AL # convert int/short/char to longlong\n"
400 " sra U1,AL,31\n", },
401
402{ SCONV, INBREG,
403 SAREG, TSWORD|TSHORT|TCHAR,
404 SBREG, TULONGLONG,
405 NBREG, RESC1,
406 " move A1,AL # convert int/short/char to ulonglong\n"
407 " move U1,$zero\n", },
408
409{ SCONV, INBREG,
410 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
411 SBREG, TLONGLONG|TULONGLONG,
412 NBREG, RESC1,
413 " move A1,AL # convert (u)int/(u)short/(u)char to ulonglong\n"
414 " move U1,$zero\n", },
415
416{ SCONV, INAREG,
417 SBREG, TLONGLONG|TULONGLONG,
418 SAREG, TWORD,
419 NAREG, RESC1,
420 " move A1,AL # convert (u)longlong to int\n", },
421
422{ SCONV, INAREG,
423 SBREG, TLONGLONG|TULONGLONG,
424 SAREG, TSHORT,
425 NAREG, RESC1,
426 " sll A1,AL,16 # convert (u)longlong to short\n"
427 " sra A1,A1,16\n", },
428
429{ SCONV, INAREG,
430 SBREG, TLONGLONG|TULONGLONG,
431 SAREG, TCHAR,
432 NAREG, RESC1,
433 " sll A1,AL,24 # convert (u)longlong to char\n"
434 " sra A1,A1,24\n", },
435
436{ SCONV, INAREG,
437 SBREG, TLONGLONG|TULONGLONG,
438 SAREG, TUSHORT,
439 NAREG, RESC1,
440 " andi A1,AL,65535 # convert (u)longlong to ushort\n", },
441
442{ SCONV, INAREG,
443 SBREG, TLONGLONG|TULONGLONG,
444 SAREG, TUCHAR,
445 NAREG, RESC1,
446 " andi A1,AL,255 # convert (u)longlong to uchar\n", },
447
448{ SCONV, INCREG,
449 SCREG, TFLOAT,
450 SCREG, TDOUBLE|TLDOUBLE,
451 NCREG, RESC1,
452 " cvt.d.s A1,AL # convert float to (l)double\n", },
453
454{ SCONV, INCREG,
455 SCREG, TDOUBLE|TLDOUBLE,
456 SCREG, TFLOAT,
457 NCREG, RESC1,
458 " cvt.s.d A1,AL # convert (l)double to float\n", },
459
460{ SCONV, INCREG,
461 SAREG, TWORD,
462 SCREG, TFLOAT,
463 NCREG, RESC1,
464 " mtc1 AL,A1 # convert (u)int to float\n"
465 " nop\n"
466 " cvt.s.w A1,A1\n", },
467
468{ SCONV, INCREG,
469 SOREG, TWORD,
470 SCREG, TFLOAT,
471 NCREG, RESC1,
472 " l.s A1,AL # convert (u)int to float\n"
473 " nop\n"
474 " cvt.s.w A1,A1\n", },
475
476{ SCONV, INCREG,
477 SAREG, TWORD,
478 SCREG, TDOUBLE|TLDOUBLE,
479 NCREG, RESC1,
480 " mtc1 AL,A1 # convert (u)int to (l)double\n"
481 " nop\n"
482 " cvt.d.w A1,A1\n", },
483
484{ SCONV, INCREG,
485 SOREG, TWORD,
486 SCREG, TDOUBLE|TLDOUBLE,
487 NCREG, RESC1,
488 " l.d A1,AL # convert (u)int to (l)double\n"
489 " nop\n"
490 " cvt.d.w A1,A1\n", },
491
492{ SCONV, INAREG,
493 SCREG, TFLOAT,
494 SAREG, TWORD,
495 NCREG|NAREG, RESC1,
496 " cvt.w.s A2,AL # convert float to (u)int\n"
497 " mfc1 A1,A2\n"
498 " nop\n", },
499
500{ SCONV, FOREFF,
501 SCREG, TFLOAT,
502 SOREG, TWORD,
503 NCREG, RDEST,
504 " cvt.w.s A1,AL # convert float to (u)int\n"
505 " s.s A1,AR\n"
506 " nop\n", },
507
508{ SCONV, INAREG,
509 SCREG, TDOUBLE|TLDOUBLE,
510 SAREG, TWORD,
511 NCREG|NAREG, RESC1,
512 " cvt.w.d A2,AL # convert (l)double to (u)int\n"
513 " mfc1 A1,A2\n"
514 " nop\n", },
515
516{ SCONV, INCREG,
517 SCREG, TDOUBLE|TLDOUBLE,
518 SCREG, TDOUBLE|TLDOUBLE,
519 0, RLEFT,
520 " # convert between double and ldouble\n", },
521
522{ SCONV, INCREG,
523 SBREG, TLONGLONG|TULONGLONG,
524 SCREG, TFLOAT,
525 NSPECIAL|NCREG, RESC1,
526 "ZF", },
527
528{ SCONV, INCREG,
529 SBREG, TLONGLONG|TULONGLONG,
530 SCREG, TDOUBLE|TLDOUBLE,
531 NSPECIAL|NCREG, RESC1,
532 "ZF", },
533
534{ SCONV, INBREG,
535 SCREG, TDOUBLE|TLDOUBLE,
536 SBREG, TLONGLONG|TULONGLONG,
537 NSPECIAL|NBREG, RESC1,
538 "ZF", },
539
540{ SCONV, INBREG,
541 SCREG, TFLOAT,
542 SBREG, TLONGLONG|TULONGLONG,
543 NSPECIAL|NBREG, RESC1,
544 "ZF", },
545
546/*
547 * Multiplication and division
548 */
549
550{ MUL, INAREG,
551 SAREG, TUWORD|TUSHORT|TUCHAR,
552 SAREG, TUWORD|TUSHORT|TUCHAR,
553 NAREG|NASR|NASL, RESC1,
554 " multu AL,AR # unsigned multiply\n"
555 " mflo A1\n"
556 " nop\n"
557 " nop\n", },
558
559/* this previous will match on unsigned/unsigned multiplication first */
560{ MUL, INAREG,
561 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
562 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
563 NAREG|NASR|NASL, RESC1,
564 " mult AL,AR # signed multiply\n"
565 " mflo A1\n"
566 " nop\n"
567 " nop\n", },
568
569{ MUL, INBREG,
570 SBREG, TLONGLONG|TULONGLONG,
571 SBREG, TLONGLONG|TULONGLONG,
572 2*NBREG, RESC1,
573 " multu AL,AR\n"
574 " mfhi U1\n"
575 " mflo A1\n"
576 " mult AL,UR\n"
577 " mflo A2\n"
578 " nop\n"
579 " nop\n"
580 " addu A2,U1,A2\n"
581 " mult UL,AR\n"
582 " mflo U2\n"
583 " nop\n"
584 " nop\n"
585 " addu U1,A2,U2\n", },
586
587{ MUL, INCREG,
588 SCREG, TFLOAT,
589 SCREG, TFLOAT,
590 NCREG, RESC1,
591 " mul.s A1,AL,AR # floating-point multiply\n", },
592
593{ MUL, INCREG,
594 SCREG, TDOUBLE|TLDOUBLE,
595 SCREG, TDOUBLE|TLDOUBLE,
596 NCREG, RESC1,
597 " mul.d A1,AL,AR # double-floating-point multiply\n", },
598
599{ DIV, INAREG,
600 SAREG, TUWORD|TUSHORT|TUCHAR,
601 SAREG, TUWORD|TUSHORT|TUCHAR,
602 NAREG|NASR|NASL, RESC1,
603 " divu AL,AR # unsigned division\n"
604 " mflo A1\n"
605 " nop\n"
606 " nop\n", },
607
608/* the previous rule will match unsigned/unsigned first */
609{ DIV, INAREG,
610 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
611 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
612 NAREG|NASR|NASL, RESC1,
613 " div AL,AR # signed division\n"
614 " mflo A1\n"
615 " nop\n"
616 " nop\n", },
617
618{ DIV, INBREG,
619 SBREG, TLONGLONG|TULONGLONG,
620 SBREG, TLONGLONG|TULONGLONG,
621 NSPECIAL|NBREG, RESC1,
622 "ZE", },
623
624{ DIV, INCREG,
625 SCREG, TFLOAT,
626 SCREG, TFLOAT,
627 NCREG, RESC1,
628 " div.s A1,AL,AR # floating-point division\n", },
629
630{ DIV, INCREG,
631 SCREG, TDOUBLE|TLDOUBLE,
632 SCREG, TDOUBLE|TLDOUBLE,
633 NCREG, RESC1,
634 " div.d A1,AL,AR # double-floating-point division\n", },
635
636{ MOD, INAREG,
637 SAREG, TUWORD|TUSHORT|TUCHAR,
638 SAREG, TUWORD|TUSHORT|TUCHAR,
639 NAREG, RESC1,
640 " divu AL,AR # signed modulo\n"
641 " mfhi A1\n"
642 " nop\n"
643 " nop\n", },
644
645/* the previous rule will match unsigned%unsigned first */
646{ MOD, INAREG,
647 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
648 SAREG, TWORD|TUSHORT|TSHORT|TUCHAR|TCHAR,
649 NAREG, RESC1,
650 " div AL,AR # signed modulo\n"
651 " mfhi A1\n"
652 " nop\n"
653 " nop\n", },
654
655{ MOD, INBREG,
656 SBREG, TLONGLONG|TULONGLONG,
657 SBREG, TLONGLONG|TULONGLONG,
658 NSPECIAL|NBREG, RESC1,
659 "ZE", },
660
661/*
662 * Templates for unsigned values needs to come before OPSIMP
663 */
664
665{ PLUS, INBREG,
666 SBREG, TULONGLONG|TLONGLONG,
667 SBREG, TULONGLONG|TLONGLONG,
668 2*NBREG, RESC1,
669 " addu A1,AL,AR # 64-bit addition\n"
670 " sltu A2,A1,AR\n"
671 " addu U1,UL,UR\n"
672 " addu U1,U1,A2\n", },
673
674{ PLUS, INAREG,
675 SAREG, TSWORD|TSHORT|TCHAR,
676 SSCON, TANY,
677 NAREG|NASL, RESC1,
678 " addi A1,AL,AR\n", },
679
680{ PLUS, INAREG,
681 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
682 SSCON, TANY,
683 NAREG|NASL, RESC1,
684 " addiu A1,AL,AR\n", },
685
686{ PLUS, INAREG,
687 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
688 SAREG, TUWORD|TUSHORT|TUCHAR,
689 NAREG|NASL, RESC1,
690 " addu A1,AL,AR\n", },
691
692{ PLUS, INAREG,
693 SAREG, TSWORD|TSHORT|TCHAR,
694 SAREG, TSWORD|TSHORT|TCHAR,
695 NAREG|NASL, RESC1,
696 " add A1,AL,AR\n", },
697
698{ PLUS, INCREG,
699 SCREG, TFLOAT,
700 SCREG, TFLOAT,
701 NCREG|NCSL, RESC1,
702 " add.s A1,AL,AR\n", },
703
704{ PLUS, INCREG,
705 SCREG, TDOUBLE|TLDOUBLE,
706 SCREG, TDOUBLE|TLDOUBLE,
707 NCREG|NCSL, RESC1,
708 " add.d A1,AL,AR\n", },
709
710{ MINUS, INBREG,
711 SBREG, TLONGLONG|TULONGLONG,
712 SBREG, TLONGLONG|TULONGLONG,
713 2*NBREG, RESC1,
714 " sltu A2,AL,AR # 64-bit subtraction\n"
715 " subu A1,AL,AR\n"
716 " subu U1,UL,UR\n"
717 " subu U1,U1,A2\n", },
718
719{ MINUS, INAREG,
720 SAREG, TUWORD|TPOINT|TUSHORT|TUCHAR,
721 SSCON, TANY,
722 NAREG|NASL, RESC1,
723 " subu A1,AL,AR\n", },
724
725{ MINUS, INAREG,
726 SAREG, TSWORD|TSHORT|TCHAR,
727 SSCON, TANY,
728 NAREG|NASL, RESC1,
729 " sub A1,AL,AR\n", },
730
731{ MINUS, INAREG,
732 SAREG, TSWORD|TSHORT|TCHAR,
733 SAREG, TSWORD|TSHORT|TCHAR,
734 NAREG|NASL, RESC1,
735 " sub A1,AL,AR\n", },
736
737{ MINUS, INCREG,
738 SCREG, TFLOAT,
739 SCREG, TFLOAT,
740 NCREG|NCSL, RESC1,
741 " sub.s A1,AL,AR\n", },
742
743{ MINUS, INCREG,
744 SCREG, TDOUBLE|TLDOUBLE,
745 SCREG, TDOUBLE|TLDOUBLE,
746 NCREG|NCSL, RESC1,
747 " sub.d A1,AL,AR\n", },
748
749{ UMINUS, INAREG,
750 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
751 SANY, TANY,
752 NAREG|NASL, RESC1,
753 " neg A1,AL\n", },
754
755{ UMINUS, INBREG,
756 SBREG, TLONGLONG|TULONGLONG,
757 SANY, TANY,
758 NBREG|NAREG|NBSL, RESC2,
759 " subu A1,$zero,AL\n"
760 " subu U1,$zero,UL\n"
761 " sltu A2,$zero,A1\n"
762 " subu U1,U1,A2\n", },
763
764{ UMINUS, INCREG,
765 SCREG, TFLOAT,
766 SCREG, TFLOAT,
767 NCREG|NCSL, RESC1,
768 " neg.s A1,AL\n", },
769
770{ UMINUS, INCREG,
771 SCREG, TDOUBLE|TLDOUBLE,
772 SCREG, TDOUBLE|TLDOUBLE,
773 NCREG|NCSL, RESC1,
774 " neg.d A1,AL\n", },
775
776/* Simple 'op rd, rs, rt' or 'op rt, rs, imm' operations */
777
778{ OPSIMP, INBREG,
779 SBREG, TLONGLONG|TULONGLONG,
780 SBREG, TLONGLONG|TULONGLONG,
781 NBREG|NBSR|NBSL, RESC1,
782 " O A1,AL,AR\n"
783 " O U1,UL,UR\n", },
784
785{ OPSIMP, INAREG,
786 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
787 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
788 NAREG|NASR|NASL, RESC1,
789 " O A1,AL,AR\n", },
790
791{ OPSIMP, INAREG,
792 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TUCHAR|TCHAR,
793 SPCON, TANY,
794 NAREG|NASL, RESC1,
795 " Oi A1,AL,AR\n", },
796
797/*
798 * Shift instructions
799 */
800
801{ RS, INAREG,
802 SAREG, TSWORD|TSHORT|TCHAR,
803 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
804 NAREG|NASL, RESC1,
805 " sra A1,AL,AR # shift right by constant\n", },
806
807{ RS, INAREG,
808 SAREG, TUWORD|TUSHORT|TUCHAR,
809 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
810 NAREG|NASL, RESC1,
811 " srl A1,AL,AR # shift right by constant\n", },
812
813{ LS, INAREG,
814 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
815 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
816 NAREG|NASL, RESC1,
817 " sll A1,AL,AR # shift left by constant\n", },
818
819{ RS, INAREG,
820 SAREG, TSWORD|TSHORT|TCHAR,
821 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
822 NAREG|NASL, RESC1,
823 " srav A1,AL,AR # shift right by register\n", },
824
825{ RS, INAREG,
826 SAREG, TUWORD|TUSHORT|TUCHAR,
827 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
828 NAREG|NASL, RESC1,
829 " srlv A1,AL,AR # shift right by register\n", },
830
831{ LS, INAREG,
832 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
833 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
834 NAREG|NASL, RESC1,
835 " sllv A1,AL,AR # shift left by register\n", },
836
837{ RS, INBREG,
838 SBREG, TLONGLONG|TULONGLONG,
839 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
840 NBREG, RESC1,
841 "ZO", },
842
843{ LS, INBREG,
844 SBREG, TLONGLONG|TULONGLONG,
845 SCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
846 NBREG, RESC1,
847 "ZO", },
848
849{ RS, INBREG,
850 SBREG, TLONGLONG|TULONGLONG,
851 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
852 NSPECIAL|NBREG, RESC1,
853 "ZE", },
854
855{ LS, INBREG,
856 SBREG, TLONGLONG|TULONGLONG,
857 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
858 NSPECIAL|NBREG, RESC1,
859 "ZE", },
860
861/*
862 * Rule for unary one's complement
863 */
864
865{ COMPL, INAREG,
866 SAREG, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
867 SANY, TANY,
868 NAREG|NASL, RESC1,
869 " nor A1,$zero,AL # complement\n", },
870
871{ COMPL, INBREG,
872 SBREG, TLONGLONG|TULONGLONG,
873 SANY, TANY,
874 NBREG|NBSL, RESC1,
875 " nor A1,$zero,AL # complement\n"
876 " nor U1,$zero,UL\n", },
877
878/*
879 * The next rules takes care of assignments. "=".
880 */
881
882{ ASSIGN, FOREFF|INAREG,
883 SOREG|SNAME, TWORD|TPOINT,
884 SAREG, TWORD|TPOINT,
885 0, RDEST,
886 " sw AR,AL # store (u)int/(u)long\n"
887 " nop\n", },
888
889{ ASSIGN, FOREFF|INAREG,
890 SOREG|SNAME, TSHORT|TUSHORT,
891 SAREG, TSHORT|TUSHORT,
892 0, RDEST,
893 " sh AR,AL # store (u)short\n"
894 " nop\n", },
895
896{ ASSIGN, FOREFF|INAREG,
897 SOREG|SNAME, TCHAR|TUCHAR,
898 SAREG, TCHAR|TUCHAR,
899 0, RDEST,
900 " sb AR,AL # store (u)char\n"
901 " nop\n", },
902
903{ ASSIGN, FOREFF|INBREG,
904 SOREG|SNAME, TLONGLONG|TULONGLONG,
905 SBREG, TLONGLONG|TULONGLONG,
906 0, RDEST,
907 " sw UR,UL # store (u)longlong\n"
908 " nop\n"
909 " sw AR,AL\n"
910 " nop\n", },
911
912{ ASSIGN, FOREFF|INBREG,
913 SBREG, TLONGLONG|TULONGLONG,
914 SBREG, TLONGLONG|TULONGLONG,
915 0, RDEST,
916 " move UL,UR # register move\n"
917 " move AL,AR\n", },
918
919{ ASSIGN, FOREFF|INAREG,
920 SAREG, TANY,
921 SAREG, TANY,
922 0, RDEST,
923 " move AL,AR # register move\n", },
924
925{ ASSIGN, FOREFF|INCREG,
926 SCREG, TFLOAT,
927 SCREG, TFLOAT,
928 0, RDEST,
929 " mov.s AL,AR # register move\n", },
930
931{ ASSIGN, FOREFF|INCREG,
932 SCREG, TDOUBLE|TLDOUBLE,
933 SCREG, TDOUBLE|TLDOUBLE,
934 0, RDEST,
935 " mov.d AL,AR # register move\n", },
936
937{ ASSIGN, FOREFF|INCREG,
938 SNAME|SOREG, TFLOAT,
939 SCREG, TFLOAT,
940 0, RDEST,
941 " s.s AR,AL # store floating-point reg to oreg/sname\n"
942 " nop\n", },
943
944{ ASSIGN, FOREFF|INCREG,
945 SNAME|SOREG, TDOUBLE|TLDOUBLE,
946 SCREG, TDOUBLE|TLDOUBLE,
947 0, RDEST,
948 " s.d AR,AL # store double floating-point reg to oreg/sname\n"
949 " nop\n", },
950
951{ ASSIGN, FOREFF|INAREG,
952 SFLD, TANY,
953 SOREG|SNAME, TANY,
954 3*NAREG, RDEST,
955 " lw A1,AR # bit-field assignment\n"
956 " li A3,M\n"
957 " lw A2,AL\n"
958 " sll A1,A1,H\n"
959 " and A1,A1,A3\n"
960 " nor A3,$zero,A3\n"
961 " and A2,A2,A3\n"
962 " or A2,A2,A1\n"
963 " sw A2,AL\n"
964 "F lw AD,AR\n"
965 "F nop\n"
966 "F sll AD,AD,32-S\n"
967 "F sra AD,AD,32-S\n", },
968
969/* XXX we can optimise this away */
970{ ASSIGN, FOREFF|INAREG,
971 SFLD, TANY,
972 SCON, TANY,
973 3*NAREG, RDEST,
974 " li A1,AR # bit-field assignment\n"
975 " lw A2,AL\n"
976 " li A3,M\n"
977 " sll A1,A1,H\n"
978 " and A1,A1,A3\n"
979 " nor A3,$zero,A3\n"
980 " and A2,A2,A3\n"
981 " or A2,A2,A1\n"
982 " sw A2,AL\n"
983 "F li AD,AR\n"
984 "F sll AD,AD,32-S\n"
985 "F sra AD,AD,32-S\n", },
986
987{ ASSIGN, FOREFF|INAREG,
988 SFLD, TANY,
989 SAREG, TANY,
990 3*NAREG, RDEST,
991 " move A1,AR # bit-field assignment\n"
992 " lw A2,AL\n"
993 " li A3,M\n"
994 " sll A1,A1,H\n"
995 " and A1,A1,A3\n"
996 " nor A3,$zero,A3\n"
997 " and A2,A2,A3\n"
998 " or A2,A2,A1\n"
999 " sw A2,AL\n"
1000 "F move AR,AD\n"
1001 "F sll AD,AD,32-S\n"
1002 "F sra AD,AD,32-S\n", },
1003
1004{ STASG, INAREG|FOREFF,
1005 SOREG|SNAME, TANY,
1006 SAREG, TPTRTO|TANY,
1007 NSPECIAL, RDEST,
1008 "ZQ", },
1009
1010/*
1011 * Compare instructions
1012 */
1013
1014{ EQ, FORCC,
1015 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1016 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1017 0, RESCC,
1018 " beq AL,AR,LC\n"
1019 " nop\n", },
1020
1021{ NE, FORCC,
1022 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1023 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1024 0, RESCC,
1025 " bne AL,AR,LC\n"
1026 " nop\n", },
1027
1028{ OPLOG, FORCC,
1029 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1030 SZERO, TANY,
1031 0, RESCC,
1032 " O AL,LC\n"
1033 " nop\n", },
1034
1035{ OPLOG, FORCC,
1036 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1037 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1038 NAREG|NASL, RESCC,
1039 " sub A1,AL,AR\n"
1040 " O A1,LC\n"
1041 " nop\n", },
1042
1043{ OPLOG, FORCC,
1044 SAREG, TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
1045 SSCON, TWORD|TSHORT|TUSHORT|TCHAR|TUCHAR,
1046 NAREG|NASL, RESCC,
1047 " sub A1,AL,AR\n"
1048 " O A1,LC\n"
1049 " nop\n", },
1050
1051{ OPLOG, FORCC,
1052 SBREG, TLONGLONG|TULONGLONG,
1053 SBREG, TLONGLONG|TULONGLONG,
1054 NAREG, RESCC,
1055 "ZD", },
1056
1057{ OPLOG, FORCC,
1058 SCREG, TFLOAT|TDOUBLE|TLDOUBLE,
1059 SCREG, TFLOAT|TDOUBLE|TLDOUBLE,
1060 0, RESCC,
1061 "ZG", },
1062
1063/*
1064 * Convert LTYPE to reg.
1065 */
1066
1067{ OPLTYPE, INAREG,
1068 SANY, TANY,
1069 SOREG|SNAME, TCHAR,
1070 NAREG, RESC1,
1071 " lb A1,AL # load char to reg\n"
1072 " nop\n", },
1073
1074{ OPLTYPE, INAREG,
1075 SANY, TANY,
1076 SOREG|SNAME, TUCHAR,
1077 NAREG, RESC1,
1078 " lbu A1,AL # load uchar to reg\n"
1079 " nop\n", },
1080
1081{ OPLTYPE, INAREG,
1082 SANY, TANY,
1083 SOREG|SNAME, TSHORT,
1084 NAREG, RESC1,
1085 " lh A1,AL # load short to reg\n"
1086 " nop\n", },
1087
1088{ OPLTYPE, INAREG,
1089 SANY, TANY,
1090 SOREG|SNAME, TUSHORT,
1091 NAREG, RESC1,
1092 " lhu A1,AL # load ushort to reg\n"
1093 " nop\n", },
1094
1095{ OPLTYPE, INAREG,
1096 SANY, TANY,
1097 SOREG|SNAME, TWORD|TPOINT,
1098 NAREG, RESC1,
1099 " lw A1,AL # load (u)int/(u)long to reg\n"
1100 " nop\n", },
1101
1102{ OPLTYPE, INBREG,
1103 SANY, TANY,
1104 SOREG|SNAME, TLONGLONG|TULONGLONG,
1105 NBREG, RESC1,
1106 " lw U1,UL # load (u)longlong to reg\n"
1107 " nop\n"
1108 " lw A1,AL\n"
1109 " nop\n", },
1110
1111{ OPLTYPE, INAREG,
1112 SANY, TANY,
1113 SCON, TPOINT,
1114 NAREG, RESC1,
1115 " la A1,AL # load constant address to reg\n", },
1116
1117{ OPLTYPE, INAREG,
1118 SANY, TANY,
1119 SZERO, TANY,
1120 NAREG, RESC1,
1121 " move A1,$zero # load 0 to reg\n", },
1122
1123{ OPLTYPE, INAREG,
1124 SANY, TANY,
1125 SCON, TANY,
1126 NAREG, RESC1,
1127 " li A1,AL # load constant to reg\n", },
1128
1129{ OPLTYPE, INBREG,
1130 SANY, TANY,
1131 SZERO, TANY,
1132 NBREG, RESC1,
1133 " move A1,$zero # load 0 to reg\n"
1134 " move U1,$zero\n", },
1135
1136{ OPLTYPE, INBREG,
1137 SANY, TANY,
1138 SCON, TANY,
1139 NBREG, RESC1,
1140 " li A1,AL # load constant to reg\n"
1141 " li U1,UL\n", },
1142
1143{ OPLTYPE, INAREG,
1144 SANY, TANY,
1145 SANY, TANY,
1146 NAREG, RESC1,
1147 " move A1,AL\n", },
1148
1149{ OPLTYPE, INCREG,
1150 SANY, TANY,
1151 SZERO, TFLOAT,
1152 NCREG, RESC1,
1153 " mtc1 $zero,A1 # load 0 to float reg\n"
1154 " nop\n", },
1155
1156{ OPLTYPE, INCREG,
1157 SANY, TANY,
1158 SZERO, TDOUBLE|TLDOUBLE,
1159 NCREG, RESC1,
1160 " mtc1 $zero,A1 # load 0 to (l)double reg\n"
1161 " mtc1 $zero,U1\n"
1162 " nop\n", },
1163
1164{ OPLTYPE, INCREG,
1165 SANY, TANY,
1166 SOREG|SNAME, TFLOAT,
1167 NCREG, RESC1,
1168 " l.s A1,AL # load into floating-point reg\n"
1169 " nop\n", },
1170
1171{ OPLTYPE, INCREG,
1172 SANY, TANY,
1173 OREG|SNAME, TDOUBLE|TLDOUBLE,
1174 NCREG, RESC1,
1175 " l.d A1,AL # load into double floating-point reg\n"
1176 " nop\n", },
1177
1178/*
1179 * Jumps.
1180 */
1181{ GOTO, FOREFF,
1182 SCON, TANY,
1183 SANY, TANY,
1184 0, RNOP,
1185 " j LL # goto label\n"
1186 " nop\n"
1187 " nop\n", },
1188
1189/*
1190 * Subroutine calls.
1191 */
1192
1193{ CALL, FOREFF,
1194 SCON, TANY,
1195 SANY, TANY,
1196 0, 0,
1197 " subu $sp,$sp,16 # call (args, no result) to scon/sname\n"
1198 " jal CL\n"
1199 " nop\n"
1200 "ZC", },
1201
1202{ UCALL, FOREFF,
1203 SCON, TANY,
1204 SANY, TANY,
1205 0, 0,
1206 " jal CL # call (no args, no result) to scon/sname\n"
1207 " nop\n", },
1208
1209{ CALL, INAREG,
1210 SCON, TANY,
1211 SAREG, TANY,
1212 NAREG, RESC1, /* should be 0 */
1213 " subu $sp,$sp,16 # call (args, result in v0) to scon/sname\n"
1214 " jal CL\n"
1215 " nop\n"
1216 "ZC", },
1217
1218{ UCALL, INAREG,
1219 SCON, TANY,
1220 SAREG, TANY,
1221 NAREG, RESC1, /* should be 0 */
1222 " jal CL # call (no args, result in v0) to scon/sname\n"
1223 " nop\n",
1224 },
1225
1226{ CALL, INBREG,
1227 SCON, TANY,
1228 SBREG, TANY,
1229 NBREG, RESC1, /* should be 0 */
1230 " subu $sp,$sp,16 # call (args, result in v0:v1) to scon/sname\n"
1231 " jal CL\n"
1232 " nop\n"
1233 "ZC", },
1234
1235{ UCALL, INBREG,
1236 SCON, TANY,
1237 SBREG, TANY,
1238 NBREG, RESC1, /* should be 0 */
1239 " jal CL # call (no args, result in v0:v1) to scon/sname\n"
1240 " nop\n",
1241 },
1242
1243{ CALL, INCREG,
1244 SCON, TANY,
1245 SCREG, TANY,
1246 NCREG, RESC1, /* should be 0 */
1247 " subu $sp,$sp,16 # call (args, result in f0:f1) to scon/sname\n"
1248 " jal CL\n"
1249 " nop\n"
1250 "ZC", },
1251
1252{ UCALL, INCREG,
1253 SCON, TANY,
1254 SCREG, TANY,
1255 NCREG, RESC1, /* should be 0 */
1256 " jal CL # call (no args, result in v0:v1) to scon/sname\n"
1257 " nop\n",
1258 },
1259
1260{ CALL, FOREFF,
1261 SAREG, TANY,
1262 SANY, TANY,
1263 0, 0,
1264 " subu $sp,$sp,16 # call (args, no result) to reg\n"
1265 " move $25,AL\n"
1266 " jal $25\n"
1267 " nop\n"
1268 "ZC", },
1269
1270{ UCALL, FOREFF,
1271 SAREG, TANY,
1272 SANY, TANY,
1273 0, 0,
1274 " move $25,AL\n"
1275 " jal $25 # call (no args, no result) to reg\n"
1276 " nop\n", },
1277
1278{ CALL, INAREG,
1279 SAREG, TANY,
1280 SAREG, TANY,
1281 NAREG, RESC1, /* should be 0 */
1282 " subu $sp,$sp,16 # call (args, result) to reg\n"
1283 " move $25,AL\n"
1284 " jal $25\n"
1285 " nop\n"
1286 "ZC", },
1287
1288{ UCALL, INAREG,
1289 SAREG, TANY,
1290 SAREG, TANY,
1291 NAREG, RESC1, /* should be 0 */
1292 " move $25,AL\n"
1293 " jal $25 # call (no args, result) to reg\n"
1294 " nop\n", },
1295
1296{ CALL, INBREG,
1297 SAREG, TANY,
1298 SBREG, TANY,
1299 NBREG, RESC1, /* should be 0 */
1300 " subu $sp,$sp,16 # call (args, result) to reg\n"
1301 " move $25,AL\n"
1302 " jal $25\n"
1303 " nop\n"
1304 "ZC", },
1305
1306{ UCALL, INBREG,
1307 SAREG, TANY,
1308 SBREG, TANY,
1309 NBREG, RESC1, /* should be 0 */
1310 " move $25,AL\n"
1311 " jal $25 # call (no args, result) to reg\n"
1312 " nop\n", },
1313
1314{ CALL, INCREG,
1315 SAREG, TANY,
1316 SCREG, TANY,
1317 NCREG, RESC1, /* should be 0 */
1318 " subu $sp,$sp,16 # call (args, result) to reg\n"
1319 " move $25,AL\n"
1320 " jal $25\n"
1321 " nop\n"
1322 "ZC", },
1323
1324{ UCALL, INCREG,
1325 SCREG, TANY,
1326 SCREG, TANY,
1327 NCREG, RESC1, /* should be 0 */
1328 " move $25,AL\n"
1329 " jal $25 # call (no args, result) to reg\n"
1330 " nop\n", },
1331
1332
1333/* struct return */
1334{ USTCALL, FOREFF,
1335 SCON|SNAME, TANY,
1336 SANY, TANY,
1337 0, 0,
1338 " jal CL\n"
1339 " nop\n", },
1340
1341{ USTCALL, FOREFF,
1342 SAREG, TANY,
1343 SANY, TANY,
1344 0, 0,
1345 " move $25,AL\n"
1346 " jal $25\n"
1347 " nop\n", },
1348
1349{ USTCALL, INAREG,
1350 SCON|SNAME, TANY,
1351 SANY, TANY,
1352 NAREG|NASL, RESC1,
1353 " jal CL\n"
1354 " nop\n", },
1355
1356{ USTCALL, INAREG,
1357 SAREG, TANY,
1358 SANY, TANY,
1359 NAREG|NASL, RESC1,
1360 " move $25,AL\n"
1361 " jal $25\n"
1362 " nop\n", },
1363
1364{ STCALL, FOREFF,
1365 SCON|SNAME, TANY,
1366 SANY, TANY,
1367 0, 0,
1368 " subu $sp,$sp,16\n"
1369 " jal CL\n"
1370 " nop\n"
1371 "ZC", },
1372
1373{ STCALL, FOREFF,
1374 SAREG, TANY,
1375 SANY, TANY,
1376 0, 0,
1377 " subu $sp,$sp,16\n"
1378 " move $25,AL\n"
1379 " jal $25\n"
1380 " nop\n"
1381 "ZC", },
1382
1383{ STCALL, INAREG,
1384 SCON|SNAME, TANY,
1385 SANY, TANY,
1386 NAREG|NASL, RESC1,
1387 " subu $sp,$sp,16\n"
1388 " jal CL\n"
1389 " nop\n"
1390 "ZC", },
1391
1392{ STCALL, INAREG,
1393 SAREG, TANY,
1394 SANY, TANY,
1395 0, 0,
1396 " subu $sp,$sp,16\n"
1397 " move $25,AL\n"
1398 " jal $25\n"
1399 " nop\n"
1400 "ZC", },
1401
1402
1403/*
1404 * Function arguments
1405 */
1406
1407#if 0
1408
1409/* intentionally write out the register for (u)short/(u)char */
1410{ FUNARG, FOREFF,
1411 SAREG, TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR,
1412 SANY, TWORD|TPOINT|TUSHORT|TSHORT|TUCHAR|TCHAR,
1413 0, 0,
1414 " subu $sp,$sp,4 # save function arg to stack\n"
1415 " sw AL,($sp)\n"
1416 " #nop\n", },
1417
1418{ FUNARG, FOREFF,
1419 SBREG, TLONGLONG|TULONGLONG,
1420 SANY, TLONGLONG|TULONGLONG,
1421 0, 0,
1422 " addi $sp,$sp,-8 # save function arg to stack (endian problem here?\n"
1423 " sw UL,4($sp)\n"
1424 " sw AL,($sp)\n"
1425 " #nop\n", },
1426
1427{ FUNARG, FOREFF,
1428 SCREG, TFLOAT,
1429 SANY, TFLOAT,
1430 0, 0,
1431 " addi $sp,$sp,-4 # save function arg to stack\n"
1432 " s.s AL,($sp)\n"
1433 " #nop\n", },
1434
1435{ FUNARG, FOREFF,
1436 SCREG, TDOUBLE|TLDOUBLE,
1437 SANY, TDOUBLE|TLDOUBLE,
1438 0, 0,
1439 " addi $sp,$sp,-8 # save function arg to stack\n"
1440 " s.d AL,($sp)\n"
1441 " #nop\n", },
1442
1443#endif
1444
1445{ STARG, FOREFF,
1446 SAREG, TANY,
1447 SANY, TSTRUCT,
1448 NSPECIAL, 0,
1449 "ZH", },
1450
1451/*
1452 * Indirection operators.
1453 */
1454{ UMUL, INAREG,
1455 SANY, TPOINT|TWORD,
1456 SOREG, TPOINT|TWORD,
1457 NAREG, RESC1,
1458 " lw A1,AL # word load\n"
1459 " nop\n", },
1460
1461{ UMUL, INAREG,
1462 SANY, TSHORT|TUSHORT,
1463 SOREG, TSHORT|TUSHORT,
1464 NAREG, RESC1,
1465 " lh A1,AL # (u)short load\n"
1466 " nop\n", },
1467
1468{ UMUL, INAREG,
1469 SANY, TCHAR|TUCHAR,
1470 SOREG, TCHAR|TUCHAR,
1471 NAREG, RESC1,
1472 " lb A1,AL # (u)char load\n"
1473 " nop\n", },
1474
1475{ UMUL, INBREG,
1476 SANY, TLONGLONG|TULONGLONG,
1477 SOREG, TLONGLONG|TULONGLONG,
1478 NBREG, RESC1,
1479 " lw A1,AL # (u)longlong load - endian problem here?\n"
1480 " nop\n"
1481 " lw U1,UL\n"
1482 " nop\n", },
1483
1484{ UMUL, INCREG,
1485 SANY, TFLOAT,
1486 SOREG, TFLOAT,
1487 NCREG, RESC1,
1488 " l.s A1,AL # float load\n"
1489 " nop\n", },
1490
1491{ UMUL, INCREG,
1492 SANY, TDOUBLE|TLDOUBLE,
1493 SOREG, TDOUBLE|TLDOUBLE,
1494 NCREG, RESC1,
1495 " l.d A1,AL # float load\n"
1496 " nop\n", },
1497
1498#if 0
1499{ UMUL, INCREG,
1500 SANY, TDOUBLE|TLDOUBLE,
1501 SAREG, TPOINT,
1502 NCREG, RESC1,
1503 " l.d A1,(AL)\n"
1504 " nop\n", },
1505
1506{ UMUL, INAREG,
1507 SANY, TPOINT|TWORD,
1508 SNAME, TPOINT|TWORD,
1509 NAREG, RESC1,
1510 " la A1,AL # sname word load\n"
1511 " lw A1,(A1)\n"
1512 " nop\n", },
1513
1514{ UMUL, INAREG,
1515 SANY, TSHORT|TUSHORT,
1516 SNAME, TSHORT|TUSHORT,
1517 NAREG, RESC1,
1518 " la A1,AL # sname (u)short load\n"
1519 " lh A1,(A1)\n"
1520 " nop\n", },
1521
1522{ UMUL, INAREG,
1523 SANY, TCHAR|TUCHAR,
1524 SNAME, TCHAR|TUCHAR,
1525 NAREG, RESC1,
1526 " la A1,AL # sname (u)char load\n"
1527 " lb A1,(A1)\n"
1528 " nop\n", },
1529
1530{ UMUL, INBREG,
1531 SANY, TLONGLONG|TULONGLONG,
1532 SNAME, TLONGLONG|TULONGLONG,
1533 NBREG|NAREG, RESC1,
1534 " la A2,AL # sname (u)long long load - endian problems here?\n"
1535 " lw A1,(A1)\n"
1536 " nop\n"
1537 " lw U1,4(A1)\n"
1538 " nop\n", },
1539#endif
1540
1541{ UMUL, INAREG,
1542 SANY, TPOINT|TWORD,
1543 SAREG, TPOINT|TWORD,
1544 NAREG, RESC1,
1545 " lw A1,(AL) # word load\n"
1546 " nop\n", },
1547
1548#if 0
1549{ UMUL, INAREG,
1550 SANY, TSHORT|TUSHORT,
1551 SAREG, TPTRTO|TSHORT|TUSHORT,
1552 NAREG, RESC1,
1553 " lh A1,(AL) # (u)short load\n"
1554 " nop\n", },
1555
1556{ UMUL, INAREG,
1557 SANY, TCHAR|TUCHAR,
1558 SAREG, TPTRTO|TCHAR|TUCHAR,
1559 NAREG|NASL, RESC1,
1560 " lb A1,(AL) # (u)char load\n"
1561 " nop\n", },
1562
1563{ UMUL, INBREG,
1564 SANY, TLONGLONG|TULONGLONG,
1565 SAREG, TPTRTO|TLONGLONG|TULONGLONG,
1566 NBREG, RESC1,
1567 " lw A1,(AL) # (u)long long load - endianness problems?\n"
1568 " nop\n"
1569 " lw U1,4(AL)"
1570 " nop\n", },
1571#endif
1572
1573#define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""
1574
1575{ FLD, DF(FLD), },
1576
1577{ FREE, FREE, FREE, FREE, FREE, FREE, FREE, FREE, "help; I'm in trouble\n" },
1578};
1579
1580int tablesize = sizeof(table)/sizeof(table[0]);
Note: See TracBrowser for help on using the repository browser.