cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

macros.def (29813B)


      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
     18DEF_MACRO(
     19    LIKELY,    /* NAME */
     20    __builtin_expect((X),1), /* BEH */
     21    ()    /* attribs */
     22)
     23
     24DEF_MACRO(
     25    UNLIKELY,    /* NAME */
     26    __builtin_expect((X),0), /* BEH */
     27    ()    /* attribs */
     28)
     29
     30DEF_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
     36DEF_MACRO(
     37    LOAD_CANCEL, /* macro name */
     38    {mem_general_load_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
     39    (A_CONDEXEC)
     40)
     41
     42DEF_MACRO(
     43    STORE_CANCEL, /* macro name */
     44    {mem_general_store_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
     45    (A_CONDEXEC)
     46)
     47
     48DEF_MACRO(
     49    fMAX, /* macro name */
     50    (((A) > (B)) ? (A) : (B)), /* behavior */
     51    /* optional attributes */
     52)
     53
     54DEF_MACRO(
     55    fMIN, /* macro name */
     56    (((A) < (B)) ? (A) : (B)), /* behavior */
     57    /* optional attributes */
     58)
     59
     60DEF_MACRO(
     61    fABS, /* macro name */
     62    (((A)<0)?(-(A)):(A)), /* behavior */
     63    /* optional attributes */
     64)
     65
     66
     67/* Bit insert */
     68DEF_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 */
     77DEF_MACRO(
     78    fEXTRACTU_BITS,
     79    (fZXTN(WIDTH,32,(INREG >> OFFSET))),
     80    /* attribs */
     81)
     82
     83DEF_MACRO(
     84    fEXTRACTU_BIDIR,
     85    (fZXTN(WIDTH,32,fBIDIR_LSHIFTR((INREG),(OFFSET),4_8))),
     86    /* attribs */
     87)
     88
     89DEF_MACRO(
     90    fEXTRACTU_RANGE,
     91    (fZXTN((HIBIT-LOWBIT+1),32,(INREG >> LOWBIT))),
     92    /* attribs */
     93)
     94
     95
     96DEF_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
    110DEF_MACRO(
    111    f8BITSOF,
    112    ( (VAL) ? 0xff : 0x00),
    113    /* attribs */
    114)
    115
    116DEF_MACRO(
    117    fLSBOLD,
    118    ((VAL) & 1),
    119    ()
    120)
    121
    122DEF_MACRO(
    123    fLSBNEW,
    124    predlog_read(thread,PNUM),
    125    ()
    126)
    127
    128DEF_MACRO(
    129    fLSBNEW0,
    130    predlog_read(thread,0),
    131    ()
    132)
    133
    134DEF_MACRO(
    135    fLSBNEW1,
    136    predlog_read(thread,1),
    137    ()
    138)
    139
    140DEF_MACRO(
    141    fLSBOLDNOT,
    142    (!fLSBOLD(VAL)),
    143    ()
    144)
    145
    146DEF_MACRO(
    147    fLSBNEWNOT,
    148    (!fLSBNEW(PNUM)),
    149    ()
    150)
    151
    152DEF_MACRO(
    153    fLSBNEW0NOT,
    154    (!fLSBNEW0),
    155    ()
    156)
    157
    158DEF_MACRO(
    159    fLSBNEW1NOT,
    160    (!fLSBNEW1),
    161    ()
    162)
    163
    164DEF_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
    172DEF_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
    179DEF_MACRO(
    180    fSATUVALN,
    181    ({fSET_OVERFLOW(); ((VAL) < 0) ? 0 : ((1LL<<(N))-1);}),
    182    ()
    183)
    184
    185DEF_MACRO(
    186    fSATVALN,
    187    ({fSET_OVERFLOW(); ((VAL) < 0) ? (-(1LL<<((N)-1))) : ((1LL<<((N)-1))-1);}),
    188    ()
    189)
    190
    191DEF_MACRO(
    192    fZXTN, /* macro name */
    193    ((VAL) & ((1LL<<(N))-1)),
    194    /* attribs */
    195)
    196
    197DEF_MACRO(
    198    fSXTN, /* macro name */
    199    ((fZXTN(N,M,VAL) ^ (1LL<<((N)-1))) - (1LL<<((N)-1))),
    200    /* attribs */
    201)
    202
    203DEF_MACRO(
    204    fSATN,
    205    ((fSXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATVALN(N,VAL)),
    206    ()
    207)
    208
    209DEF_MACRO(
    210    fADDSAT64,
    211    {
    212        size8u_t __a = fCAST8u(A);
    213        size8u_t __b = fCAST8u(B);
    214        size8u_t __sum = __a + __b;
    215        size8u_t __xor = __a ^ __b;
    216        const size8u_t __mask = 0x8000000000000000ULL;
    217        if (__xor & __mask) {
    218            /* Opposite signs, OK */
    219            DST = __sum;
    220        } else if ((__a ^ __sum) & __mask) {
    221            /* Signs mismatch */
    222            if (__sum & __mask) {
    223                /* overflowed to negative, make max pos */
    224                DST=0x7FFFFFFFFFFFFFFFLL; fSET_OVERFLOW();
    225            } else {
    226                /* overflowed to positive, make max neg */
    227                DST=0x8000000000000000LL; fSET_OVERFLOW();
    228            }
    229        } else {
    230            /* signs did not mismatch, OK */
    231            DST = __sum;
    232        }
    233    },
    234    ()
    235)
    236
    237DEF_MACRO(
    238    fSATUN,
    239    ((fZXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATUVALN(N,VAL)),
    240    ()
    241)
    242
    243DEF_MACRO(
    244    fSATH,
    245    (fSATN(16,VAL)),
    246    ()
    247)
    248
    249
    250DEF_MACRO(
    251    fSATUH,
    252    (fSATUN(16,VAL)),
    253    ()
    254)
    255
    256DEF_MACRO(
    257    fSATUB,
    258    (fSATUN(8,VAL)),
    259    ()
    260)
    261DEF_MACRO(
    262    fSATB,
    263    (fSATN(8,VAL)),
    264    ()
    265)
    266
    267
    268/*************************************/
    269/* immediate extension               */
    270/*************************************/
    271
    272DEF_MACRO(
    273    fIMMEXT,
    274    (IMM = IMM),
    275    (A_EXTENDABLE)
    276)
    277
    278DEF_MACRO(
    279    fMUST_IMMEXT,
    280    fIMMEXT(IMM),
    281    (A_EXTENDABLE)
    282)
    283
    284DEF_MACRO(
    285    fPCALIGN,
    286    IMM=(IMM & ~PCALIGN_MASK),
    287    (A_EXTENDABLE)
    288)
    289
    290/*************************************/
    291/* Read and Write Implicit Regs      */
    292/*************************************/
    293
    294DEF_MACRO(
    295    fREAD_IREG, /* read modifier register */
    296    (fSXTN(11,64,(((VAL) & 0xf0000000)>>21) | ((VAL>>17)&0x7f) )),          /* behavior */
    297    ()
    298)
    299
    300DEF_MACRO(
    301    fREAD_LR, /* read link register */
    302    (READ_RREG(REG_LR)),          /* behavior */
    303    ()
    304)
    305
    306DEF_MACRO(
    307    fWRITE_LR, /* write lr */
    308    WRITE_RREG(REG_LR,A),          /* behavior */
    309    (A_IMPLICIT_WRITES_LR)
    310)
    311
    312DEF_MACRO(
    313    fWRITE_FP, /* write sp */
    314    WRITE_RREG(REG_FP,A),          /* behavior */
    315    (A_IMPLICIT_WRITES_FP)
    316)
    317
    318DEF_MACRO(
    319    fWRITE_SP, /* write sp */
    320    WRITE_RREG(REG_SP,A),          /* behavior */
    321    (A_IMPLICIT_WRITES_SP)
    322)
    323
    324DEF_MACRO(
    325    fREAD_SP, /* read stack pointer */
    326    (READ_RREG(REG_SP)),          /* behavior */
    327    ()
    328)
    329
    330DEF_MACRO(
    331    fREAD_CSREG, /* read  CS register */
    332    (READ_RREG(REG_CSA+N)),          /* behavior */
    333    ()
    334)
    335
    336DEF_MACRO(
    337    fREAD_LC0, /* read loop count */
    338    (READ_RREG(REG_LC0)),          /* behavior */
    339    ()
    340)
    341
    342DEF_MACRO(
    343    fREAD_LC1, /* read loop count */
    344    (READ_RREG(REG_LC1)),          /* behavior */
    345    ()
    346)
    347
    348DEF_MACRO(
    349    fREAD_SA0, /* read start addr */
    350    (READ_RREG(REG_SA0)),          /* behavior */
    351    ()
    352)
    353
    354DEF_MACRO(
    355    fREAD_SA1, /* read start addr */
    356    (READ_RREG(REG_SA1)),          /* behavior */
    357    ()
    358)
    359
    360
    361DEF_MACRO(
    362    fREAD_FP, /* read frame pointer */
    363    (READ_RREG(REG_FP)),          /* behavior */
    364    ()
    365)
    366
    367DEF_MACRO(
    368    fREAD_GP, /* read global pointer */
    369    (insn->extension_valid ? 0 : READ_RREG(REG_GP)),          /* behavior */
    370    ()
    371)
    372
    373DEF_MACRO(
    374    fREAD_PC, /* read PC */
    375    (READ_RREG(REG_PC)),          /* behavior */
    376    ()
    377)
    378
    379DEF_MACRO(
    380    fREAD_NPC, /* read next PC */
    381    (thread->next_PC & (0xfffffffe)),          /* behavior */
    382    ()
    383)
    384
    385DEF_MACRO(
    386    fREAD_P0, /* read Predicate 0 */
    387    (READ_PREG(0)),          /* behavior */
    388    ()
    389)
    390
    391DEF_MACRO(
    392    fREAD_P3, /* read Predicate 3 */
    393    (READ_PREG(3)),          /* behavior */
    394    ()
    395)
    396
    397DEF_MACRO(
    398    fCHECK_PCALIGN,
    399    if (((A) & PCALIGN_MASK)) {
    400        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);
    401    },
    402    ()
    403)
    404
    405DEF_MACRO(
    406    fWRITE_NPC, /* write next PC */
    407    if (!thread->branch_taken) {
    408        if (A != thread->next_PC) {
    409            thread->next_pkt_guess=thread->last_pkt->taken_ptr;
    410        }
    411        fCHECK_PCALIGN(A);
    412        thread->branched = 1; thread->branch_taken = 1; thread->next_PC = A; \
    413        thread->branch_offset = insn->encoding_offset; thread->branch_opcode = insn->opcode;
    414    },          /* behavior */
    415    (A_COF)
    416)
    417
    418DEF_MACRO(
    419    fBRANCH,
    420    fWRITE_NPC(LOC); fCOF_CALLBACK(LOC,TYPE),
    421    ()
    422)
    423
    424DEF_MACRO(
    425    fJUMPR,    /* A jumpr has executed */
    426    {fBRANCH(TARGET,COF_TYPE_JUMPR);},
    427    (A_INDIRECT)
    428)
    429
    430DEF_MACRO(
    431    fHINTJR,    /* A hintjr instruction has executed */
    432    { },
    433)
    434
    435DEF_MACRO(
    436    fCALL,    /* Do a call */
    437    if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALL);},
    438    (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
    439)
    440
    441DEF_MACRO(
    442    fCALLR,    /* Do a call Register */
    443    if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALLR);},
    444    (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
    445)
    446
    447DEF_MACRO(
    448    fWRITE_LOOP_REGS0, /* write ln,sa,ea,lc */
    449    {WRITE_RREG(REG_LC0,COUNT);
    450     WRITE_RREG(REG_SA0,START);},
    451    (A_IMPLICIT_WRITES_LC0,A_IMPLICIT_WRITES_SA0)
    452)
    453
    454DEF_MACRO(
    455    fWRITE_LOOP_REGS1, /* write ln,sa,ea,lc */
    456    {WRITE_RREG(REG_LC1,COUNT);
    457     WRITE_RREG(REG_SA1,START);},
    458    (A_IMPLICIT_WRITES_LC1,A_IMPLICIT_WRITES_SA1)
    459)
    460
    461DEF_MACRO(
    462    fWRITE_LC0,
    463    WRITE_RREG(REG_LC0,VAL),
    464    (A_IMPLICIT_WRITES_LC0)
    465)
    466
    467DEF_MACRO(
    468    fWRITE_LC1,
    469    WRITE_RREG(REG_LC1,VAL),
    470    (A_IMPLICIT_WRITES_LC1)
    471)
    472
    473DEF_MACRO(
    474    fCARRY_FROM_ADD,
    475    carry_from_add64(A,B,C),
    476    /* NOTHING */
    477)
    478
    479DEF_MACRO(
    480    fSET_OVERFLOW,
    481    SET_USR_FIELD(USR_OVF,1),
    482    ()
    483)
    484
    485DEF_MACRO(
    486    fSET_LPCFG,
    487    SET_USR_FIELD(USR_LPCFG,(VAL)),
    488    ()
    489)
    490
    491
    492DEF_MACRO(
    493    fGET_LPCFG,
    494    (GET_USR_FIELD(USR_LPCFG)),
    495    ()
    496)
    497
    498
    499
    500DEF_MACRO(
    501    fWRITE_P0, /* write Predicate 0 */
    502    WRITE_PREG(0,VAL),          /* behavior */
    503    (A_IMPLICIT_WRITES_P0)
    504)
    505
    506DEF_MACRO(
    507    fWRITE_P1, /* write Predicate 0 */
    508    WRITE_PREG(1,VAL),          /* behavior */
    509    (A_IMPLICIT_WRITES_P1)
    510)
    511
    512DEF_MACRO(
    513    fWRITE_P2, /* write Predicate 0 */
    514    WRITE_PREG(2,VAL),          /* behavior */
    515    (A_IMPLICIT_WRITES_P2)
    516)
    517
    518DEF_MACRO(
    519    fWRITE_P3, /* write Predicate 0 */
    520    WRITE_PREG(3,VAL),     /* behavior */
    521    (A_IMPLICIT_WRITES_P3)
    522)
    523
    524DEF_MACRO(
    525    fPART1, /* write Predicate 0 */
    526    if (insn->part1) { WORK; return; },          /* behavior */
    527    /* optional attributes */
    528)
    529
    530
    531/*************************************/
    532/* Casting, Sign-Zero extension, etc */
    533/*************************************/
    534
    535DEF_MACRO(
    536    fCAST4u, /* macro name */
    537    ((size4u_t)(A)),          /* behavior */
    538    /* optional attributes */
    539)
    540
    541DEF_MACRO(
    542    fCAST4s, /* macro name */
    543    ((size4s_t)(A)),          /* behavior */
    544    /* optional attributes */
    545)
    546
    547DEF_MACRO(
    548    fCAST8u, /* macro name */
    549    ((size8u_t)(A)),          /* behavior */
    550    /* optional attributes */
    551)
    552
    553DEF_MACRO(
    554    fCAST8s, /* macro name */
    555    ((size8s_t)(A)),          /* behavior */
    556    /* optional attributes */
    557)
    558
    559DEF_MACRO(
    560    fCAST4_4s, /* macro name */
    561    ((size4s_t)(A)),
    562    /* optional attributes */
    563)
    564
    565DEF_MACRO(
    566    fCAST4_4u, /* macro name */
    567    ((size4u_t)(A)),
    568    /* optional attributes */
    569)
    570
    571
    572DEF_MACRO(
    573    fCAST4_8s, /* macro name */
    574    ((size8s_t)((size4s_t)(A))),
    575    /* optional attributes */
    576)
    577
    578DEF_MACRO(
    579    fCAST4_8u, /* macro name */
    580    ((size8u_t)((size4u_t)(A))),
    581    /* optional attributes */
    582)
    583
    584DEF_MACRO(
    585    fCAST8_8s, /* macro name */
    586    ((size8s_t)(A)),
    587    /* optional attributes */
    588)
    589
    590DEF_MACRO(
    591    fCAST8_8u, /* macro name */
    592    ((size8u_t)(A)),
    593    /* optional attributes */
    594)
    595
    596DEF_MACRO(
    597    fCAST2_8s, /* macro name */
    598    ((size8s_t)((size2s_t)(A))),
    599    /* optional attributes */
    600)
    601DEF_MACRO(
    602    fCAST2_8u, /* macro name */
    603    ((size8u_t)((size2u_t)(A))),
    604    /* optional attributes */
    605)
    606
    607DEF_MACRO(
    608    fZE8_16, /* zero-extend 8 to 16 */
    609    ((size2s_t)((size1u_t)(A))),
    610    /* optional attributes */
    611)
    612DEF_MACRO(
    613    fSE8_16, /* sign-extend 8 to 16 */
    614    ((size2s_t)((size1s_t)(A))),
    615    /* optional attributes */
    616)
    617
    618
    619DEF_MACRO(
    620    fSE16_32, /* sign-extend 16 to 32 */
    621    ((size4s_t)((size2s_t)(A))),          /* behavior */
    622    /* optional attributes */
    623)
    624
    625DEF_MACRO(
    626    fZE16_32, /* zero-extend 16 to 32 */
    627    ((size4u_t)((size2u_t)(A))),          /* behavior */
    628    /* optional attributes */
    629)
    630
    631DEF_MACRO(
    632    fSE32_64,
    633    ( (size8s_t)((size4s_t)(A)) ),          /* behavior */
    634    /* optional attributes */
    635)
    636
    637DEF_MACRO(
    638    fZE32_64,
    639    ( (size8u_t)((size4u_t)(A)) ),          /* behavior */
    640    /* optional attributes */
    641)
    642
    643DEF_MACRO(
    644    fSE8_32, /* sign-extend 8 to 32 */
    645    ((size4s_t)((size1s_t)(A))),
    646    /* optional attributes */
    647)
    648
    649DEF_MACRO(
    650    fZE8_32, /* zero-extend 8 to 32 */
    651    ((size4s_t)((size1u_t)(A))),
    652    /* optional attributes */
    653)
    654
    655/*************************************/
    656/* DSP arithmetic support            */
    657/************************************/
    658DEF_MACRO(
    659    fMPY8UU, /* multiply half integer */
    660    (int)(fZE8_16(A)*fZE8_16(B)),     /* behavior */
    661    ()
    662)
    663DEF_MACRO(
    664    fMPY8US, /* multiply half integer */
    665    (int)(fZE8_16(A)*fSE8_16(B)),     /* behavior */
    666    ()
    667)
    668DEF_MACRO(
    669    fMPY8SU, /* multiply half integer */
    670    (int)(fSE8_16(A)*fZE8_16(B)),     /* behavior */
    671    ()
    672)
    673
    674DEF_MACRO(
    675    fMPY8SS, /* multiply half integer */
    676    (int)((short)(A)*(short)(B)),     /* behavior */
    677    ()
    678)
    679
    680DEF_MACRO(
    681    fMPY16SS, /* multiply half integer */
    682    fSE32_64(fSE16_32(A)*fSE16_32(B)),     /* behavior */
    683    ()
    684)
    685
    686DEF_MACRO(
    687    fMPY16UU, /* multiply unsigned half integer */
    688    fZE32_64(fZE16_32(A)*fZE16_32(B)),     /* behavior */
    689    ()
    690)
    691
    692DEF_MACRO(
    693    fMPY16SU, /* multiply half integer */
    694    fSE32_64(fSE16_32(A)*fZE16_32(B)),     /* behavior */
    695    ()
    696)
    697
    698DEF_MACRO(
    699    fMPY16US, /* multiply half integer */
    700    fMPY16SU(B,A),
    701    ()
    702)
    703
    704DEF_MACRO(
    705    fMPY32SS, /* multiply half integer */
    706    (fSE32_64(A)*fSE32_64(B)),     /* behavior */
    707    ()
    708)
    709
    710DEF_MACRO(
    711    fMPY32UU, /* multiply half integer */
    712    (fZE32_64(A)*fZE32_64(B)),     /* behavior */
    713    ()
    714)
    715
    716DEF_MACRO(
    717    fMPY32SU, /* multiply half integer */
    718    (fSE32_64(A)*fZE32_64(B)),     /* behavior */
    719    ()
    720)
    721
    722DEF_MACRO(
    723    fMPY3216SS, /* multiply mixed precision */
    724    (fSE32_64(A)*fSXTN(16,64,B)),     /* behavior */
    725    ()
    726)
    727
    728DEF_MACRO(
    729    fMPY3216SU, /* multiply mixed precision */
    730    (fSE32_64(A)*fZXTN(16,64,B)),     /* behavior */
    731    ()
    732)
    733
    734DEF_MACRO(
    735    fROUND, /* optional rounding */
    736    (A+0x8000),
    737    /* optional attributes */
    738)
    739
    740DEF_MACRO(
    741    fCLIP, /* optional rounding */
    742    { size4s_t maxv = (1<<U)-1;
    743      size4s_t minv = -(1<<U);
    744      DST = fMIN(maxv,fMAX(SRC,minv));
    745    },
    746    /* optional attributes */
    747)
    748
    749DEF_MACRO(
    750    fCRND, /* optional rounding */
    751    ((((A)&0x3)==0x3)?((A)+1):((A))),
    752    /* optional attributes */
    753)
    754
    755DEF_MACRO(
    756    fRNDN, /* Rounding to a boundary */
    757    ((((N)==0)?(A):(((fSE32_64(A))+(1<<((N)-1)))))),
    758    /* optional attributes */
    759)
    760
    761DEF_MACRO(
    762    fCRNDN, /* Rounding to a boundary */
    763    (conv_round(A,N)),
    764    /* optional attributes */
    765)
    766
    767DEF_MACRO(
    768    fADD128, /* Rounding to a boundary */
    769    (add128(A, B)),
    770    /* optional attributes */
    771)
    772DEF_MACRO(
    773    fSUB128, /* Rounding to a boundary */
    774    (sub128(A, B)),
    775    /* optional attributes */
    776)
    777DEF_MACRO(
    778    fSHIFTR128, /* Rounding to a boundary */
    779    (shiftr128(A, B)),
    780    /* optional attributes */
    781)
    782
    783DEF_MACRO(
    784    fSHIFTL128, /* Rounding to a boundary */
    785    (shiftl128(A, B)),
    786    /* optional attributes */
    787)
    788
    789DEF_MACRO(
    790    fAND128, /* Rounding to a boundary */
    791    (and128(A, B)),
    792    /* optional attributes */
    793)
    794
    795DEF_MACRO(
    796    fCAST8S_16S, /* Rounding to a boundary */
    797    (cast8s_to_16s(A)),
    798    /* optional attributes */
    799)
    800DEF_MACRO(
    801    fCAST16S_8S, /* Rounding to a boundary */
    802    (cast16s_to_8s(A)),
    803    /* optional attributes */
    804)
    805
    806DEF_MACRO(
    807    fEA_RI, /* Calculate EA with Register + Immediate Offset */
    808    do { EA=REG+IMM; fDOCHKPAGECROSS(REG,EA); } while (0),
    809    ()
    810)
    811
    812DEF_MACRO(
    813    fEA_RRs, /* Calculate EA with Register + Registers scaled Offset */
    814    do { EA=REG+(REG2<<SCALE); fDOCHKPAGECROSS(REG,EA); } while (0),
    815    ()
    816)
    817
    818DEF_MACRO(
    819    fEA_IRs, /* Calculate EA with Immediate + Registers scaled Offset */
    820    do { EA=IMM+(REG<<SCALE); fDOCHKPAGECROSS(IMM,EA); } while (0),
    821    ()
    822)
    823
    824DEF_MACRO(
    825    fEA_IMM, /* Calculate EA with Immediate */
    826    EA=IMM,
    827    ()
    828)
    829
    830DEF_MACRO(
    831    fEA_REG, /* Calculate EA with REGISTER */
    832    EA=REG,
    833    ()
    834)
    835
    836DEF_MACRO(
    837    fEA_BREVR, /* Calculate EA with bit reversed bottom of REGISTER */
    838    EA=fbrev(REG),
    839    ()
    840)
    841
    842DEF_MACRO(
    843    fEA_GPI, /* Calculate EA with Global Poitner + Immediate */
    844    do { EA=fREAD_GP()+IMM; fGP_DOCHKPAGECROSS(fREAD_GP(),EA); } while (0),
    845    ()
    846)
    847
    848DEF_MACRO(
    849    fPM_I, /* Post Modify Register by Immediate*/
    850    do { REG = REG + IMM; } while (0),
    851    ()
    852)
    853
    854DEF_MACRO(
    855    fPM_M, /* Post Modify Register by M register */
    856    do { REG = REG + MVAL; } while (0),
    857    ()
    858)
    859
    860DEF_MACRO(
    861    fPM_CIRI, /* Post Modify Register using Circular arithmetic by Immediate */
    862    do { fcirc_add(REG,siV,MuV); } while (0),
    863    ()
    864)
    865
    866DEF_MACRO(
    867    fPM_CIRR, /* Post Modify Register using Circular arithmetic by register */
    868    do { fcirc_add(REG,VAL,MuV); } while (0),
    869    ()
    870)
    871
    872
    873
    874DEF_MACRO(
    875    fSCALE, /* scale by N */
    876    (((size8s_t)(A))<<N),
    877    /* optional attributes */
    878)
    879
    880DEF_MACRO(
    881    fSATW, /* saturating to 32-bits*/
    882    fSATN(32,((long long)A)),
    883    ()
    884)
    885
    886DEF_MACRO(
    887    fSAT, /* saturating to 32-bits*/
    888    fSATN(32,(A)),
    889    ()
    890)
    891
    892DEF_MACRO(
    893    fSAT_ORIG_SHL, /* Saturating to 32-bits, with original value, for shift left */
    894    ((((size4s_t)((fSAT(A)) ^ ((size4s_t)(ORIG_REG)))) < 0) ?
    895        fSATVALN(32,((size4s_t)(ORIG_REG))) :
    896        ((((ORIG_REG) > 0) && ((A) == 0)) ?
    897            fSATVALN(32,(ORIG_REG)) :
    898            fSAT(A))),
    899    ()
    900)
    901
    902DEF_MACRO(
    903    fPASS,
    904    A,
    905)
    906
    907DEF_MACRO(
    908    fRND, /* saturating to 32-bits*/
    909    (((A)+1)>>1),
    910)
    911
    912
    913DEF_MACRO(
    914    fBIDIR_SHIFTL,
    915    (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) >> ((-(SHAMT))-1)) >>1) : (fCAST##REGSTYPE(SRC) << (SHAMT))),
    916    ()
    917)
    918
    919DEF_MACRO(
    920    fBIDIR_ASHIFTL,
    921    fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##s),
    922    ()
    923)
    924
    925DEF_MACRO(
    926    fBIDIR_LSHIFTL,
    927    fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##u),
    928    ()
    929)
    930
    931DEF_MACRO(
    932    fBIDIR_ASHIFTL_SAT,
    933    (((SHAMT) < 0) ? ((fCAST##REGSTYPE##s(SRC) >> ((-(SHAMT))-1)) >>1) : fSAT_ORIG_SHL(fCAST##REGSTYPE##s(SRC) << (SHAMT),(SRC))),
    934    ()
    935)
    936
    937
    938DEF_MACRO(
    939    fBIDIR_SHIFTR,
    940    (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) << ((-(SHAMT))-1)) << 1) : (fCAST##REGSTYPE(SRC) >> (SHAMT))),
    941    ()
    942)
    943
    944DEF_MACRO(
    945    fBIDIR_ASHIFTR,
    946    fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##s),
    947    ()
    948)
    949
    950DEF_MACRO(
    951    fBIDIR_LSHIFTR,
    952    fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##u),
    953    ()
    954)
    955
    956DEF_MACRO(
    957    fBIDIR_ASHIFTR_SAT,
    958    (((SHAMT) < 0) ? fSAT_ORIG_SHL((fCAST##REGSTYPE##s(SRC) << ((-(SHAMT))-1)) << 1,(SRC)) : (fCAST##REGSTYPE##s(SRC) >> (SHAMT))),
    959    ()
    960)
    961
    962DEF_MACRO(
    963    fASHIFTR,
    964    (fCAST##REGSTYPE##s(SRC) >> (SHAMT)),
    965    /* */
    966)
    967
    968DEF_MACRO(
    969    fLSHIFTR,
    970    (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##u(SRC) >> (SHAMT))),
    971    /* */
    972)
    973
    974DEF_MACRO(
    975    fROTL,
    976    (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) << (SHAMT)) | \
    977        ((fCAST##REGSTYPE##u(SRC) >> ((sizeof(SRC)*8)-(SHAMT)))))),
    978    /* */
    979)
    980
    981DEF_MACRO(
    982    fROTR,
    983    (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) >> (SHAMT)) | \
    984        ((fCAST##REGSTYPE##u(SRC) << ((sizeof(SRC)*8)-(SHAMT)))))),
    985    /* */
    986)
    987
    988DEF_MACRO(
    989    fASHIFTL,
    990    (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##s(SRC) << (SHAMT))),
    991    /* */
    992)
    993
    994/*************************************/
    995/* Floating-Point Support            */
    996/************************************/
    997
    998DEF_MACRO(
    999    fFLOAT, /* name */
   1000    ({ union { float f; size4u_t i; } _fipun; _fipun.i = (A); _fipun.f; }),     /* behavior */
   1001    (A_FPOP)
   1002)
   1003
   1004DEF_MACRO(
   1005    fUNFLOAT, /* multiply half integer */
   1006    ({ union { float f; size4u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFU : _fipun.i; }),     /* behavior */
   1007    (A_FPOP)
   1008)
   1009
   1010DEF_MACRO(
   1011    fSFNANVAL,
   1012    0xffffffff,
   1013    ()
   1014)
   1015
   1016DEF_MACRO(
   1017    fSFINFVAL,
   1018    (((A) & 0x80000000) | 0x7f800000),
   1019    ()
   1020)
   1021
   1022DEF_MACRO(
   1023    fSFONEVAL,
   1024    (((A) & 0x80000000) | fUNFLOAT(1.0)),
   1025    ()
   1026)
   1027
   1028DEF_MACRO(
   1029    fCHECKSFNAN,
   1030    do {
   1031        if (isnan(fFLOAT(A))) {
   1032            if ((fGETBIT(22,A)) == 0) fRAISEFLAGS(FE_INVALID);
   1033            DST = fSFNANVAL();
   1034        }
   1035    } while (0),
   1036    ()
   1037)
   1038
   1039DEF_MACRO(
   1040    fCHECKSFNAN3,
   1041    do {
   1042        fCHECKSFNAN(DST,A);
   1043        fCHECKSFNAN(DST,B);
   1044        fCHECKSFNAN(DST,C);
   1045    } while (0),
   1046    ()
   1047)
   1048
   1049DEF_MACRO(
   1050    fSF_BIAS,
   1051    127,
   1052    ()
   1053)
   1054
   1055DEF_MACRO(
   1056    fSF_MANTBITS,
   1057    23,
   1058    ()
   1059)
   1060
   1061DEF_MACRO(
   1062    fSF_MUL_POW2,
   1063    (fUNFLOAT(fFLOAT(A) * fFLOAT((fSF_BIAS() + (B)) << fSF_MANTBITS()))),
   1064    ()
   1065)
   1066
   1067DEF_MACRO(
   1068    fSF_GETEXP,
   1069    (((A) >> fSF_MANTBITS()) & 0xff),
   1070    ()
   1071)
   1072
   1073DEF_MACRO(
   1074    fSF_MAXEXP,
   1075    (254),
   1076    ()
   1077)
   1078
   1079DEF_MACRO(
   1080    fSF_RECIP_COMMON,
   1081    arch_sf_recip_common(&N,&D,&O,&A),
   1082    (A_FPOP)
   1083)
   1084
   1085DEF_MACRO(
   1086    fSF_INVSQRT_COMMON,
   1087    arch_sf_invsqrt_common(&N,&O,&A),
   1088    (A_FPOP)
   1089)
   1090
   1091DEF_MACRO(
   1092    fFMAFX,
   1093    internal_fmafx(A,B,C,fSXTN(8,64,ADJ)),
   1094    ()
   1095)
   1096
   1097DEF_MACRO(
   1098    fFMAF,
   1099    internal_fmafx(A,B,C,0),
   1100    ()
   1101)
   1102
   1103DEF_MACRO(
   1104    fSFMPY,
   1105    internal_mpyf(A,B),
   1106    ()
   1107)
   1108
   1109DEF_MACRO(
   1110    fMAKESF,
   1111    ((((SIGN) & 1) << 31) | (((EXP) & 0xff) << fSF_MANTBITS()) |
   1112        ((MANT) & ((1<<fSF_MANTBITS())-1))),
   1113    ()
   1114)
   1115
   1116
   1117DEF_MACRO(
   1118    fDOUBLE, /* multiply half integer */
   1119    ({ union { double f; size8u_t i; } _fipun; _fipun.i = (A); _fipun.f; }),     /* behavior */
   1120    (A_FPOP)
   1121)
   1122
   1123DEF_MACRO(
   1124    fUNDOUBLE, /* multiply half integer */
   1125    ({ union { double f; size8u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFFFFFFFFFULL : _fipun.i; }),     /* behavior */
   1126    (A_FPOP)
   1127)
   1128
   1129DEF_MACRO(
   1130    fDFNANVAL,
   1131    0xffffffffffffffffULL,
   1132    ()
   1133)
   1134
   1135DEF_MACRO(
   1136    fDF_ISNORMAL,
   1137    (fpclassify(fDOUBLE(X)) == FP_NORMAL),
   1138    ()
   1139)
   1140
   1141DEF_MACRO(
   1142    fDF_ISDENORM,
   1143    (fpclassify(fDOUBLE(X)) == FP_SUBNORMAL),
   1144    ()
   1145)
   1146
   1147DEF_MACRO(
   1148    fDF_ISBIG,
   1149    (fDF_GETEXP(X) >= 512),
   1150    ()
   1151)
   1152
   1153DEF_MACRO(
   1154    fDF_MANTBITS,
   1155    52,
   1156    ()
   1157)
   1158
   1159DEF_MACRO(
   1160    fDF_GETEXP,
   1161    (((A) >> fDF_MANTBITS()) & 0x7ff),
   1162    ()
   1163)
   1164
   1165DEF_MACRO(
   1166    fFMA,
   1167    internal_fma(A,B,C),
   1168    /* nothing */
   1169)
   1170
   1171DEF_MACRO(
   1172    fDF_MPY_HH,
   1173    internal_mpyhh(A,B,ACC),
   1174    /* nothing */
   1175)
   1176
   1177DEF_MACRO(
   1178    fFPOP_START,
   1179    arch_fpop_start(thread),
   1180    /* nothing */
   1181)
   1182
   1183DEF_MACRO(
   1184    fFPOP_END,
   1185    arch_fpop_end(thread),
   1186    /* nothing */
   1187)
   1188
   1189DEF_MACRO(
   1190    fFPSETROUND_NEAREST,
   1191    fesetround(FE_TONEAREST),
   1192    /* nothing */
   1193)
   1194
   1195DEF_MACRO(
   1196    fFPSETROUND_CHOP,
   1197    fesetround(FE_TOWARDZERO),
   1198    /* nothing */
   1199)
   1200
   1201DEF_MACRO(
   1202    fFPCANCELFLAGS,
   1203    feclearexcept(FE_ALL_EXCEPT),
   1204    /* nothing */
   1205)
   1206
   1207DEF_MACRO(
   1208    fISINFPROD,
   1209    ((isinf(A) && isinf(B)) ||
   1210     (isinf(A) && isfinite(B) && ((B) != 0.0)) ||
   1211     (isinf(B) && isfinite(A) && ((A) != 0.0))),
   1212    /* nothing */
   1213)
   1214
   1215DEF_MACRO(
   1216    fISZEROPROD,
   1217    ((((A) == 0.0) && isfinite(B)) || (((B) == 0.0) && isfinite(A))),
   1218    /* nothing */
   1219)
   1220
   1221DEF_MACRO(
   1222    fRAISEFLAGS,
   1223    arch_raise_fpflag(A),
   1224    /* NOTHING */
   1225)
   1226
   1227DEF_MACRO(
   1228    fDF_MAX,
   1229    (((A)==(B))
   1230    ? fDOUBLE(fUNDOUBLE(A) & fUNDOUBLE(B))
   1231    : fmax(A,B)),
   1232    (A_FPOP)
   1233)
   1234
   1235DEF_MACRO(
   1236    fDF_MIN,
   1237    (((A)==(B))
   1238    ? fDOUBLE(fUNDOUBLE(A) | fUNDOUBLE(B))
   1239    : fmin(A,B)),
   1240    (A_FPOP)
   1241)
   1242
   1243DEF_MACRO(
   1244    fSF_MAX,
   1245    (((A)==(B))
   1246    ? fFLOAT(fUNFLOAT(A) & fUNFLOAT(B))
   1247    : fmaxf(A,B)),
   1248    (A_FPOP)
   1249)
   1250
   1251DEF_MACRO(
   1252    fSF_MIN,
   1253    (((A)==(B))
   1254    ? fFLOAT(fUNFLOAT(A) | fUNFLOAT(B))
   1255    : fminf(A,B)),
   1256    (A_FPOP)
   1257)
   1258
   1259/*************************************/
   1260/* Load/Store support                */
   1261/*************************************/
   1262
   1263DEF_MACRO(fLOAD,
   1264    { DST = (size##SIZE##SIGN##_t)MEM_LOAD##SIZE(thread,EA,insn); },
   1265    (A_LOAD,A_MEMLIKE)
   1266)
   1267
   1268DEF_MACRO(fMEMOP,
   1269    { memop##SIZE##_##FNTYPE(thread,EA,VALUE); },
   1270    (A_LOAD,A_STORE,A_MEMLIKE)
   1271)
   1272
   1273DEF_MACRO(fGET_FRAMEKEY,
   1274    READ_RREG(REG_FRAMEKEY),
   1275    ()
   1276)
   1277
   1278DEF_MACRO(fFRAME_SCRAMBLE,
   1279    ((VAL) ^ (fCAST8u(fGET_FRAMEKEY()) << 32)),
   1280    /* ATTRIBS */
   1281)
   1282
   1283DEF_MACRO(fFRAME_UNSCRAMBLE,
   1284    fFRAME_SCRAMBLE(VAL),
   1285    /* ATTRIBS */
   1286)
   1287
   1288DEF_MACRO(fFRAMECHECK,
   1289    sys_check_framelimit(thread,ADDR,EA),
   1290    ()
   1291)
   1292
   1293DEF_MACRO(fLOAD_LOCKED,
   1294    {     DST = (size##SIZE##SIGN##_t)mem_load_locked(thread,EA,SIZE,insn); },
   1295    (A_LOAD,A_MEMLIKE)
   1296)
   1297
   1298DEF_MACRO(fSTORE,
   1299    { MEM_STORE##SIZE(thread,EA,SRC,insn); },
   1300    (A_STORE,A_MEMLIKE)
   1301)
   1302
   1303
   1304DEF_MACRO(fSTORE_LOCKED,
   1305    { PRED = (mem_store_conditional(thread,EA,SRC,SIZE,insn) ? 0xff : 0); },
   1306    (A_STORE,A_MEMLIKE)
   1307)
   1308
   1309/*************************************/
   1310/* Functions to help with bytes      */
   1311/*************************************/
   1312
   1313DEF_MACRO(fGETBYTE,
   1314    ((size1s_t)((SRC>>((N)*8))&0xff)),
   1315    /* nothing */
   1316)
   1317
   1318DEF_MACRO(fGETUBYTE,
   1319    ((size1u_t)((SRC>>((N)*8))&0xff)),
   1320    /* nothing */
   1321)
   1322
   1323DEF_MACRO(fSETBYTE,
   1324    {
   1325        DST = (DST & ~(0x0ffLL<<((N)*8))) | (((size8u_t)((VAL) & 0x0ffLL)) << ((N)*8));
   1326    },
   1327    /* nothing */
   1328)
   1329
   1330DEF_MACRO(fGETHALF,
   1331    ((size2s_t)((SRC>>((N)*16))&0xffff)),
   1332    /* nothing */
   1333)
   1334
   1335DEF_MACRO(fGETUHALF,
   1336    ((size2u_t)((SRC>>((N)*16))&0xffff)),
   1337    /* nothing */
   1338)
   1339
   1340DEF_MACRO(fSETHALF,
   1341    {
   1342        DST = (DST & ~(0x0ffffLL<<((N)*16))) | (((size8u_t)((VAL) & 0x0ffff)) << ((N)*16));
   1343    },
   1344    /* nothing */
   1345)
   1346
   1347
   1348
   1349DEF_MACRO(fGETWORD,
   1350    ((size8s_t)((size4s_t)((SRC>>((N)*32))&0x0ffffffffLL))),
   1351    /* nothing */
   1352)
   1353
   1354DEF_MACRO(fGETUWORD,
   1355    ((size8u_t)((size4u_t)((SRC>>((N)*32))&0x0ffffffffLL))),
   1356    /* nothing */
   1357)
   1358
   1359DEF_MACRO(fSETWORD,
   1360    {
   1361        DST = (DST & ~(0x0ffffffffLL<<((N)*32))) | (((VAL) & 0x0ffffffffLL) << ((N)*32));
   1362    },
   1363    /* nothing */
   1364)
   1365
   1366DEF_MACRO(fSETBIT,
   1367    {
   1368        DST = (DST & ~(1ULL<<(N))) | (((size8u_t)(VAL))<<(N));
   1369    },
   1370    /* nothing */
   1371)
   1372
   1373DEF_MACRO(fGETBIT,
   1374    (((SRC)>>N)&1),
   1375    /* nothing */
   1376)
   1377
   1378
   1379DEF_MACRO(fSETBITS,
   1380    do {
   1381        int j;
   1382        for (j=LO;j<=HI;j++) {
   1383          fSETBIT(j,DST,VAL);
   1384        }
   1385    } while (0),
   1386    /* nothing */
   1387)
   1388
   1389/*************************************/
   1390/* Used for parity, etc........      */
   1391/*************************************/
   1392DEF_MACRO(fCOUNTONES_4,
   1393    count_ones_4(VAL),
   1394    /* nothing */
   1395)
   1396
   1397DEF_MACRO(fCOUNTONES_8,
   1398    count_ones_8(VAL),
   1399    /* nothing */
   1400)
   1401
   1402DEF_MACRO(fBREV_8,
   1403    reverse_bits_8(VAL),
   1404    /* nothing */
   1405)
   1406
   1407DEF_MACRO(fBREV_4,
   1408    reverse_bits_4(VAL),
   1409    /* nothing */
   1410)
   1411
   1412DEF_MACRO(fCL1_8,
   1413    count_leading_ones_8(VAL),
   1414    /* nothing */
   1415)
   1416
   1417DEF_MACRO(fCL1_4,
   1418    count_leading_ones_4(VAL),
   1419    /* nothing */
   1420)
   1421
   1422DEF_MACRO(fINTERLEAVE,
   1423    interleave(ODD,EVEN),
   1424    /* nothing */
   1425)
   1426
   1427DEF_MACRO(fDEINTERLEAVE,
   1428    deinterleave(MIXED),
   1429    /* nothing */
   1430)
   1431
   1432DEF_MACRO(fHIDE,
   1433    A,
   1434    ()
   1435)
   1436
   1437DEF_MACRO(fCONSTLL,
   1438    A##LL,
   1439)
   1440
   1441/* Do the things in the parens, but don't print the parens. */
   1442DEF_MACRO(fECHO,
   1443    (A),
   1444    /* nothing */
   1445)
   1446
   1447
   1448/********************************************/
   1449/* OS interface and stop/wait               */
   1450/********************************************/
   1451
   1452DEF_MACRO(fPAUSE,
   1453    {sys_pause(thread, insn->slot, IMM);},
   1454    ()
   1455)
   1456
   1457DEF_MACRO(fTRAP,
   1458    warn("Trap NPC=%x ",fREAD_NPC());
   1459    warn("Trap exception, PCYCLE=%lld TYPE=%d NPC=%x IMM=0x%x",thread->processor_ptr->pstats[pcycles],TRAPTYPE,fREAD_NPC(),IMM);
   1460    register_trap_exception(thread,fREAD_NPC(),TRAPTYPE,IMM);,
   1461    ()
   1462)
   1463
   1464DEF_MACRO(fALIGN_REG_FIELD_VALUE,
   1465    ((VAL)<<reg_field_info[FIELD].offset),
   1466    /* */
   1467)
   1468
   1469DEF_MACRO(fGET_REG_FIELD_MASK,
   1470    (((1<<reg_field_info[FIELD].width)-1)<<reg_field_info[FIELD].offset),
   1471    /* */
   1472)
   1473
   1474DEF_MACRO(fREAD_REG_FIELD,
   1475    fEXTRACTU_BITS(thread->Regs[REG_##REG],
   1476        reg_field_info[FIELD].width,
   1477        reg_field_info[FIELD].offset),
   1478    /* ATTRIBS */
   1479)
   1480
   1481DEF_MACRO(fGET_FIELD,
   1482    fEXTRACTU_BITS(VAL,
   1483        reg_field_info[FIELD].width,
   1484        reg_field_info[FIELD].offset),
   1485    /* ATTRIBS */
   1486)
   1487
   1488DEF_MACRO(fSET_FIELD,
   1489    fINSERT_BITS(VAL,
   1490        reg_field_info[FIELD].width,
   1491        reg_field_info[FIELD].offset,
   1492        (NEWVAL)),
   1493    /* ATTRIBS */
   1494)
   1495
   1496/********************************************/
   1497/* Cache Management                         */
   1498/********************************************/
   1499
   1500DEF_MACRO(fBARRIER,
   1501    {
   1502        sys_barrier(thread, insn->slot);
   1503    },
   1504    ()
   1505)
   1506
   1507DEF_MACRO(fSYNCH,
   1508    {
   1509        sys_sync(thread, insn->slot);
   1510    },
   1511    ()
   1512)
   1513
   1514DEF_MACRO(fISYNC,
   1515    {
   1516        sys_isync(thread, insn->slot);
   1517    },
   1518    ()
   1519)
   1520
   1521
   1522DEF_MACRO(fDCFETCH,
   1523    sys_dcfetch(thread, (REG), insn->slot),
   1524    (A_MEMLIKE)
   1525)
   1526
   1527DEF_MACRO(fICINVA,
   1528    {
   1529        arch_internal_flush(thread->processor_ptr, 0, 0xffffffff);
   1530        sys_icinva(thread, (REG),insn->slot);
   1531    },
   1532    (A_ICINVA)
   1533)
   1534
   1535DEF_MACRO(fL2FETCH,
   1536    sys_l2fetch(thread, ADDR,HEIGHT,WIDTH,STRIDE,FLAGS, insn->slot),
   1537    (A_MEMLIKE,A_L2FETCH)
   1538)
   1539
   1540DEF_MACRO(fDCCLEANA,
   1541    sys_dccleana(thread, (REG)),
   1542    (A_MEMLIKE)
   1543)
   1544
   1545DEF_MACRO(fDCCLEANINVA,
   1546    sys_dccleaninva(thread, (REG), insn->slot),
   1547    (A_MEMLIKE,A_DCCLEANINVA)
   1548)
   1549
   1550DEF_MACRO(fDCZEROA,
   1551    sys_dczeroa(thread, (REG)),
   1552    (A_MEMLIKE)
   1553)
   1554
   1555DEF_MACRO(fCHECKFORPRIV,
   1556    {sys_check_privs(thread); if (EXCEPTION_DETECTED) return; },
   1557    ()
   1558)
   1559
   1560DEF_MACRO(fCHECKFORGUEST,
   1561    {sys_check_guest(thread); if (EXCEPTION_DETECTED) return; },
   1562    ()
   1563)
   1564
   1565DEF_MACRO(fBRANCH_SPECULATE_STALL,
   1566    {
   1567        sys_speculate_branch_stall(thread, insn->slot, JUMP_COND(JUMP_PRED_SET),
   1568            SPEC_DIR,
   1569            DOTNEWVAL,
   1570            HINTBITNUM,
   1571            STRBITNUM,
   1572            0,
   1573            thread->last_pkt->pkt_has_dual_jump,
   1574            insn->is_2nd_jump,
   1575            (thread->fetch_access.vaddr + insn->encoding_offset*4));
   1576    },
   1577    ()
   1578)