master
def 2,134 lines 37.8 KB
Raw
1 /*
2 * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 */
17
18 DEF_MACRO(
19 LIKELY, /* NAME */
20 __builtin_expect((X),1), /* BEH */
21 () /* attribs */
22 )
23
24 DEF_MACRO(
25 UNLIKELY, /* NAME */
26 __builtin_expect((X),0), /* BEH */
27 () /* attribs */
28 )
29
30 DEF_MACRO(
31 CANCEL, /* macro name */
32 {if (thread->last_pkt) thread->last_pkt->slot_cancelled |= (1<<insn->slot); return;} , /* behavior */
33 (A_CONDEXEC)
34 )
35
36 DEF_MACRO(
37 LOAD_CANCEL, /* macro name */
38 {mem_general_load_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
39 (A_CONDEXEC)
40 )
41
42 DEF_MACRO(
43 STORE_CANCEL, /* macro name */
44 {mem_general_store_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
45 (A_CONDEXEC)
46 )
47
48 DEF_MACRO(
49 fMAX, /* macro name */
50 (((A) > (B)) ? (A) : (B)), /* behavior */
51 /* optional attributes */
52 )
53
54 DEF_MACRO(
55 fMIN, /* macro name */
56 (((A) < (B)) ? (A) : (B)), /* behavior */
57 /* optional attributes */
58 )
59
60 DEF_MACRO(
61 fABS, /* macro name */
62 (((A)<0)?(-(A)):(A)), /* behavior */
63 /* optional attributes */
64 )
65
66
67 /* Bit insert */
68 DEF_MACRO(
69 fINSERT_BITS,
70 {
71 REG = ((REG) & ~(((fCONSTLL(1)<<(WIDTH))-1)<<(OFFSET))) | (((INVAL) & ((fCONSTLL(1)<<(WIDTH))-1)) << (OFFSET));
72 },
73 /* attribs */
74 )
75
76 /* Bit extract */
77 DEF_MACRO(
78 fEXTRACTU_BITS,
79 (fZXTN(WIDTH,32,(INREG >> OFFSET))),
80 /* attribs */
81 )
82
83 DEF_MACRO(
84 fEXTRACTU_BIDIR,
85 (fZXTN(WIDTH,32,fBIDIR_LSHIFTR((INREG),(OFFSET),4_8))),
86 /* attribs */
87 )
88
89 DEF_MACRO(
90 fEXTRACTU_RANGE,
91 (fZXTN((HIBIT-LOWBIT+1),32,(INREG >> LOWBIT))),
92 /* attribs */
93 )
94
95
96 DEF_MACRO(
97 fINSERT_RANGE,
98 {
99 int offset=LOWBIT;
100 int width=HIBIT-LOWBIT+1;
101 /* clear bits where new bits go */
102 INREG &= ~(((fCONSTLL(1)<<width)-1)<<offset);
103 /* OR in new bits */
104 INREG |= ((INVAL & ((fCONSTLL(1)<<width)-1)) << offset);
105 },
106 /* attribs */
107 )
108
109
110 DEF_MACRO(
111 f8BITSOF,
112 ( (VAL) ? 0xff : 0x00),
113 /* attribs */
114 )
115
116 DEF_MACRO(
117 fLSBOLD,
118 ((VAL) & 1),
119 ()
120 )
121
122 DEF_MACRO(
123 fLSBNEW,
124 predlog_read(thread,PNUM),
125 ()
126 )
127
128 DEF_MACRO(
129 fLSBNEW0,
130 predlog_read(thread,0),
131 ()
132 )
133
134 DEF_MACRO(
135 fLSBNEW1,
136 predlog_read(thread,1),
137 ()
138 )
139
140 DEF_MACRO(
141 fLSBOLDNOT,
142 (!fLSBOLD(VAL)),
143 ()
144 )
145
146 DEF_MACRO(
147 fLSBNEWNOT,
148 (!fLSBNEW(PNUM)),
149 ()
150 )
151
152 DEF_MACRO(
153 fLSBNEW0NOT,
154 (!fLSBNEW0),
155 ()
156 )
157
158 DEF_MACRO(
159 fLSBNEW1NOT,
160 (!fLSBNEW1),
161 ()
162 )
163
164 DEF_MACRO(
165 fNEWREG,
166 ({if (newvalue_missing(thread,RNUM) ||
167 IS_CANCELLED(insn->new_value_producer_slot)) CANCEL; reglog_read(thread,RNUM);}),
168 (A_DOTNEWVALUE,A_RESTRICT_SLOT0ONLY)
169 )
170 // Store new with a missing newvalue or cancelled goes out as a zero byte store in V65
171 // take advantage of the fact that reglog_read returns zero for not valid rnum
172 DEF_MACRO(
173 fNEWREG_ST,
174 ({if (newvalue_missing(thread,RNUM) ||
175 IS_CANCELLED(insn->new_value_producer_slot)) { STORE_ZERO; RNUM = -1; }; reglog_read(thread,RNUM);}),
176 (A_DOTNEWVALUE,A_RESTRICT_SLOT0ONLY)
177 )
178
179 DEF_MACRO(
180 fVSATUVALN,
181 ({ ((VAL) < 0) ? 0 : ((1LL<<(N))-1);}),
182 ()
183 )
184
185 DEF_MACRO(
186 fSATUVALN,
187 ({fSET_OVERFLOW(); ((VAL) < 0) ? 0 : ((1LL<<(N))-1);}),
188 ()
189 )
190
191 DEF_MACRO(
192 fSATVALN,
193 ({fSET_OVERFLOW(); ((VAL) < 0) ? (-(1LL<<((N)-1))) : ((1LL<<((N)-1))-1);}),
194 ()
195 )
196
197 DEF_MACRO(
198 fVSATVALN,
199 ({((VAL) < 0) ? (-(1LL<<((N)-1))) : ((1LL<<((N)-1))-1);}),
200 ()
201 )
202
203 DEF_MACRO(
204 fZXTN, /* macro name */
205 ((VAL) & ((1LL<<(N))-1)),
206 /* attribs */
207 )
208
209 DEF_MACRO(
210 fSXTN, /* macro name */
211 ((fZXTN(N,M,VAL) ^ (1LL<<((N)-1))) - (1LL<<((N)-1))),
212 /* attribs */
213 )
214
215 DEF_MACRO(
216 fSATN,
217 ((fSXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATVALN(N,VAL)),
218 ()
219 )
220 DEF_MACRO(
221 fVSATN,
222 ((fSXTN(N,64,VAL) == (VAL)) ? (VAL) : fVSATVALN(N,VAL)),
223 ()
224 )
225
226 DEF_MACRO(
227 fADDSAT64,
228 {
229 size8u_t __a = fCAST8u(A);
230 size8u_t __b = fCAST8u(B);
231 size8u_t __sum = __a + __b;
232 size8u_t __xor = __a ^ __b;
233 const size8u_t __mask = 0x8000000000000000ULL;
234 if (__xor & __mask) {
235 /* Opposite signs, OK */
236 DST = __sum;
237 } else if ((__a ^ __sum) & __mask) {
238 /* Signs mismatch */
239 if (__sum & __mask) {
240 /* overflowed to negative, make max pos */
241 DST=0x7FFFFFFFFFFFFFFFLL; fSET_OVERFLOW();
242 } else {
243 /* overflowed to positive, make max neg */
244 DST=0x8000000000000000LL; fSET_OVERFLOW();
245 }
246 } else {
247 /* signs did not mismatch, OK */
248 DST = __sum;
249 }
250 },
251 ()
252 )
253
254 DEF_MACRO(
255 fVSATUN,
256 ((fZXTN(N,64,VAL) == (VAL)) ? (VAL) : fVSATUVALN(N,VAL)),
257 ()
258 )
259
260 DEF_MACRO(
261 fSATUN,
262 ((fZXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATUVALN(N,VAL)),
263 ()
264 )
265
266 DEF_MACRO(
267 fSATH,
268 (fSATN(16,VAL)),
269 ()
270 )
271
272
273 DEF_MACRO(
274 fSATUH,
275 (fSATUN(16,VAL)),
276 ()
277 )
278
279 DEF_MACRO(
280 fVSATH,
281 (fVSATN(16,VAL)),
282 ()
283 )
284
285 DEF_MACRO(
286 fVSATUH,
287 (fVSATUN(16,VAL)),
288 ()
289 )
290
291
292 DEF_MACRO(
293 fSATUB,
294 (fSATUN(8,VAL)),
295 ()
296 )
297 DEF_MACRO(
298 fSATB,
299 (fSATN(8,VAL)),
300 ()
301 )
302
303
304 DEF_MACRO(
305 fVSATUB,
306 (fVSATUN(8,VAL)),
307 ()
308 )
309 DEF_MACRO(
310 fVSATB,
311 (fVSATN(8,VAL)),
312 ()
313 )
314
315
316
317
318 /*************************************/
319 /* immediate extension */
320 /*************************************/
321
322 DEF_MACRO(
323 fIMMEXT,
324 (IMM = IMM),
325 (A_EXTENDABLE)
326 )
327
328 DEF_MACRO(
329 fMUST_IMMEXT,
330 fIMMEXT(IMM),
331 (A_EXTENDABLE)
332 )
333
334 DEF_MACRO(
335 fPCALIGN,
336 IMM=(IMM & ~PCALIGN_MASK),
337 (A_EXTENDABLE)
338 )
339
340 /*************************************/
341 /* Read and Write Implicit Regs */
342 /*************************************/
343
344 DEF_MACRO(
345 fREAD_IREG, /* read modifier register */
346 (fSXTN(11,64,(((VAL) & 0xf0000000)>>21) | ((VAL>>17)&0x7f) )), /* behavior */
347 ()
348 )
349
350 DEF_MACRO(
351 fREAD_LR, /* read link register */
352 (READ_RREG(REG_LR)), /* behavior */
353 ()
354 )
355
356 DEF_MACRO(
357 fREAD_SSR, /* read SSR register */
358 (READ_RREG(REG_SSR)), /* behavior */
359 ()
360 )
361
362 DEF_MACRO(
363 fWRITE_LR, /* write lr */
364 WRITE_RREG(REG_LR,A), /* behavior */
365 (A_IMPLICIT_WRITES_LR)
366 )
367
368 DEF_MACRO(
369 fWRITE_FP, /* write sp */
370 WRITE_RREG(REG_FP,A), /* behavior */
371 (A_IMPLICIT_WRITES_FP)
372 )
373
374 DEF_MACRO(
375 fWRITE_SP, /* write sp */
376 WRITE_RREG(REG_SP,A), /* behavior */
377 (A_IMPLICIT_WRITES_SP)
378 )
379
380 DEF_MACRO(
381 fWRITE_GOSP, /* write gosp */
382 WRITE_RREG(REG_GOSP,A), /* behavior */
383 (A_IMPLICIT_WRITES_GOSP)
384 )
385
386 DEF_MACRO(
387 fREAD_SP, /* read stack pointer */
388 (READ_RREG(REG_SP)), /* behavior */
389 ()
390 )
391
392 DEF_MACRO(
393 fREAD_GOSP, /* read guest other stack pointer */
394 (READ_RREG(REG_GOSP)), /* behavior */
395 ()
396 )
397
398 DEF_MACRO(
399 fREAD_GELR, /* read guest other stack pointer */
400 (READ_RREG(REG_GELR)), /* behavior */
401 ()
402 )
403
404 DEF_MACRO(
405 fREAD_GEVB, /* read guest other stack pointer */
406 (READ_RREG(REG_GEVB)), /* behavior */
407 ()
408 )
409
410 DEF_MACRO(
411 fREAD_CSREG, /* read CS register */
412 (READ_RREG(REG_CSA+N)), /* behavior */
413 ()
414 )
415
416 DEF_MACRO(
417 fREAD_LC0, /* read loop count */
418 (READ_RREG(REG_LC0)), /* behavior */
419 ()
420 )
421
422 DEF_MACRO(
423 fREAD_LC1, /* read loop count */
424 (READ_RREG(REG_LC1)), /* behavior */
425 ()
426 )
427
428 DEF_MACRO(
429 fREAD_SA0, /* read start addr */
430 (READ_RREG(REG_SA0)), /* behavior */
431 ()
432 )
433
434 DEF_MACRO(
435 fREAD_SA1, /* read start addr */
436 (READ_RREG(REG_SA1)), /* behavior */
437 ()
438 )
439
440
441 DEF_MACRO(
442 fREAD_FP, /* read frame pointer */
443 (READ_RREG(REG_FP)), /* behavior */
444 ()
445 )
446
447 DEF_MACRO(
448 fREAD_GP, /* read global pointer */
449 (insn->extension_valid ? 0 : READ_RREG(REG_GP)), /* behavior */
450 ()
451 )
452
453 DEF_MACRO(
454 fREAD_PC, /* read PC */
455 (READ_RREG(REG_PC)), /* behavior */
456 ()
457 )
458
459 DEF_MACRO(
460 fREAD_NPC, /* read next PC */
461 (thread->next_PC & (0xfffffffe)), /* behavior */
462 ()
463 )
464
465 DEF_MACRO(
466 fREAD_P0, /* read Predicate 0 */
467 (READ_PREG(0)), /* behavior */
468 ()
469 )
470
471 DEF_MACRO(
472 fREAD_P3, /* read Predicate 3 */
473 (READ_PREG(3)), /* behavior */
474 ()
475 )
476
477 DEF_MACRO(
478 fCHECK_PCALIGN,
479 if (((A) & PCALIGN_MASK)) {
480 register_error_exception(thread,PRECISE_CAUSE_PC_NOT_ALIGNED,thread->Regs[REG_BADVA0],thread->Regs[REG_BADVA1],GET_SSR_FIELD(SSR_BVS),GET_SSR_FIELD(SSR_V0),GET_SSR_FIELD(SSR_V1),0);
481 },
482 ()
483 )
484
485 DEF_MACRO(
486 fWRITE_NPC, /* write next PC */
487 if (!thread->branch_taken) {
488 if (A != thread->next_PC) {
489 thread->next_pkt_guess=thread->last_pkt->taken_ptr;
490 }
491 fCHECK_PCALIGN(A);
492 thread->branched = 1; thread->branch_taken = 1; thread->next_PC = A; \
493 thread->branch_offset = insn->encoding_offset; thread->branch_opcode = insn->opcode;
494 }, /* behavior */
495 (A_COF)
496 )
497
498 DEF_MACRO(
499 fBRANCH,
500 fWRITE_NPC(LOC); fCOF_CALLBACK(LOC,TYPE),
501 ()
502 )
503
504 DEF_MACRO(
505 fJUMPR, /* A jumpr has executed */
506 {fBRANCH(TARGET,COF_TYPE_JUMPR);},
507 (A_INDIRECT)
508 )
509
510 DEF_MACRO(
511 fHINTJR, /* A hintjr instruction has executed */
512 { },
513 )
514
515 DEF_MACRO(
516 fCALL, /* Do a call */
517 if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALL);},
518 (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
519 )
520
521 DEF_MACRO(
522 fCALLR, /* Do a call Register */
523 if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALLR);},
524 (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
525 )
526
527 DEF_MACRO(
528 fWRITE_LOOP_REGS0, /* write ln,sa,ea,lc */
529 {WRITE_RREG(REG_LC0,COUNT);
530 WRITE_RREG(REG_SA0,START);},
531 (A_IMPLICIT_WRITES_LC0,A_IMPLICIT_WRITES_SA0)
532 )
533
534 DEF_MACRO(
535 fWRITE_LOOP_REGS1, /* write ln,sa,ea,lc */
536 {WRITE_RREG(REG_LC1,COUNT);
537 WRITE_RREG(REG_SA1,START);},
538 (A_IMPLICIT_WRITES_LC1,A_IMPLICIT_WRITES_SA1)
539 )
540
541 DEF_MACRO(
542 fWRITE_LC0,
543 WRITE_RREG(REG_LC0,VAL),
544 (A_IMPLICIT_WRITES_LC0)
545 )
546
547 DEF_MACRO(
548 fWRITE_LC1,
549 WRITE_RREG(REG_LC1,VAL),
550 (A_IMPLICIT_WRITES_LC1)
551 )
552
553 DEF_MACRO(
554 fCARRY_FROM_ADD,
555 carry_from_add64(A,B,C),
556 /* NOTHING */
557 )
558
559 DEF_MACRO(
560 fSET_OVERFLOW,
561 SET_USR_FIELD(USR_OVF,1),
562 ()
563 )
564
565 DEF_MACRO(
566 fSET_LPCFG,
567 SET_USR_FIELD(USR_LPCFG,(VAL)),
568 ()
569 )
570
571
572 DEF_MACRO(
573 fGET_LPCFG,
574 (GET_USR_FIELD(USR_LPCFG)),
575 ()
576 )
577
578
579
580 DEF_MACRO(
581 fWRITE_P0, /* write Predicate 0 */
582 WRITE_PREG(0,VAL), /* behavior */
583 (A_IMPLICIT_WRITES_P0)
584 )
585
586 DEF_MACRO(
587 fWRITE_P1, /* write Predicate 0 */
588 WRITE_PREG(1,VAL), /* behavior */
589 (A_IMPLICIT_WRITES_P1)
590 )
591
592 DEF_MACRO(
593 fWRITE_P2, /* write Predicate 0 */
594 WRITE_PREG(2,VAL), /* behavior */
595 (A_IMPLICIT_WRITES_P2)
596 )
597
598 DEF_MACRO(
599 fWRITE_P3, /* write Predicate 0 */
600 WRITE_PREG(3,VAL), /* behavior */
601 (A_IMPLICIT_WRITES_P3)
602 )
603 DEF_MACRO(
604 fWRITE_P3_LATE, /* write Predicate 0 */
605 {WRITE_PREG(3,VAL); fHIDE(MARK_LATE_PRED_WRITE(3))} , /* behavior */
606 (A_IMPLICIT_WRITES_P3,A_RESTRICT_LATEPRED)
607 )
608
609 DEF_MACRO(
610 fPART1, /* write Predicate 0 */
611 if (insn->part1) { WORK; return; }, /* behavior */
612 /* optional attributes */
613 )
614
615
616 /*************************************/
617 /* Casting, Sign-Zero extension, etc */
618 /*************************************/
619
620 DEF_MACRO(
621 fCAST4u, /* macro name */
622 ((size4u_t)(A)), /* behavior */
623 /* optional attributes */
624 )
625
626 DEF_MACRO(
627 fCAST4s, /* macro name */
628 ((size4s_t)(A)), /* behavior */
629 /* optional attributes */
630 )
631
632 DEF_MACRO(
633 fCAST8u, /* macro name */
634 ((size8u_t)(A)), /* behavior */
635 /* optional attributes */
636 )
637
638 DEF_MACRO(
639 fCAST8s, /* macro name */
640 ((size8s_t)(A)), /* behavior */
641 /* optional attributes */
642 )
643
644 DEF_MACRO(
645 fCAST2_2s, /* macro name */
646 ((size2s_t)(A)),
647 /* optional attributes */
648 )
649
650 DEF_MACRO(
651 fCAST2_2u, /* macro name */
652 ((size2u_t)(A)),
653 /* optional attributes */
654 )
655
656 DEF_MACRO(
657 fCAST4_4s, /* macro name */
658 ((size4s_t)(A)),
659 /* optional attributes */
660 )
661
662 DEF_MACRO(
663 fCAST4_4u, /* macro name */
664 ((size4u_t)(A)),
665 /* optional attributes */
666 )
667
668
669 DEF_MACRO(
670 fCAST4_8s, /* macro name */
671 ((size8s_t)((size4s_t)(A))),
672 /* optional attributes */
673 )
674
675 DEF_MACRO(
676 fCAST4_8u, /* macro name */
677 ((size8u_t)((size4u_t)(A))),
678 /* optional attributes */
679 )
680
681 DEF_MACRO(
682 fCAST8_8s, /* macro name */
683 ((size8s_t)(A)),
684 /* optional attributes */
685 )
686
687 DEF_MACRO(
688 fCAST8_8u, /* macro name */
689 ((size8u_t)(A)),
690 /* optional attributes */
691 )
692
693 DEF_MACRO(
694 fCAST2_8s, /* macro name */
695 ((size8s_t)((size2s_t)(A))),
696 /* optional attributes */
697 )
698
699 DEF_MACRO(
700 fCAST2_8u, /* macro name */
701 ((size8u_t)((size2u_t)(A))),
702 /* optional attributes */
703 )
704
705 DEF_MACRO(
706 fZE8_16, /* zero-extend 8 to 16 */
707 ((size2s_t)((size1u_t)(A))),
708 /* optional attributes */
709 )
710 DEF_MACRO(
711 fSE8_16, /* sign-extend 8 to 16 */
712 ((size2s_t)((size1s_t)(A))),
713 /* optional attributes */
714 )
715
716
717 DEF_MACRO(
718 fSE16_32, /* sign-extend 16 to 32 */
719 ((size4s_t)((size2s_t)(A))), /* behavior */
720 /* optional attributes */
721 )
722
723 DEF_MACRO(
724 fZE16_32, /* zero-extend 16 to 32 */
725 ((size4u_t)((size2u_t)(A))), /* behavior */
726 /* optional attributes */
727 )
728
729 DEF_MACRO(
730 fSE32_64,
731 ( (size8s_t)((size4s_t)(A)) ), /* behavior */
732 /* optional attributes */
733 )
734
735 DEF_MACRO(
736 fZE32_64,
737 ( (size8u_t)((size4u_t)(A)) ), /* behavior */
738 /* optional attributes */
739 )
740
741 DEF_MACRO(
742 fSE8_32, /* sign-extend 8 to 32 */
743 ((size4s_t)((size1s_t)(A))),
744 /* optional attributes */
745 )
746
747 DEF_MACRO(
748 fZE8_32, /* zero-extend 8 to 32 */
749 ((size4s_t)((size1u_t)(A))),
750 /* optional attributes */
751 )
752
753 /*************************************/
754 /* DSP arithmetic support */
755 /************************************/
756 DEF_MACRO(
757 fMPY8UU, /* multiply half integer */
758 (int)(fZE8_16(A)*fZE8_16(B)), /* behavior */
759 ()
760 )
761 DEF_MACRO(
762 fMPY8US, /* multiply half integer */
763 (int)(fZE8_16(A)*fSE8_16(B)), /* behavior */
764 ()
765 )
766 DEF_MACRO(
767 fMPY8SU, /* multiply half integer */
768 (int)(fSE8_16(A)*fZE8_16(B)), /* behavior */
769 ()
770 )
771
772 DEF_MACRO(
773 fMPY8SS, /* multiply half integer */
774 (int)((short)(A)*(short)(B)), /* behavior */
775 ()
776 )
777
778 DEF_MACRO(
779 fMPY16SS, /* multiply half integer */
780 fSE32_64(fSE16_32(A)*fSE16_32(B)), /* behavior */
781 ()
782 )
783
784 DEF_MACRO(
785 fMPY16UU, /* multiply unsigned half integer */
786 fZE32_64(fZE16_32(A)*fZE16_32(B)), /* behavior */
787 ()
788 )
789
790 DEF_MACRO(
791 fMPY16SU, /* multiply half integer */
792 fSE32_64(fSE16_32(A)*fZE16_32(B)), /* behavior */
793 ()
794 )
795
796 DEF_MACRO(
797 fMPY16US, /* multiply half integer */
798 fMPY16SU(B,A),
799 ()
800 )
801
802 DEF_MACRO(
803 fMPY32SS, /* multiply half integer */
804 (fSE32_64(A)*fSE32_64(B)), /* behavior */
805 ()
806 )
807
808 DEF_MACRO(
809 fMPY32UU, /* multiply half integer */
810 (fZE32_64(A)*fZE32_64(B)), /* behavior */
811 ()
812 )
813
814 DEF_MACRO(
815 fMPY32SU, /* multiply half integer */
816 (fSE32_64(A)*fZE32_64(B)), /* behavior */
817 ()
818 )
819
820 DEF_MACRO(
821 fMPY3216SS, /* multiply mixed precision */
822 (fSE32_64(A)*fSXTN(16,64,B)), /* behavior */
823 ()
824 )
825
826 DEF_MACRO(
827 fMPY3216SU, /* multiply mixed precision */
828 (fSE32_64(A)*fZXTN(16,64,B)), /* behavior */
829 ()
830 )
831
832 DEF_MACRO(
833 fROUND, /* optional rounding */
834 (A+0x8000),
835 /* optional attributes */
836 )
837
838 DEF_MACRO(
839 fCLIP, /* optional rounding */
840 { size4s_t maxv = (1<<U)-1;
841 size4s_t minv = -(1<<U);
842 DST = fMIN(maxv,fMAX(SRC,minv));
843 },
844 /* optional attributes */
845 )
846
847 DEF_MACRO(
848 fCRND, /* optional rounding */
849 ((((A)&0x3)==0x3)?((A)+1):((A))),
850 /* optional attributes */
851 )
852
853 DEF_MACRO(
854 fRNDN, /* Rounding to a boundary */
855 ((((N)==0)?(A):(((fSE32_64(A))+(1<<((N)-1)))))),
856 /* optional attributes */
857 )
858
859 DEF_MACRO(
860 fCRNDN, /* Rounding to a boundary */
861 (conv_round(A,N)),
862 /* optional attributes */
863 )
864
865 DEF_MACRO(
866 fADD128, /* Rounding to a boundary */
867 (add128(A, B)),
868 /* optional attributes */
869 )
870 DEF_MACRO(
871 fSUB128, /* Rounding to a boundary */
872 (sub128(A, B)),
873 /* optional attributes */
874 )
875 DEF_MACRO(
876 fSHIFTR128, /* Rounding to a boundary */
877 (shiftr128(A, B)),
878 /* optional attributes */
879 )
880
881 DEF_MACRO(
882 fSHIFTL128, /* Rounding to a boundary */
883 (shiftl128(A, B)),
884 /* optional attributes */
885 )
886
887 DEF_MACRO(
888 fAND128, /* Rounding to a boundary */
889 (and128(A, B)),
890 /* optional attributes */
891 )
892
893 DEF_MACRO(
894 fCAST8S_16S, /* Rounding to a boundary */
895 (cast8s_to_16s(A)),
896 /* optional attributes */
897 )
898 DEF_MACRO(
899 fCAST16S_8S, /* Rounding to a boundary */
900 (cast16s_to_8s(A)),
901 /* optional attributes */
902 )
903
904 DEF_MACRO(
905 fEA_RI, /* Calculate EA with Register + Immediate Offset */
906 do { EA=REG+IMM; fDOCHKPAGECROSS(REG,EA); } while (0),
907 ()
908 )
909
910 DEF_MACRO(
911 fEA_RRs, /* Calculate EA with Register + Registers scaled Offset */
912 do { EA=REG+(REG2<<SCALE); fDOCHKPAGECROSS(REG,EA); } while (0),
913 ()
914 )
915
916 DEF_MACRO(
917 fEA_IRs, /* Calculate EA with Immediate + Registers scaled Offset */
918 do { EA=IMM+(REG<<SCALE); fDOCHKPAGECROSS(IMM,EA); } while (0),
919 ()
920 )
921
922 DEF_MACRO(
923 fEA_IMM, /* Calculate EA with Immediate */
924 EA=IMM,
925 ()
926 )
927
928 DEF_MACRO(
929 fEA_REG, /* Calculate EA with REGISTER */
930 EA=REG,
931 ()
932 )
933
934 DEF_MACRO(
935 fEA_BREVR, /* Calculate EA with bit reversed bottom of REGISTER */
936 EA=fbrev(REG),
937 ()
938 )
939
940 DEF_MACRO(
941 fEA_GPI, /* Calculate EA with Global Pointer + Immediate */
942 do { EA=fREAD_GP()+IMM; fGP_DOCHKPAGECROSS(fREAD_GP(),EA); } while (0),
943 ()
944 )
945
946 DEF_MACRO(
947 fPM_I, /* Post Modify Register by Immediate*/
948 do { REG = REG + IMM; } while (0),
949 ()
950 )
951
952 DEF_MACRO(
953 fPM_M, /* Post Modify Register by M register */
954 do { REG = REG + MVAL; } while (0),
955 ()
956 )
957
958 DEF_MACRO(
959 fPM_CIRI, /* Post Modify Register using Circular arithmetic by Immediate */
960 do { fcirc_add(REG,siV,MuV); } while (0),
961 ()
962 )
963
964 DEF_MACRO(
965 fPM_CIRR, /* Post Modify Register using Circular arithmetic by register */
966 do { fcirc_add(REG,VAL,MuV); } while (0),
967 ()
968 )
969
970
971
972 DEF_MACRO(
973 fSCALE, /* scale by N */
974 (((size8s_t)(A))<<N),
975 /* optional attributes */
976 )
977 DEF_MACRO(
978 fVSATW, /* saturating to 32-bits*/
979 fVSATN(32,((long long)A)),
980 ()
981 )
982
983 DEF_MACRO(
984 fSATW, /* saturating to 32-bits*/
985 fSATN(32,((long long)A)),
986 ()
987 )
988
989 DEF_MACRO(
990 fVSAT, /* saturating to 32-bits*/
991 fVSATN(32,(A)),
992 ()
993 )
994
995 DEF_MACRO(
996 fSAT, /* saturating to 32-bits*/
997 fSATN(32,(A)),
998 ()
999 )
1000
1001 DEF_MACRO(
1002 fSAT_ORIG_SHL, /* Saturating to 32-bits, with original value, for shift left */
1003 ((((size4s_t)((fSAT(A)) ^ ((size4s_t)(ORIG_REG)))) < 0) ?
1004 fSATVALN(32,((size4s_t)(ORIG_REG))) :
1005 ((((ORIG_REG) > 0) && ((A) == 0)) ?
1006 fSATVALN(32,(ORIG_REG)) :
1007 fSAT(A))),
1008 ()
1009 )
1010
1011 DEF_MACRO(
1012 fPASS,
1013 A,
1014 )
1015
1016 DEF_MACRO(
1017 fRND, /* saturating to 32-bits*/
1018 (((A)+1)>>1),
1019 )
1020
1021
1022 DEF_MACRO(
1023 fBIDIR_SHIFTL,
1024 (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) >> ((-(SHAMT))-1)) >>1) : (fCAST##REGSTYPE(SRC) << (SHAMT))),
1025 ()
1026 )
1027
1028 DEF_MACRO(
1029 fBIDIR_ASHIFTL,
1030 fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##s),
1031 ()
1032 )
1033
1034 DEF_MACRO(
1035 fBIDIR_LSHIFTL,
1036 fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##u),
1037 ()
1038 )
1039
1040 DEF_MACRO(
1041 fBIDIR_ASHIFTL_SAT,
1042 (((SHAMT) < 0) ? ((fCAST##REGSTYPE##s(SRC) >> ((-(SHAMT))-1)) >>1) : fSAT_ORIG_SHL(fCAST##REGSTYPE##s(SRC) << (SHAMT),(SRC))),
1043 ()
1044 )
1045
1046
1047 DEF_MACRO(
1048 fBIDIR_SHIFTR,
1049 (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) << ((-(SHAMT))-1)) << 1) : (fCAST##REGSTYPE(SRC) >> (SHAMT))),
1050 ()
1051 )
1052
1053 DEF_MACRO(
1054 fBIDIR_ASHIFTR,
1055 fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##s),
1056 ()
1057 )
1058
1059 DEF_MACRO(
1060 fBIDIR_LSHIFTR,
1061 fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##u),
1062 ()
1063 )
1064
1065 DEF_MACRO(
1066 fBIDIR_ASHIFTR_SAT,
1067 (((SHAMT) < 0) ? fSAT_ORIG_SHL((fCAST##REGSTYPE##s(SRC) << ((-(SHAMT))-1)) << 1,(SRC)) : (fCAST##REGSTYPE##s(SRC) >> (SHAMT))),
1068 ()
1069 )
1070
1071 DEF_MACRO(
1072 fASHIFTR,
1073 (fCAST##REGSTYPE##s(SRC) >> (SHAMT)),
1074 /* */
1075 )
1076
1077 DEF_MACRO(
1078 fLSHIFTR,
1079 (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##u(SRC) >> (SHAMT))),
1080 /* */
1081 )
1082
1083 DEF_MACRO(
1084 fROTL,
1085 (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) << (SHAMT)) | \
1086 ((fCAST##REGSTYPE##u(SRC) >> ((sizeof(SRC)*8)-(SHAMT)))))),
1087 /* */
1088 )
1089
1090 DEF_MACRO(
1091 fROTR,
1092 (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) >> (SHAMT)) | \
1093 ((fCAST##REGSTYPE##u(SRC) << ((sizeof(SRC)*8)-(SHAMT)))))),
1094 /* */
1095 )
1096
1097 DEF_MACRO(
1098 fASHIFTL,
1099 (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##s(SRC) << (SHAMT))),
1100 /* */
1101 )
1102
1103 /*************************************/
1104 /* Floating-Point Support */
1105 /************************************/
1106
1107 DEF_MACRO(
1108 fFLOAT, /* name */
1109 ({ union { float f; size4u_t i; } _fipun; _fipun.i = (A); _fipun.f; }), /* behavior */
1110 (A_FPOP)
1111 )
1112
1113 DEF_MACRO(
1114 fUNFLOAT, /* multiply half integer */
1115 ({ union { float f; size4u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFU : _fipun.i; }), /* behavior */
1116 (A_FPOP)
1117 )
1118
1119 DEF_MACRO(
1120 fSFNANVAL,
1121 0xffffffff,
1122 ()
1123 )
1124
1125 DEF_MACRO(
1126 fSFINFVAL,
1127 (((A) & 0x80000000) | 0x7f800000),
1128 ()
1129 )
1130
1131 DEF_MACRO(
1132 fSFONEVAL,
1133 (((A) & 0x80000000) | fUNFLOAT(1.0)),
1134 ()
1135 )
1136
1137 DEF_MACRO(
1138 fCHECKSFNAN,
1139 do {
1140 if (isnan(fFLOAT(A))) {
1141 if ((fGETBIT(22,A)) == 0) fRAISEFLAGS(FE_INVALID);
1142 DST = fSFNANVAL();
1143 }
1144 } while (0),
1145 ()
1146 )
1147
1148 DEF_MACRO(
1149 fCHECKSFNAN3,
1150 do {
1151 fCHECKSFNAN(DST,A);
1152 fCHECKSFNAN(DST,B);
1153 fCHECKSFNAN(DST,C);
1154 } while (0),
1155 ()
1156 )
1157
1158 DEF_MACRO(
1159 fSF_BIAS,
1160 127,
1161 ()
1162 )
1163
1164 DEF_MACRO(
1165 fSF_MANTBITS,
1166 23,
1167 ()
1168 )
1169
1170 DEF_MACRO(
1171 fSF_MUL_POW2,
1172 (fUNFLOAT(fFLOAT(A) * fFLOAT((fSF_BIAS() + (B)) << fSF_MANTBITS()))),
1173 ()
1174 )
1175
1176 DEF_MACRO(
1177 fSF_GETEXP,
1178 (((A) >> fSF_MANTBITS()) & 0xff),
1179 ()
1180 )
1181
1182 DEF_MACRO(
1183 fSF_MAXEXP,
1184 (254),
1185 ()
1186 )
1187
1188 DEF_MACRO(
1189 fSF_RECIP_COMMON,
1190 arch_sf_recip_common(&N,&D,&O,&A),
1191 (A_FPOP)
1192 )
1193
1194 DEF_MACRO(
1195 fSF_INVSQRT_COMMON,
1196 arch_sf_invsqrt_common(&N,&O,&A),
1197 (A_FPOP)
1198 )
1199
1200 DEF_MACRO(
1201 fFMAFX,
1202 internal_fmafx(A,B,C,fSXTN(8,64,ADJ)),
1203 ()
1204 )
1205
1206 DEF_MACRO(
1207 fFMAF,
1208 internal_fmafx(A,B,C,0),
1209 ()
1210 )
1211
1212 DEF_MACRO(
1213 fSFMPY,
1214 internal_mpyf(A,B),
1215 ()
1216 )
1217
1218 DEF_MACRO(
1219 fMAKESF,
1220 ((((SIGN) & 1) << 31) | (((EXP) & 0xff) << fSF_MANTBITS()) |
1221 ((MANT) & ((1<<fSF_MANTBITS())-1))),
1222 ()
1223 )
1224
1225
1226 DEF_MACRO(
1227 fDOUBLE, /* multiply half integer */
1228 ({ union { double f; size8u_t i; } _fipun; _fipun.i = (A); _fipun.f; }), /* behavior */
1229 (A_FPOP)
1230 )
1231
1232 DEF_MACRO(
1233 fUNDOUBLE, /* multiply half integer */
1234 ({ union { double f; size8u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFFFFFFFFFULL : _fipun.i; }), /* behavior */
1235 (A_FPOP)
1236 )
1237
1238 DEF_MACRO(
1239 fDFNANVAL,
1240 0xffffffffffffffffULL,
1241 ()
1242 )
1243
1244 DEF_MACRO(
1245 fDF_ISNORMAL,
1246 (fpclassify(fDOUBLE(X)) == FP_NORMAL),
1247 ()
1248 )
1249
1250 DEF_MACRO(
1251 fDF_ISDENORM,
1252 (fpclassify(fDOUBLE(X)) == FP_SUBNORMAL),
1253 ()
1254 )
1255
1256 DEF_MACRO(
1257 fDF_ISBIG,
1258 (fDF_GETEXP(X) >= 512),
1259 ()
1260 )
1261
1262 DEF_MACRO(
1263 fDF_MANTBITS,
1264 52,
1265 ()
1266 )
1267
1268 DEF_MACRO(
1269 fDF_GETEXP,
1270 (((A) >> fDF_MANTBITS()) & 0x7ff),
1271 ()
1272 )
1273
1274 DEF_MACRO(
1275 fFMA,
1276 internal_fma(A,B,C),
1277 /* nothing */
1278 )
1279
1280 DEF_MACRO(
1281 fDF_MPY_HH,
1282 internal_mpyhh(A,B,ACC),
1283 /* nothing */
1284 )
1285
1286 DEF_MACRO(
1287 fFPOP_START,
1288 arch_fpop_start(thread),
1289 /* nothing */
1290 )
1291
1292 DEF_MACRO(
1293 fFPOP_END,
1294 arch_fpop_end(thread),
1295 /* nothing */
1296 )
1297
1298 DEF_MACRO(
1299 fFPSETROUND_NEAREST,
1300 fesetround(FE_TONEAREST),
1301 /* nothing */
1302 )
1303
1304 DEF_MACRO(
1305 fFPSETROUND_CHOP,
1306 fesetround(FE_TOWARDZERO),
1307 /* nothing */
1308 )
1309
1310 DEF_MACRO(
1311 fFPCANCELFLAGS,
1312 feclearexcept(FE_ALL_EXCEPT),
1313 /* nothing */
1314 )
1315
1316 DEF_MACRO(
1317 fISINFPROD,
1318 ((isinf(A) && isinf(B)) ||
1319 (isinf(A) && isfinite(B) && ((B) != 0.0)) ||
1320 (isinf(B) && isfinite(A) && ((A) != 0.0))),
1321 /* nothing */
1322 )
1323
1324 DEF_MACRO(
1325 fISZEROPROD,
1326 ((((A) == 0.0) && isfinite(B)) || (((B) == 0.0) && isfinite(A))),
1327 /* nothing */
1328 )
1329
1330 DEF_MACRO(
1331 fRAISEFLAGS,
1332 arch_raise_fpflag(A),
1333 /* NOTHING */
1334 )
1335
1336 DEF_MACRO(
1337 fDF_MAX,
1338 (((A)==(B))
1339 ? fDOUBLE(fUNDOUBLE(A) & fUNDOUBLE(B))
1340 : fmax(A,B)),
1341 (A_FPOP)
1342 )
1343
1344 DEF_MACRO(
1345 fDF_MIN,
1346 (((A)==(B))
1347 ? fDOUBLE(fUNDOUBLE(A) | fUNDOUBLE(B))
1348 : fmin(A,B)),
1349 (A_FPOP)
1350 )
1351
1352 DEF_MACRO(
1353 fSF_MAX,
1354 (((A)==(B))
1355 ? fFLOAT(fUNFLOAT(A) & fUNFLOAT(B))
1356 : fmaxf(A,B)),
1357 (A_FPOP)
1358 )
1359
1360 DEF_MACRO(
1361 fSF_MIN,
1362 (((A)==(B))
1363 ? fFLOAT(fUNFLOAT(A) | fUNFLOAT(B))
1364 : fminf(A,B)),
1365 (A_FPOP)
1366 )
1367
1368 /*************************************/
1369 /* Load/Store support */
1370 /*************************************/
1371
1372 DEF_MACRO(fLOAD,
1373 { DST = (size##SIZE##SIGN##_t)MEM_LOAD##SIZE(thread,EA,insn); },
1374 (A_LOAD,A_MEMLIKE)
1375 )
1376
1377 DEF_MACRO(fMEMOP,
1378 { memop##SIZE##_##FNTYPE(thread,EA,VALUE); },
1379 (A_LOAD,A_STORE,A_MEMLIKE)
1380 )
1381
1382 DEF_MACRO(fGET_FRAMEKEY,
1383 READ_RREG(REG_FRAMEKEY),
1384 ()
1385 )
1386
1387 DEF_MACRO(fFRAME_SCRAMBLE,
1388 ((VAL) ^ (fCAST8u(fGET_FRAMEKEY()) << 32)),
1389 /* ATTRIBS */
1390 )
1391
1392 DEF_MACRO(fFRAME_UNSCRAMBLE,
1393 fFRAME_SCRAMBLE(VAL),
1394 /* ATTRIBS */
1395 )
1396
1397 DEF_MACRO(fFRAMECHECK,
1398 sys_check_framelimit(thread,ADDR,EA),
1399 ()
1400 )
1401
1402 DEF_MACRO(fLOAD_LOCKED,
1403 { DST = (size##SIZE##SIGN##_t)mem_load_locked(thread,EA,SIZE,insn); },
1404 (A_LOAD,A_MEMLIKE)
1405 )
1406
1407 DEF_MACRO(fSTORE,
1408 { MEM_STORE##SIZE(thread,EA,SRC,insn); },
1409 (A_STORE,A_MEMLIKE)
1410 )
1411
1412
1413 DEF_MACRO(fSTORE_LOCKED,
1414 { PRED = (mem_store_conditional(thread,EA,SRC,SIZE,insn) ? 0xff : 0); },
1415 (A_STORE,A_MEMLIKE)
1416 )
1417
1418 /*************************************/
1419 /* Functions to help with bytes */
1420 /*************************************/
1421
1422 DEF_MACRO(fGETBYTE,
1423 ((size1s_t)((SRC>>((N)*8))&0xff)),
1424 /* nothing */
1425 )
1426
1427 DEF_MACRO(fGETUBYTE,
1428 ((size1u_t)((SRC>>((N)*8))&0xff)),
1429 /* nothing */
1430 )
1431
1432 DEF_MACRO(fSETBYTE,
1433 {
1434 DST = (DST & ~(0x0ffLL<<((N)*8))) | (((size8u_t)((VAL) & 0x0ffLL)) << ((N)*8));
1435 },
1436 /* nothing */
1437 )
1438
1439 DEF_MACRO(fGETHALF,
1440 ((size2s_t)((SRC>>((N)*16))&0xffff)),
1441 /* nothing */
1442 )
1443
1444 DEF_MACRO(fGETUHALF,
1445 ((size2u_t)((SRC>>((N)*16))&0xffff)),
1446 /* nothing */
1447 )
1448
1449 DEF_MACRO(fSETHALF,
1450 {
1451 DST = (DST & ~(0x0ffffLL<<((N)*16))) | (((size8u_t)((VAL) & 0x0ffff)) << ((N)*16));
1452 },
1453 /* nothing */
1454 )
1455
1456
1457
1458 DEF_MACRO(fGETWORD,
1459 ((size8s_t)((size4s_t)((SRC>>((N)*32))&0x0ffffffffLL))),
1460 /* nothing */
1461 )
1462
1463 DEF_MACRO(fGETUWORD,
1464 ((size8u_t)((size4u_t)((SRC>>((N)*32))&0x0ffffffffLL))),
1465 /* nothing */
1466 )
1467
1468 DEF_MACRO(fSETWORD,
1469 {
1470 DST = (DST & ~(0x0ffffffffLL<<((N)*32))) | (((VAL) & 0x0ffffffffLL) << ((N)*32));
1471 },
1472 /* nothing */
1473 )
1474
1475 DEF_MACRO(fSETBIT,
1476 {
1477 DST = (DST & ~(1ULL<<(N))) | (((size8u_t)(VAL))<<(N));
1478 },
1479 /* nothing */
1480 )
1481
1482 DEF_MACRO(fGETBIT,
1483 (((SRC)>>N)&1),
1484 /* nothing */
1485 )
1486
1487
1488 DEF_MACRO(fSETBITS,
1489 do {
1490 int j;
1491 for (j=LO;j<=HI;j++) {
1492 fSETBIT(j,DST,VAL);
1493 }
1494 } while (0),
1495 /* nothing */
1496 )
1497
1498 /*************************************/
1499 /* Used for parity, etc........ */
1500 /*************************************/
1501 DEF_MACRO(fCOUNTONES_2,
1502 count_ones_2(VAL),
1503 /* nothing */
1504 )
1505
1506 DEF_MACRO(fCOUNTONES_4,
1507 count_ones_4(VAL),
1508 /* nothing */
1509 )
1510
1511 DEF_MACRO(fCOUNTONES_8,
1512 count_ones_8(VAL),
1513 /* nothing */
1514 )
1515
1516 DEF_MACRO(fBREV_8,
1517 reverse_bits_8(VAL),
1518 /* nothing */
1519 )
1520
1521 DEF_MACRO(fBREV_4,
1522 reverse_bits_4(VAL),
1523 /* nothing */
1524 )
1525
1526 DEF_MACRO(fCL1_8,
1527 count_leading_ones_8(VAL),
1528 /* nothing */
1529 )
1530
1531 DEF_MACRO(fCL1_4,
1532 count_leading_ones_4(VAL),
1533 /* nothing */
1534 )
1535
1536 DEF_MACRO(fCL1_2,
1537 count_leading_ones_2(VAL),
1538 /* nothing */
1539 )
1540
1541 DEF_MACRO(fINTERLEAVE,
1542 interleave(ODD,EVEN),
1543 /* nothing */
1544 )
1545
1546 DEF_MACRO(fDEINTERLEAVE,
1547 deinterleave(MIXED),
1548 /* nothing */
1549 )
1550
1551 DEF_MACRO(fHIDE,
1552 A,
1553 ()
1554 )
1555
1556 DEF_MACRO(fCONSTLL,
1557 A##LL,
1558 )
1559
1560 /* Do the things in the parens, but don't print the parens. */
1561 DEF_MACRO(fECHO,
1562 (A),
1563 /* nothing */
1564 )
1565
1566
1567 /********************************************/
1568 /* OS interface and stop/wait */
1569 /********************************************/
1570
1571 DEF_MACRO(RUNNABLE_THREADS_MAX,
1572 /* */,
1573 ()
1574 )
1575
1576 DEF_MACRO(THREAD_IS_ON,
1577 ((PROC->arch_proc_options->thread_enable_mask>>TNUM) & 0x1),
1578 ()
1579 )
1580
1581 DEF_MACRO(THREAD_EN_MASK,
1582 ((PROC->arch_proc_options->thread_enable_mask)),
1583 ()
1584 )
1585
1586
1587
1588 DEF_MACRO(READ_IMASK,
1589 /* */,
1590 ()
1591 )
1592 DEF_MACRO(WRITE_IMASK,
1593 /* */,
1594 (A_IMPLICIT_WRITES_IMASK_ANYTHREAD)
1595 )
1596
1597
1598 DEF_MACRO(WRITE_PRIO,
1599 /* */,
1600 (A_IMPLICIT_WRITES_STID_PRIO_ANYTHREAD)
1601 )
1602
1603
1604 DEF_MACRO(DO_IASSIGNW,
1605 /* */,
1606 (A_IMPLICIT_WRITES_IMASK_ANYTHREAD)
1607 )
1608
1609
1610
1611
1612 DEF_MACRO(fDO_NMI,
1613 /* */,
1614 )
1615
1616 DEF_MACRO(fDO_TRACE,
1617 /* */,
1618 )
1619
1620 DEF_MACRO(DO_IASSIGNR,
1621 /* */,
1622 ()
1623 )
1624
1625 DEF_MACRO(DO_SWI,
1626 /* */,
1627 (A_EXCEPTION_SWI)
1628 )
1629
1630 DEF_MACRO(DO_CSWI,
1631 LOG_GLOBAL_REG_WRITE(REG_IPEND,GLOBAL_REG_READ(REG_IPEND) & ~((REG) & GLOBAL_REG_READ(REG_IEL)));,
1632 ()
1633 )
1634
1635 DEF_MACRO(DO_CIAD,
1636 sys_ciad(thread,VAL); LOG_GLOBAL_REG_WRITE(REG_IAD,GLOBAL_REG_READ(REG_IAD) & ~(VAL));,
1637 (A_EXCEPTION_SWI)
1638 )
1639
1640 DEF_MACRO(DO_SIAD,
1641 sys_siad(thread,VAL); LOG_GLOBAL_REG_WRITE(REG_IAD,GLOBAL_REG_READ(REG_IAD) | (VAL));,
1642 (A_EXCEPTION_SWI)
1643 )
1644
1645 DEF_MACRO(fBREAK,
1646 /* */,
1647 ()
1648 )
1649
1650 DEF_MACRO(fPAUSE,
1651 {sys_pause(thread, insn->slot, IMM);},
1652 ()
1653 )
1654
1655
1656 DEF_MACRO(fTRAP,
1657 /* */,
1658 (A_EXCEPTION_SWI)
1659 )
1660
1661 DEF_MACRO(fCLEAR_RTE_EX,
1662 /* */,
1663 ()
1664 )
1665
1666 DEF_MACRO(fTLB_LOCK_AVAILABLE,
1667 (fREAD_GLOBAL_REG_FIELD(SYSCONF,SYSCFG_TLBLOCK) == 0),
1668 ()
1669 )
1670
1671 DEF_MACRO(fK0_LOCK_AVAILABLE,
1672 (fREAD_GLOBAL_REG_FIELD(SYSCONF,SYSCFG_K0LOCK) == 0),
1673 ()
1674 )
1675
1676 DEF_MACRO(fSET_TLB_LOCK,
1677 {
1678 if (fTLB_LOCK_AVAILABLE()) {
1679 fLOG_GLOBAL_REG_FIELD(SYSCONF,SYSCFG_TLBLOCK,1);
1680 } else {
1681 sys_waiting_for_tlb_lock(thread);
1682 }
1683 },
1684 ()
1685 )
1686
1687 DEF_MACRO(fSET_K0_LOCK,
1688 /* */,
1689 ()
1690 )
1691
1692 DEF_MACRO(fCLEAR_TLB_LOCK,
1693 /* */,
1694 ()
1695 )
1696
1697 DEF_MACRO(fCLEAR_K0_LOCK,
1698 /* */,
1699 ()
1700 )
1701
1702 DEF_MACRO(fALIGN_REG_FIELD_VALUE,
1703 ((VAL)<<reg_field_info[FIELD].offset),
1704 /* */
1705 )
1706
1707 DEF_MACRO(fGET_REG_FIELD_MASK,
1708 (((1<<reg_field_info[FIELD].width)-1)<<reg_field_info[FIELD].offset),
1709 /* */
1710 )
1711
1712 DEF_MACRO(fLOG_REG_FIELD,
1713 LOG_MASKED_REG_WRITE(thread,REG_##REG,
1714 fALIGN_REG_FIELD_VALUE(FIELD,VAL),
1715 fGET_REG_FIELD_MASK(FIELD)),
1716 ()
1717 )
1718
1719 DEF_MACRO(fWRITE_GLOBAL_REG_FIELD,
1720 /* */,
1721 )
1722
1723 DEF_MACRO(fLOG_GLOBAL_REG_FIELD,
1724 LOG_MASKED_GLOBAL_REG_WRITE(REG_##REG,
1725 fALIGN_REG_FIELD_VALUE(FIELD,VAL),
1726 fGET_REG_FIELD_MASK(FIELD)),
1727 ()
1728 )
1729
1730 DEF_MACRO(fREAD_REG_FIELD,
1731 fEXTRACTU_BITS(thread->Regs[REG_##REG],
1732 reg_field_info[FIELD].width,
1733 reg_field_info[FIELD].offset),
1734 /* ATTRIBS */
1735 )
1736
1737 DEF_MACRO(fREAD_GLOBAL_REG_FIELD,
1738 /* */,
1739 /* ATTRIBS */
1740 )
1741
1742 DEF_MACRO(fGET_FIELD,
1743 fEXTRACTU_BITS(VAL,
1744 reg_field_info[FIELD].width,
1745 reg_field_info[FIELD].offset),
1746 /* ATTRIBS */
1747 )
1748
1749 DEF_MACRO(fSET_FIELD,
1750 fINSERT_BITS(VAL,
1751 reg_field_info[FIELD].width,
1752 reg_field_info[FIELD].offset,
1753 (NEWVAL)),
1754 /* ATTRIBS */
1755 )
1756
1757 DEF_MACRO(fSET_RUN_MODE_NOW,
1758 /* */,
1759 )
1760
1761 DEF_MACRO(fIN_DEBUG_MODE,
1762 (thread->debug_mode || (fREAD_GLOBAL_REG_FIELD(ISDBST,ISDBST_DEBUGMODE) & 1<<TNUM)),
1763 ()
1764 )
1765 DEF_MACRO(fIN_DEBUG_MODE_NO_ISDB,
1766 (thread->debug_mode),
1767 ()
1768 )
1769
1770
1771 DEF_MACRO(fIN_DEBUG_MODE_WARN,
1772 {
1773 if (fREAD_GLOBAL_REG_FIELD(ISDBST,ISDBST_DEBUGMODE) & 1<<TNUM)
1774 warn("In ISDB debug mode, but TB told me to step normally");
1775 },
1776 ()
1777 )
1778
1779 DEF_MACRO(fCLEAR_RUN_MODE,
1780 {fLOG_GLOBAL_REG_FIELD(MODECTL,MODECTL_E,
1781 fREAD_GLOBAL_REG_FIELD(MODECTL,MODECTL_E) & ~(1<<(TNUM)))},
1782 /* NOTHING */
1783 )
1784
1785 DEF_MACRO(fCLEAR_RUN_MODE_NOW,
1786 /* */,
1787 /* NOTHING */
1788 )
1789
1790 DEF_MACRO(fGET_RUN_MODE,
1791 /* */,
1792 )
1793
1794 DEF_MACRO(fSET_WAIT_MODE,
1795 {fLOG_GLOBAL_REG_FIELD(MODECTL,MODECTL_W,
1796 fREAD_GLOBAL_REG_FIELD(MODECTL,MODECTL_W) | 1<<(TNUM))},
1797 /* NOTHING */
1798 )
1799
1800 DEF_MACRO(fCLEAR_WAIT_MODE,
1801 /* */,
1802 )
1803
1804 DEF_MACRO(fGET_WAIT_MODE,
1805 /* */,
1806 )
1807
1808
1809 DEF_MACRO(fRESET_THREAD,
1810 register_reset_interrupt(T,NUM),
1811 )
1812
1813 DEF_MACRO(fREAD_CURRENT_EVB,
1814 (GLOBAL_REG_READ(REG_EVB)),
1815 /* nothing */
1816 )
1817
1818 DEF_MACRO(fREAD_ELR,
1819 READ_RREG(REG_ELR),
1820 ()
1821 )
1822
1823 DEF_MACRO(fPOW2_HELP_ROUNDUP,
1824 ((VAL) | ((VAL) >> 1) | ((VAL) >> 2) | ((VAL) >> 4) | ((VAL) >> 8) | ((VAL) >> 16)),
1825 ()
1826 )
1827
1828 DEF_MACRO(fPOW2_ROUNDUP,
1829 fPOW2_HELP_ROUNDUP((VAL)-1)+1,
1830 ()
1831 )
1832
1833 DEF_MACRO(fTLB_IDXMASK,
1834 /* */,
1835 ()
1836 )
1837
1838 DEF_MACRO(fTLB_NONPOW2WRAP,
1839 /* */,
1840 /* ATTRIBS */
1841 )
1842
1843 DEF_MACRO(fTLBW,
1844 /* */,
1845 /* ATTRIBS */
1846 )
1847
1848 DEF_MACRO(fTLB_ENTRY_OVERLAP,
1849 fHIDE( (sys_check_overlap(thread,VALUE)!=-2) ),
1850 /* ATTRIBS */
1851 )
1852
1853 DEF_MACRO(fTLB_ENTRY_OVERLAP_IDX,
1854 fHIDE(sys_check_overlap(thread,VALUE)),
1855 /* ATTRIBS */
1856 )
1857
1858
1859 DEF_MACRO(fTLBR,
1860 TLB_REG_READ(fTLB_NONPOW2WRAP(fTLB_IDXMASK(INDEX))),
1861 /* ATTRIBS */
1862 )
1863
1864 DEF_MACRO(fTLBP,
1865 tlb_lookup(thread,((TLBHI)>>12),((TLBHI)<<12),1),
1866 /* attribs */
1867 )
1868
1869
1870
1871 DEF_MACRO(READ_SGP0,
1872 READ_RREG(REG_SGP),
1873 ()
1874 )
1875
1876 DEF_MACRO(READ_SGP1,
1877 READ_RREG(REG_SGP+1),
1878 ()
1879 )
1880
1881 DEF_MACRO(READ_SGP10,
1882 READ_RREG_PAIR(REG_SGP),
1883 ()
1884 )
1885
1886 DEF_MACRO(READ_UGP,
1887 READ_RREG(REG_UGP),
1888 )
1889
1890 DEF_MACRO(WRITE_SGP0,
1891 WRITE_RREG(REG_SGP,VAL),
1892 (A_IMPLICIT_WRITES_SGP0)
1893 )
1894
1895 DEF_MACRO(WRITE_SGP1,
1896 WRITE_RREG(REG_SGP+1,VAL),
1897 (A_IMPLICIT_WRITES_SGP1)
1898 )
1899
1900 DEF_MACRO(WRITE_SGP10,
1901 WRITE_RREG_PAIR(REG_SGP,VAL),
1902 (A_IMPLICIT_WRITES_SGP0,A_IMPLICIT_WRITES_SGP1)
1903 )
1904
1905 DEF_MACRO(WRITE_UGP,
1906 WRITE_RREG(REG_UGP,VAL),
1907 )
1908
1909 DEF_MACRO(fSTART,
1910 /* */,
1911 ()
1912 )
1913
1914 DEF_MACRO(fRESUME,
1915 fLOG_GLOBAL_REG_FIELD(MODECTL,MODECTL_W,
1916 fREAD_GLOBAL_REG_FIELD(MODECTL,MODECTL_W) & (~(REG))),
1917 ()
1918 )
1919
1920 DEF_MACRO(fGET_TNUM,
1921 thread->threadId,
1922 ()
1923 )
1924
1925 /********************************************/
1926 /* Cache Management */
1927 /********************************************/
1928
1929 DEF_MACRO(fBARRIER,
1930 {
1931 sys_barrier(thread, insn->slot);
1932 },
1933 ()
1934 )
1935
1936 DEF_MACRO(fSYNCH,
1937 {
1938 sys_sync(thread, insn->slot);
1939 },
1940 ()
1941 )
1942
1943 DEF_MACRO(fISYNC,
1944 {
1945 sys_isync(thread, insn->slot);
1946 },
1947 ()
1948 )
1949
1950
1951 DEF_MACRO(fICFETCH,
1952 ,
1953 ()
1954 )
1955
1956 DEF_MACRO(fDCFETCH,
1957 sys_dcfetch(thread, (REG), insn->slot),
1958 (A_MEMLIKE)
1959 )
1960
1961 DEF_MACRO(fICINVA,
1962 /* */,
1963 (A_ICINVA)
1964 )
1965
1966 DEF_MACRO(fDCTAGR,
1967 ({DST=sys_dctagr(thread, INDEX, insn->slot,DSTREGNO);})/* FIXME */,
1968 ()
1969 )
1970
1971 DEF_MACRO(fDCTAGW,
1972 (sys_dctagw(thread, INDEX, PART2, insn->slot)),
1973 ()
1974 )
1975 DEF_MACRO(fICTAGR,
1976 ({DST=sys_ictagr(thread, INDEX, insn->slot,REGNO);}),
1977 ()
1978 )
1979
1980 DEF_MACRO(fICDATAR,
1981 ({DST=sys_icdatar(thread, INDEX, insn->slot);}),
1982 ()
1983 )
1984
1985 DEF_MACRO(fICTAGW,
1986 (sys_ictagw(thread, INDEX, PART2, insn->slot)),
1987 ()
1988 )
1989 DEF_MACRO(fICDATAW,
1990 ({ fHIDE(); }),
1991 ()
1992 )
1993
1994 DEF_MACRO(fL2FETCH,
1995 sys_l2fetch(thread, ADDR,HEIGHT,WIDTH,STRIDE,FLAGS, insn->slot),
1996 (A_MEMLIKE,A_L2FETCH)
1997 )
1998
1999 DEF_MACRO(fDCCLEANA,
2000 sys_dccleana(thread, (REG)),
2001 (A_MEMLIKE)
2002 )
2003
2004 DEF_MACRO(fDCCLEANINVA,
2005 sys_dccleaninva(thread, (REG), insn->slot),
2006 (A_MEMLIKE,A_DCCLEANINVA)
2007 )
2008
2009 DEF_MACRO(fDCZEROA,
2010 sys_dczeroa(thread, (REG)),
2011 (A_MEMLIKE)
2012 )
2013
2014 DEF_MACRO(fDCINVA,
2015 sys_dcinva(thread, (REG)),
2016 (A_MEMLIKE)
2017 )
2018
2019
2020 DEF_MACRO(fCHECKFORPRIV,
2021 {sys_check_privs(thread); if (EXCEPTION_DETECTED) return; },
2022 ()
2023 )
2024
2025 DEF_MACRO(fCHECKFORGUEST,
2026 {sys_check_guest(thread); if (EXCEPTION_DETECTED) return; },
2027 ()
2028 )
2029
2030 DEF_MACRO(fTAKEN_INTERRUPT_EDGECLEAR,
2031 { proc->global_regs[REG_IPEND] &= ~(INT_NUMTOMASK(intnum) & proc->global_regs[REG_IEL]); },
2032 ()
2033 )
2034
2035 DEF_MACRO(fSET_IAD,
2036 /* */,
2037 ()
2038 )
2039
2040 DEF_MACRO(fBRANCH_SPECULATE_STALL,
2041 {
2042 sys_speculate_branch_stall(thread, insn->slot, JUMP_COND(JUMP_PRED_SET),
2043 SPEC_DIR,
2044 DOTNEWVAL,
2045 HINTBITNUM,
2046 STRBITNUM,
2047 0,
2048 thread->last_pkt->pkt_has_dual_jump,
2049 insn->is_2nd_jump,
2050 (thread->fetch_access.vaddr + insn->encoding_offset*4));
2051 },
2052 ()
2053 )
2054
2055 DEF_MACRO(IV1DEAD,
2056 ,
2057 ()
2058 )
2059
2060 DEF_MACRO(fIN_MONITOR_MODE,
2061 sys_in_monitor_mode(thread),
2062 ()
2063 )
2064
2065 DEF_MACRO(fIN_USER_MODE,
2066 sys_in_user_mode(thread),
2067 ()
2068 )
2069
2070 DEF_MACRO(fIN_GUEST_MODE,
2071 sys_in_guest_mode(thread),
2072 ()
2073 )
2074
2075 DEF_MACRO(fGRE_ENABLED,
2076 fREAD_REG_FIELD(CCR,CCR_GRE),
2077 ()
2078 )
2079
2080 DEF_MACRO(fGTE_ENABLED,
2081 fREAD_REG_FIELD(CCR,CCR_GRE),
2082 ()
2083 )
2084
2085 DEF_MACRO(fTRAP1_VIRTINSN,
2086 ((fIN_GUEST_MODE())
2087 && (fGRE_ENABLED())
2088 && ( ((IMM) == 1)
2089 || ((IMM) == 3)
2090 || ((IMM) == 4)
2091 || ((IMM) == 6))),
2092 ()
2093 )
2094
2095 DEF_MACRO(fVIRTINSN_RTE,
2096 do {
2097 thread->trap1_info = TRAP1_VIRTINSN_RTE;
2098 fLOG_REG_FIELD(SSR,SSR_SS,fREAD_REG_FIELD(GSR,GSR_SS));
2099 fLOG_REG_FIELD(CCR,CCR_GIE,fREAD_REG_FIELD(GSR,GSR_IE));
2100 fLOG_REG_FIELD(SSR,SSR_GM,!fREAD_REG_FIELD(GSR,GSR_UM));
2101 fBRANCH((fREAD_GELR() & -4),COF_TYPE_RTE);
2102 fINTERNAL_CLEAR_SAMEPAGE();
2103 } while (0),
2104 (A_IMPLICIT_WRITES_CCR,A_IMPLICIT_WRITES_SSR)
2105 )
2106
2107 DEF_MACRO(fVIRTINSN_SETIE,
2108 do {
2109 fLOG_REG_FIELD(CCR,CCR_GIE,(REG) & 1);
2110 REG = fREAD_REG_FIELD(CCR,CCR_GIE);
2111 thread->trap1_info = TRAP1_VIRTINSN_SETIE;
2112 } while (0),
2113 (A_IMPLICIT_WRITES_CCR)
2114 )
2115
2116 DEF_MACRO(fVIRTINSN_GETIE,
2117 {
2118 thread->trap1_info = TRAP1_VIRTINSN_GETIE;
2119 REG = fREAD_REG_FIELD(CCR,CCR_GIE);
2120 },
2121 ()
2122 )
2123
2124 DEF_MACRO(fVIRTINSN_SPSWAP,
2125 do {
2126 if (fREAD_REG_FIELD(GSR,GSR_UM)) {
2127 size4u_t TEMP = REG;
2128 REG = fREAD_GOSP();
2129 fWRITE_GOSP(TEMP);
2130 thread->trap1_info = TRAP1_VIRTINSN_SPSWAP;
2131 }
2132 } while (0),
2133 (A_IMPLICIT_WRITES_GOSP)
2134 )