28#ifndef GRID_ASM_BGQ_QPX_H
29#define GRID_ASM_BGQ_QPX_H
36#define VLOADf(OFF,PTR,DEST) "qvlfsux " #DEST "," #OFF "," #PTR ") ;\n"
37#define VLOADd(OFF,PTR,DEST) "qvlfdux " #DEST "," #OFF "," #PTR ") ;\n"
38#define VSTOREf(OFF,PTR,SRC) "qvstfsux " #SRC "," #OFF "," #PTR ") ;\n"
39#define VSTOREd(OFF,PTR,SRC) "qvstfdux " #SRC "," #OFF "," #PTR ") ;\n"
40#define VSPLATf(A,B,DEST) "qvlfcdxa " #A "," #B "," #DEST ";\n"
41#define VSPLATd(A,B,DEST) "qvlfcsxa " #A "," #B "," #DEST ";\n"
44#define VZERO(DEST) "qvfclr " #DEST "; \n"
45#define VONE (DEST) "qvfset " #DEST "; \n"
46#define VNEG (SRC,DEST) "qvfneg " #DEST "," #SRC "; \n"
47#define VMOV(A,DEST) "qvfmr " #DEST, "," #A ";\n"
49#define VADD(A,B,DEST) "qvfadd " #DEST "," #A "," #B ";\n"
50#define VSUB(A,B,DEST) "qvfsub " #DEST "," #A "," #B ";\n"
51#define VMUL(A,B,DEST) "qvfmul " #DEST "," #A "," #B ";\n"
52#define VMUL_RR_RI(A,B,DEST) "qvfxmul " #DEST "," #A "," #B ";\n"
53#define VMADD(A,B,C,DEST) "qvfmadd " #DEST "," #A "," #B ","#C ";\n"
54#define VMADD_RR_RI(A,B,C,DEST) "qvfxmadd " #DEST "," #A "," #B ","#C ";\n"
55#define VMADD_MII_IR(A,B,C,DEST) "qvfxxnpmadd " #DEST "," #A "," #B ","#C ";\n"
56#define VMADD_II_MIR(A,B,C,DEST) "qvfmadd " #DEST "," #A "," #B ","#C ";\n"
58#define CACHE_LOCK (PTR) asm (" dcbtls %%r0, %0 \n" : : "r" (PTR) );
59#define CACHE_UNLOCK(PTR) asm (" dcblc %%r0, %0 \n" : : "r" (PTR) );
60#define CACHE_FLUSH (PTR) asm (" dcbf %%r0, %0 \n" : : "r" (PTR) );
61#define CACHE_TOUCH (PTR) asm (" dcbt %%r0, %0 \n" : : "r" (PTR) );
67#define PREFETCH1_CHIMU(base)
68#define PREFETCH_CHIMU(base)
114#define Chimu_00 Chi_00
115#define Chimu_01 Chi_01
116#define Chimu_02 Chi_02
117#define Chimu_10 Chi_10
118#define Chimu_11 Chi_11
119#define Chimu_12 Chi_02
120#define Chimu_20 UChi_00
121#define Chimu_21 UChi_01
122#define Chimu_22 UChi_02
123#define Chimu_30 UChi_10
124#define Chimu_31 UChi_11
125#define Chimu_32 UChi_02
130#define LOCK_GAUGE(dir) \
132 uint8_t *byte_addr = (uint8_t *)&U[sU](dir); \
133 for(int i=0;i< 18*2*BYTES_PER_WORD*8;i+=32){ \
134 CACHE_LOCK(&byte_addr[i]); \
138#define UNLOCK_GAUGE(dir) \
140 uint8_t *byte_addr = (uint8_t *)&U[sU](dir); \
141 for(int i=0;i< 18*2*BYTES_PER_WORD*8;i+=32){ \
142 CACHE_UNLOCK(&byte_addr[i]); \
146#define MAYBEPERM(A,B)
153#define MULT_2SPIN_DIR_PFXP(A,p) MULT_2SPIN(&U[sU](A),p)
154#define MULT_2SPIN_DIR_PFYP(A,p) MULT_2SPIN(&U[sU](A),p)
155#define MULT_2SPIN_DIR_PFZP(A,p) MULT_2SPIN(&U[sU](A),p)
156#define MULT_2SPIN_DIR_PFTP(A,p) MULT_2SPIN(&U[sU](A),p)
157#define MULT_2SPIN_DIR_PFXM(A,p) MULT_2SPIN(&U[sU](A),p)
158#define MULT_2SPIN_DIR_PFYM(A,p) MULT_2SPIN(&U[sU](A),p)
159#define MULT_2SPIN_DIR_PFZM(A,p) MULT_2SPIN(&U[sU](A),p)
160#define MULT_2SPIN_DIR_PFTM(A,p) MULT_2SPIN(&U[sU](A),p)
162#define MULT_SPIN(ptr,p) { \
163 uint64_t ub = ((uint64_t)base); \
168 VMUL_RR_RI(U0,Chi_00,UChi_00) \
169 VMUL_RR_RI(U1,Chi_00,UChi_01) \
170 VMUL_RR_RI(U2,Chi_00,UChi_02) \
171 VMUL_RR_RI(U0,Chi_10,UChi_10) \
172 VMUL_RR_RI(U1,Chi_10,UChi_11) \
173 VMUL_RR_RI(U2,Chi_10,UChi_12) \
174 VMADD_MII_IR(U0,Chi_00,UChi_00,UChi_00) \
175 VMADD_MII_IR(U1,Chi_00,UChi_01,UChi_01) \
176 VMADD_MII_IR(U2,Chi_00,UChi_02,UChi_02) \
177 VMADD_MII_IR(U0,Chi_10,UChi_10,UChi_10) \
178 VMADD_MII_IR(U1,Chi_10,UChi_11,UChi_11) \
179 VMADD_MII_IR(U2,Chi_10,UChi_12,UChi_12) \
180 : : "r" (0), "r" (32*3), "r" (32*6), "r" (ub )); \
185 VMADD_RR_RI(U0,Chi_01,UChi_00,UChi_00) \
186 VMADD_RR_RI(U1,Chi_01,UChi_01,UChi_01) \
187 VMADD_RR_RI(U2,Chi_01,UChi_02,UChi_02) \
188 VMADD_RR_RI(U0,Chi_11,UChi_10,UChi_10) \
189 VMADD_RR_RI(U1,Chi_11,UChi_11,UChi_11) \
190 VMADD_RR_RI(U2,Chi_11,UChi_12,UChi_12) \
191 VMADD_MII_IR(U0,Chi_01,UChi_00,UChi_00) \
192 VMADD_MII_IR(U1,Chi_01,UChi_01,UChi_01) \
193 VMADD_MII_IR(U2,Chi_01,UChi_02,UChi_02) \
194 VMADD_MII_IR(U0,Chi_11,UChi_10,UChi_10) \
195 VMADD_MII_IR(U1,Chi_11,UChi_11,UChi_11) \
196 VMADD_MII_IR(U2,Chi_11,UChi_12,UChi_12) \
197 : : "r" (32), "r" (32*4), "r" (32*7), "r" (ub )); \
202 VMADD_RR_RI(U0,Chi_02,UChi_00,UChi_00) \
203 VMADD_RR_RI(U1,Chi_02,UChi_01,UChi_01) \
204 VMADD_RR_RI(U2,Chi_02,UChi_02,UChi_02) \
205 VMADD_RR_RI(U0,Chi_12,UChi_10,UChi_10) \
206 VMADD_RR_RI(U1,Chi_12,UChi_11,UChi_11) \
207 VMADD_RR_RI(U2,Chi_12,UChi_12,UChi_12) \
208 VMADD_MII_IR(U0,Chi_02,UChi_00,UChi_00) \
209 VMADD_MII_IR(U1,Chi_02,UChi_01,UChi_01) \
210 VMADD_MII_IR(U2,Chi_02,UChi_02,UChi_02) \
211 VMADD_MII_IR(U0,Chi_12,UChi_10,UChi_10) \
212 VMADD_MII_IR(U1,Chi_12,UChi_11,UChi_11) \
213 VMADD_MII_IR(U2,Chi_12,UChi_12,UChi_12) \
214 : : "r" (32*2), "r" (32*5), "r" (32*8), "r" (ub )); \
217#define SAVE_RESULT(base,basep) { \
218 uint64_t ub = ((uint64_t)base) - 32; \
219 asm("mr %0,"REP";\n\t" \
220 "li " IMM ",32;\n\t" \
221 VSTORE(IMM,REP,psi_00) \
222 VSTORE(IMM,REP,psi_01) \
223 VSTORE(IMM,REP,psi_02) \
224 VSTORE(IMM,REP,psi_10) \
225 VSTORE(IMM,REP,psi_11) \
226 VSTORE(IMM,REP,psi_12) \
227 VSTORE(IMM,REP,psi_20) \
228 VSTORE(IMM,REP,psi_21) \
229 VSTORE(IMM,REP,psi_22) \
230 VSTORE(IMM,REP,psi_30) \
231 VSTORE(IMM,REP,psi_31) \
232 VSTORE(IMM,REP,psi_32) \
240#define LOAD_CHI(base) { \
241 uint64_t ub = ((uint64_t)base) - 64; \
242 asm("mr %0,"REP";\n\t" \
243 "li " IMM ",64;\n\t" \
244 VLOAD(IMM,REP,Chi_00) \
245 VLOAD(IMM,REP,Chi_02) \
246 VLOAD(IMM,REP,Chi_11) : : "r" (ub) ); \
247 ub = ((uint64_t)base) - 32; \
248 asm("mr %0,"REP";\n\t" \
250 VLOAD(IMM,REP,Chimu_01) \
251 VLOAD(IMM,REP,Chimu_10) \
252 VLOAD(IMM,REP,Chimu_12) : : "r" (ub) ); \
255#define LOAD_CHIMU(base) { \
256 uint64_t ub = ((uint64_t)base) - 64; \
257 asm("mr %0,"REP";\n\t" \
259 VLOAD(IMM,REP,Chimu_00) \
260 VLOAD(IMM,REP,Chimu_02) \
261 VLOAD(IMM,REP,Chimu_11) \
262 VLOAD(IMM,REP,Chimu_20) \
263 VLOAD(IMM,REP,Chimu_22) \
264 VLOAD(IMM,REP,Chimu_31) : : "r" (ub) ); \
265 ub = ((uint64_t)base) - 32; \
266 asm("mr %0,"REP";\n\t" \
268 VLOAD(IMM,REP,Chimu_01) \
269 VLOAD(IMM,REP,Chimu_10) \
270 VLOAD(IMM,REP,Chimu_12) \
271 VLOAD(IMM,REP,Chimu_21) \
272 VLOAD(IMM,REP,Chimu_30) \
273 VLOAD(IMM,REP,Chimu_32) : : "r" (ub) ); \
278#define XP_PROJMEM(base) { \
282 VMADD_MII_IR(one,Chimu_30,Chimu_00,Chi_00) \
283 VMADD_MII_IR(one,Chimu_31,Chimu_01,Chi_01) \
284 VMADD_MII_IR(one,Chimu_32,Chimu_02,Chi_02) \
285 VMADD_MII_IR(one,Chimu_20,Chimu_10,Chi_10) \
286 VMADD_MII_IR(one,Chimu_21,Chimu_11,Chi_11) \
287 VMADD_MII_IR(one,Chimu_22,Chimu_12,Chi_12) \
291#define XM_PROJMEM(base) { \
295 VMADD_II_MIR(one,Chimu_30,Chimu_00,Chi_00) \
296 VMADD_II_MIR(one,Chimu_31,Chimu_01,Chi_01) \
297 VMADD_II_MIR(one,Chimu_32,Chimu_02,Chi_02) \
298 VMADD_II_MIR(one,Chimu_20,Chimu_10,Chi_10) \
299 VMADD_II_MIR(one,Chimu_21,Chimu_11,Chi_11) \
300 VMADD_II_MIR(one,Chimu_22,Chimu_12,Chi_12) \
306#define YP_PROJMEM(base) { \
309 VSUB(Chimu_00,Chimu_00,Chi_30) \
310 VSUB(Chimu_01,Chimu_01,Chi_31) \
311 VSUB(Chimu_02,Chimu_02,Chi_32) \
312 VADD(Chimu_10,Chimu_10,Chi_20) \
313 VADD(Chimu_11,Chimu_11,Chi_21) \
314 VADD(Chimu_12,Chimu_12,Chi_22) \
318#define YM_PROJMEM(base) { \
321 VADD(Chimu_00,Chimu_00,Chi_30) \
322 VADD(Chimu_01,Chimu_01,Chi_31) \
323 VADD(Chimu_02,Chimu_02,Chi_32) \
324 VSUB(Chimu_10,Chimu_10,Chi_20) \
325 VSUB(Chimu_11,Chimu_11,Chi_21) \
326 VSUB(Chimu_12,Chimu_12,Chi_22) \
336#define ZP_PROJMEM(base) { \
340 VMADD_MII_IR(one,Chimu_20,Chimu_00,Chi_00) \
341 VMADD_MII_IR(one,Chimu_21,Chimu_01,Chi_01) \
342 VMADD_MII_IR(one,Chimu_22,Chimu_02,Chi_02) \
343 VMADD_II_MIR(one,Chimu_30,Chimu_10,Chi_10) \
344 VMADD_II_MIR(one,Chimu_31,Chimu_11,Chi_11) \
345 VMADD_II_MIR(one,Chimu_32,Chimu_12,Chi_12) \
349#define ZM_PROJMEM(base) { \
353 VMADD_II_MIR(one,Chimu_20,Chimu_00,Chi_00) \
354 VMADD_II_MIR(one,Chimu_21,Chimu_01,Chi_01) \
355 VMADD_II_MIR(one,Chimu_22,Chimu_02,Chi_02) \
356 VMADD_MII_IR(one,Chimu_30,Chimu_10,Chi_10) \
357 VMADD_MII_IR(one,Chimu_31,Chimu_11,Chi_11) \
358 VMADD_MII_IR(one,Chimu_32,Chimu_12,Chi_12) \
367#define TP_PROJMEM(base) { \
370 VADD(Chimu_00,Chimu_00,Chi_20) \
371 VADD(Chimu_01,Chimu_01,Chi_21) \
372 VADD(Chimu_02,Chimu_02,Chi_22) \
373 VADD(Chimu_10,Chimu_10,Chi_30) \
374 VADD(Chimu_11,Chimu_11,Chi_31) \
375 VADD(Chimu_12,Chimu_12,Chi_32) \
379#define TM_PROJMEM(base) { \
382 VSUB(Chimu_00,Chimu_00,Chi_20) \
383 VSUB(Chimu_01,Chimu_01,Chi_21) \
384 VSUB(Chimu_02,Chimu_02,Chi_22) \
385 VSUB(Chimu_10,Chimu_10,Chi_30) \
386 VSUB(Chimu_11,Chimu_11,Chi_31) \
387 VSUB(Chimu_12,Chimu_12,Chi_32) \
405 VMOV(psi_00,UChi_00) VMOV(psi_01,UChi_01) VMOV(psi_02,UChi_02) \
406 VMOV(psi_10,UChi_10) VMOV(psi_11,UChi_11) VMOV(psi_12,UChi_12) \
407 VZERO(psi_20) VZERO(psi_21) VZERO(psi_22) \
408 VZERO(psi_30) VZERO(psi_31) VZERO(psi_32) \
409 VMADD_II_MIR(one,UChi_10,psi_20,psi_20) \
410 VMADD_II_MIR(one,UChi_11,psi_21,psi_21) \
411 VMADD_II_MIR(one,UChi_12,psi_22,psi_22) \
412 VMADD_II_MIR(one,UChi_00,psi_30,psi_30) \
413 VMADD_II_MIR(one,UChi_01,psi_31,psi_31) \
414 VMADD_II_MIR(one,UChi_02,psi_32,psi_32) \
421 VMOV(psi_00,UChi_00) VMOV(psi_01,UChi_01) VMOV(psi_02,UChi_02) \
422 VMOV(psi_10,UChi_10) VMOV(psi_11,UChi_11) VMOV(psi_12,UChi_12) \
423 VZERO(psi_20) VZERO(psi_21) VZERO(psi_22) \
424 VZERO(psi_30) VZERO(psi_31) VZERO(psi_32) \
425 VMADD_MII_IR(one,UChi_10,psi_20,psi_20) \
426 VMADD_MII_IR(one,UChi_11,psi_21,psi_21) \
427 VMADD_MII_IR(one,UChi_12,psi_22,psi_22) \
428 VMADD_MII_IR(one,UChi_00,psi_30,psi_30) \
429 VMADD_MII_IR(one,UChi_01,psi_31,psi_31) \
430 VMADD_MII_IR(one,UChi_02,psi_32,psi_32) \
434#define XP_RECON_ACCUM { \
437 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
438 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
439 VMADD_II_MIR(one,UChi_10,psi_20,psi_20) \
440 VMADD_II_MIR(one,UChi_11,psi_21,psi_21) \
441 VMADD_II_MIR(one,UChi_12,psi_22,psi_22) \
442 VMADD_II_MIR(one,UChi_00,psi_30,psi_30) \
443 VMADD_II_MIR(one,UChi_01,psi_31,psi_31) \
444 VMADD_II_MIR(one,UChi_02,psi_32,psi_32) \
448#define XM_RECON_ACCUM { \
451 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
452 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
453 VMADD_MII_IR(one,UChi_10,psi_20,psi_20) \
454 VMADD_MII_IR(one,UChi_11,psi_21,psi_21) \
455 VMADD_MII_IR(one,UChi_12,psi_22,psi_22) \
456 VMADD_MII_IR(one,UChi_00,psi_30,psi_30) \
457 VMADD_MII_IR(one,UChi_01,psi_31,psi_31) \
458 VMADD_MII_IR(one,UChi_02,psi_32,psi_32) \
464#define YP_RECON_ACCUM { \
466 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
467 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
468 VADD(psi_20,UChi_10,psi_20) VADD(psi_21,UChi_11,psi_21) VADD(psi_22,UChi_12,psi_22) \
469 VSUB(psi_30,UChi_00,psi_30) VSUB(psi_31,UChi_01,psi_31) VSUB(psi_32,UChi_02,psi_32) \
472#define YM_RECON_ACCUM { \
474 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
475 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
476 VSUB(psi_20,UChi_10,psi_20) VSUB(psi_21,UChi_11,psi_21) VSUB(psi_22,UChi_12,psi_22) \
477 VADD(psi_30,UChi_00,psi_30) VADD(psi_31,UChi_01,psi_31) VADD(psi_32,UChi_02,psi_32) \
483#define ZP_RECON_ACCUM { \
486 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
487 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
488 VMADD_II_MIR(one,UChi_00,psi_20,psi_20) \
489 VMADD_II_MIR(one,UChi_01,psi_21,psi_21) \
490 VMADD_II_MIR(one,UChi_02,psi_22,psi_22) \
491 VMADD_MII_IR(one,UChi_10,psi_30,psi_30) \
492 VMADD_MII_IR(one,UChi_11,psi_31,psi_31) \
493 VMADD_MII_IR(one,UChi_12,psi_32,psi_32) \
497#define ZM_RECON_ACCUM { \
500 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
501 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
502 VMADD_MII_IR(one,UChi_00,psi_20,psi_20) \
503 VMADD_MII_IR(one,UChi_01,psi_21,psi_21) \
504 VMADD_MII_IR(one,UChi_02,psi_22,psi_22) \
505 VMADD_II_MIR(one,UChi_10,psi_30,psi_30) \
506 VMADD_II_MIR(one,UChi_11,psi_31,psi_31) \
507 VMADD_II_MIR(one,UChi_12,psi_32,psi_32) \
513#define TP_RECON_ACCUM { \
515 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
516 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
517 VADD(psi_20,UChi_00,psi_20) VADD(psi_21,UChi_01,psi_21) VADD(psi_22,UChi_02,psi_22) \
518 VADD(psi_30,UChi_10,psi_30) VADD(psi_31,UChi_11,psi_31) VADD(psi_32,UChi_12,psi_32) \
522#define TM_RECON_ACCUM { \
525 VADD(psi_00,UChi_00,psi_00) VADD(psi_01,UChi_01,psi_01) VADD(psi_02,UChi_02,psi_02) \
526 VADD(psi_10,UChi_10,psi_10) VADD(psi_11,UChi_11,psi_11) VADD(psi_12,UChi_12,psi_12) \
527 VSUB(psi_20,UChi_00,psi_20) VSUB(psi_21,UChi_01,psi_21) VSUB(psi_22,UChi_02,psi_22) \
528 VSUB(psi_30,UChi_10,psi_30) VSUB(psi_31,UChi_11,psi_31) VSUB(psi_32,UChi_12,psi_32) \
535#define COMPLEX_TYPE int;
543 const uint64_t
plocal =(uint64_t) & in[0];
552 for(
int site=0;site<
Ns;site++) {
557 for(
int s=0;s<Ls;s++) {
678 basep= (uint64_t) &out[ss];
773 base= (uint64_t) &out[ss];
uint64_t GetPFInfo(int nent, int plocal)
#define MULT_2SPIN_DIR_PFTP(A, p)
#define SAVE_RESULT(base, basep)
#define MULT_2SPIN_DIR_PFXM(A, p)
#define MULT_2SPIN_DIR_PFYM(A, p)
#define MULT_2SPIN_DIR_PFZM(A, p)
#define MULT_2SPIN_DIR_PFZP(A, p)
#define PREFETCH_CHIMU(base)
#define PREFETCH1_CHIMU(base)
#define MULT_2SPIN_DIR_PFTM(A, p)
#define MULT_2SPIN_DIR_PFXP(A, p)
#define MULT_2SPIN_DIR_PFYP(A, p)
uint64_t GetInfo(int ptype, int local, int perm, int Xp, int ent, int plocal)
void testme(int osites, int ssU)