xref: /qemu/target/hexagon/imported/macros.def (revision 6c67d98c)
17cf9345cSTaylor Simpson/*
27cf9345cSTaylor Simpson *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
37cf9345cSTaylor Simpson *
47cf9345cSTaylor Simpson *  This program is free software; you can redistribute it and/or modify
57cf9345cSTaylor Simpson *  it under the terms of the GNU General Public License as published by
67cf9345cSTaylor Simpson *  the Free Software Foundation; either version 2 of the License, or
77cf9345cSTaylor Simpson *  (at your option) any later version.
87cf9345cSTaylor Simpson *
97cf9345cSTaylor Simpson *  This program is distributed in the hope that it will be useful,
107cf9345cSTaylor Simpson *  but WITHOUT ANY WARRANTY; without even the implied warranty of
117cf9345cSTaylor Simpson *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
127cf9345cSTaylor Simpson *  GNU General Public License for more details.
137cf9345cSTaylor Simpson *
147cf9345cSTaylor Simpson *  You should have received a copy of the GNU General Public License
157cf9345cSTaylor Simpson *  along with this program; if not, see <http://www.gnu.org/licenses/>.
167cf9345cSTaylor Simpson */
177cf9345cSTaylor Simpson
187cf9345cSTaylor SimpsonDEF_MACRO(
197cf9345cSTaylor Simpson    LIKELY,    /* NAME */
207cf9345cSTaylor Simpson    __builtin_expect((X),1), /* BEH */
217cf9345cSTaylor Simpson    ()    /* attribs */
227cf9345cSTaylor Simpson)
237cf9345cSTaylor Simpson
247cf9345cSTaylor SimpsonDEF_MACRO(
257cf9345cSTaylor Simpson    UNLIKELY,    /* NAME */
267cf9345cSTaylor Simpson    __builtin_expect((X),0), /* BEH */
277cf9345cSTaylor Simpson    ()    /* attribs */
287cf9345cSTaylor Simpson)
297cf9345cSTaylor Simpson
307cf9345cSTaylor SimpsonDEF_MACRO(
317cf9345cSTaylor Simpson    CANCEL, /* macro name */
327cf9345cSTaylor Simpson    {if (thread->last_pkt) thread->last_pkt->slot_cancelled |= (1<<insn->slot); return;} , /* behavior */
337cf9345cSTaylor Simpson    (A_CONDEXEC)
347cf9345cSTaylor Simpson)
357cf9345cSTaylor Simpson
367cf9345cSTaylor SimpsonDEF_MACRO(
377cf9345cSTaylor Simpson    LOAD_CANCEL, /* macro name */
387cf9345cSTaylor Simpson    {mem_general_load_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
397cf9345cSTaylor Simpson    (A_CONDEXEC)
407cf9345cSTaylor Simpson)
417cf9345cSTaylor Simpson
427cf9345cSTaylor SimpsonDEF_MACRO(
437cf9345cSTaylor Simpson    STORE_CANCEL, /* macro name */
447cf9345cSTaylor Simpson    {mem_general_store_cancelled(thread,EA,insn);CANCEL;} , /* behavior */
457cf9345cSTaylor Simpson    (A_CONDEXEC)
467cf9345cSTaylor Simpson)
477cf9345cSTaylor Simpson
487cf9345cSTaylor SimpsonDEF_MACRO(
497cf9345cSTaylor Simpson    fMAX, /* macro name */
507cf9345cSTaylor Simpson    (((A) > (B)) ? (A) : (B)), /* behavior */
517cf9345cSTaylor Simpson    /* optional attributes */
527cf9345cSTaylor Simpson)
537cf9345cSTaylor Simpson
547cf9345cSTaylor SimpsonDEF_MACRO(
557cf9345cSTaylor Simpson    fMIN, /* macro name */
567cf9345cSTaylor Simpson    (((A) < (B)) ? (A) : (B)), /* behavior */
577cf9345cSTaylor Simpson    /* optional attributes */
587cf9345cSTaylor Simpson)
597cf9345cSTaylor Simpson
607cf9345cSTaylor SimpsonDEF_MACRO(
617cf9345cSTaylor Simpson    fABS, /* macro name */
627cf9345cSTaylor Simpson    (((A)<0)?(-(A)):(A)), /* behavior */
637cf9345cSTaylor Simpson    /* optional attributes */
647cf9345cSTaylor Simpson)
657cf9345cSTaylor Simpson
667cf9345cSTaylor Simpson
677cf9345cSTaylor Simpson/* Bit insert */
687cf9345cSTaylor SimpsonDEF_MACRO(
697cf9345cSTaylor Simpson    fINSERT_BITS,
707cf9345cSTaylor Simpson        {
717cf9345cSTaylor Simpson            REG = ((REG) & ~(((fCONSTLL(1)<<(WIDTH))-1)<<(OFFSET))) | (((INVAL) & ((fCONSTLL(1)<<(WIDTH))-1)) << (OFFSET));
727cf9345cSTaylor Simpson        },
737cf9345cSTaylor Simpson    /* attribs */
747cf9345cSTaylor Simpson)
757cf9345cSTaylor Simpson
767cf9345cSTaylor Simpson/* Bit extract */
777cf9345cSTaylor SimpsonDEF_MACRO(
787cf9345cSTaylor Simpson    fEXTRACTU_BITS,
797cf9345cSTaylor Simpson    (fZXTN(WIDTH,32,(INREG >> OFFSET))),
807cf9345cSTaylor Simpson    /* attribs */
817cf9345cSTaylor Simpson)
827cf9345cSTaylor Simpson
837cf9345cSTaylor SimpsonDEF_MACRO(
847cf9345cSTaylor Simpson    fEXTRACTU_BIDIR,
857cf9345cSTaylor Simpson    (fZXTN(WIDTH,32,fBIDIR_LSHIFTR((INREG),(OFFSET),4_8))),
867cf9345cSTaylor Simpson    /* attribs */
877cf9345cSTaylor Simpson)
887cf9345cSTaylor Simpson
897cf9345cSTaylor SimpsonDEF_MACRO(
907cf9345cSTaylor Simpson    fEXTRACTU_RANGE,
917cf9345cSTaylor Simpson    (fZXTN((HIBIT-LOWBIT+1),32,(INREG >> LOWBIT))),
927cf9345cSTaylor Simpson    /* attribs */
937cf9345cSTaylor Simpson)
947cf9345cSTaylor Simpson
95e628c015STaylor Simpson
96e628c015STaylor SimpsonDEF_MACRO(
97e628c015STaylor Simpson    fINSERT_RANGE,
98e628c015STaylor Simpson        {
99e628c015STaylor Simpson            int offset=LOWBIT;
100e628c015STaylor Simpson            int width=HIBIT-LOWBIT+1;
101e628c015STaylor Simpson            /* clear bits where new bits go */
102e628c015STaylor Simpson            INREG &= ~(((fCONSTLL(1)<<width)-1)<<offset);
103e628c015STaylor Simpson            /* OR in new bits */
104e628c015STaylor Simpson            INREG |= ((INVAL & ((fCONSTLL(1)<<width)-1)) << offset);
105e628c015STaylor Simpson        },
106e628c015STaylor Simpson    /* attribs */
107e628c015STaylor Simpson)
108e628c015STaylor Simpson
109e628c015STaylor Simpson
1107cf9345cSTaylor SimpsonDEF_MACRO(
1117cf9345cSTaylor Simpson    f8BITSOF,
1127cf9345cSTaylor Simpson    ( (VAL) ? 0xff : 0x00),
1137cf9345cSTaylor Simpson    /* attribs */
1147cf9345cSTaylor Simpson)
1157cf9345cSTaylor Simpson
1167cf9345cSTaylor SimpsonDEF_MACRO(
1177cf9345cSTaylor Simpson    fLSBOLD,
1187cf9345cSTaylor Simpson    ((VAL) & 1),
1197cf9345cSTaylor Simpson    ()
1207cf9345cSTaylor Simpson)
1217cf9345cSTaylor Simpson
1227cf9345cSTaylor SimpsonDEF_MACRO(
1237cf9345cSTaylor Simpson    fLSBNEW,
1247cf9345cSTaylor Simpson    predlog_read(thread,PNUM),
1257cf9345cSTaylor Simpson    ()
1267cf9345cSTaylor Simpson)
1277cf9345cSTaylor Simpson
1287cf9345cSTaylor SimpsonDEF_MACRO(
1297cf9345cSTaylor Simpson    fLSBNEW0,
1307cf9345cSTaylor Simpson    predlog_read(thread,0),
1317cf9345cSTaylor Simpson    ()
1327cf9345cSTaylor Simpson)
1337cf9345cSTaylor Simpson
1347cf9345cSTaylor SimpsonDEF_MACRO(
1357cf9345cSTaylor Simpson    fLSBNEW1,
1367cf9345cSTaylor Simpson    predlog_read(thread,1),
1377cf9345cSTaylor Simpson    ()
1387cf9345cSTaylor Simpson)
1397cf9345cSTaylor Simpson
1407cf9345cSTaylor SimpsonDEF_MACRO(
1417cf9345cSTaylor Simpson    fLSBOLDNOT,
1427cf9345cSTaylor Simpson    (!fLSBOLD(VAL)),
1437cf9345cSTaylor Simpson    ()
1447cf9345cSTaylor Simpson)
1457cf9345cSTaylor Simpson
1467cf9345cSTaylor SimpsonDEF_MACRO(
1477cf9345cSTaylor Simpson    fLSBNEWNOT,
1487cf9345cSTaylor Simpson    (!fLSBNEW(PNUM)),
1497cf9345cSTaylor Simpson    ()
1507cf9345cSTaylor Simpson)
1517cf9345cSTaylor Simpson
1527cf9345cSTaylor SimpsonDEF_MACRO(
1537cf9345cSTaylor Simpson    fLSBNEW0NOT,
1547cf9345cSTaylor Simpson    (!fLSBNEW0),
1557cf9345cSTaylor Simpson    ()
1567cf9345cSTaylor Simpson)
1577cf9345cSTaylor Simpson
1587cf9345cSTaylor SimpsonDEF_MACRO(
1597cf9345cSTaylor Simpson    fLSBNEW1NOT,
1607cf9345cSTaylor Simpson    (!fLSBNEW1),
1617cf9345cSTaylor Simpson    ()
1627cf9345cSTaylor Simpson)
1637cf9345cSTaylor Simpson
1647cf9345cSTaylor SimpsonDEF_MACRO(
1657cf9345cSTaylor Simpson    fNEWREG,
1667cf9345cSTaylor Simpson    ({if (newvalue_missing(thread,RNUM) ||
1677cf9345cSTaylor Simpson      IS_CANCELLED(insn->new_value_producer_slot)) CANCEL; reglog_read(thread,RNUM);}),
1687cf9345cSTaylor Simpson    (A_DOTNEWVALUE,A_RESTRICT_SLOT0ONLY)
1697cf9345cSTaylor Simpson)
1707cf9345cSTaylor Simpson// Store new with a missing newvalue or cancelled goes out as a zero byte store in V65
1717cf9345cSTaylor Simpson// take advantage of the fact that reglog_read returns zero for not valid rnum
1727cf9345cSTaylor SimpsonDEF_MACRO(
1737cf9345cSTaylor Simpson    fNEWREG_ST,
1747cf9345cSTaylor Simpson    ({if (newvalue_missing(thread,RNUM) ||
1757cf9345cSTaylor Simpson      IS_CANCELLED(insn->new_value_producer_slot)) { STORE_ZERO; RNUM = -1; }; reglog_read(thread,RNUM);}),
1767cf9345cSTaylor Simpson    (A_DOTNEWVALUE,A_RESTRICT_SLOT0ONLY)
1777cf9345cSTaylor Simpson)
1787cf9345cSTaylor Simpson
1797cf9345cSTaylor SimpsonDEF_MACRO(
180e3d143e9STaylor Simpson    fVSATUVALN,
181e3d143e9STaylor Simpson    ({ ((VAL) < 0) ? 0 : ((1LL<<(N))-1);}),
182e3d143e9STaylor Simpson    ()
183e3d143e9STaylor Simpson)
184e3d143e9STaylor Simpson
185e3d143e9STaylor SimpsonDEF_MACRO(
1867cf9345cSTaylor Simpson    fSATUVALN,
1877cf9345cSTaylor Simpson    ({fSET_OVERFLOW(); ((VAL) < 0) ? 0 : ((1LL<<(N))-1);}),
1887cf9345cSTaylor Simpson    ()
1897cf9345cSTaylor Simpson)
1907cf9345cSTaylor Simpson
1917cf9345cSTaylor SimpsonDEF_MACRO(
1927cf9345cSTaylor Simpson    fSATVALN,
1937cf9345cSTaylor Simpson    ({fSET_OVERFLOW(); ((VAL) < 0) ? (-(1LL<<((N)-1))) : ((1LL<<((N)-1))-1);}),
1947cf9345cSTaylor Simpson    ()
1957cf9345cSTaylor Simpson)
1967cf9345cSTaylor Simpson
1977cf9345cSTaylor SimpsonDEF_MACRO(
198e3d143e9STaylor Simpson    fVSATVALN,
199e3d143e9STaylor Simpson    ({((VAL) < 0) ? (-(1LL<<((N)-1))) : ((1LL<<((N)-1))-1);}),
200e3d143e9STaylor Simpson    ()
201e3d143e9STaylor Simpson)
202e3d143e9STaylor Simpson
203e3d143e9STaylor SimpsonDEF_MACRO(
2047cf9345cSTaylor Simpson    fZXTN, /* macro name */
2057cf9345cSTaylor Simpson    ((VAL) & ((1LL<<(N))-1)),
2067cf9345cSTaylor Simpson    /* attribs */
2077cf9345cSTaylor Simpson)
2087cf9345cSTaylor Simpson
2097cf9345cSTaylor SimpsonDEF_MACRO(
2107cf9345cSTaylor Simpson    fSXTN, /* macro name */
2117cf9345cSTaylor Simpson    ((fZXTN(N,M,VAL) ^ (1LL<<((N)-1))) - (1LL<<((N)-1))),
2127cf9345cSTaylor Simpson    /* attribs */
2137cf9345cSTaylor Simpson)
2147cf9345cSTaylor Simpson
2157cf9345cSTaylor SimpsonDEF_MACRO(
2167cf9345cSTaylor Simpson    fSATN,
2177cf9345cSTaylor Simpson    ((fSXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATVALN(N,VAL)),
2187cf9345cSTaylor Simpson    ()
2197cf9345cSTaylor Simpson)
220e3d143e9STaylor SimpsonDEF_MACRO(
221e3d143e9STaylor Simpson    fVSATN,
222e3d143e9STaylor Simpson    ((fSXTN(N,64,VAL) == (VAL)) ? (VAL) : fVSATVALN(N,VAL)),
223e3d143e9STaylor Simpson    ()
224e3d143e9STaylor Simpson)
2257cf9345cSTaylor Simpson
2267cf9345cSTaylor SimpsonDEF_MACRO(
2277cf9345cSTaylor Simpson    fADDSAT64,
2287cf9345cSTaylor Simpson    {
2297cf9345cSTaylor Simpson        size8u_t __a = fCAST8u(A);
2307cf9345cSTaylor Simpson        size8u_t __b = fCAST8u(B);
2317cf9345cSTaylor Simpson        size8u_t __sum = __a + __b;
2327cf9345cSTaylor Simpson        size8u_t __xor = __a ^ __b;
2337cf9345cSTaylor Simpson        const size8u_t __mask = 0x8000000000000000ULL;
2347cf9345cSTaylor Simpson        if (__xor & __mask) {
2357cf9345cSTaylor Simpson            /* Opposite signs, OK */
2367cf9345cSTaylor Simpson            DST = __sum;
2377cf9345cSTaylor Simpson        } else if ((__a ^ __sum) & __mask) {
2387cf9345cSTaylor Simpson            /* Signs mismatch */
2397cf9345cSTaylor Simpson            if (__sum & __mask) {
2407cf9345cSTaylor Simpson                /* overflowed to negative, make max pos */
2417cf9345cSTaylor Simpson                DST=0x7FFFFFFFFFFFFFFFLL; fSET_OVERFLOW();
2427cf9345cSTaylor Simpson            } else {
2437cf9345cSTaylor Simpson                /* overflowed to positive, make max neg */
2447cf9345cSTaylor Simpson                DST=0x8000000000000000LL; fSET_OVERFLOW();
2457cf9345cSTaylor Simpson            }
2467cf9345cSTaylor Simpson        } else {
2477cf9345cSTaylor Simpson            /* signs did not mismatch, OK */
2487cf9345cSTaylor Simpson            DST = __sum;
2497cf9345cSTaylor Simpson        }
2507cf9345cSTaylor Simpson    },
2517cf9345cSTaylor Simpson    ()
2527cf9345cSTaylor Simpson)
2537cf9345cSTaylor Simpson
2547cf9345cSTaylor SimpsonDEF_MACRO(
255e3d143e9STaylor Simpson    fVSATUN,
256e3d143e9STaylor Simpson    ((fZXTN(N,64,VAL) == (VAL)) ? (VAL) : fVSATUVALN(N,VAL)),
257e3d143e9STaylor Simpson    ()
258e3d143e9STaylor Simpson)
259e3d143e9STaylor Simpson
260e3d143e9STaylor SimpsonDEF_MACRO(
2617cf9345cSTaylor Simpson    fSATUN,
2627cf9345cSTaylor Simpson    ((fZXTN(N,64,VAL) == (VAL)) ? (VAL) : fSATUVALN(N,VAL)),
2637cf9345cSTaylor Simpson    ()
2647cf9345cSTaylor Simpson)
2657cf9345cSTaylor Simpson
2667cf9345cSTaylor SimpsonDEF_MACRO(
2677cf9345cSTaylor Simpson    fSATH,
2687cf9345cSTaylor Simpson    (fSATN(16,VAL)),
2697cf9345cSTaylor Simpson    ()
2707cf9345cSTaylor Simpson)
2717cf9345cSTaylor Simpson
2727cf9345cSTaylor Simpson
2737cf9345cSTaylor SimpsonDEF_MACRO(
2747cf9345cSTaylor Simpson    fSATUH,
2757cf9345cSTaylor Simpson    (fSATUN(16,VAL)),
2767cf9345cSTaylor Simpson    ()
2777cf9345cSTaylor Simpson)
2787cf9345cSTaylor Simpson
2797cf9345cSTaylor SimpsonDEF_MACRO(
280e3d143e9STaylor Simpson    fVSATH,
281e3d143e9STaylor Simpson    (fVSATN(16,VAL)),
282e3d143e9STaylor Simpson    ()
283e3d143e9STaylor Simpson)
284e3d143e9STaylor Simpson
285e3d143e9STaylor SimpsonDEF_MACRO(
286e3d143e9STaylor Simpson    fVSATUH,
287e3d143e9STaylor Simpson    (fVSATUN(16,VAL)),
288e3d143e9STaylor Simpson    ()
289e3d143e9STaylor Simpson)
290e3d143e9STaylor Simpson
291e3d143e9STaylor Simpson
292e3d143e9STaylor SimpsonDEF_MACRO(
2937cf9345cSTaylor Simpson    fSATUB,
2947cf9345cSTaylor Simpson    (fSATUN(8,VAL)),
2957cf9345cSTaylor Simpson    ()
2967cf9345cSTaylor Simpson)
2977cf9345cSTaylor SimpsonDEF_MACRO(
2987cf9345cSTaylor Simpson    fSATB,
2997cf9345cSTaylor Simpson    (fSATN(8,VAL)),
3007cf9345cSTaylor Simpson    ()
3017cf9345cSTaylor Simpson)
3027cf9345cSTaylor Simpson
3037cf9345cSTaylor Simpson
304e3d143e9STaylor SimpsonDEF_MACRO(
305e3d143e9STaylor Simpson    fVSATUB,
306e3d143e9STaylor Simpson    (fVSATUN(8,VAL)),
307e3d143e9STaylor Simpson    ()
308e3d143e9STaylor Simpson)
309e3d143e9STaylor SimpsonDEF_MACRO(
310e3d143e9STaylor Simpson    fVSATB,
311e3d143e9STaylor Simpson    (fVSATN(8,VAL)),
312e3d143e9STaylor Simpson    ()
313e3d143e9STaylor Simpson)
314e3d143e9STaylor Simpson
315e3d143e9STaylor Simpson
316e3d143e9STaylor Simpson
317e3d143e9STaylor Simpson
3187cf9345cSTaylor Simpson/*************************************/
3197cf9345cSTaylor Simpson/* immediate extension               */
3207cf9345cSTaylor Simpson/*************************************/
3217cf9345cSTaylor Simpson
3227cf9345cSTaylor SimpsonDEF_MACRO(
3237cf9345cSTaylor Simpson    fIMMEXT,
3247cf9345cSTaylor Simpson    (IMM = IMM),
3257cf9345cSTaylor Simpson    (A_EXTENDABLE)
3267cf9345cSTaylor Simpson)
3277cf9345cSTaylor Simpson
3287cf9345cSTaylor SimpsonDEF_MACRO(
3297cf9345cSTaylor Simpson    fMUST_IMMEXT,
3307cf9345cSTaylor Simpson    fIMMEXT(IMM),
3317cf9345cSTaylor Simpson    (A_EXTENDABLE)
3327cf9345cSTaylor Simpson)
3337cf9345cSTaylor Simpson
3347cf9345cSTaylor SimpsonDEF_MACRO(
3357cf9345cSTaylor Simpson    fPCALIGN,
3367cf9345cSTaylor Simpson    IMM=(IMM & ~PCALIGN_MASK),
3377cf9345cSTaylor Simpson    (A_EXTENDABLE)
3387cf9345cSTaylor Simpson)
3397cf9345cSTaylor Simpson
3407cf9345cSTaylor Simpson/*************************************/
3417cf9345cSTaylor Simpson/* Read and Write Implicit Regs      */
3427cf9345cSTaylor Simpson/*************************************/
3437cf9345cSTaylor Simpson
3447cf9345cSTaylor SimpsonDEF_MACRO(
34546ef47e2STaylor Simpson    fREAD_IREG, /* read modifier register */
34646ef47e2STaylor Simpson    (fSXTN(11,64,(((VAL) & 0xf0000000)>>21) | ((VAL>>17)&0x7f) )),          /* behavior */
34746ef47e2STaylor Simpson    ()
34846ef47e2STaylor Simpson)
34946ef47e2STaylor Simpson
35046ef47e2STaylor SimpsonDEF_MACRO(
3517cf9345cSTaylor Simpson    fREAD_LR, /* read link register */
3527cf9345cSTaylor Simpson    (READ_RREG(REG_LR)),          /* behavior */
3537cf9345cSTaylor Simpson    ()
3547cf9345cSTaylor Simpson)
3557cf9345cSTaylor Simpson
3567cf9345cSTaylor SimpsonDEF_MACRO(
3577cf9345cSTaylor Simpson    fWRITE_LR, /* write lr */
3587cf9345cSTaylor Simpson    WRITE_RREG(REG_LR,A),          /* behavior */
3597cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_LR)
3607cf9345cSTaylor Simpson)
3617cf9345cSTaylor Simpson
3627cf9345cSTaylor SimpsonDEF_MACRO(
3637cf9345cSTaylor Simpson    fWRITE_FP, /* write sp */
3647cf9345cSTaylor Simpson    WRITE_RREG(REG_FP,A),          /* behavior */
3657cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_FP)
3667cf9345cSTaylor Simpson)
3677cf9345cSTaylor Simpson
3687cf9345cSTaylor SimpsonDEF_MACRO(
3697cf9345cSTaylor Simpson    fWRITE_SP, /* write sp */
3707cf9345cSTaylor Simpson    WRITE_RREG(REG_SP,A),          /* behavior */
3717cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_SP)
3727cf9345cSTaylor Simpson)
3737cf9345cSTaylor Simpson
3747cf9345cSTaylor SimpsonDEF_MACRO(
3757cf9345cSTaylor Simpson    fREAD_SP, /* read stack pointer */
3767cf9345cSTaylor Simpson    (READ_RREG(REG_SP)),          /* behavior */
3777cf9345cSTaylor Simpson    ()
3787cf9345cSTaylor Simpson)
3797cf9345cSTaylor Simpson
3807cf9345cSTaylor SimpsonDEF_MACRO(
38146ef47e2STaylor Simpson    fREAD_CSREG, /* read  CS register */
38246ef47e2STaylor Simpson    (READ_RREG(REG_CSA+N)),          /* behavior */
38346ef47e2STaylor Simpson    ()
38446ef47e2STaylor Simpson)
38546ef47e2STaylor Simpson
38646ef47e2STaylor SimpsonDEF_MACRO(
3877cf9345cSTaylor Simpson    fREAD_LC0, /* read loop count */
3887cf9345cSTaylor Simpson    (READ_RREG(REG_LC0)),          /* behavior */
3897cf9345cSTaylor Simpson    ()
3907cf9345cSTaylor Simpson)
3917cf9345cSTaylor Simpson
3927cf9345cSTaylor SimpsonDEF_MACRO(
3937cf9345cSTaylor Simpson    fREAD_LC1, /* read loop count */
3947cf9345cSTaylor Simpson    (READ_RREG(REG_LC1)),          /* behavior */
3957cf9345cSTaylor Simpson    ()
3967cf9345cSTaylor Simpson)
3977cf9345cSTaylor Simpson
3987cf9345cSTaylor SimpsonDEF_MACRO(
3997cf9345cSTaylor Simpson    fREAD_SA0, /* read start addr */
4007cf9345cSTaylor Simpson    (READ_RREG(REG_SA0)),          /* behavior */
4017cf9345cSTaylor Simpson    ()
4027cf9345cSTaylor Simpson)
4037cf9345cSTaylor Simpson
4047cf9345cSTaylor SimpsonDEF_MACRO(
4057cf9345cSTaylor Simpson    fREAD_SA1, /* read start addr */
4067cf9345cSTaylor Simpson    (READ_RREG(REG_SA1)),          /* behavior */
4077cf9345cSTaylor Simpson    ()
4087cf9345cSTaylor Simpson)
4097cf9345cSTaylor Simpson
4107cf9345cSTaylor Simpson
4117cf9345cSTaylor SimpsonDEF_MACRO(
4127cf9345cSTaylor Simpson    fREAD_FP, /* read frame pointer */
4137cf9345cSTaylor Simpson    (READ_RREG(REG_FP)),          /* behavior */
4147cf9345cSTaylor Simpson    ()
4157cf9345cSTaylor Simpson)
4167cf9345cSTaylor Simpson
4177cf9345cSTaylor SimpsonDEF_MACRO(
4187cf9345cSTaylor Simpson    fREAD_GP, /* read global pointer */
4197cf9345cSTaylor Simpson    (insn->extension_valid ? 0 : READ_RREG(REG_GP)),          /* behavior */
4207cf9345cSTaylor Simpson    ()
4217cf9345cSTaylor Simpson)
4227cf9345cSTaylor Simpson
4237cf9345cSTaylor SimpsonDEF_MACRO(
4247cf9345cSTaylor Simpson    fREAD_PC, /* read PC */
4257cf9345cSTaylor Simpson    (READ_RREG(REG_PC)),          /* behavior */
4267cf9345cSTaylor Simpson    ()
4277cf9345cSTaylor Simpson)
4287cf9345cSTaylor Simpson
4297cf9345cSTaylor SimpsonDEF_MACRO(
4307cf9345cSTaylor Simpson    fREAD_NPC, /* read next PC */
4317cf9345cSTaylor Simpson    (thread->next_PC & (0xfffffffe)),          /* behavior */
4327cf9345cSTaylor Simpson    ()
4337cf9345cSTaylor Simpson)
4347cf9345cSTaylor Simpson
4357cf9345cSTaylor SimpsonDEF_MACRO(
4367cf9345cSTaylor Simpson    fREAD_P0, /* read Predicate 0 */
4377cf9345cSTaylor Simpson    (READ_PREG(0)),          /* behavior */
4387cf9345cSTaylor Simpson    ()
4397cf9345cSTaylor Simpson)
4407cf9345cSTaylor Simpson
4417cf9345cSTaylor SimpsonDEF_MACRO(
4427cf9345cSTaylor Simpson    fREAD_P3, /* read Predicate 3 */
4437cf9345cSTaylor Simpson    (READ_PREG(3)),          /* behavior */
4447cf9345cSTaylor Simpson    ()
4457cf9345cSTaylor Simpson)
4467cf9345cSTaylor Simpson
4477cf9345cSTaylor SimpsonDEF_MACRO(
4487cf9345cSTaylor Simpson    fCHECK_PCALIGN,
4497cf9345cSTaylor Simpson    if (((A) & PCALIGN_MASK)) {
4507cf9345cSTaylor Simpson        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);
4517cf9345cSTaylor Simpson    },
4527cf9345cSTaylor Simpson    ()
4537cf9345cSTaylor Simpson)
4547cf9345cSTaylor Simpson
4557cf9345cSTaylor SimpsonDEF_MACRO(
4567cf9345cSTaylor Simpson    fWRITE_NPC, /* write next PC */
4577cf9345cSTaylor Simpson    if (!thread->branch_taken) {
4587cf9345cSTaylor Simpson        if (A != thread->next_PC) {
4597cf9345cSTaylor Simpson            thread->next_pkt_guess=thread->last_pkt->taken_ptr;
4607cf9345cSTaylor Simpson        }
4617cf9345cSTaylor Simpson        fCHECK_PCALIGN(A);
4627cf9345cSTaylor Simpson        thread->branched = 1; thread->branch_taken = 1; thread->next_PC = A; \
4637cf9345cSTaylor Simpson        thread->branch_offset = insn->encoding_offset; thread->branch_opcode = insn->opcode;
4647cf9345cSTaylor Simpson    },          /* behavior */
4657cf9345cSTaylor Simpson    (A_COF)
4667cf9345cSTaylor Simpson)
4677cf9345cSTaylor Simpson
4687cf9345cSTaylor SimpsonDEF_MACRO(
4697cf9345cSTaylor Simpson    fBRANCH,
4707cf9345cSTaylor Simpson    fWRITE_NPC(LOC); fCOF_CALLBACK(LOC,TYPE),
4717cf9345cSTaylor Simpson    ()
4727cf9345cSTaylor Simpson)
4737cf9345cSTaylor Simpson
4747cf9345cSTaylor SimpsonDEF_MACRO(
4757cf9345cSTaylor Simpson    fJUMPR,    /* A jumpr has executed */
4767cf9345cSTaylor Simpson    {fBRANCH(TARGET,COF_TYPE_JUMPR);},
4777cf9345cSTaylor Simpson    (A_INDIRECT)
4787cf9345cSTaylor Simpson)
4797cf9345cSTaylor Simpson
4807cf9345cSTaylor SimpsonDEF_MACRO(
4817cf9345cSTaylor Simpson    fHINTJR,    /* A hintjr instruction has executed */
4827cf9345cSTaylor Simpson    { },
4837cf9345cSTaylor Simpson)
4847cf9345cSTaylor Simpson
4857cf9345cSTaylor SimpsonDEF_MACRO(
4867cf9345cSTaylor Simpson    fCALL,    /* Do a call */
4877cf9345cSTaylor Simpson    if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALL);},
4887cf9345cSTaylor Simpson    (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
4897cf9345cSTaylor Simpson)
4907cf9345cSTaylor Simpson
4917cf9345cSTaylor SimpsonDEF_MACRO(
4927cf9345cSTaylor Simpson    fCALLR,    /* Do a call Register */
4937cf9345cSTaylor Simpson    if (!thread->branch_taken) {fBP_RAS_CALL(A); fWRITE_LR(fREAD_NPC()); fBRANCH(A,COF_TYPE_CALLR);},
4947cf9345cSTaylor Simpson    (A_COF,A_IMPLICIT_WRITES_LR,A_CALL)
4957cf9345cSTaylor Simpson)
4967cf9345cSTaylor Simpson
4977cf9345cSTaylor SimpsonDEF_MACRO(
4987cf9345cSTaylor Simpson    fWRITE_LOOP_REGS0, /* write ln,sa,ea,lc */
4997cf9345cSTaylor Simpson    {WRITE_RREG(REG_LC0,COUNT);
5007cf9345cSTaylor Simpson     WRITE_RREG(REG_SA0,START);},
5017cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_LC0,A_IMPLICIT_WRITES_SA0)
5027cf9345cSTaylor Simpson)
5037cf9345cSTaylor Simpson
5047cf9345cSTaylor SimpsonDEF_MACRO(
5057cf9345cSTaylor Simpson    fWRITE_LOOP_REGS1, /* write ln,sa,ea,lc */
5067cf9345cSTaylor Simpson    {WRITE_RREG(REG_LC1,COUNT);
5077cf9345cSTaylor Simpson     WRITE_RREG(REG_SA1,START);},
5087cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_LC1,A_IMPLICIT_WRITES_SA1)
5097cf9345cSTaylor Simpson)
5107cf9345cSTaylor Simpson
5117cf9345cSTaylor SimpsonDEF_MACRO(
5127cf9345cSTaylor Simpson    fWRITE_LC0,
5137cf9345cSTaylor Simpson    WRITE_RREG(REG_LC0,VAL),
5147cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_LC0)
5157cf9345cSTaylor Simpson)
5167cf9345cSTaylor Simpson
5177cf9345cSTaylor SimpsonDEF_MACRO(
5187cf9345cSTaylor Simpson    fWRITE_LC1,
5197cf9345cSTaylor Simpson    WRITE_RREG(REG_LC1,VAL),
5207cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_LC1)
5217cf9345cSTaylor Simpson)
5227cf9345cSTaylor Simpson
5237cf9345cSTaylor SimpsonDEF_MACRO(
5247cf9345cSTaylor Simpson    fCARRY_FROM_ADD,
5257cf9345cSTaylor Simpson    carry_from_add64(A,B,C),
5267cf9345cSTaylor Simpson    /* NOTHING */
5277cf9345cSTaylor Simpson)
5287cf9345cSTaylor Simpson
5297cf9345cSTaylor SimpsonDEF_MACRO(
5307cf9345cSTaylor Simpson    fSET_OVERFLOW,
5317cf9345cSTaylor Simpson    SET_USR_FIELD(USR_OVF,1),
5327cf9345cSTaylor Simpson    ()
5337cf9345cSTaylor Simpson)
5347cf9345cSTaylor Simpson
5357cf9345cSTaylor SimpsonDEF_MACRO(
5367cf9345cSTaylor Simpson    fSET_LPCFG,
5377cf9345cSTaylor Simpson    SET_USR_FIELD(USR_LPCFG,(VAL)),
5387cf9345cSTaylor Simpson    ()
5397cf9345cSTaylor Simpson)
5407cf9345cSTaylor Simpson
5417cf9345cSTaylor Simpson
5427cf9345cSTaylor SimpsonDEF_MACRO(
5437cf9345cSTaylor Simpson    fGET_LPCFG,
5447cf9345cSTaylor Simpson    (GET_USR_FIELD(USR_LPCFG)),
5457cf9345cSTaylor Simpson    ()
5467cf9345cSTaylor Simpson)
5477cf9345cSTaylor Simpson
5487cf9345cSTaylor Simpson
5497cf9345cSTaylor Simpson
5507cf9345cSTaylor SimpsonDEF_MACRO(
5517cf9345cSTaylor Simpson    fWRITE_P0, /* write Predicate 0 */
5527cf9345cSTaylor Simpson    WRITE_PREG(0,VAL),          /* behavior */
5537cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_P0)
5547cf9345cSTaylor Simpson)
5557cf9345cSTaylor Simpson
5567cf9345cSTaylor SimpsonDEF_MACRO(
5577cf9345cSTaylor Simpson    fWRITE_P1, /* write Predicate 0 */
5587cf9345cSTaylor Simpson    WRITE_PREG(1,VAL),          /* behavior */
5597cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_P1)
5607cf9345cSTaylor Simpson)
5617cf9345cSTaylor Simpson
5627cf9345cSTaylor SimpsonDEF_MACRO(
5637cf9345cSTaylor Simpson    fWRITE_P2, /* write Predicate 0 */
5647cf9345cSTaylor Simpson    WRITE_PREG(2,VAL),          /* behavior */
5657cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_P2)
5667cf9345cSTaylor Simpson)
5677cf9345cSTaylor Simpson
5687cf9345cSTaylor SimpsonDEF_MACRO(
5697cf9345cSTaylor Simpson    fWRITE_P3, /* write Predicate 0 */
5707cf9345cSTaylor Simpson    WRITE_PREG(3,VAL),     /* behavior */
5717cf9345cSTaylor Simpson    (A_IMPLICIT_WRITES_P3)
5727cf9345cSTaylor Simpson)
5737cf9345cSTaylor Simpson
5747cf9345cSTaylor SimpsonDEF_MACRO(
5757cf9345cSTaylor Simpson    fPART1, /* write Predicate 0 */
5767cf9345cSTaylor Simpson    if (insn->part1) { WORK; return; },          /* behavior */
5777cf9345cSTaylor Simpson    /* optional attributes */
5787cf9345cSTaylor Simpson)
5797cf9345cSTaylor Simpson
5807cf9345cSTaylor Simpson
5817cf9345cSTaylor Simpson/*************************************/
5827cf9345cSTaylor Simpson/* Casting, Sign-Zero extension, etc */
5837cf9345cSTaylor Simpson/*************************************/
5847cf9345cSTaylor Simpson
5857cf9345cSTaylor SimpsonDEF_MACRO(
5867cf9345cSTaylor Simpson    fCAST4u, /* macro name */
5877cf9345cSTaylor Simpson    ((size4u_t)(A)),          /* behavior */
5887cf9345cSTaylor Simpson    /* optional attributes */
5897cf9345cSTaylor Simpson)
5907cf9345cSTaylor Simpson
5917cf9345cSTaylor SimpsonDEF_MACRO(
5927cf9345cSTaylor Simpson    fCAST4s, /* macro name */
5937cf9345cSTaylor Simpson    ((size4s_t)(A)),          /* behavior */
5947cf9345cSTaylor Simpson    /* optional attributes */
5957cf9345cSTaylor Simpson)
5967cf9345cSTaylor Simpson
5977cf9345cSTaylor SimpsonDEF_MACRO(
5987cf9345cSTaylor Simpson    fCAST8u, /* macro name */
5997cf9345cSTaylor Simpson    ((size8u_t)(A)),          /* behavior */
6007cf9345cSTaylor Simpson    /* optional attributes */
6017cf9345cSTaylor Simpson)
6027cf9345cSTaylor Simpson
6037cf9345cSTaylor SimpsonDEF_MACRO(
6047cf9345cSTaylor Simpson    fCAST8s, /* macro name */
6057cf9345cSTaylor Simpson    ((size8s_t)(A)),          /* behavior */
6067cf9345cSTaylor Simpson    /* optional attributes */
6077cf9345cSTaylor Simpson)
6087cf9345cSTaylor Simpson
6097cf9345cSTaylor SimpsonDEF_MACRO(
610e3d143e9STaylor Simpson    fCAST2_2s, /* macro name */
611e3d143e9STaylor Simpson    ((size2s_t)(A)),
612e3d143e9STaylor Simpson    /* optional attributes */
613e3d143e9STaylor Simpson)
614e3d143e9STaylor Simpson
615e3d143e9STaylor SimpsonDEF_MACRO(
616e3d143e9STaylor Simpson    fCAST2_2u, /* macro name */
617e3d143e9STaylor Simpson    ((size2u_t)(A)),
618e3d143e9STaylor Simpson    /* optional attributes */
619e3d143e9STaylor Simpson)
620e3d143e9STaylor Simpson
621e3d143e9STaylor SimpsonDEF_MACRO(
6227cf9345cSTaylor Simpson    fCAST4_4s, /* macro name */
6237cf9345cSTaylor Simpson    ((size4s_t)(A)),
6247cf9345cSTaylor Simpson    /* optional attributes */
6257cf9345cSTaylor Simpson)
6267cf9345cSTaylor Simpson
6277cf9345cSTaylor SimpsonDEF_MACRO(
6287cf9345cSTaylor Simpson    fCAST4_4u, /* macro name */
6297cf9345cSTaylor Simpson    ((size4u_t)(A)),
6307cf9345cSTaylor Simpson    /* optional attributes */
6317cf9345cSTaylor Simpson)
6327cf9345cSTaylor Simpson
6337cf9345cSTaylor Simpson
6347cf9345cSTaylor SimpsonDEF_MACRO(
6357cf9345cSTaylor Simpson    fCAST4_8s, /* macro name */
6367cf9345cSTaylor Simpson    ((size8s_t)((size4s_t)(A))),
6377cf9345cSTaylor Simpson    /* optional attributes */
6387cf9345cSTaylor Simpson)
6397cf9345cSTaylor Simpson
6407cf9345cSTaylor SimpsonDEF_MACRO(
6417cf9345cSTaylor Simpson    fCAST4_8u, /* macro name */
6427cf9345cSTaylor Simpson    ((size8u_t)((size4u_t)(A))),
6437cf9345cSTaylor Simpson    /* optional attributes */
6447cf9345cSTaylor Simpson)
6457cf9345cSTaylor Simpson
6467cf9345cSTaylor SimpsonDEF_MACRO(
6477cf9345cSTaylor Simpson    fCAST8_8s, /* macro name */
6487cf9345cSTaylor Simpson    ((size8s_t)(A)),
6497cf9345cSTaylor Simpson    /* optional attributes */
6507cf9345cSTaylor Simpson)
6517cf9345cSTaylor Simpson
6527cf9345cSTaylor SimpsonDEF_MACRO(
6537cf9345cSTaylor Simpson    fCAST8_8u, /* macro name */
6547cf9345cSTaylor Simpson    ((size8u_t)(A)),
6557cf9345cSTaylor Simpson    /* optional attributes */
6567cf9345cSTaylor Simpson)
6577cf9345cSTaylor Simpson
6587cf9345cSTaylor SimpsonDEF_MACRO(
6597cf9345cSTaylor Simpson    fCAST2_8s, /* macro name */
6607cf9345cSTaylor Simpson    ((size8s_t)((size2s_t)(A))),
6617cf9345cSTaylor Simpson    /* optional attributes */
6627cf9345cSTaylor Simpson)
6637cf9345cSTaylor SimpsonDEF_MACRO(
6647cf9345cSTaylor Simpson    fCAST2_8u, /* macro name */
6657cf9345cSTaylor Simpson    ((size8u_t)((size2u_t)(A))),
6667cf9345cSTaylor Simpson    /* optional attributes */
6677cf9345cSTaylor Simpson)
6687cf9345cSTaylor Simpson
6697cf9345cSTaylor SimpsonDEF_MACRO(
6707cf9345cSTaylor Simpson    fZE8_16, /* zero-extend 8 to 16 */
6717cf9345cSTaylor Simpson    ((size2s_t)((size1u_t)(A))),
6727cf9345cSTaylor Simpson    /* optional attributes */
6737cf9345cSTaylor Simpson)
6747cf9345cSTaylor SimpsonDEF_MACRO(
6757cf9345cSTaylor Simpson    fSE8_16, /* sign-extend 8 to 16 */
6767cf9345cSTaylor Simpson    ((size2s_t)((size1s_t)(A))),
6777cf9345cSTaylor Simpson    /* optional attributes */
6787cf9345cSTaylor Simpson)
6797cf9345cSTaylor Simpson
6807cf9345cSTaylor Simpson
6817cf9345cSTaylor SimpsonDEF_MACRO(
6827cf9345cSTaylor Simpson    fSE16_32, /* sign-extend 16 to 32 */
6837cf9345cSTaylor Simpson    ((size4s_t)((size2s_t)(A))),          /* behavior */
6847cf9345cSTaylor Simpson    /* optional attributes */
6857cf9345cSTaylor Simpson)
6867cf9345cSTaylor Simpson
6877cf9345cSTaylor SimpsonDEF_MACRO(
6887cf9345cSTaylor Simpson    fZE16_32, /* zero-extend 16 to 32 */
6897cf9345cSTaylor Simpson    ((size4u_t)((size2u_t)(A))),          /* behavior */
6907cf9345cSTaylor Simpson    /* optional attributes */
6917cf9345cSTaylor Simpson)
6927cf9345cSTaylor Simpson
6937cf9345cSTaylor SimpsonDEF_MACRO(
6947cf9345cSTaylor Simpson    fSE32_64,
6957cf9345cSTaylor Simpson    ( (size8s_t)((size4s_t)(A)) ),          /* behavior */
6967cf9345cSTaylor Simpson    /* optional attributes */
6977cf9345cSTaylor Simpson)
6987cf9345cSTaylor Simpson
6997cf9345cSTaylor SimpsonDEF_MACRO(
7007cf9345cSTaylor Simpson    fZE32_64,
7017cf9345cSTaylor Simpson    ( (size8u_t)((size4u_t)(A)) ),          /* behavior */
7027cf9345cSTaylor Simpson    /* optional attributes */
7037cf9345cSTaylor Simpson)
7047cf9345cSTaylor Simpson
7057cf9345cSTaylor SimpsonDEF_MACRO(
7067cf9345cSTaylor Simpson    fSE8_32, /* sign-extend 8 to 32 */
7077cf9345cSTaylor Simpson    ((size4s_t)((size1s_t)(A))),
7087cf9345cSTaylor Simpson    /* optional attributes */
7097cf9345cSTaylor Simpson)
7107cf9345cSTaylor Simpson
7117cf9345cSTaylor SimpsonDEF_MACRO(
7127cf9345cSTaylor Simpson    fZE8_32, /* zero-extend 8 to 32 */
7137cf9345cSTaylor Simpson    ((size4s_t)((size1u_t)(A))),
7147cf9345cSTaylor Simpson    /* optional attributes */
7157cf9345cSTaylor Simpson)
7167cf9345cSTaylor Simpson
7177cf9345cSTaylor Simpson/*************************************/
7187cf9345cSTaylor Simpson/* DSP arithmetic support            */
7197cf9345cSTaylor Simpson/************************************/
7207cf9345cSTaylor SimpsonDEF_MACRO(
7217cf9345cSTaylor Simpson    fMPY8UU, /* multiply half integer */
7227cf9345cSTaylor Simpson    (int)(fZE8_16(A)*fZE8_16(B)),     /* behavior */
7237cf9345cSTaylor Simpson    ()
7247cf9345cSTaylor Simpson)
7257cf9345cSTaylor SimpsonDEF_MACRO(
7267cf9345cSTaylor Simpson    fMPY8US, /* multiply half integer */
7277cf9345cSTaylor Simpson    (int)(fZE8_16(A)*fSE8_16(B)),     /* behavior */
7287cf9345cSTaylor Simpson    ()
7297cf9345cSTaylor Simpson)
7307cf9345cSTaylor SimpsonDEF_MACRO(
7317cf9345cSTaylor Simpson    fMPY8SU, /* multiply half integer */
7327cf9345cSTaylor Simpson    (int)(fSE8_16(A)*fZE8_16(B)),     /* behavior */
7337cf9345cSTaylor Simpson    ()
7347cf9345cSTaylor Simpson)
7357cf9345cSTaylor Simpson
7367cf9345cSTaylor SimpsonDEF_MACRO(
7377cf9345cSTaylor Simpson    fMPY8SS, /* multiply half integer */
7387cf9345cSTaylor Simpson    (int)((short)(A)*(short)(B)),     /* behavior */
7397cf9345cSTaylor Simpson    ()
7407cf9345cSTaylor Simpson)
7417cf9345cSTaylor Simpson
7427cf9345cSTaylor SimpsonDEF_MACRO(
7437cf9345cSTaylor Simpson    fMPY16SS, /* multiply half integer */
7447cf9345cSTaylor Simpson    fSE32_64(fSE16_32(A)*fSE16_32(B)),     /* behavior */
7457cf9345cSTaylor Simpson    ()
7467cf9345cSTaylor Simpson)
7477cf9345cSTaylor Simpson
7487cf9345cSTaylor SimpsonDEF_MACRO(
7497cf9345cSTaylor Simpson    fMPY16UU, /* multiply unsigned half integer */
7507cf9345cSTaylor Simpson    fZE32_64(fZE16_32(A)*fZE16_32(B)),     /* behavior */
7517cf9345cSTaylor Simpson    ()
7527cf9345cSTaylor Simpson)
7537cf9345cSTaylor Simpson
7547cf9345cSTaylor SimpsonDEF_MACRO(
7557cf9345cSTaylor Simpson    fMPY16SU, /* multiply half integer */
7567cf9345cSTaylor Simpson    fSE32_64(fSE16_32(A)*fZE16_32(B)),     /* behavior */
7577cf9345cSTaylor Simpson    ()
7587cf9345cSTaylor Simpson)
7597cf9345cSTaylor Simpson
7607cf9345cSTaylor SimpsonDEF_MACRO(
7617cf9345cSTaylor Simpson    fMPY16US, /* multiply half integer */
7627cf9345cSTaylor Simpson    fMPY16SU(B,A),
7637cf9345cSTaylor Simpson    ()
7647cf9345cSTaylor Simpson)
7657cf9345cSTaylor Simpson
7667cf9345cSTaylor SimpsonDEF_MACRO(
7677cf9345cSTaylor Simpson    fMPY32SS, /* multiply half integer */
7687cf9345cSTaylor Simpson    (fSE32_64(A)*fSE32_64(B)),     /* behavior */
7697cf9345cSTaylor Simpson    ()
7707cf9345cSTaylor Simpson)
7717cf9345cSTaylor Simpson
7727cf9345cSTaylor SimpsonDEF_MACRO(
7737cf9345cSTaylor Simpson    fMPY32UU, /* multiply half integer */
7747cf9345cSTaylor Simpson    (fZE32_64(A)*fZE32_64(B)),     /* behavior */
7757cf9345cSTaylor Simpson    ()
7767cf9345cSTaylor Simpson)
7777cf9345cSTaylor Simpson
7787cf9345cSTaylor SimpsonDEF_MACRO(
7797cf9345cSTaylor Simpson    fMPY32SU, /* multiply half integer */
7807cf9345cSTaylor Simpson    (fSE32_64(A)*fZE32_64(B)),     /* behavior */
7817cf9345cSTaylor Simpson    ()
7827cf9345cSTaylor Simpson)
7837cf9345cSTaylor Simpson
7847cf9345cSTaylor SimpsonDEF_MACRO(
7857cf9345cSTaylor Simpson    fMPY3216SS, /* multiply mixed precision */
7867cf9345cSTaylor Simpson    (fSE32_64(A)*fSXTN(16,64,B)),     /* behavior */
7877cf9345cSTaylor Simpson    ()
7887cf9345cSTaylor Simpson)
7897cf9345cSTaylor Simpson
7907cf9345cSTaylor SimpsonDEF_MACRO(
7917cf9345cSTaylor Simpson    fMPY3216SU, /* multiply mixed precision */
7927cf9345cSTaylor Simpson    (fSE32_64(A)*fZXTN(16,64,B)),     /* behavior */
7937cf9345cSTaylor Simpson    ()
7947cf9345cSTaylor Simpson)
7957cf9345cSTaylor Simpson
7967cf9345cSTaylor SimpsonDEF_MACRO(
7977cf9345cSTaylor Simpson    fROUND, /* optional rounding */
7987cf9345cSTaylor Simpson    (A+0x8000),
7997cf9345cSTaylor Simpson    /* optional attributes */
8007cf9345cSTaylor Simpson)
8017cf9345cSTaylor Simpson
8027cf9345cSTaylor SimpsonDEF_MACRO(
8037cf9345cSTaylor Simpson    fCLIP, /* optional rounding */
8047cf9345cSTaylor Simpson    { size4s_t maxv = (1<<U)-1;
8057cf9345cSTaylor Simpson      size4s_t minv = -(1<<U);
8067cf9345cSTaylor Simpson      DST = fMIN(maxv,fMAX(SRC,minv));
8077cf9345cSTaylor Simpson    },
8087cf9345cSTaylor Simpson    /* optional attributes */
8097cf9345cSTaylor Simpson)
8107cf9345cSTaylor Simpson
8117cf9345cSTaylor SimpsonDEF_MACRO(
8127cf9345cSTaylor Simpson    fCRND, /* optional rounding */
8137cf9345cSTaylor Simpson    ((((A)&0x3)==0x3)?((A)+1):((A))),
8147cf9345cSTaylor Simpson    /* optional attributes */
8157cf9345cSTaylor Simpson)
8167cf9345cSTaylor Simpson
8177cf9345cSTaylor SimpsonDEF_MACRO(
8187cf9345cSTaylor Simpson    fRNDN, /* Rounding to a boundary */
8197cf9345cSTaylor Simpson    ((((N)==0)?(A):(((fSE32_64(A))+(1<<((N)-1)))))),
8207cf9345cSTaylor Simpson    /* optional attributes */
8217cf9345cSTaylor Simpson)
8227cf9345cSTaylor Simpson
8237cf9345cSTaylor SimpsonDEF_MACRO(
8247cf9345cSTaylor Simpson    fCRNDN, /* Rounding to a boundary */
8257cf9345cSTaylor Simpson    (conv_round(A,N)),
8267cf9345cSTaylor Simpson    /* optional attributes */
8277cf9345cSTaylor Simpson)
8287cf9345cSTaylor Simpson
8297cf9345cSTaylor SimpsonDEF_MACRO(
8307cf9345cSTaylor Simpson    fADD128, /* Rounding to a boundary */
8317cf9345cSTaylor Simpson    (add128(A, B)),
8327cf9345cSTaylor Simpson    /* optional attributes */
8337cf9345cSTaylor Simpson)
8347cf9345cSTaylor SimpsonDEF_MACRO(
8357cf9345cSTaylor Simpson    fSUB128, /* Rounding to a boundary */
8367cf9345cSTaylor Simpson    (sub128(A, B)),
8377cf9345cSTaylor Simpson    /* optional attributes */
8387cf9345cSTaylor Simpson)
8397cf9345cSTaylor SimpsonDEF_MACRO(
8407cf9345cSTaylor Simpson    fSHIFTR128, /* Rounding to a boundary */
8417cf9345cSTaylor Simpson    (shiftr128(A, B)),
8427cf9345cSTaylor Simpson    /* optional attributes */
8437cf9345cSTaylor Simpson)
8447cf9345cSTaylor Simpson
8457cf9345cSTaylor SimpsonDEF_MACRO(
8467cf9345cSTaylor Simpson    fSHIFTL128, /* Rounding to a boundary */
8477cf9345cSTaylor Simpson    (shiftl128(A, B)),
8487cf9345cSTaylor Simpson    /* optional attributes */
8497cf9345cSTaylor Simpson)
8507cf9345cSTaylor Simpson
8517cf9345cSTaylor SimpsonDEF_MACRO(
8527cf9345cSTaylor Simpson    fAND128, /* Rounding to a boundary */
8537cf9345cSTaylor Simpson    (and128(A, B)),
8547cf9345cSTaylor Simpson    /* optional attributes */
8557cf9345cSTaylor Simpson)
8567cf9345cSTaylor Simpson
8577cf9345cSTaylor SimpsonDEF_MACRO(
8587cf9345cSTaylor Simpson    fCAST8S_16S, /* Rounding to a boundary */
8597cf9345cSTaylor Simpson    (cast8s_to_16s(A)),
8607cf9345cSTaylor Simpson    /* optional attributes */
8617cf9345cSTaylor Simpson)
8627cf9345cSTaylor SimpsonDEF_MACRO(
8637cf9345cSTaylor Simpson    fCAST16S_8S, /* Rounding to a boundary */
8647cf9345cSTaylor Simpson    (cast16s_to_8s(A)),
8657cf9345cSTaylor Simpson    /* optional attributes */
8667cf9345cSTaylor Simpson)
8677cf9345cSTaylor Simpson
8687cf9345cSTaylor SimpsonDEF_MACRO(
8697cf9345cSTaylor Simpson    fEA_RI, /* Calculate EA with Register + Immediate Offset */
8707cf9345cSTaylor Simpson    do { EA=REG+IMM; fDOCHKPAGECROSS(REG,EA); } while (0),
8717cf9345cSTaylor Simpson    ()
8727cf9345cSTaylor Simpson)
8737cf9345cSTaylor Simpson
8747cf9345cSTaylor SimpsonDEF_MACRO(
8757cf9345cSTaylor Simpson    fEA_RRs, /* Calculate EA with Register + Registers scaled Offset */
8767cf9345cSTaylor Simpson    do { EA=REG+(REG2<<SCALE); fDOCHKPAGECROSS(REG,EA); } while (0),
8777cf9345cSTaylor Simpson    ()
8787cf9345cSTaylor Simpson)
8797cf9345cSTaylor Simpson
8807cf9345cSTaylor SimpsonDEF_MACRO(
8817cf9345cSTaylor Simpson    fEA_IRs, /* Calculate EA with Immediate + Registers scaled Offset */
8827cf9345cSTaylor Simpson    do { EA=IMM+(REG<<SCALE); fDOCHKPAGECROSS(IMM,EA); } while (0),
8837cf9345cSTaylor Simpson    ()
8847cf9345cSTaylor Simpson)
8857cf9345cSTaylor Simpson
8867cf9345cSTaylor SimpsonDEF_MACRO(
8877cf9345cSTaylor Simpson    fEA_IMM, /* Calculate EA with Immediate */
8887cf9345cSTaylor Simpson    EA=IMM,
8897cf9345cSTaylor Simpson    ()
8907cf9345cSTaylor Simpson)
8917cf9345cSTaylor Simpson
8927cf9345cSTaylor SimpsonDEF_MACRO(
8937cf9345cSTaylor Simpson    fEA_REG, /* Calculate EA with REGISTER */
8947cf9345cSTaylor Simpson    EA=REG,
8957cf9345cSTaylor Simpson    ()
8967cf9345cSTaylor Simpson)
8977cf9345cSTaylor Simpson
8987cf9345cSTaylor SimpsonDEF_MACRO(
899af7f1821STaylor Simpson    fEA_BREVR, /* Calculate EA with bit reversed bottom of REGISTER */
900af7f1821STaylor Simpson    EA=fbrev(REG),
901af7f1821STaylor Simpson    ()
902af7f1821STaylor Simpson)
903af7f1821STaylor Simpson
904af7f1821STaylor SimpsonDEF_MACRO(
9056c67d98cSMichael Tokarev    fEA_GPI, /* Calculate EA with Global Pointer + Immediate */
9067cf9345cSTaylor Simpson    do { EA=fREAD_GP()+IMM; fGP_DOCHKPAGECROSS(fREAD_GP(),EA); } while (0),
9077cf9345cSTaylor Simpson    ()
9087cf9345cSTaylor Simpson)
9097cf9345cSTaylor Simpson
9107cf9345cSTaylor SimpsonDEF_MACRO(
9117cf9345cSTaylor Simpson    fPM_I, /* Post Modify Register by Immediate*/
9127cf9345cSTaylor Simpson    do { REG = REG + IMM; } while (0),
9137cf9345cSTaylor Simpson    ()
9147cf9345cSTaylor Simpson)
9157cf9345cSTaylor Simpson
9167cf9345cSTaylor SimpsonDEF_MACRO(
9177cf9345cSTaylor Simpson    fPM_M, /* Post Modify Register by M register */
9187cf9345cSTaylor Simpson    do { REG = REG + MVAL; } while (0),
9197cf9345cSTaylor Simpson    ()
9207cf9345cSTaylor Simpson)
9217cf9345cSTaylor Simpson
9227cf9345cSTaylor SimpsonDEF_MACRO(
92346ef47e2STaylor Simpson    fPM_CIRI, /* Post Modify Register using Circular arithmetic by Immediate */
92446ef47e2STaylor Simpson    do { fcirc_add(REG,siV,MuV); } while (0),
92546ef47e2STaylor Simpson    ()
92646ef47e2STaylor Simpson)
92746ef47e2STaylor Simpson
92846ef47e2STaylor SimpsonDEF_MACRO(
92946ef47e2STaylor Simpson    fPM_CIRR, /* Post Modify Register using Circular arithmetic by register */
93046ef47e2STaylor Simpson    do { fcirc_add(REG,VAL,MuV); } while (0),
93146ef47e2STaylor Simpson    ()
93246ef47e2STaylor Simpson)
93346ef47e2STaylor Simpson
93446ef47e2STaylor Simpson
93546ef47e2STaylor Simpson
93646ef47e2STaylor SimpsonDEF_MACRO(
9377cf9345cSTaylor Simpson    fSCALE, /* scale by N */
9387cf9345cSTaylor Simpson    (((size8s_t)(A))<<N),
9397cf9345cSTaylor Simpson    /* optional attributes */
9407cf9345cSTaylor Simpson)
941e3d143e9STaylor SimpsonDEF_MACRO(
942e3d143e9STaylor Simpson    fVSATW, /* saturating to 32-bits*/
943e3d143e9STaylor Simpson    fVSATN(32,((long long)A)),
944e3d143e9STaylor Simpson    ()
945e3d143e9STaylor Simpson)
9467cf9345cSTaylor Simpson
9477cf9345cSTaylor SimpsonDEF_MACRO(
9487cf9345cSTaylor Simpson    fSATW, /* saturating to 32-bits*/
9497cf9345cSTaylor Simpson    fSATN(32,((long long)A)),
9507cf9345cSTaylor Simpson    ()
9517cf9345cSTaylor Simpson)
9527cf9345cSTaylor Simpson
9537cf9345cSTaylor SimpsonDEF_MACRO(
954e3d143e9STaylor Simpson    fVSAT, /* saturating to 32-bits*/
955e3d143e9STaylor Simpson    fVSATN(32,(A)),
956e3d143e9STaylor Simpson    ()
957e3d143e9STaylor Simpson)
958e3d143e9STaylor Simpson
959e3d143e9STaylor SimpsonDEF_MACRO(
9607cf9345cSTaylor Simpson    fSAT, /* saturating to 32-bits*/
9617cf9345cSTaylor Simpson    fSATN(32,(A)),
9627cf9345cSTaylor Simpson    ()
9637cf9345cSTaylor Simpson)
9647cf9345cSTaylor Simpson
9657cf9345cSTaylor SimpsonDEF_MACRO(
9667cf9345cSTaylor Simpson    fSAT_ORIG_SHL, /* Saturating to 32-bits, with original value, for shift left */
9677cf9345cSTaylor Simpson    ((((size4s_t)((fSAT(A)) ^ ((size4s_t)(ORIG_REG)))) < 0) ?
9687cf9345cSTaylor Simpson        fSATVALN(32,((size4s_t)(ORIG_REG))) :
9697cf9345cSTaylor Simpson        ((((ORIG_REG) > 0) && ((A) == 0)) ?
9707cf9345cSTaylor Simpson            fSATVALN(32,(ORIG_REG)) :
9717cf9345cSTaylor Simpson            fSAT(A))),
9727cf9345cSTaylor Simpson    ()
9737cf9345cSTaylor Simpson)
9747cf9345cSTaylor Simpson
9757cf9345cSTaylor SimpsonDEF_MACRO(
9767cf9345cSTaylor Simpson    fPASS,
9777cf9345cSTaylor Simpson    A,
9787cf9345cSTaylor Simpson)
9797cf9345cSTaylor Simpson
9807cf9345cSTaylor SimpsonDEF_MACRO(
9817cf9345cSTaylor Simpson    fRND, /* saturating to 32-bits*/
9827cf9345cSTaylor Simpson    (((A)+1)>>1),
9837cf9345cSTaylor Simpson)
9847cf9345cSTaylor Simpson
9857cf9345cSTaylor Simpson
9867cf9345cSTaylor SimpsonDEF_MACRO(
9877cf9345cSTaylor Simpson    fBIDIR_SHIFTL,
9887cf9345cSTaylor Simpson    (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) >> ((-(SHAMT))-1)) >>1) : (fCAST##REGSTYPE(SRC) << (SHAMT))),
9897cf9345cSTaylor Simpson    ()
9907cf9345cSTaylor Simpson)
9917cf9345cSTaylor Simpson
9927cf9345cSTaylor SimpsonDEF_MACRO(
9937cf9345cSTaylor Simpson    fBIDIR_ASHIFTL,
9947cf9345cSTaylor Simpson    fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##s),
9957cf9345cSTaylor Simpson    ()
9967cf9345cSTaylor Simpson)
9977cf9345cSTaylor Simpson
9987cf9345cSTaylor SimpsonDEF_MACRO(
9997cf9345cSTaylor Simpson    fBIDIR_LSHIFTL,
10007cf9345cSTaylor Simpson    fBIDIR_SHIFTL(SRC,SHAMT,REGSTYPE##u),
10017cf9345cSTaylor Simpson    ()
10027cf9345cSTaylor Simpson)
10037cf9345cSTaylor Simpson
10047cf9345cSTaylor SimpsonDEF_MACRO(
10057cf9345cSTaylor Simpson    fBIDIR_ASHIFTL_SAT,
10067cf9345cSTaylor Simpson    (((SHAMT) < 0) ? ((fCAST##REGSTYPE##s(SRC) >> ((-(SHAMT))-1)) >>1) : fSAT_ORIG_SHL(fCAST##REGSTYPE##s(SRC) << (SHAMT),(SRC))),
10077cf9345cSTaylor Simpson    ()
10087cf9345cSTaylor Simpson)
10097cf9345cSTaylor Simpson
10107cf9345cSTaylor Simpson
10117cf9345cSTaylor SimpsonDEF_MACRO(
10127cf9345cSTaylor Simpson    fBIDIR_SHIFTR,
10137cf9345cSTaylor Simpson    (((SHAMT) < 0) ? ((fCAST##REGSTYPE(SRC) << ((-(SHAMT))-1)) << 1) : (fCAST##REGSTYPE(SRC) >> (SHAMT))),
10147cf9345cSTaylor Simpson    ()
10157cf9345cSTaylor Simpson)
10167cf9345cSTaylor Simpson
10177cf9345cSTaylor SimpsonDEF_MACRO(
10187cf9345cSTaylor Simpson    fBIDIR_ASHIFTR,
10197cf9345cSTaylor Simpson    fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##s),
10207cf9345cSTaylor Simpson    ()
10217cf9345cSTaylor Simpson)
10227cf9345cSTaylor Simpson
10237cf9345cSTaylor SimpsonDEF_MACRO(
10247cf9345cSTaylor Simpson    fBIDIR_LSHIFTR,
10257cf9345cSTaylor Simpson    fBIDIR_SHIFTR(SRC,SHAMT,REGSTYPE##u),
10267cf9345cSTaylor Simpson    ()
10277cf9345cSTaylor Simpson)
10287cf9345cSTaylor Simpson
10297cf9345cSTaylor SimpsonDEF_MACRO(
10307cf9345cSTaylor Simpson    fBIDIR_ASHIFTR_SAT,
10317cf9345cSTaylor Simpson    (((SHAMT) < 0) ? fSAT_ORIG_SHL((fCAST##REGSTYPE##s(SRC) << ((-(SHAMT))-1)) << 1,(SRC)) : (fCAST##REGSTYPE##s(SRC) >> (SHAMT))),
10327cf9345cSTaylor Simpson    ()
10337cf9345cSTaylor Simpson)
10347cf9345cSTaylor Simpson
10357cf9345cSTaylor SimpsonDEF_MACRO(
10367cf9345cSTaylor Simpson    fASHIFTR,
10377cf9345cSTaylor Simpson    (fCAST##REGSTYPE##s(SRC) >> (SHAMT)),
10387cf9345cSTaylor Simpson    /* */
10397cf9345cSTaylor Simpson)
10407cf9345cSTaylor Simpson
10417cf9345cSTaylor SimpsonDEF_MACRO(
10427cf9345cSTaylor Simpson    fLSHIFTR,
10437cf9345cSTaylor Simpson    (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##u(SRC) >> (SHAMT))),
10447cf9345cSTaylor Simpson    /* */
10457cf9345cSTaylor Simpson)
10467cf9345cSTaylor Simpson
10477cf9345cSTaylor SimpsonDEF_MACRO(
10487cf9345cSTaylor Simpson    fROTL,
10497cf9345cSTaylor Simpson    (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) << (SHAMT)) | \
10507cf9345cSTaylor Simpson        ((fCAST##REGSTYPE##u(SRC) >> ((sizeof(SRC)*8)-(SHAMT)))))),
10517cf9345cSTaylor Simpson    /* */
10527cf9345cSTaylor Simpson)
10537cf9345cSTaylor Simpson
10547cf9345cSTaylor SimpsonDEF_MACRO(
10557cf9345cSTaylor Simpson    fROTR,
10567cf9345cSTaylor Simpson    (((SHAMT)==0) ? (SRC) : ((fCAST##REGSTYPE##u(SRC) >> (SHAMT)) | \
10577cf9345cSTaylor Simpson        ((fCAST##REGSTYPE##u(SRC) << ((sizeof(SRC)*8)-(SHAMT)))))),
10587cf9345cSTaylor Simpson    /* */
10597cf9345cSTaylor Simpson)
10607cf9345cSTaylor Simpson
10617cf9345cSTaylor SimpsonDEF_MACRO(
10627cf9345cSTaylor Simpson    fASHIFTL,
10637cf9345cSTaylor Simpson    (((SHAMT) >= 64)?0:(fCAST##REGSTYPE##s(SRC) << (SHAMT))),
10647cf9345cSTaylor Simpson    /* */
10657cf9345cSTaylor Simpson)
10667cf9345cSTaylor Simpson
10677cf9345cSTaylor Simpson/*************************************/
10687cf9345cSTaylor Simpson/* Floating-Point Support            */
10697cf9345cSTaylor Simpson/************************************/
10707cf9345cSTaylor Simpson
10717cf9345cSTaylor SimpsonDEF_MACRO(
10727cf9345cSTaylor Simpson    fFLOAT, /* name */
10737cf9345cSTaylor Simpson    ({ union { float f; size4u_t i; } _fipun; _fipun.i = (A); _fipun.f; }),     /* behavior */
10747cf9345cSTaylor Simpson    (A_FPOP)
10757cf9345cSTaylor Simpson)
10767cf9345cSTaylor Simpson
10777cf9345cSTaylor SimpsonDEF_MACRO(
10787cf9345cSTaylor Simpson    fUNFLOAT, /* multiply half integer */
10797cf9345cSTaylor Simpson    ({ union { float f; size4u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFU : _fipun.i; }),     /* behavior */
10807cf9345cSTaylor Simpson    (A_FPOP)
10817cf9345cSTaylor Simpson)
10827cf9345cSTaylor Simpson
10837cf9345cSTaylor SimpsonDEF_MACRO(
10847cf9345cSTaylor Simpson    fSFNANVAL,
10857cf9345cSTaylor Simpson    0xffffffff,
10867cf9345cSTaylor Simpson    ()
10877cf9345cSTaylor Simpson)
10887cf9345cSTaylor Simpson
10897cf9345cSTaylor SimpsonDEF_MACRO(
10907cf9345cSTaylor Simpson    fSFINFVAL,
10917cf9345cSTaylor Simpson    (((A) & 0x80000000) | 0x7f800000),
10927cf9345cSTaylor Simpson    ()
10937cf9345cSTaylor Simpson)
10947cf9345cSTaylor Simpson
10957cf9345cSTaylor SimpsonDEF_MACRO(
10967cf9345cSTaylor Simpson    fSFONEVAL,
10977cf9345cSTaylor Simpson    (((A) & 0x80000000) | fUNFLOAT(1.0)),
10987cf9345cSTaylor Simpson    ()
10997cf9345cSTaylor Simpson)
11007cf9345cSTaylor Simpson
11017cf9345cSTaylor SimpsonDEF_MACRO(
11027cf9345cSTaylor Simpson    fCHECKSFNAN,
11037cf9345cSTaylor Simpson    do {
11047cf9345cSTaylor Simpson        if (isnan(fFLOAT(A))) {
11057cf9345cSTaylor Simpson            if ((fGETBIT(22,A)) == 0) fRAISEFLAGS(FE_INVALID);
11067cf9345cSTaylor Simpson            DST = fSFNANVAL();
11077cf9345cSTaylor Simpson        }
11087cf9345cSTaylor Simpson    } while (0),
11097cf9345cSTaylor Simpson    ()
11107cf9345cSTaylor Simpson)
11117cf9345cSTaylor Simpson
11127cf9345cSTaylor SimpsonDEF_MACRO(
11137cf9345cSTaylor Simpson    fCHECKSFNAN3,
11147cf9345cSTaylor Simpson    do {
11157cf9345cSTaylor Simpson        fCHECKSFNAN(DST,A);
11167cf9345cSTaylor Simpson        fCHECKSFNAN(DST,B);
11177cf9345cSTaylor Simpson        fCHECKSFNAN(DST,C);
11187cf9345cSTaylor Simpson    } while (0),
11197cf9345cSTaylor Simpson    ()
11207cf9345cSTaylor Simpson)
11217cf9345cSTaylor Simpson
11227cf9345cSTaylor SimpsonDEF_MACRO(
11237cf9345cSTaylor Simpson    fSF_BIAS,
11247cf9345cSTaylor Simpson    127,
11257cf9345cSTaylor Simpson    ()
11267cf9345cSTaylor Simpson)
11277cf9345cSTaylor Simpson
11287cf9345cSTaylor SimpsonDEF_MACRO(
11297cf9345cSTaylor Simpson    fSF_MANTBITS,
11307cf9345cSTaylor Simpson    23,
11317cf9345cSTaylor Simpson    ()
11327cf9345cSTaylor Simpson)
11337cf9345cSTaylor Simpson
11347cf9345cSTaylor SimpsonDEF_MACRO(
11357cf9345cSTaylor Simpson    fSF_MUL_POW2,
11367cf9345cSTaylor Simpson    (fUNFLOAT(fFLOAT(A) * fFLOAT((fSF_BIAS() + (B)) << fSF_MANTBITS()))),
11377cf9345cSTaylor Simpson    ()
11387cf9345cSTaylor Simpson)
11397cf9345cSTaylor Simpson
11407cf9345cSTaylor SimpsonDEF_MACRO(
11417cf9345cSTaylor Simpson    fSF_GETEXP,
11427cf9345cSTaylor Simpson    (((A) >> fSF_MANTBITS()) & 0xff),
11437cf9345cSTaylor Simpson    ()
11447cf9345cSTaylor Simpson)
11457cf9345cSTaylor Simpson
11467cf9345cSTaylor SimpsonDEF_MACRO(
11477cf9345cSTaylor Simpson    fSF_MAXEXP,
11487cf9345cSTaylor Simpson    (254),
11497cf9345cSTaylor Simpson    ()
11507cf9345cSTaylor Simpson)
11517cf9345cSTaylor Simpson
11527cf9345cSTaylor SimpsonDEF_MACRO(
11537cf9345cSTaylor Simpson    fSF_RECIP_COMMON,
11547cf9345cSTaylor Simpson    arch_sf_recip_common(&N,&D,&O,&A),
11557cf9345cSTaylor Simpson    (A_FPOP)
11567cf9345cSTaylor Simpson)
11577cf9345cSTaylor Simpson
11587cf9345cSTaylor SimpsonDEF_MACRO(
11597cf9345cSTaylor Simpson    fSF_INVSQRT_COMMON,
11607cf9345cSTaylor Simpson    arch_sf_invsqrt_common(&N,&O,&A),
11617cf9345cSTaylor Simpson    (A_FPOP)
11627cf9345cSTaylor Simpson)
11637cf9345cSTaylor Simpson
11647cf9345cSTaylor SimpsonDEF_MACRO(
11657cf9345cSTaylor Simpson    fFMAFX,
11667cf9345cSTaylor Simpson    internal_fmafx(A,B,C,fSXTN(8,64,ADJ)),
11677cf9345cSTaylor Simpson    ()
11687cf9345cSTaylor Simpson)
11697cf9345cSTaylor Simpson
11707cf9345cSTaylor SimpsonDEF_MACRO(
11717cf9345cSTaylor Simpson    fFMAF,
11727cf9345cSTaylor Simpson    internal_fmafx(A,B,C,0),
11737cf9345cSTaylor Simpson    ()
11747cf9345cSTaylor Simpson)
11757cf9345cSTaylor Simpson
11767cf9345cSTaylor SimpsonDEF_MACRO(
11777cf9345cSTaylor Simpson    fSFMPY,
11787cf9345cSTaylor Simpson    internal_mpyf(A,B),
11797cf9345cSTaylor Simpson    ()
11807cf9345cSTaylor Simpson)
11817cf9345cSTaylor Simpson
11827cf9345cSTaylor SimpsonDEF_MACRO(
11837cf9345cSTaylor Simpson    fMAKESF,
11847cf9345cSTaylor Simpson    ((((SIGN) & 1) << 31) | (((EXP) & 0xff) << fSF_MANTBITS()) |
11857cf9345cSTaylor Simpson        ((MANT) & ((1<<fSF_MANTBITS())-1))),
11867cf9345cSTaylor Simpson    ()
11877cf9345cSTaylor Simpson)
11887cf9345cSTaylor Simpson
11897cf9345cSTaylor Simpson
11907cf9345cSTaylor SimpsonDEF_MACRO(
11917cf9345cSTaylor Simpson    fDOUBLE, /* multiply half integer */
11927cf9345cSTaylor Simpson    ({ union { double f; size8u_t i; } _fipun; _fipun.i = (A); _fipun.f; }),     /* behavior */
11937cf9345cSTaylor Simpson    (A_FPOP)
11947cf9345cSTaylor Simpson)
11957cf9345cSTaylor Simpson
11967cf9345cSTaylor SimpsonDEF_MACRO(
11977cf9345cSTaylor Simpson    fUNDOUBLE, /* multiply half integer */
11987cf9345cSTaylor Simpson    ({ union { double f; size8u_t i; } _fipun; _fipun.f = (A); isnan(_fipun.f) ? 0xFFFFFFFFFFFFFFFFULL : _fipun.i; }),     /* behavior */
11997cf9345cSTaylor Simpson    (A_FPOP)
12007cf9345cSTaylor Simpson)
12017cf9345cSTaylor Simpson
12027cf9345cSTaylor SimpsonDEF_MACRO(
12037cf9345cSTaylor Simpson    fDFNANVAL,
12047cf9345cSTaylor Simpson    0xffffffffffffffffULL,
12057cf9345cSTaylor Simpson    ()
12067cf9345cSTaylor Simpson)
12077cf9345cSTaylor Simpson
12087cf9345cSTaylor SimpsonDEF_MACRO(
12097cf9345cSTaylor Simpson    fDF_ISNORMAL,
12107cf9345cSTaylor Simpson    (fpclassify(fDOUBLE(X)) == FP_NORMAL),
12117cf9345cSTaylor Simpson    ()
12127cf9345cSTaylor Simpson)
12137cf9345cSTaylor Simpson
12147cf9345cSTaylor SimpsonDEF_MACRO(
12157cf9345cSTaylor Simpson    fDF_ISDENORM,
12167cf9345cSTaylor Simpson    (fpclassify(fDOUBLE(X)) == FP_SUBNORMAL),
12177cf9345cSTaylor Simpson    ()
12187cf9345cSTaylor Simpson)
12197cf9345cSTaylor Simpson
12207cf9345cSTaylor SimpsonDEF_MACRO(
12217cf9345cSTaylor Simpson    fDF_ISBIG,
12227cf9345cSTaylor Simpson    (fDF_GETEXP(X) >= 512),
12237cf9345cSTaylor Simpson    ()
12247cf9345cSTaylor Simpson)
12257cf9345cSTaylor Simpson
12267cf9345cSTaylor SimpsonDEF_MACRO(
12277cf9345cSTaylor Simpson    fDF_MANTBITS,
12287cf9345cSTaylor Simpson    52,
12297cf9345cSTaylor Simpson    ()
12307cf9345cSTaylor Simpson)
12317cf9345cSTaylor Simpson
12327cf9345cSTaylor SimpsonDEF_MACRO(
12337cf9345cSTaylor Simpson    fDF_GETEXP,
12347cf9345cSTaylor Simpson    (((A) >> fDF_MANTBITS()) & 0x7ff),
12357cf9345cSTaylor Simpson    ()
12367cf9345cSTaylor Simpson)
12377cf9345cSTaylor Simpson
12387cf9345cSTaylor SimpsonDEF_MACRO(
12397cf9345cSTaylor Simpson    fFMA,
12407cf9345cSTaylor Simpson    internal_fma(A,B,C),
12417cf9345cSTaylor Simpson    /* nothing */
12427cf9345cSTaylor Simpson)
12437cf9345cSTaylor Simpson
12447cf9345cSTaylor SimpsonDEF_MACRO(
12457cf9345cSTaylor Simpson    fDF_MPY_HH,
12467cf9345cSTaylor Simpson    internal_mpyhh(A,B,ACC),
12477cf9345cSTaylor Simpson    /* nothing */
12487cf9345cSTaylor Simpson)
12497cf9345cSTaylor Simpson
12507cf9345cSTaylor SimpsonDEF_MACRO(
12517cf9345cSTaylor Simpson    fFPOP_START,
12527cf9345cSTaylor Simpson    arch_fpop_start(thread),
12537cf9345cSTaylor Simpson    /* nothing */
12547cf9345cSTaylor Simpson)
12557cf9345cSTaylor Simpson
12567cf9345cSTaylor SimpsonDEF_MACRO(
12577cf9345cSTaylor Simpson    fFPOP_END,
12587cf9345cSTaylor Simpson    arch_fpop_end(thread),
12597cf9345cSTaylor Simpson    /* nothing */
12607cf9345cSTaylor Simpson)
12617cf9345cSTaylor Simpson
12627cf9345cSTaylor SimpsonDEF_MACRO(
12637cf9345cSTaylor Simpson    fFPSETROUND_NEAREST,
12647cf9345cSTaylor Simpson    fesetround(FE_TONEAREST),
12657cf9345cSTaylor Simpson    /* nothing */
12667cf9345cSTaylor Simpson)
12677cf9345cSTaylor Simpson
12687cf9345cSTaylor SimpsonDEF_MACRO(
12697cf9345cSTaylor Simpson    fFPSETROUND_CHOP,
12707cf9345cSTaylor Simpson    fesetround(FE_TOWARDZERO),
12717cf9345cSTaylor Simpson    /* nothing */
12727cf9345cSTaylor Simpson)
12737cf9345cSTaylor Simpson
12747cf9345cSTaylor SimpsonDEF_MACRO(
12757cf9345cSTaylor Simpson    fFPCANCELFLAGS,
12767cf9345cSTaylor Simpson    feclearexcept(FE_ALL_EXCEPT),
12777cf9345cSTaylor Simpson    /* nothing */
12787cf9345cSTaylor Simpson)
12797cf9345cSTaylor Simpson
12807cf9345cSTaylor SimpsonDEF_MACRO(
12817cf9345cSTaylor Simpson    fISINFPROD,
12827cf9345cSTaylor Simpson    ((isinf(A) && isinf(B)) ||
12837cf9345cSTaylor Simpson     (isinf(A) && isfinite(B) && ((B) != 0.0)) ||
12847cf9345cSTaylor Simpson     (isinf(B) && isfinite(A) && ((A) != 0.0))),
12857cf9345cSTaylor Simpson    /* nothing */
12867cf9345cSTaylor Simpson)
12877cf9345cSTaylor Simpson
12887cf9345cSTaylor SimpsonDEF_MACRO(
12897cf9345cSTaylor Simpson    fISZEROPROD,
12907cf9345cSTaylor Simpson    ((((A) == 0.0) && isfinite(B)) || (((B) == 0.0) && isfinite(A))),
12917cf9345cSTaylor Simpson    /* nothing */
12927cf9345cSTaylor Simpson)
12937cf9345cSTaylor Simpson
12947cf9345cSTaylor SimpsonDEF_MACRO(
12957cf9345cSTaylor Simpson    fRAISEFLAGS,
12967cf9345cSTaylor Simpson    arch_raise_fpflag(A),
12977cf9345cSTaylor Simpson    /* NOTHING */
12987cf9345cSTaylor Simpson)
12997cf9345cSTaylor Simpson
13007cf9345cSTaylor SimpsonDEF_MACRO(
13017cf9345cSTaylor Simpson    fDF_MAX,
13027cf9345cSTaylor Simpson    (((A)==(B))
13037cf9345cSTaylor Simpson    ? fDOUBLE(fUNDOUBLE(A) & fUNDOUBLE(B))
13047cf9345cSTaylor Simpson    : fmax(A,B)),
13057cf9345cSTaylor Simpson    (A_FPOP)
13067cf9345cSTaylor Simpson)
13077cf9345cSTaylor Simpson
13087cf9345cSTaylor SimpsonDEF_MACRO(
13097cf9345cSTaylor Simpson    fDF_MIN,
13107cf9345cSTaylor Simpson    (((A)==(B))
13117cf9345cSTaylor Simpson    ? fDOUBLE(fUNDOUBLE(A) | fUNDOUBLE(B))
13127cf9345cSTaylor Simpson    : fmin(A,B)),
13137cf9345cSTaylor Simpson    (A_FPOP)
13147cf9345cSTaylor Simpson)
13157cf9345cSTaylor Simpson
13167cf9345cSTaylor SimpsonDEF_MACRO(
13177cf9345cSTaylor Simpson    fSF_MAX,
13187cf9345cSTaylor Simpson    (((A)==(B))
13197cf9345cSTaylor Simpson    ? fFLOAT(fUNFLOAT(A) & fUNFLOAT(B))
13207cf9345cSTaylor Simpson    : fmaxf(A,B)),
13217cf9345cSTaylor Simpson    (A_FPOP)
13227cf9345cSTaylor Simpson)
13237cf9345cSTaylor Simpson
13247cf9345cSTaylor SimpsonDEF_MACRO(
13257cf9345cSTaylor Simpson    fSF_MIN,
13267cf9345cSTaylor Simpson    (((A)==(B))
13277cf9345cSTaylor Simpson    ? fFLOAT(fUNFLOAT(A) | fUNFLOAT(B))
13287cf9345cSTaylor Simpson    : fminf(A,B)),
13297cf9345cSTaylor Simpson    (A_FPOP)
13307cf9345cSTaylor Simpson)
13317cf9345cSTaylor Simpson
13327cf9345cSTaylor Simpson/*************************************/
13337cf9345cSTaylor Simpson/* Load/Store support                */
13347cf9345cSTaylor Simpson/*************************************/
13357cf9345cSTaylor Simpson
13367cf9345cSTaylor SimpsonDEF_MACRO(fLOAD,
13377cf9345cSTaylor Simpson    { DST = (size##SIZE##SIGN##_t)MEM_LOAD##SIZE(thread,EA,insn); },
13387cf9345cSTaylor Simpson    (A_LOAD,A_MEMLIKE)
13397cf9345cSTaylor Simpson)
13407cf9345cSTaylor Simpson
13417cf9345cSTaylor SimpsonDEF_MACRO(fMEMOP,
13427cf9345cSTaylor Simpson    { memop##SIZE##_##FNTYPE(thread,EA,VALUE); },
13437cf9345cSTaylor Simpson    (A_LOAD,A_STORE,A_MEMLIKE)
13447cf9345cSTaylor Simpson)
13457cf9345cSTaylor Simpson
13467cf9345cSTaylor SimpsonDEF_MACRO(fGET_FRAMEKEY,
13477cf9345cSTaylor Simpson    READ_RREG(REG_FRAMEKEY),
13487cf9345cSTaylor Simpson    ()
13497cf9345cSTaylor Simpson)
13507cf9345cSTaylor Simpson
13517cf9345cSTaylor SimpsonDEF_MACRO(fFRAME_SCRAMBLE,
13527cf9345cSTaylor Simpson    ((VAL) ^ (fCAST8u(fGET_FRAMEKEY()) << 32)),
13537cf9345cSTaylor Simpson    /* ATTRIBS */
13547cf9345cSTaylor Simpson)
13557cf9345cSTaylor Simpson
13567cf9345cSTaylor SimpsonDEF_MACRO(fFRAME_UNSCRAMBLE,
13577cf9345cSTaylor Simpson    fFRAME_SCRAMBLE(VAL),
13587cf9345cSTaylor Simpson    /* ATTRIBS */
13597cf9345cSTaylor Simpson)
13607cf9345cSTaylor Simpson
13617cf9345cSTaylor SimpsonDEF_MACRO(fFRAMECHECK,
13627cf9345cSTaylor Simpson    sys_check_framelimit(thread,ADDR,EA),
13637cf9345cSTaylor Simpson    ()
13647cf9345cSTaylor Simpson)
13657cf9345cSTaylor Simpson
13667cf9345cSTaylor SimpsonDEF_MACRO(fLOAD_LOCKED,
13677cf9345cSTaylor Simpson    {     DST = (size##SIZE##SIGN##_t)mem_load_locked(thread,EA,SIZE,insn); },
13687cf9345cSTaylor Simpson    (A_LOAD,A_MEMLIKE)
13697cf9345cSTaylor Simpson)
13707cf9345cSTaylor Simpson
13717cf9345cSTaylor SimpsonDEF_MACRO(fSTORE,
13727cf9345cSTaylor Simpson    { MEM_STORE##SIZE(thread,EA,SRC,insn); },
13737cf9345cSTaylor Simpson    (A_STORE,A_MEMLIKE)
13747cf9345cSTaylor Simpson)
13757cf9345cSTaylor Simpson
13767cf9345cSTaylor Simpson
13777cf9345cSTaylor SimpsonDEF_MACRO(fSTORE_LOCKED,
13787cf9345cSTaylor Simpson    { PRED = (mem_store_conditional(thread,EA,SRC,SIZE,insn) ? 0xff : 0); },
13797cf9345cSTaylor Simpson    (A_STORE,A_MEMLIKE)
13807cf9345cSTaylor Simpson)
13817cf9345cSTaylor Simpson
13827cf9345cSTaylor Simpson/*************************************/
13837cf9345cSTaylor Simpson/* Functions to help with bytes      */
13847cf9345cSTaylor Simpson/*************************************/
13857cf9345cSTaylor Simpson
13867cf9345cSTaylor SimpsonDEF_MACRO(fGETBYTE,
13877cf9345cSTaylor Simpson    ((size1s_t)((SRC>>((N)*8))&0xff)),
13887cf9345cSTaylor Simpson    /* nothing */
13897cf9345cSTaylor Simpson)
13907cf9345cSTaylor Simpson
13917cf9345cSTaylor SimpsonDEF_MACRO(fGETUBYTE,
13927cf9345cSTaylor Simpson    ((size1u_t)((SRC>>((N)*8))&0xff)),
13937cf9345cSTaylor Simpson    /* nothing */
13947cf9345cSTaylor Simpson)
13957cf9345cSTaylor Simpson
13967cf9345cSTaylor SimpsonDEF_MACRO(fSETBYTE,
13977cf9345cSTaylor Simpson    {
13987cf9345cSTaylor Simpson        DST = (DST & ~(0x0ffLL<<((N)*8))) | (((size8u_t)((VAL) & 0x0ffLL)) << ((N)*8));
13997cf9345cSTaylor Simpson    },
14007cf9345cSTaylor Simpson    /* nothing */
14017cf9345cSTaylor Simpson)
14027cf9345cSTaylor Simpson
14037cf9345cSTaylor SimpsonDEF_MACRO(fGETHALF,
14047cf9345cSTaylor Simpson    ((size2s_t)((SRC>>((N)*16))&0xffff)),
14057cf9345cSTaylor Simpson    /* nothing */
14067cf9345cSTaylor Simpson)
14077cf9345cSTaylor Simpson
14087cf9345cSTaylor SimpsonDEF_MACRO(fGETUHALF,
14097cf9345cSTaylor Simpson    ((size2u_t)((SRC>>((N)*16))&0xffff)),
14107cf9345cSTaylor Simpson    /* nothing */
14117cf9345cSTaylor Simpson)
14127cf9345cSTaylor Simpson
14137cf9345cSTaylor SimpsonDEF_MACRO(fSETHALF,
14147cf9345cSTaylor Simpson    {
14157cf9345cSTaylor Simpson        DST = (DST & ~(0x0ffffLL<<((N)*16))) | (((size8u_t)((VAL) & 0x0ffff)) << ((N)*16));
14167cf9345cSTaylor Simpson    },
14177cf9345cSTaylor Simpson    /* nothing */
14187cf9345cSTaylor Simpson)
14197cf9345cSTaylor Simpson
14207cf9345cSTaylor Simpson
14217cf9345cSTaylor Simpson
14227cf9345cSTaylor SimpsonDEF_MACRO(fGETWORD,
14237cf9345cSTaylor Simpson    ((size8s_t)((size4s_t)((SRC>>((N)*32))&0x0ffffffffLL))),
14247cf9345cSTaylor Simpson    /* nothing */
14257cf9345cSTaylor Simpson)
14267cf9345cSTaylor Simpson
14277cf9345cSTaylor SimpsonDEF_MACRO(fGETUWORD,
14287cf9345cSTaylor Simpson    ((size8u_t)((size4u_t)((SRC>>((N)*32))&0x0ffffffffLL))),
14297cf9345cSTaylor Simpson    /* nothing */
14307cf9345cSTaylor Simpson)
14317cf9345cSTaylor Simpson
14327cf9345cSTaylor SimpsonDEF_MACRO(fSETWORD,
14337cf9345cSTaylor Simpson    {
14347cf9345cSTaylor Simpson        DST = (DST & ~(0x0ffffffffLL<<((N)*32))) | (((VAL) & 0x0ffffffffLL) << ((N)*32));
14357cf9345cSTaylor Simpson    },
14367cf9345cSTaylor Simpson    /* nothing */
14377cf9345cSTaylor Simpson)
14387cf9345cSTaylor Simpson
14397cf9345cSTaylor SimpsonDEF_MACRO(fSETBIT,
14407cf9345cSTaylor Simpson    {
14417cf9345cSTaylor Simpson        DST = (DST & ~(1ULL<<(N))) | (((size8u_t)(VAL))<<(N));
14427cf9345cSTaylor Simpson    },
14437cf9345cSTaylor Simpson    /* nothing */
14447cf9345cSTaylor Simpson)
14457cf9345cSTaylor Simpson
14467cf9345cSTaylor SimpsonDEF_MACRO(fGETBIT,
14477cf9345cSTaylor Simpson    (((SRC)>>N)&1),
14487cf9345cSTaylor Simpson    /* nothing */
14497cf9345cSTaylor Simpson)
14507cf9345cSTaylor Simpson
14517cf9345cSTaylor Simpson
14527cf9345cSTaylor SimpsonDEF_MACRO(fSETBITS,
14537cf9345cSTaylor Simpson    do {
14547cf9345cSTaylor Simpson        int j;
14557cf9345cSTaylor Simpson        for (j=LO;j<=HI;j++) {
14567cf9345cSTaylor Simpson          fSETBIT(j,DST,VAL);
14577cf9345cSTaylor Simpson        }
14587cf9345cSTaylor Simpson    } while (0),
14597cf9345cSTaylor Simpson    /* nothing */
14607cf9345cSTaylor Simpson)
14617cf9345cSTaylor Simpson
14627cf9345cSTaylor Simpson/*************************************/
14637cf9345cSTaylor Simpson/* Used for parity, etc........      */
14647cf9345cSTaylor Simpson/*************************************/
1465e3d143e9STaylor SimpsonDEF_MACRO(fCOUNTONES_2,
1466e3d143e9STaylor Simpson    count_ones_2(VAL),
1467e3d143e9STaylor Simpson    /* nothing */
1468e3d143e9STaylor Simpson)
1469e3d143e9STaylor Simpson
14707cf9345cSTaylor SimpsonDEF_MACRO(fCOUNTONES_4,
14717cf9345cSTaylor Simpson    count_ones_4(VAL),
14727cf9345cSTaylor Simpson    /* nothing */
14737cf9345cSTaylor Simpson)
14747cf9345cSTaylor Simpson
14757cf9345cSTaylor SimpsonDEF_MACRO(fCOUNTONES_8,
14767cf9345cSTaylor Simpson    count_ones_8(VAL),
14777cf9345cSTaylor Simpson    /* nothing */
14787cf9345cSTaylor Simpson)
14797cf9345cSTaylor Simpson
14807cf9345cSTaylor SimpsonDEF_MACRO(fBREV_8,
14817cf9345cSTaylor Simpson    reverse_bits_8(VAL),
14827cf9345cSTaylor Simpson    /* nothing */
14837cf9345cSTaylor Simpson)
14847cf9345cSTaylor Simpson
14857cf9345cSTaylor SimpsonDEF_MACRO(fBREV_4,
14867cf9345cSTaylor Simpson    reverse_bits_4(VAL),
14877cf9345cSTaylor Simpson    /* nothing */
14887cf9345cSTaylor Simpson)
14897cf9345cSTaylor Simpson
14907cf9345cSTaylor SimpsonDEF_MACRO(fCL1_8,
14917cf9345cSTaylor Simpson    count_leading_ones_8(VAL),
14927cf9345cSTaylor Simpson    /* nothing */
14937cf9345cSTaylor Simpson)
14947cf9345cSTaylor Simpson
14957cf9345cSTaylor SimpsonDEF_MACRO(fCL1_4,
14967cf9345cSTaylor Simpson    count_leading_ones_4(VAL),
14977cf9345cSTaylor Simpson    /* nothing */
14987cf9345cSTaylor Simpson)
14997cf9345cSTaylor Simpson
1500e3d143e9STaylor SimpsonDEF_MACRO(fCL1_2,
1501e3d143e9STaylor Simpson    count_leading_ones_2(VAL),
1502e3d143e9STaylor Simpson    /* nothing */
1503e3d143e9STaylor Simpson)
1504e3d143e9STaylor Simpson
15057cf9345cSTaylor SimpsonDEF_MACRO(fINTERLEAVE,
15067cf9345cSTaylor Simpson    interleave(ODD,EVEN),
15077cf9345cSTaylor Simpson    /* nothing */
15087cf9345cSTaylor Simpson)
15097cf9345cSTaylor Simpson
15107cf9345cSTaylor SimpsonDEF_MACRO(fDEINTERLEAVE,
15117cf9345cSTaylor Simpson    deinterleave(MIXED),
15127cf9345cSTaylor Simpson    /* nothing */
15137cf9345cSTaylor Simpson)
15147cf9345cSTaylor Simpson
15157cf9345cSTaylor SimpsonDEF_MACRO(fHIDE,
15167cf9345cSTaylor Simpson    A,
15177cf9345cSTaylor Simpson    ()
15187cf9345cSTaylor Simpson)
15197cf9345cSTaylor Simpson
15207cf9345cSTaylor SimpsonDEF_MACRO(fCONSTLL,
15217cf9345cSTaylor Simpson    A##LL,
15227cf9345cSTaylor Simpson)
15237cf9345cSTaylor Simpson
15247cf9345cSTaylor Simpson/* Do the things in the parens, but don't print the parens. */
15257cf9345cSTaylor SimpsonDEF_MACRO(fECHO,
15267cf9345cSTaylor Simpson    (A),
15277cf9345cSTaylor Simpson    /* nothing */
15287cf9345cSTaylor Simpson)
15297cf9345cSTaylor Simpson
15307cf9345cSTaylor Simpson
15317cf9345cSTaylor Simpson/********************************************/
15327cf9345cSTaylor Simpson/* OS interface and stop/wait               */
15337cf9345cSTaylor Simpson/********************************************/
15347cf9345cSTaylor Simpson
15357cf9345cSTaylor SimpsonDEF_MACRO(fPAUSE,
15367cf9345cSTaylor Simpson    {sys_pause(thread, insn->slot, IMM);},
15377cf9345cSTaylor Simpson    ()
15387cf9345cSTaylor Simpson)
15397cf9345cSTaylor Simpson
15407cf9345cSTaylor SimpsonDEF_MACRO(fTRAP,
15417cf9345cSTaylor Simpson    warn("Trap NPC=%x ",fREAD_NPC());
15427cf9345cSTaylor Simpson    warn("Trap exception, PCYCLE=%lld TYPE=%d NPC=%x IMM=0x%x",thread->processor_ptr->pstats[pcycles],TRAPTYPE,fREAD_NPC(),IMM);
15437cf9345cSTaylor Simpson    register_trap_exception(thread,fREAD_NPC(),TRAPTYPE,IMM);,
15447cf9345cSTaylor Simpson    ()
15457cf9345cSTaylor Simpson)
15467cf9345cSTaylor Simpson
15477cf9345cSTaylor SimpsonDEF_MACRO(fALIGN_REG_FIELD_VALUE,
15487cf9345cSTaylor Simpson    ((VAL)<<reg_field_info[FIELD].offset),
15497cf9345cSTaylor Simpson    /* */
15507cf9345cSTaylor Simpson)
15517cf9345cSTaylor Simpson
15527cf9345cSTaylor SimpsonDEF_MACRO(fGET_REG_FIELD_MASK,
15537cf9345cSTaylor Simpson    (((1<<reg_field_info[FIELD].width)-1)<<reg_field_info[FIELD].offset),
15547cf9345cSTaylor Simpson    /* */
15557cf9345cSTaylor Simpson)
15567cf9345cSTaylor Simpson
15577cf9345cSTaylor SimpsonDEF_MACRO(fREAD_REG_FIELD,
15587cf9345cSTaylor Simpson    fEXTRACTU_BITS(thread->Regs[REG_##REG],
15597cf9345cSTaylor Simpson        reg_field_info[FIELD].width,
15607cf9345cSTaylor Simpson        reg_field_info[FIELD].offset),
15617cf9345cSTaylor Simpson    /* ATTRIBS */
15627cf9345cSTaylor Simpson)
15637cf9345cSTaylor Simpson
15647cf9345cSTaylor SimpsonDEF_MACRO(fGET_FIELD,
15657cf9345cSTaylor Simpson    fEXTRACTU_BITS(VAL,
15667cf9345cSTaylor Simpson        reg_field_info[FIELD].width,
15677cf9345cSTaylor Simpson        reg_field_info[FIELD].offset),
15687cf9345cSTaylor Simpson    /* ATTRIBS */
15697cf9345cSTaylor Simpson)
15707cf9345cSTaylor Simpson
15717cf9345cSTaylor SimpsonDEF_MACRO(fSET_FIELD,
15727cf9345cSTaylor Simpson    fINSERT_BITS(VAL,
15737cf9345cSTaylor Simpson        reg_field_info[FIELD].width,
15747cf9345cSTaylor Simpson        reg_field_info[FIELD].offset,
15757cf9345cSTaylor Simpson        (NEWVAL)),
15767cf9345cSTaylor Simpson    /* ATTRIBS */
15777cf9345cSTaylor Simpson)
15787cf9345cSTaylor Simpson
15797cf9345cSTaylor Simpson/********************************************/
15807cf9345cSTaylor Simpson/* Cache Management                         */
15817cf9345cSTaylor Simpson/********************************************/
15827cf9345cSTaylor Simpson
15837cf9345cSTaylor SimpsonDEF_MACRO(fBARRIER,
15847cf9345cSTaylor Simpson    {
15857cf9345cSTaylor Simpson        sys_barrier(thread, insn->slot);
15867cf9345cSTaylor Simpson    },
15877cf9345cSTaylor Simpson    ()
15887cf9345cSTaylor Simpson)
15897cf9345cSTaylor Simpson
15907cf9345cSTaylor SimpsonDEF_MACRO(fSYNCH,
15917cf9345cSTaylor Simpson    {
15927cf9345cSTaylor Simpson        sys_sync(thread, insn->slot);
15937cf9345cSTaylor Simpson    },
15947cf9345cSTaylor Simpson    ()
15957cf9345cSTaylor Simpson)
15967cf9345cSTaylor Simpson
15977cf9345cSTaylor SimpsonDEF_MACRO(fISYNC,
15987cf9345cSTaylor Simpson    {
15997cf9345cSTaylor Simpson        sys_isync(thread, insn->slot);
16007cf9345cSTaylor Simpson    },
16017cf9345cSTaylor Simpson    ()
16027cf9345cSTaylor Simpson)
16037cf9345cSTaylor Simpson
16047cf9345cSTaylor Simpson
16057cf9345cSTaylor SimpsonDEF_MACRO(fDCFETCH,
16067cf9345cSTaylor Simpson    sys_dcfetch(thread, (REG), insn->slot),
16077cf9345cSTaylor Simpson    (A_MEMLIKE)
16087cf9345cSTaylor Simpson)
16097cf9345cSTaylor Simpson
16107cf9345cSTaylor SimpsonDEF_MACRO(fICINVA,
16117cf9345cSTaylor Simpson    {
16127cf9345cSTaylor Simpson        arch_internal_flush(thread->processor_ptr, 0, 0xffffffff);
16137cf9345cSTaylor Simpson        sys_icinva(thread, (REG),insn->slot);
16147cf9345cSTaylor Simpson    },
16157cf9345cSTaylor Simpson    (A_ICINVA)
16167cf9345cSTaylor Simpson)
16177cf9345cSTaylor Simpson
16187cf9345cSTaylor SimpsonDEF_MACRO(fL2FETCH,
16197cf9345cSTaylor Simpson    sys_l2fetch(thread, ADDR,HEIGHT,WIDTH,STRIDE,FLAGS, insn->slot),
16207cf9345cSTaylor Simpson    (A_MEMLIKE,A_L2FETCH)
16217cf9345cSTaylor Simpson)
16227cf9345cSTaylor Simpson
16237cf9345cSTaylor SimpsonDEF_MACRO(fDCCLEANA,
16247cf9345cSTaylor Simpson    sys_dccleana(thread, (REG)),
16257cf9345cSTaylor Simpson    (A_MEMLIKE)
16267cf9345cSTaylor Simpson)
16277cf9345cSTaylor Simpson
16287cf9345cSTaylor SimpsonDEF_MACRO(fDCCLEANINVA,
16297cf9345cSTaylor Simpson    sys_dccleaninva(thread, (REG), insn->slot),
16307cf9345cSTaylor Simpson    (A_MEMLIKE,A_DCCLEANINVA)
16317cf9345cSTaylor Simpson)
16327cf9345cSTaylor Simpson
16337cf9345cSTaylor SimpsonDEF_MACRO(fDCZEROA,
16347cf9345cSTaylor Simpson    sys_dczeroa(thread, (REG)),
16357cf9345cSTaylor Simpson    (A_MEMLIKE)
16367cf9345cSTaylor Simpson)
16377cf9345cSTaylor Simpson
16387cf9345cSTaylor SimpsonDEF_MACRO(fCHECKFORPRIV,
16397cf9345cSTaylor Simpson    {sys_check_privs(thread); if (EXCEPTION_DETECTED) return; },
16407cf9345cSTaylor Simpson    ()
16417cf9345cSTaylor Simpson)
16427cf9345cSTaylor Simpson
16437cf9345cSTaylor SimpsonDEF_MACRO(fCHECKFORGUEST,
16447cf9345cSTaylor Simpson    {sys_check_guest(thread); if (EXCEPTION_DETECTED) return; },
16457cf9345cSTaylor Simpson    ()
16467cf9345cSTaylor Simpson)
16477cf9345cSTaylor Simpson
16487cf9345cSTaylor SimpsonDEF_MACRO(fBRANCH_SPECULATE_STALL,
16497cf9345cSTaylor Simpson    {
16507cf9345cSTaylor Simpson        sys_speculate_branch_stall(thread, insn->slot, JUMP_COND(JUMP_PRED_SET),
16517cf9345cSTaylor Simpson            SPEC_DIR,
16527cf9345cSTaylor Simpson            DOTNEWVAL,
16537cf9345cSTaylor Simpson            HINTBITNUM,
16547cf9345cSTaylor Simpson            STRBITNUM,
16557cf9345cSTaylor Simpson            0,
16567cf9345cSTaylor Simpson            thread->last_pkt->pkt_has_dual_jump,
16577cf9345cSTaylor Simpson            insn->is_2nd_jump,
16587cf9345cSTaylor Simpson            (thread->fetch_access.vaddr + insn->encoding_offset*4));
16597cf9345cSTaylor Simpson    },
16607cf9345cSTaylor Simpson    ()
16617cf9345cSTaylor Simpson)
1662e3d143e9STaylor Simpson
1663e3d143e9STaylor SimpsonDEF_MACRO(IV1DEAD,
1664e3d143e9STaylor Simpson    ,
1665e3d143e9STaylor Simpson    ()
1666e3d143e9STaylor Simpson)
1667