Skip to content

Commit 95af2bc

Browse files
authored
JIT: ARM64 SVE format encodings, SVE_HY_3A to SVE_IB_3A (#98468)
* Initial format work for prf* instructions * Formats done * Forgot to add CONST14 * Feedback * Feedback * Fix build * Fix the merge. Small cleanup. * Formatting
1 parent 6a468fe commit 95af2bc

File tree

6 files changed

+907
-13
lines changed

6 files changed

+907
-13
lines changed

src/coreclr/jit/codegenarm64test.cpp

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7599,6 +7599,117 @@ void CodeGen::genArm64EmitterUnitTestsSve()
75997599
theEmitter->emitIns_R_R_I(INS_sve_str, EA_SCALABLE, REG_V2, REG_R3, 255, INS_OPTS_NONE,
76007600
INS_SCALABLE_OPTS_UNPREDICATED);
76017601

7602+
// IF_SVE_HY_3A
7603+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_R2, REG_V3,
7604+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7605+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P6, REG_R5, REG_V4,
7606+
INS_OPTS_SCALABLE_S_UXTW,
7607+
INS_SCALABLE_OPTS_MOD_N); // PRFD <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod> #3]
7608+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_R8, REG_V9,
7609+
INS_OPTS_SCALABLE_S_SXTW,
7610+
INS_SCALABLE_OPTS_MOD_N); // PRFH <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod> #1]
7611+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_R2, REG_V1,
7612+
INS_OPTS_SCALABLE_S_UXTW,
7613+
INS_SCALABLE_OPTS_MOD_N); // PRFW <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod> #2]
7614+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1STRM, REG_P1, REG_R2, REG_V3,
7615+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7616+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL2KEEP, REG_P1, REG_R2, REG_V3,
7617+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7618+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL2STRM, REG_P1, REG_R2, REG_V3,
7619+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7620+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL3KEEP, REG_P1, REG_R2, REG_V3,
7621+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7622+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL3STRM, REG_P1, REG_R2, REG_V3,
7623+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7624+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL1KEEP, REG_P1, REG_R2, REG_V3,
7625+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7626+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL1STRM, REG_P1, REG_R2, REG_V3,
7627+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7628+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL2KEEP, REG_P1, REG_R2, REG_V3,
7629+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7630+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL2STRM, REG_P1, REG_R2, REG_V3,
7631+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7632+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL3KEEP, REG_P1, REG_R2, REG_V3,
7633+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7634+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PSTL3STRM, REG_P1, REG_R2, REG_V3,
7635+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7636+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_CONST6, REG_P1, REG_R2, REG_V3,
7637+
INS_OPTS_SCALABLE_S_SXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7638+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_CONST7, REG_P1, REG_R2, REG_V3,
7639+
INS_OPTS_SCALABLE_S_SXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7640+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_CONST14, REG_P1, REG_R2, REG_V3,
7641+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7642+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_CONST15, REG_P1, REG_R2, REG_V3,
7643+
INS_OPTS_SCALABLE_S_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.S, <mod>]
7644+
7645+
// IF_SVE_HY_3A_A
7646+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_R2, REG_V3,
7647+
INS_OPTS_SCALABLE_D_UXTW); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, <mod>]
7648+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P6, REG_R5, REG_V4,
7649+
INS_OPTS_SCALABLE_D_UXTW,
7650+
INS_SCALABLE_OPTS_MOD_N); // PRFD <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, <mod> #3]
7651+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_R8, REG_V9,
7652+
INS_OPTS_SCALABLE_D_SXTW,
7653+
INS_SCALABLE_OPTS_MOD_N); // PRFH <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, <mod> #1]
7654+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_R2, REG_V1,
7655+
INS_OPTS_SCALABLE_D_UXTW,
7656+
INS_SCALABLE_OPTS_MOD_N); // PRFW <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, <mod> #2]
7657+
7658+
// IF_SVE_HY_3B
7659+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_R1, REG_V2,
7660+
INS_OPTS_SCALABLE_D); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Zm>.D]
7661+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_R4, REG_V3,
7662+
INS_OPTS_SCALABLE_D,
7663+
INS_SCALABLE_OPTS_LSL_N); // PRFD <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, LSL #3]
7664+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P6, REG_R5, REG_V4,
7665+
INS_OPTS_SCALABLE_D,
7666+
INS_SCALABLE_OPTS_LSL_N); // PRFH <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, LSL #1]
7667+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P3, REG_R2, REG_V1,
7668+
INS_OPTS_SCALABLE_D,
7669+
INS_SCALABLE_OPTS_LSL_N); // PRFW <prfop>, <Pg>, [<Xn|SP>, <Zm>.D, LSL #2]
7670+
7671+
// IF_SVE_HZ_2A_B
7672+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_V2, 0,
7673+
INS_OPTS_SCALABLE_S); // PRFB <prfop>, <Pg>, [<Zn>.S{, #<imm>}]
7674+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P4, REG_V3, 248,
7675+
INS_OPTS_SCALABLE_S); // PRFD <prfop>, <Pg>, [<Zn>.S{, #<imm>}]
7676+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_V4, 62,
7677+
INS_OPTS_SCALABLE_S); // PRFH <prfop>, <Pg>, [<Zn>.S{, #<imm>}]
7678+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_V5, 124,
7679+
INS_OPTS_SCALABLE_S); // PRFW <prfop>, <Pg>, [<Zn>.S{, #<imm>}]
7680+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_V2, 31,
7681+
INS_OPTS_SCALABLE_D); // PRFB <prfop>, <Pg>, [<Zn>.D{, #<imm>}]
7682+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P4, REG_V3, 248,
7683+
INS_OPTS_SCALABLE_D); // PRFD <prfop>, <Pg>, [<Zn>.D{, #<imm>}]
7684+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_V4, 62,
7685+
INS_OPTS_SCALABLE_D); // PRFH <prfop>, <Pg>, [<Zn>.D{, #<imm>}]
7686+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_V5, 124,
7687+
INS_OPTS_SCALABLE_D); // PRFW <prfop>, <Pg>, [<Zn>.D{, #<imm>}]
7688+
7689+
// IF_SVE_IA_2A
7690+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P2, REG_R3,
7691+
-32); // PRFB <prfop>, <Pg>, [<Xn|SP>{, #<imm>, MUL VL}]
7692+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_R4,
7693+
31); // PRFD <prfop>, <Pg>, [<Xn|SP>{, #<imm>, MUL VL}]
7694+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P1, REG_R2,
7695+
0); // PRFH <prfop>, <Pg>, [<Xn|SP>{, #<imm>, MUL VL}]
7696+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_R5,
7697+
-32); // PRFW <prfop>, <Pg>, [<Xn|SP>{, #<imm>, MUL VL}]
7698+
theEmitter->emitIns_PRFOP_R_R_I(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P2, REG_R3,
7699+
17); // PRFB <prfop>, <Pg>, [<Xn|SP>{, #<imm>, MUL VL}]
7700+
7701+
// IF_SVE_IB_3A
7702+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfb, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P0, REG_R1,
7703+
REG_R2); // PRFB <prfop>, <Pg>, [<Xn|SP>, <Xm>]
7704+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfd, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P5, REG_R4, REG_R3,
7705+
INS_OPTS_NONE,
7706+
INS_SCALABLE_OPTS_LSL_N); // PRFD <prfop>, <Pg>, [<Xn|SP>, <Xm>, LSL #3]
7707+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfh, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P6, REG_R7, REG_R8,
7708+
INS_OPTS_NONE,
7709+
INS_SCALABLE_OPTS_LSL_N); // PRFH <prfop>, <Pg>, [<Xn|SP>, <Xm>, LSL #1]
7710+
theEmitter->emitIns_PRFOP_R_R_R(INS_sve_prfw, EA_SCALABLE, SVE_PRFOP_PLDL1KEEP, REG_P7, REG_R1, REG_R9,
7711+
INS_OPTS_NONE,
7712+
INS_SCALABLE_OPTS_LSL_N); // PRFW <prfop>, <Pg>, [<Xn|SP>, <Xm>, LSL #2]
76027713
// IF_SVE_HX_3A_B
76037714
theEmitter->emitIns_R_R_R_I(INS_sve_ld1b, EA_SCALABLE, REG_V0, REG_P0, REG_V1, 0,
76047715
INS_OPTS_SCALABLE_S); // LD1B {<Zt>.S }, <Pg>/Z, [<Zn>.S{, #<imm>}]

src/coreclr/jit/emit.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,16 @@ class emitter
14781478
assert(!idIsSmallDsc());
14791479
idAddr()->_idSvePattern = idSvePattern;
14801480
}
1481+
insSvePrfop idSvePrfop() const
1482+
{
1483+
assert(!idIsSmallDsc());
1484+
return (insSvePrfop)(idAddr()->_idReg4);
1485+
}
1486+
void idSvePrfop(insSvePrfop idSvePrfop)
1487+
{
1488+
assert(!idIsSmallDsc());
1489+
idAddr()->_idReg4 = (regNumber)idSvePrfop;
1490+
}
14811491
#endif // TARGET_ARM64
14821492

14831493
#endif // TARGET_ARMARCH

0 commit comments

Comments
 (0)