xref: /qemu/target/hexagon/imported/mmvec/macros.def (revision c88da1f3dac9681b29a0d23016a7acbbc2c8c517)
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