1*e3d143e9STaylor Simpson/* 2*e3d143e9STaylor Simpson * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved. 3*e3d143e9STaylor Simpson * 4*e3d143e9STaylor Simpson * This program is free software; you can redistribute it and/or modify 5*e3d143e9STaylor Simpson * it under the terms of the GNU General Public License as published by 6*e3d143e9STaylor Simpson * the Free Software Foundation; either version 2 of the License, or 7*e3d143e9STaylor Simpson * (at your option) any later version. 8*e3d143e9STaylor Simpson * 9*e3d143e9STaylor Simpson * This program is distributed in the hope that it will be useful, 10*e3d143e9STaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*e3d143e9STaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*e3d143e9STaylor Simpson * GNU General Public License for more details. 13*e3d143e9STaylor Simpson * 14*e3d143e9STaylor Simpson * You should have received a copy of the GNU General Public License 15*e3d143e9STaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>. 16*e3d143e9STaylor Simpson */ 17*e3d143e9STaylor Simpson 18*e3d143e9STaylor SimpsonDEF_MACRO(fDUMPQ, 19*e3d143e9STaylor Simpson do { 20*e3d143e9STaylor Simpson printf(STR ":" #REG ": 0x%016llx\n",REG.ud[0]); 21*e3d143e9STaylor Simpson } while (0), 22*e3d143e9STaylor Simpson () 23*e3d143e9STaylor Simpson) 24*e3d143e9STaylor Simpson 25*e3d143e9STaylor SimpsonDEF_MACRO(fUSE_LOOKUP_ADDRESS_BY_REV, 26*e3d143e9STaylor Simpson PROC->arch_proc_options->mmvec_use_full_va_for_lookup, 27*e3d143e9STaylor Simpson () 28*e3d143e9STaylor Simpson) 29*e3d143e9STaylor Simpson 30*e3d143e9STaylor SimpsonDEF_MACRO(fUSE_LOOKUP_ADDRESS, 31*e3d143e9STaylor Simpson 1, 32*e3d143e9STaylor Simpson () 33*e3d143e9STaylor Simpson) 34*e3d143e9STaylor Simpson 35*e3d143e9STaylor SimpsonDEF_MACRO(fNOTQ, 36*e3d143e9STaylor Simpson ({mmqreg_t _ret = {0}; int _i_; for (_i_ = 0; _i_ < fVECSIZE()/64; _i_++) _ret.ud[_i_] = ~VAL.ud[_i_]; _ret;}), 37*e3d143e9STaylor Simpson () 38*e3d143e9STaylor Simpson) 39*e3d143e9STaylor Simpson 40*e3d143e9STaylor SimpsonDEF_MACRO(fGETQBITS, 41*e3d143e9STaylor Simpson ((MASK) & (REG.w[(BITNO)>>5] >> ((BITNO) & 0x1f))), 42*e3d143e9STaylor Simpson () 43*e3d143e9STaylor Simpson) 44*e3d143e9STaylor Simpson 45*e3d143e9STaylor SimpsonDEF_MACRO(fGETQBIT, 46*e3d143e9STaylor Simpson fGETQBITS(REG,1,1,BITNO), 47*e3d143e9STaylor Simpson () 48*e3d143e9STaylor Simpson) 49*e3d143e9STaylor Simpson 50*e3d143e9STaylor SimpsonDEF_MACRO(fGENMASKW, 51*e3d143e9STaylor Simpson (((fGETQBIT(QREG,(IDX*4+0)) ? 0xFF : 0x0) << 0) 52*e3d143e9STaylor Simpson |((fGETQBIT(QREG,(IDX*4+1)) ? 0xFF : 0x0) << 8) 53*e3d143e9STaylor Simpson |((fGETQBIT(QREG,(IDX*4+2)) ? 0xFF : 0x0) << 16) 54*e3d143e9STaylor Simpson |((fGETQBIT(QREG,(IDX*4+3)) ? 0xFF : 0x0) << 24)), 55*e3d143e9STaylor Simpson () 56*e3d143e9STaylor Simpson) 57*e3d143e9STaylor SimpsonDEF_MACRO(fGET10BIT, 58*e3d143e9STaylor Simpson { 59*e3d143e9STaylor Simpson COE = (((((fGETUBYTE(3,VAL) >> (2 * POS)) & 3) << 8) | fGETUBYTE(POS,VAL)) << 6); 60*e3d143e9STaylor Simpson COE >>= 6; 61*e3d143e9STaylor Simpson }, 62*e3d143e9STaylor Simpson () 63*e3d143e9STaylor Simpson) 64*e3d143e9STaylor Simpson 65*e3d143e9STaylor SimpsonDEF_MACRO(fVMAX, 66*e3d143e9STaylor Simpson (X>Y) ? X : Y, 67*e3d143e9STaylor Simpson () 68*e3d143e9STaylor Simpson) 69*e3d143e9STaylor Simpson 70*e3d143e9STaylor Simpson 71*e3d143e9STaylor SimpsonDEF_MACRO(fGETNIBBLE, 72*e3d143e9STaylor Simpson ( fSXTN(4,8,(SRC >> (4*IDX)) & 0xF) ), 73*e3d143e9STaylor Simpson () 74*e3d143e9STaylor Simpson) 75*e3d143e9STaylor Simpson 76*e3d143e9STaylor SimpsonDEF_MACRO(fGETCRUMB, 77*e3d143e9STaylor Simpson ( fSXTN(2,8,(SRC >> (2*IDX)) & 0x3) ), 78*e3d143e9STaylor Simpson () 79*e3d143e9STaylor Simpson) 80*e3d143e9STaylor Simpson 81*e3d143e9STaylor SimpsonDEF_MACRO(fGETCRUMB_SYMMETRIC, 82*e3d143e9STaylor Simpson ( (fGETCRUMB(IDX,SRC)>=0 ? (2-fGETCRUMB(IDX,SRC)) : fGETCRUMB(IDX,SRC) ) ), 83*e3d143e9STaylor Simpson () 84*e3d143e9STaylor Simpson) 85*e3d143e9STaylor Simpson 86*e3d143e9STaylor Simpson#define ZERO_OFFSET_2B + 87*e3d143e9STaylor Simpson 88*e3d143e9STaylor SimpsonDEF_MACRO(fGENMASKH, 89*e3d143e9STaylor Simpson (((fGETQBIT(QREG,(IDX*2+0)) ? 0xFF : 0x0) << 0) 90*e3d143e9STaylor Simpson |((fGETQBIT(QREG,(IDX*2+1)) ? 0xFF : 0x0) << 8)), 91*e3d143e9STaylor Simpson () 92*e3d143e9STaylor Simpson) 93*e3d143e9STaylor Simpson 94*e3d143e9STaylor SimpsonDEF_MACRO(fGETMASKW, 95*e3d143e9STaylor Simpson (VREG.w[IDX] & fGENMASKW((QREG),IDX)), 96*e3d143e9STaylor Simpson () 97*e3d143e9STaylor Simpson) 98*e3d143e9STaylor Simpson 99*e3d143e9STaylor SimpsonDEF_MACRO(fGETMASKH, 100*e3d143e9STaylor Simpson (VREG.h[IDX] & fGENMASKH((QREG),IDX)), 101*e3d143e9STaylor Simpson () 102*e3d143e9STaylor Simpson) 103*e3d143e9STaylor Simpson 104*e3d143e9STaylor SimpsonDEF_MACRO(fCONDMASK8, 105*e3d143e9STaylor Simpson (fGETQBIT(QREG,IDX) ? (YESVAL) : (NOVAL)), 106*e3d143e9STaylor Simpson () 107*e3d143e9STaylor Simpson) 108*e3d143e9STaylor Simpson 109*e3d143e9STaylor SimpsonDEF_MACRO(fCONDMASK16, 110*e3d143e9STaylor Simpson ((fGENMASKH(QREG,IDX) & (YESVAL)) | (fGENMASKH(fNOTQ(QREG),IDX) & (NOVAL))), 111*e3d143e9STaylor Simpson () 112*e3d143e9STaylor Simpson) 113*e3d143e9STaylor Simpson 114*e3d143e9STaylor SimpsonDEF_MACRO(fCONDMASK32, 115*e3d143e9STaylor Simpson ((fGENMASKW(QREG,IDX) & (YESVAL)) | (fGENMASKW(fNOTQ(QREG),IDX) & (NOVAL))), 116*e3d143e9STaylor Simpson () 117*e3d143e9STaylor Simpson) 118*e3d143e9STaylor Simpson 119*e3d143e9STaylor Simpson 120*e3d143e9STaylor SimpsonDEF_MACRO(fSETQBITS, 121*e3d143e9STaylor Simpson do { 122*e3d143e9STaylor Simpson size4u_t __TMP = (VAL); 123*e3d143e9STaylor Simpson REG.w[(BITNO)>>5] &= ~((MASK) << ((BITNO) & 0x1f)); 124*e3d143e9STaylor Simpson REG.w[(BITNO)>>5] |= (((__TMP) & (MASK)) << ((BITNO) & 0x1f)); 125*e3d143e9STaylor Simpson } while (0), 126*e3d143e9STaylor Simpson () 127*e3d143e9STaylor Simpson) 128*e3d143e9STaylor Simpson 129*e3d143e9STaylor SimpsonDEF_MACRO(fSETQBIT, 130*e3d143e9STaylor Simpson fSETQBITS(REG,1,1,BITNO,VAL), 131*e3d143e9STaylor Simpson () 132*e3d143e9STaylor Simpson) 133*e3d143e9STaylor Simpson 134*e3d143e9STaylor SimpsonDEF_MACRO(fVBYTES, 135*e3d143e9STaylor Simpson (fVECSIZE()), 136*e3d143e9STaylor Simpson () 137*e3d143e9STaylor Simpson) 138*e3d143e9STaylor Simpson 139*e3d143e9STaylor SimpsonDEF_MACRO(fVHALVES, 140*e3d143e9STaylor Simpson (fVECSIZE()/2), 141*e3d143e9STaylor Simpson () 142*e3d143e9STaylor Simpson) 143*e3d143e9STaylor Simpson 144*e3d143e9STaylor SimpsonDEF_MACRO(fVWORDS, 145*e3d143e9STaylor Simpson (fVECSIZE()/4), 146*e3d143e9STaylor Simpson () 147*e3d143e9STaylor Simpson) 148*e3d143e9STaylor Simpson 149*e3d143e9STaylor SimpsonDEF_MACRO(fVDWORDS, 150*e3d143e9STaylor Simpson (fVECSIZE()/8), 151*e3d143e9STaylor Simpson () 152*e3d143e9STaylor Simpson) 153*e3d143e9STaylor Simpson 154*e3d143e9STaylor SimpsonDEF_MACRO(fVALIGN, 155*e3d143e9STaylor Simpson ( ADDR = ADDR & ~(LOG2_ALIGNMENT-1)), 156*e3d143e9STaylor Simpson () 157*e3d143e9STaylor Simpson) 158*e3d143e9STaylor Simpson 159*e3d143e9STaylor SimpsonDEF_MACRO(fVLASTBYTE, 160*e3d143e9STaylor Simpson ( ADDR = ADDR | (LOG2_ALIGNMENT-1)), 161*e3d143e9STaylor Simpson () 162*e3d143e9STaylor Simpson) 163*e3d143e9STaylor Simpson 164*e3d143e9STaylor Simpson 165*e3d143e9STaylor SimpsonDEF_MACRO(fVELEM, 166*e3d143e9STaylor Simpson ((fVECSIZE()*8)/WIDTH), 167*e3d143e9STaylor Simpson () 168*e3d143e9STaylor Simpson) 169*e3d143e9STaylor Simpson 170*e3d143e9STaylor SimpsonDEF_MACRO(fVECLOGSIZE, 171*e3d143e9STaylor Simpson (mmvec_current_veclogsize(thread)), 172*e3d143e9STaylor Simpson () 173*e3d143e9STaylor Simpson) 174*e3d143e9STaylor Simpson 175*e3d143e9STaylor SimpsonDEF_MACRO(fVECSIZE, 176*e3d143e9STaylor Simpson (1<<fVECLOGSIZE()), 177*e3d143e9STaylor Simpson () 178*e3d143e9STaylor Simpson) 179*e3d143e9STaylor Simpson 180*e3d143e9STaylor SimpsonDEF_MACRO(fSWAPB, 181*e3d143e9STaylor Simpson { 182*e3d143e9STaylor Simpson size1u_t tmp = A; 183*e3d143e9STaylor Simpson A = B; 184*e3d143e9STaylor Simpson B = tmp; 185*e3d143e9STaylor Simpson }, 186*e3d143e9STaylor Simpson /* NOTHING */ 187*e3d143e9STaylor Simpson) 188*e3d143e9STaylor Simpson 189*e3d143e9STaylor SimpsonDEF_MACRO( 190*e3d143e9STaylor Simpson fVZERO, 191*e3d143e9STaylor Simpson mmvec_zero_vector(), 192*e3d143e9STaylor Simpson () 193*e3d143e9STaylor Simpson) 194*e3d143e9STaylor Simpson 195*e3d143e9STaylor SimpsonDEF_MACRO( 196*e3d143e9STaylor Simpson fNEWVREG, 197*e3d143e9STaylor Simpson ((THREAD2STRUCT->VRegs_updated & (((VRegMask)1)<<VNUM)) ? THREAD2STRUCT->future_VRegs[VNUM] : mmvec_zero_vector()), 198*e3d143e9STaylor Simpson (A_DOTNEWVALUE,A_RESTRICT_SLOT0ONLY) 199*e3d143e9STaylor Simpson) 200*e3d143e9STaylor Simpson 201*e3d143e9STaylor SimpsonDEF_MACRO( 202*e3d143e9STaylor Simpson fV_AL_CHECK, 203*e3d143e9STaylor Simpson if ((EA) & (MASK)) { 204*e3d143e9STaylor Simpson warn("aligning misaligned vector. PC=%08x EA=%08x",thread->Regs[REG_PC],(EA)); 205*e3d143e9STaylor Simpson }, 206*e3d143e9STaylor Simpson () 207*e3d143e9STaylor Simpson) 208*e3d143e9STaylor SimpsonDEF_MACRO(fSCATTER_INIT, 209*e3d143e9STaylor Simpson { 210*e3d143e9STaylor Simpson mem_vector_scatter_init(thread, insn, REGION_START, LENGTH, ELEMENT_SIZE); 211*e3d143e9STaylor Simpson if (EXCEPTION_DETECTED) return; 212*e3d143e9STaylor Simpson }, 213*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE,A_RESTRICT_SLOT0ONLY) 214*e3d143e9STaylor Simpson) 215*e3d143e9STaylor Simpson 216*e3d143e9STaylor SimpsonDEF_MACRO(fGATHER_INIT, 217*e3d143e9STaylor Simpson { 218*e3d143e9STaylor Simpson mem_vector_gather_init(thread, insn, REGION_START, LENGTH, ELEMENT_SIZE); 219*e3d143e9STaylor Simpson if (EXCEPTION_DETECTED) return; 220*e3d143e9STaylor Simpson }, 221*e3d143e9STaylor Simpson (A_LOAD,A_MEMLIKE,A_RESTRICT_SLOT1ONLY) 222*e3d143e9STaylor Simpson) 223*e3d143e9STaylor Simpson 224*e3d143e9STaylor SimpsonDEF_MACRO(fSCATTER_FINISH, 225*e3d143e9STaylor Simpson { 226*e3d143e9STaylor Simpson if (EXCEPTION_DETECTED) return; 227*e3d143e9STaylor Simpson mem_vector_scatter_finish(thread, insn, OP); 228*e3d143e9STaylor Simpson }, 229*e3d143e9STaylor Simpson () 230*e3d143e9STaylor Simpson) 231*e3d143e9STaylor Simpson 232*e3d143e9STaylor SimpsonDEF_MACRO(fGATHER_FINISH, 233*e3d143e9STaylor Simpson { 234*e3d143e9STaylor Simpson if (EXCEPTION_DETECTED) return; 235*e3d143e9STaylor Simpson mem_vector_gather_finish(thread, insn); 236*e3d143e9STaylor Simpson }, 237*e3d143e9STaylor Simpson () 238*e3d143e9STaylor Simpson) 239*e3d143e9STaylor Simpson 240*e3d143e9STaylor Simpson 241*e3d143e9STaylor SimpsonDEF_MACRO(CHECK_VTCM_PAGE, 242*e3d143e9STaylor Simpson { 243*e3d143e9STaylor Simpson int slot = insn->slot; 244*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+OFFSET; 245*e3d143e9STaylor Simpson pa = pa & ~(ALIGNMENT-1); 246*e3d143e9STaylor Simpson FLAG = (pa < (thread->mem_access[slot].paddr+LENGTH)); 247*e3d143e9STaylor Simpson }, 248*e3d143e9STaylor Simpson () 249*e3d143e9STaylor Simpson) 250*e3d143e9STaylor SimpsonDEF_MACRO(COUNT_OUT_OF_BOUNDS, 251*e3d143e9STaylor Simpson { 252*e3d143e9STaylor Simpson if (!FLAG) 253*e3d143e9STaylor Simpson { 254*e3d143e9STaylor Simpson THREAD2STRUCT->vtcm_log.oob_access += SIZE; 255*e3d143e9STaylor Simpson warn("Scatter/Gather out of bounds of region"); 256*e3d143e9STaylor Simpson } 257*e3d143e9STaylor Simpson }, 258*e3d143e9STaylor Simpson () 259*e3d143e9STaylor Simpson) 260*e3d143e9STaylor Simpson 261*e3d143e9STaylor SimpsonDEF_MACRO(fLOG_SCATTER_OP, 262*e3d143e9STaylor Simpson { 263*e3d143e9STaylor Simpson // Log the size and indicate that the extension ext.c file needs to increment right before memory write 264*e3d143e9STaylor Simpson THREAD2STRUCT->vtcm_log.op = 1; 265*e3d143e9STaylor Simpson THREAD2STRUCT->vtcm_log.op_size = SIZE; 266*e3d143e9STaylor Simpson }, 267*e3d143e9STaylor Simpson () 268*e3d143e9STaylor Simpson) 269*e3d143e9STaylor Simpson 270*e3d143e9STaylor Simpson 271*e3d143e9STaylor Simpson 272*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_WORD_INCREMENT, 273*e3d143e9STaylor Simpson { 274*e3d143e9STaylor Simpson int slot = insn->slot; 275*e3d143e9STaylor Simpson int log_bank = 0; 276*e3d143e9STaylor Simpson int log_byte =0; 277*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+(OFFSET & ~(ALIGNMENT-1)); 278*e3d143e9STaylor Simpson paddr_t pa_high = thread->mem_access[slot].paddr+LEN; 279*e3d143e9STaylor Simpson for(int i0 = 0; i0 < 4; i0++) 280*e3d143e9STaylor Simpson { 281*e3d143e9STaylor Simpson log_byte = ((OFFSET>=0)&&((pa+i0)<=pa_high)); 282*e3d143e9STaylor Simpson log_bank |= (log_byte<<i0); 283*e3d143e9STaylor Simpson LOG_VTCM_BYTE(pa+i0,log_byte,INC.ub[4*IDX+i0],4*IDX+i0); 284*e3d143e9STaylor Simpson } 285*e3d143e9STaylor Simpson { LOG_VTCM_BANK(pa, log_bank, IDX); } 286*e3d143e9STaylor Simpson }, 287*e3d143e9STaylor Simpson () 288*e3d143e9STaylor Simpson) 289*e3d143e9STaylor Simpson 290*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORD_INCREMENT, 291*e3d143e9STaylor Simpson { 292*e3d143e9STaylor Simpson int slot = insn->slot; 293*e3d143e9STaylor Simpson int log_bank = 0; 294*e3d143e9STaylor Simpson int log_byte = 0; 295*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+(OFFSET & ~(ALIGNMENT-1)); 296*e3d143e9STaylor Simpson paddr_t pa_high = thread->mem_access[slot].paddr+LEN; 297*e3d143e9STaylor Simpson for(int i0 = 0; i0 < 2; i0++) { 298*e3d143e9STaylor Simpson log_byte = ((OFFSET>=0)&&((pa+i0)<=pa_high)); 299*e3d143e9STaylor Simpson log_bank |= (log_byte<<i0); 300*e3d143e9STaylor Simpson LOG_VTCM_BYTE(pa+i0,log_byte,INC.ub[2*IDX+i0],2*IDX+i0); 301*e3d143e9STaylor Simpson } 302*e3d143e9STaylor Simpson { LOG_VTCM_BANK(pa, log_bank,IDX); } 303*e3d143e9STaylor Simpson }, 304*e3d143e9STaylor Simpson () 305*e3d143e9STaylor Simpson) 306*e3d143e9STaylor Simpson 307*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORD_INCREMENT_DV, 308*e3d143e9STaylor Simpson { 309*e3d143e9STaylor Simpson int slot = insn->slot; 310*e3d143e9STaylor Simpson int log_bank = 0; 311*e3d143e9STaylor Simpson int log_byte = 0; 312*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+(OFFSET & ~(ALIGNMENT-1)); 313*e3d143e9STaylor Simpson paddr_t pa_high = thread->mem_access[slot].paddr+LEN; 314*e3d143e9STaylor Simpson for(int i0 = 0; i0 < 2; i0++) { 315*e3d143e9STaylor Simpson log_byte = ((OFFSET>=0)&&((pa+i0)<=pa_high)); 316*e3d143e9STaylor Simpson log_bank |= (log_byte<<i0); 317*e3d143e9STaylor Simpson LOG_VTCM_BYTE(pa+i0,log_byte,INC.ub[2*IDX+i0],2*IDX+i0); 318*e3d143e9STaylor Simpson } 319*e3d143e9STaylor Simpson { LOG_VTCM_BANK(pa, log_bank,(2*IDX2+IDX_H));} 320*e3d143e9STaylor Simpson }, 321*e3d143e9STaylor Simpson () 322*e3d143e9STaylor Simpson) 323*e3d143e9STaylor Simpson 324*e3d143e9STaylor Simpson 325*e3d143e9STaylor Simpson 326*e3d143e9STaylor SimpsonDEF_MACRO(GATHER_FUNCTION, 327*e3d143e9STaylor Simpson{ 328*e3d143e9STaylor Simpson int slot = insn->slot; 329*e3d143e9STaylor Simpson int i0; 330*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+OFFSET; 331*e3d143e9STaylor Simpson paddr_t pa_high = thread->mem_access[slot].paddr+LEN; 332*e3d143e9STaylor Simpson int log_bank = 0; 333*e3d143e9STaylor Simpson int log_byte = 0; 334*e3d143e9STaylor Simpson for(i0 = 0; i0 < ELEMENT_SIZE; i0++) 335*e3d143e9STaylor Simpson { 336*e3d143e9STaylor Simpson log_byte = ((OFFSET>=0)&&((pa+i0)<=pa_high)) && QVAL; 337*e3d143e9STaylor Simpson log_bank |= (log_byte<<i0); 338*e3d143e9STaylor Simpson size1u_t B = sim_mem_read1(thread->system_ptr, thread->threadId, thread->mem_access[slot].paddr+OFFSET+i0); 339*e3d143e9STaylor Simpson THREAD2STRUCT->tmp_VRegs[0].ub[ELEMENT_SIZE*IDX+i0] = B; 340*e3d143e9STaylor Simpson LOG_VTCM_BYTE(pa+i0,log_byte,B,ELEMENT_SIZE*IDX+i0); 341*e3d143e9STaylor Simpson } 342*e3d143e9STaylor Simpson LOG_VTCM_BANK(pa, log_bank,BANK_IDX); 343*e3d143e9STaylor Simpson}, 344*e3d143e9STaylor Simpson() 345*e3d143e9STaylor Simpson) 346*e3d143e9STaylor Simpson 347*e3d143e9STaylor Simpson 348*e3d143e9STaylor Simpson 349*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_WORD, 350*e3d143e9STaylor Simpson { 351*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 4, IDX, 1); 352*e3d143e9STaylor Simpson }, 353*e3d143e9STaylor Simpson () 354*e3d143e9STaylor Simpson) 355*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_HALFWORD, 356*e3d143e9STaylor Simpson { 357*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 2, IDX, 1); 358*e3d143e9STaylor Simpson }, 359*e3d143e9STaylor Simpson () 360*e3d143e9STaylor Simpson) 361*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_HALFWORD_DV, 362*e3d143e9STaylor Simpson { 363*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 2, (2*IDX2+IDX_H), 1); 364*e3d143e9STaylor Simpson }, 365*e3d143e9STaylor Simpson () 366*e3d143e9STaylor Simpson) 367*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_WORDQ, 368*e3d143e9STaylor Simpson { 369*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 4, IDX, fGETQBIT(QsV,4*IDX+i0)); 370*e3d143e9STaylor Simpson }, 371*e3d143e9STaylor Simpson () 372*e3d143e9STaylor Simpson) 373*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_HALFWORDQ, 374*e3d143e9STaylor Simpson { 375*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 2, IDX, fGETQBIT(QsV,2*IDX+i0)); 376*e3d143e9STaylor Simpson }, 377*e3d143e9STaylor Simpson () 378*e3d143e9STaylor Simpson) 379*e3d143e9STaylor Simpson 380*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_GATHER_HALFWORDQ_DV, 381*e3d143e9STaylor Simpson { 382*e3d143e9STaylor Simpson GATHER_FUNCTION(EA,OFFSET,IDX, LEN, 2, (2*IDX2+IDX_H), fGETQBIT(QsV,2*IDX+i0)); 383*e3d143e9STaylor Simpson }, 384*e3d143e9STaylor Simpson () 385*e3d143e9STaylor Simpson) 386*e3d143e9STaylor Simpson 387*e3d143e9STaylor Simpson 388*e3d143e9STaylor SimpsonDEF_MACRO(DEBUG_LOG_ADDR, 389*e3d143e9STaylor Simpson { 390*e3d143e9STaylor Simpson 391*e3d143e9STaylor Simpson if (thread->processor_ptr->arch_proc_options->mmvec_network_addr_log2) 392*e3d143e9STaylor Simpson { 393*e3d143e9STaylor Simpson 394*e3d143e9STaylor Simpson int slot = insn->slot; 395*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+OFFSET; 396*e3d143e9STaylor Simpson } 397*e3d143e9STaylor Simpson }, 398*e3d143e9STaylor Simpson () 399*e3d143e9STaylor Simpson) 400*e3d143e9STaylor Simpson 401*e3d143e9STaylor Simpson 402*e3d143e9STaylor Simpson 403*e3d143e9STaylor Simpson 404*e3d143e9STaylor Simpson 405*e3d143e9STaylor Simpson 406*e3d143e9STaylor Simpson 407*e3d143e9STaylor SimpsonDEF_MACRO(SCATTER_OP_WRITE_TO_MEM, 408*e3d143e9STaylor Simpson { 409*e3d143e9STaylor Simpson for (int i = 0; i < mmvecx->vtcm_log.size; i+=sizeof(TYPE)) 410*e3d143e9STaylor Simpson { 411*e3d143e9STaylor Simpson if ( mmvecx->vtcm_log.mask.ub[i] != 0) { 412*e3d143e9STaylor Simpson TYPE dst = 0; 413*e3d143e9STaylor Simpson TYPE inc = 0; 414*e3d143e9STaylor Simpson for(int j = 0; j < sizeof(TYPE); j++) { 415*e3d143e9STaylor Simpson dst |= (sim_mem_read1(thread->system_ptr, thread->threadId, mmvecx->vtcm_log.pa[i+j]) << (8*j)); 416*e3d143e9STaylor Simpson inc |= mmvecx->vtcm_log.data.ub[j+i] << (8*j); 417*e3d143e9STaylor Simpson 418*e3d143e9STaylor Simpson mmvecx->vtcm_log.mask.ub[j+i] = 0; 419*e3d143e9STaylor Simpson mmvecx->vtcm_log.data.ub[j+i] = 0; 420*e3d143e9STaylor Simpson mmvecx->vtcm_log.offsets.ub[j+i] = 0; 421*e3d143e9STaylor Simpson } 422*e3d143e9STaylor Simpson dst += inc; 423*e3d143e9STaylor Simpson for(int j = 0; j < sizeof(TYPE); j++) { 424*e3d143e9STaylor Simpson sim_mem_write1(thread->system_ptr,thread->threadId, mmvecx->vtcm_log.pa[i+j], (dst >> (8*j))& 0xFF ); 425*e3d143e9STaylor Simpson } 426*e3d143e9STaylor Simpson } 427*e3d143e9STaylor Simpson 428*e3d143e9STaylor Simpson } 429*e3d143e9STaylor Simpson }, 430*e3d143e9STaylor Simpson () 431*e3d143e9STaylor Simpson) 432*e3d143e9STaylor Simpson 433*e3d143e9STaylor SimpsonDEF_MACRO(SCATTER_FUNCTION, 434*e3d143e9STaylor Simpson{ 435*e3d143e9STaylor Simpson int slot = insn->slot; 436*e3d143e9STaylor Simpson int i0; 437*e3d143e9STaylor Simpson paddr_t pa = thread->mem_access[slot].paddr+OFFSET; 438*e3d143e9STaylor Simpson paddr_t pa_high = thread->mem_access[slot].paddr+LEN; 439*e3d143e9STaylor Simpson int log_bank = 0; 440*e3d143e9STaylor Simpson int log_byte = 0; 441*e3d143e9STaylor Simpson for(i0 = 0; i0 < ELEMENT_SIZE; i0++) { 442*e3d143e9STaylor Simpson log_byte = ((OFFSET>=0)&&((pa+i0)<=pa_high)) && QVAL; 443*e3d143e9STaylor Simpson log_bank |= (log_byte<<i0); 444*e3d143e9STaylor Simpson LOG_VTCM_BYTE(pa+i0,log_byte,IN.ub[ELEMENT_SIZE*IDX+i0],ELEMENT_SIZE*IDX+i0); 445*e3d143e9STaylor Simpson } 446*e3d143e9STaylor Simpson LOG_VTCM_BANK(pa, log_bank,BANK_IDX); 447*e3d143e9STaylor Simpson 448*e3d143e9STaylor Simpson}, 449*e3d143e9STaylor Simpson() 450*e3d143e9STaylor Simpson) 451*e3d143e9STaylor Simpson 452*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORD, 453*e3d143e9STaylor Simpson { 454*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 2, IDX, 1, IN); 455*e3d143e9STaylor Simpson }, 456*e3d143e9STaylor Simpson () 457*e3d143e9STaylor Simpson) 458*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_WORD, 459*e3d143e9STaylor Simpson { 460*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 4, IDX, 1, IN); 461*e3d143e9STaylor Simpson }, 462*e3d143e9STaylor Simpson () 463*e3d143e9STaylor Simpson) 464*e3d143e9STaylor Simpson 465*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORDQ, 466*e3d143e9STaylor Simpson { 467*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 2, IDX, fGETQBIT(QsV,2*IDX+i0), IN); 468*e3d143e9STaylor Simpson }, 469*e3d143e9STaylor Simpson () 470*e3d143e9STaylor Simpson) 471*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_WORDQ, 472*e3d143e9STaylor Simpson { 473*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 4, IDX, fGETQBIT(QsV,4*IDX+i0), IN); 474*e3d143e9STaylor Simpson }, 475*e3d143e9STaylor Simpson () 476*e3d143e9STaylor Simpson) 477*e3d143e9STaylor Simpson 478*e3d143e9STaylor Simpson 479*e3d143e9STaylor Simpson 480*e3d143e9STaylor Simpson 481*e3d143e9STaylor Simpson 482*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORD_DV, 483*e3d143e9STaylor Simpson { 484*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 2, (2*IDX2+IDX_H), 1, IN); 485*e3d143e9STaylor Simpson }, 486*e3d143e9STaylor Simpson () 487*e3d143e9STaylor Simpson) 488*e3d143e9STaylor Simpson 489*e3d143e9STaylor SimpsonDEF_MACRO(fVLOG_VTCM_HALFWORDQ_DV, 490*e3d143e9STaylor Simpson { 491*e3d143e9STaylor Simpson SCATTER_FUNCTION (EA,OFFSET,IDX, LEN, 2, (2*IDX2+IDX_H), fGETQBIT(QsV,2*IDX+i0), IN); 492*e3d143e9STaylor Simpson }, 493*e3d143e9STaylor Simpson () 494*e3d143e9STaylor Simpson) 495*e3d143e9STaylor Simpson 496*e3d143e9STaylor Simpson 497*e3d143e9STaylor Simpson 498*e3d143e9STaylor Simpson 499*e3d143e9STaylor Simpson 500*e3d143e9STaylor Simpson 501*e3d143e9STaylor SimpsonDEF_MACRO(fSTORERELEASE, 502*e3d143e9STaylor Simpson { 503*e3d143e9STaylor Simpson fV_AL_CHECK(EA,fVECSIZE()-1); 504*e3d143e9STaylor Simpson 505*e3d143e9STaylor Simpson mem_store_release(thread, insn, fVECSIZE(), EA&~(fVECSIZE()-1), EA, TYPE, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 506*e3d143e9STaylor Simpson }, 507*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 508*e3d143e9STaylor Simpson) 509*e3d143e9STaylor Simpson 510*e3d143e9STaylor SimpsonDEF_MACRO(fVFETCH_AL, 511*e3d143e9STaylor Simpson { 512*e3d143e9STaylor Simpson fV_AL_CHECK(EA,fVECSIZE()-1); 513*e3d143e9STaylor Simpson mem_fetch_vector(thread, insn, EA&~(fVECSIZE()-1), insn->slot, fVECSIZE()); 514*e3d143e9STaylor Simpson }, 515*e3d143e9STaylor Simpson (A_LOAD,A_MEMLIKE) 516*e3d143e9STaylor Simpson) 517*e3d143e9STaylor Simpson 518*e3d143e9STaylor Simpson 519*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMV_AL, 520*e3d143e9STaylor Simpson { 521*e3d143e9STaylor Simpson fV_AL_CHECK(EA,ALIGNMENT-1); 522*e3d143e9STaylor Simpson thread->last_pkt->double_access_vec = 0; 523*e3d143e9STaylor Simpson mem_load_vector_oddva(thread, insn, EA&~(ALIGNMENT-1), EA, insn->slot, LEN, &DST.ub[0], LEN, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 524*e3d143e9STaylor Simpson }, 525*e3d143e9STaylor Simpson (A_LOAD,A_MEMLIKE) 526*e3d143e9STaylor Simpson) 527*e3d143e9STaylor Simpson 528*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMV, 529*e3d143e9STaylor Simpson fLOADMMV_AL(EA,fVECSIZE(),fVECSIZE(),DST), 530*e3d143e9STaylor Simpson () 531*e3d143e9STaylor Simpson) 532*e3d143e9STaylor Simpson 533*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMVQ, 534*e3d143e9STaylor Simpson do { 535*e3d143e9STaylor Simpson int __i; 536*e3d143e9STaylor Simpson fLOADMMV_AL(EA,fVECSIZE(),fVECSIZE(),DST); 537*e3d143e9STaylor Simpson fVFOREACH(8,__i) if (!fGETQBIT(QVAL,__i)) DST.b[__i] = 0; 538*e3d143e9STaylor Simpson } while (0), 539*e3d143e9STaylor Simpson () 540*e3d143e9STaylor Simpson) 541*e3d143e9STaylor Simpson 542*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMVNQ, 543*e3d143e9STaylor Simpson do { 544*e3d143e9STaylor Simpson int __i; 545*e3d143e9STaylor Simpson fLOADMMV_AL(EA,fVECSIZE(),fVECSIZE(),DST); 546*e3d143e9STaylor Simpson fVFOREACH(8,__i) if (fGETQBIT(QVAL,__i)) DST.b[__i] = 0; 547*e3d143e9STaylor Simpson } while (0), 548*e3d143e9STaylor Simpson () 549*e3d143e9STaylor Simpson) 550*e3d143e9STaylor Simpson 551*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMVU_AL, 552*e3d143e9STaylor Simpson { 553*e3d143e9STaylor Simpson size4u_t size2 = (EA)&(ALIGNMENT-1); 554*e3d143e9STaylor Simpson size4u_t size1 = LEN-size2; 555*e3d143e9STaylor Simpson thread->last_pkt->double_access_vec = 1; 556*e3d143e9STaylor Simpson mem_load_vector_oddva(thread, insn, EA+size1, EA+fVECSIZE(), /* slot */ 1, size2, &DST.ub[size1], size2, fUSE_LOOKUP_ADDRESS()); 557*e3d143e9STaylor Simpson mem_load_vector_oddva(thread, insn, EA, EA,/* slot */ 0, size1, &DST.ub[0], size1, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 558*e3d143e9STaylor Simpson }, 559*e3d143e9STaylor Simpson (A_LOAD,A_MEMLIKE) 560*e3d143e9STaylor Simpson) 561*e3d143e9STaylor Simpson 562*e3d143e9STaylor SimpsonDEF_MACRO(fLOADMMVU, 563*e3d143e9STaylor Simpson { 564*e3d143e9STaylor Simpson /* if address happens to be aligned, only do aligned load */ 565*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vtcm_access = 0; 566*e3d143e9STaylor Simpson thread->last_pkt->pkt_access_count = 0; 567*e3d143e9STaylor Simpson if ( (EA & (fVECSIZE()-1)) == 0) { 568*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vmemu_access = 0; 569*e3d143e9STaylor Simpson thread->last_pkt->double_access = 0; 570*e3d143e9STaylor Simpson 571*e3d143e9STaylor Simpson fLOADMMV_AL(EA,fVECSIZE(),fVECSIZE(),DST); 572*e3d143e9STaylor Simpson } else { 573*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vmemu_access = 1; 574*e3d143e9STaylor Simpson thread->last_pkt->double_access = 1; 575*e3d143e9STaylor Simpson 576*e3d143e9STaylor Simpson fLOADMMVU_AL(EA,fVECSIZE(),fVECSIZE(),DST); 577*e3d143e9STaylor Simpson } 578*e3d143e9STaylor Simpson }, 579*e3d143e9STaylor Simpson () 580*e3d143e9STaylor Simpson) 581*e3d143e9STaylor Simpson 582*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMV_AL, 583*e3d143e9STaylor Simpson { 584*e3d143e9STaylor Simpson fV_AL_CHECK(EA,ALIGNMENT-1); 585*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA&~(ALIGNMENT-1), EA, insn->slot, LEN, &SRC.ub[0], 0, 0, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 586*e3d143e9STaylor Simpson }, 587*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 588*e3d143e9STaylor Simpson) 589*e3d143e9STaylor Simpson 590*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMV, 591*e3d143e9STaylor Simpson fSTOREMMV_AL(EA,fVECSIZE(),fVECSIZE(),SRC), 592*e3d143e9STaylor Simpson () 593*e3d143e9STaylor Simpson) 594*e3d143e9STaylor Simpson 595*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVQ_AL, 596*e3d143e9STaylor Simpson do { 597*e3d143e9STaylor Simpson mmvector_t maskvec; 598*e3d143e9STaylor Simpson int i; 599*e3d143e9STaylor Simpson for (i = 0; i < fVECSIZE(); i++) maskvec.ub[i] = fGETQBIT(MASK,i); 600*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA&~(ALIGNMENT-1), EA, insn->slot, LEN, &SRC.ub[0], &maskvec.ub[0], 0, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 601*e3d143e9STaylor Simpson } while (0), 602*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 603*e3d143e9STaylor Simpson) 604*e3d143e9STaylor Simpson 605*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVQ, 606*e3d143e9STaylor Simpson fSTOREMMVQ_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK), 607*e3d143e9STaylor Simpson () 608*e3d143e9STaylor Simpson) 609*e3d143e9STaylor Simpson 610*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVNQ_AL, 611*e3d143e9STaylor Simpson { 612*e3d143e9STaylor Simpson mmvector_t maskvec; 613*e3d143e9STaylor Simpson int i; 614*e3d143e9STaylor Simpson for (i = 0; i < fVECSIZE(); i++) maskvec.ub[i] = fGETQBIT(MASK,i); 615*e3d143e9STaylor Simpson fV_AL_CHECK(EA,ALIGNMENT-1); 616*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA&~(ALIGNMENT-1), EA, insn->slot, LEN, &SRC.ub[0], &maskvec.ub[0], 1, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 617*e3d143e9STaylor Simpson }, 618*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 619*e3d143e9STaylor Simpson) 620*e3d143e9STaylor Simpson 621*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVNQ, 622*e3d143e9STaylor Simpson fSTOREMMVNQ_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK), 623*e3d143e9STaylor Simpson () 624*e3d143e9STaylor Simpson) 625*e3d143e9STaylor Simpson 626*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVU_AL, 627*e3d143e9STaylor Simpson { 628*e3d143e9STaylor Simpson size4u_t size1 = ALIGNMENT-((EA)&(ALIGNMENT-1)); 629*e3d143e9STaylor Simpson size4u_t size2; 630*e3d143e9STaylor Simpson if (size1>LEN) size1 = LEN; 631*e3d143e9STaylor Simpson size2 = LEN-size1; 632*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA+size1, EA+fVECSIZE(), /* slot */ 1, size2, &SRC.ub[size1], 0, 0, fUSE_LOOKUP_ADDRESS()); 633*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA, EA, /* slot */ 0, size1, &SRC.ub[0], 0, 0, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 634*e3d143e9STaylor Simpson }, 635*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 636*e3d143e9STaylor Simpson) 637*e3d143e9STaylor Simpson 638*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVU, 639*e3d143e9STaylor Simpson { 640*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vtcm_access = 0; 641*e3d143e9STaylor Simpson thread->last_pkt->pkt_access_count = 0; 642*e3d143e9STaylor Simpson if ( (EA & (fVECSIZE()-1)) == 0) { 643*e3d143e9STaylor Simpson thread->last_pkt->double_access = 0; 644*e3d143e9STaylor Simpson fSTOREMMV_AL(EA,fVECSIZE(),fVECSIZE(),SRC); 645*e3d143e9STaylor Simpson } else { 646*e3d143e9STaylor Simpson thread->last_pkt->double_access = 1; 647*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vmemu_access = 1; 648*e3d143e9STaylor Simpson fSTOREMMVU_AL(EA,fVECSIZE(),fVECSIZE(),SRC); 649*e3d143e9STaylor Simpson } 650*e3d143e9STaylor Simpson }, 651*e3d143e9STaylor Simpson () 652*e3d143e9STaylor Simpson) 653*e3d143e9STaylor Simpson 654*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVQU_AL, 655*e3d143e9STaylor Simpson { 656*e3d143e9STaylor Simpson size4u_t size1 = ALIGNMENT-((EA)&(ALIGNMENT-1)); 657*e3d143e9STaylor Simpson size4u_t size2; 658*e3d143e9STaylor Simpson mmvector_t maskvec; 659*e3d143e9STaylor Simpson int i; 660*e3d143e9STaylor Simpson for (i = 0; i < fVECSIZE(); i++) maskvec.ub[i] = fGETQBIT(MASK,i); 661*e3d143e9STaylor Simpson if (size1>LEN) size1 = LEN; 662*e3d143e9STaylor Simpson size2 = LEN-size1; 663*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA+size1, EA+fVECSIZE(),/* slot */ 1, size2, &SRC.ub[size1], &maskvec.ub[size1], 0, fUSE_LOOKUP_ADDRESS()); 664*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA, /* slot */ 0, size1, &SRC.ub[0], &maskvec.ub[0], 0, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 665*e3d143e9STaylor Simpson }, 666*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 667*e3d143e9STaylor Simpson) 668*e3d143e9STaylor Simpson 669*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVQU, 670*e3d143e9STaylor Simpson { 671*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vtcm_access = 0; 672*e3d143e9STaylor Simpson thread->last_pkt->pkt_access_count = 0; 673*e3d143e9STaylor Simpson if ( (EA & (fVECSIZE()-1)) == 0) { 674*e3d143e9STaylor Simpson thread->last_pkt->double_access = 0; 675*e3d143e9STaylor Simpson fSTOREMMVQ_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK); 676*e3d143e9STaylor Simpson } else { 677*e3d143e9STaylor Simpson thread->last_pkt->double_access = 1; 678*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vmemu_access = 1; 679*e3d143e9STaylor Simpson fSTOREMMVQU_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK); 680*e3d143e9STaylor Simpson } 681*e3d143e9STaylor Simpson }, 682*e3d143e9STaylor Simpson () 683*e3d143e9STaylor Simpson) 684*e3d143e9STaylor Simpson 685*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVNQU_AL, 686*e3d143e9STaylor Simpson { 687*e3d143e9STaylor Simpson size4u_t size1 = ALIGNMENT-((EA)&(ALIGNMENT-1)); 688*e3d143e9STaylor Simpson size4u_t size2; 689*e3d143e9STaylor Simpson mmvector_t maskvec; 690*e3d143e9STaylor Simpson int i; 691*e3d143e9STaylor Simpson for (i = 0; i < fVECSIZE(); i++) maskvec.ub[i] = fGETQBIT(MASK,i); 692*e3d143e9STaylor Simpson if (size1>LEN) size1 = LEN; 693*e3d143e9STaylor Simpson size2 = LEN-size1; 694*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA+size1, EA+fVECSIZE(), /* slot */ 1, size2, &SRC.ub[size1], &maskvec.ub[size1], 1, fUSE_LOOKUP_ADDRESS()); 695*e3d143e9STaylor Simpson mem_store_vector_oddva(thread, insn, EA, EA, /* slot */ 0, size1, &SRC.ub[0], &maskvec.ub[0], 1, fUSE_LOOKUP_ADDRESS_BY_REV(thread->processor_ptr)); 696*e3d143e9STaylor Simpson }, 697*e3d143e9STaylor Simpson (A_STORE,A_MEMLIKE) 698*e3d143e9STaylor Simpson) 699*e3d143e9STaylor Simpson 700*e3d143e9STaylor SimpsonDEF_MACRO(fSTOREMMVNQU, 701*e3d143e9STaylor Simpson { 702*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vtcm_access = 0; 703*e3d143e9STaylor Simpson thread->last_pkt->pkt_access_count = 0; 704*e3d143e9STaylor Simpson if ( (EA & (fVECSIZE()-1)) == 0) { 705*e3d143e9STaylor Simpson thread->last_pkt->double_access = 0; 706*e3d143e9STaylor Simpson fSTOREMMVNQ_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK); 707*e3d143e9STaylor Simpson } else { 708*e3d143e9STaylor Simpson thread->last_pkt->double_access = 1; 709*e3d143e9STaylor Simpson thread->last_pkt->pkt_has_vmemu_access = 1; 710*e3d143e9STaylor Simpson fSTOREMMVNQU_AL(EA,fVECSIZE(),fVECSIZE(),SRC,MASK); 711*e3d143e9STaylor Simpson } 712*e3d143e9STaylor Simpson }, 713*e3d143e9STaylor Simpson () 714*e3d143e9STaylor Simpson) 715*e3d143e9STaylor Simpson 716*e3d143e9STaylor Simpson 717*e3d143e9STaylor Simpson 718*e3d143e9STaylor Simpson 719*e3d143e9STaylor SimpsonDEF_MACRO(fVFOREACH, 720*e3d143e9STaylor Simpson for (VAR = 0; VAR < fVELEM(WIDTH); VAR++), 721*e3d143e9STaylor Simpson /* NOTHING */ 722*e3d143e9STaylor Simpson) 723*e3d143e9STaylor Simpson 724*e3d143e9STaylor SimpsonDEF_MACRO(fVARRAY_ELEMENT_ACCESS, 725*e3d143e9STaylor Simpson ARRAY.v[(INDEX) / (fVECSIZE()/(sizeof(ARRAY.TYPE[0])))].TYPE[(INDEX) % (fVECSIZE()/(sizeof(ARRAY.TYPE[0])))], 726*e3d143e9STaylor Simpson () 727*e3d143e9STaylor Simpson) 728*e3d143e9STaylor Simpson 729*e3d143e9STaylor SimpsonDEF_MACRO(fVNEWCANCEL, 730*e3d143e9STaylor Simpson do { THREAD2STRUCT->VRegs_select &= ~(1<<(REGNUM)); } while (0), 731*e3d143e9STaylor Simpson () 732*e3d143e9STaylor Simpson) 733*e3d143e9STaylor Simpson 734*e3d143e9STaylor SimpsonDEF_MACRO(fTMPVDATA, 735*e3d143e9STaylor Simpson mmvec_vtmp_data(thread), 736*e3d143e9STaylor Simpson (A_CVI) 737*e3d143e9STaylor Simpson) 738*e3d143e9STaylor Simpson 739*e3d143e9STaylor SimpsonDEF_MACRO(fVSATDW, 740*e3d143e9STaylor Simpson fVSATW( ( ( ((long long)U)<<32 ) | fZXTN(32,64,V) ) ), 741*e3d143e9STaylor Simpson /* attribs */ 742*e3d143e9STaylor Simpson) 743*e3d143e9STaylor Simpson 744*e3d143e9STaylor SimpsonDEF_MACRO(fVASL_SATHI, 745*e3d143e9STaylor Simpson fVSATW(((U)<<1) | ((V)>>31)), 746*e3d143e9STaylor Simpson /* attribs */ 747*e3d143e9STaylor Simpson) 748*e3d143e9STaylor Simpson 749*e3d143e9STaylor SimpsonDEF_MACRO(fVUADDSAT, 750*e3d143e9STaylor Simpson fVSATUN( WIDTH, fZXTN(WIDTH, 2*WIDTH, U) + fZXTN(WIDTH, 2*WIDTH, V)), 751*e3d143e9STaylor Simpson /* attribs */ 752*e3d143e9STaylor Simpson) 753*e3d143e9STaylor Simpson 754*e3d143e9STaylor SimpsonDEF_MACRO(fVSADDSAT, 755*e3d143e9STaylor Simpson fVSATN( WIDTH, fSXTN(WIDTH, 2*WIDTH, U) + fSXTN(WIDTH, 2*WIDTH, V)), 756*e3d143e9STaylor Simpson /* attribs */ 757*e3d143e9STaylor Simpson) 758*e3d143e9STaylor Simpson 759*e3d143e9STaylor SimpsonDEF_MACRO(fVUSUBSAT, 760*e3d143e9STaylor Simpson fVSATUN( WIDTH, fZXTN(WIDTH, 2*WIDTH, U) - fZXTN(WIDTH, 2*WIDTH, V)), 761*e3d143e9STaylor Simpson /* attribs */ 762*e3d143e9STaylor Simpson) 763*e3d143e9STaylor Simpson 764*e3d143e9STaylor SimpsonDEF_MACRO(fVSSUBSAT, 765*e3d143e9STaylor Simpson fVSATN( WIDTH, fSXTN(WIDTH, 2*WIDTH, U) - fSXTN(WIDTH, 2*WIDTH, V)), 766*e3d143e9STaylor Simpson /* attribs */ 767*e3d143e9STaylor Simpson) 768*e3d143e9STaylor Simpson 769*e3d143e9STaylor SimpsonDEF_MACRO(fVAVGU, 770*e3d143e9STaylor Simpson ((fZXTN(WIDTH, 2*WIDTH, U) + fZXTN(WIDTH, 2*WIDTH, V))>>1), 771*e3d143e9STaylor Simpson /* attribs */ 772*e3d143e9STaylor Simpson) 773*e3d143e9STaylor Simpson 774*e3d143e9STaylor SimpsonDEF_MACRO(fVAVGURND, 775*e3d143e9STaylor Simpson ((fZXTN(WIDTH, 2*WIDTH, U) + fZXTN(WIDTH, 2*WIDTH, V)+1)>>1), 776*e3d143e9STaylor Simpson /* attribs */ 777*e3d143e9STaylor Simpson) 778*e3d143e9STaylor Simpson 779*e3d143e9STaylor SimpsonDEF_MACRO(fVNAVGU, 780*e3d143e9STaylor Simpson ((fZXTN(WIDTH, 2*WIDTH, U) - fZXTN(WIDTH, 2*WIDTH, V))>>1), 781*e3d143e9STaylor Simpson /* attribs */ 782*e3d143e9STaylor Simpson) 783*e3d143e9STaylor Simpson 784*e3d143e9STaylor SimpsonDEF_MACRO(fVNAVGURNDSAT, 785*e3d143e9STaylor Simpson fVSATUN(WIDTH,((fZXTN(WIDTH, 2*WIDTH, U) - fZXTN(WIDTH, 2*WIDTH, V)+1)>>1)), 786*e3d143e9STaylor Simpson /* attribs */ 787*e3d143e9STaylor Simpson) 788*e3d143e9STaylor Simpson 789*e3d143e9STaylor SimpsonDEF_MACRO(fVAVGS, 790*e3d143e9STaylor Simpson ((fSXTN(WIDTH, 2*WIDTH, U) + fSXTN(WIDTH, 2*WIDTH, V))>>1), 791*e3d143e9STaylor Simpson /* attribs */ 792*e3d143e9STaylor Simpson) 793*e3d143e9STaylor Simpson 794*e3d143e9STaylor SimpsonDEF_MACRO(fVAVGSRND, 795*e3d143e9STaylor Simpson ((fSXTN(WIDTH, 2*WIDTH, U) + fSXTN(WIDTH, 2*WIDTH, V)+1)>>1), 796*e3d143e9STaylor Simpson /* attribs */ 797*e3d143e9STaylor Simpson) 798*e3d143e9STaylor Simpson 799*e3d143e9STaylor SimpsonDEF_MACRO(fVNAVGS, 800*e3d143e9STaylor Simpson ((fSXTN(WIDTH, 2*WIDTH, U) - fSXTN(WIDTH, 2*WIDTH, V))>>1), 801*e3d143e9STaylor Simpson /* attribs */ 802*e3d143e9STaylor Simpson) 803*e3d143e9STaylor Simpson 804*e3d143e9STaylor SimpsonDEF_MACRO(fVNAVGSRND, 805*e3d143e9STaylor Simpson ((fSXTN(WIDTH, 2*WIDTH, U) - fSXTN(WIDTH, 2*WIDTH, V)+1)>>1), 806*e3d143e9STaylor Simpson /* attribs */ 807*e3d143e9STaylor Simpson) 808*e3d143e9STaylor Simpson 809*e3d143e9STaylor SimpsonDEF_MACRO(fVNAVGSRNDSAT, 810*e3d143e9STaylor Simpson fVSATN(WIDTH,((fSXTN(WIDTH, 2*WIDTH, U) - fSXTN(WIDTH, 2*WIDTH, V)+1)>>1)), 811*e3d143e9STaylor Simpson /* attribs */ 812*e3d143e9STaylor Simpson) 813*e3d143e9STaylor Simpson 814*e3d143e9STaylor Simpson 815*e3d143e9STaylor SimpsonDEF_MACRO(fVNOROUND, 816*e3d143e9STaylor Simpson VAL, 817*e3d143e9STaylor Simpson /* NOTHING */ 818*e3d143e9STaylor Simpson) 819*e3d143e9STaylor SimpsonDEF_MACRO(fVNOSAT, 820*e3d143e9STaylor Simpson VAL, 821*e3d143e9STaylor Simpson /* NOTHING */ 822*e3d143e9STaylor Simpson) 823*e3d143e9STaylor Simpson 824*e3d143e9STaylor SimpsonDEF_MACRO(fVROUND, 825*e3d143e9STaylor Simpson ((VAL) + (((SHAMT)>0)?(1LL<<((SHAMT)-1)):0)), 826*e3d143e9STaylor Simpson /* NOTHING */ 827*e3d143e9STaylor Simpson) 828*e3d143e9STaylor Simpson 829*e3d143e9STaylor SimpsonDEF_MACRO(fCARRY_FROM_ADD32, 830*e3d143e9STaylor Simpson (((fZXTN(32,64,A)+fZXTN(32,64,B)+C) >> 32) & 1), 831*e3d143e9STaylor Simpson /* NOTHING */ 832*e3d143e9STaylor Simpson) 833*e3d143e9STaylor Simpson 834*e3d143e9STaylor SimpsonDEF_MACRO(fUARCH_NOTE_PUMP_4X, 835*e3d143e9STaylor Simpson , 836*e3d143e9STaylor Simpson () 837*e3d143e9STaylor Simpson) 838*e3d143e9STaylor Simpson 839*e3d143e9STaylor SimpsonDEF_MACRO(fUARCH_NOTE_PUMP_2X, 840*e3d143e9STaylor Simpson , 841*e3d143e9STaylor Simpson () 842*e3d143e9STaylor Simpson) 843