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