Skip to content

Commit 569b86a

Browse files
Add encoding for ARM64 IF_SVE_CJ_2A instruction group (#97885)
* Add encoding for ARM64 IF_SVE_CJ_2A instruction group * fix merge conflicts * Fix conflicts --------- Co-authored-by: Kunal Pathak <Kunal.Pathak@microsoft.com>
1 parent 77fbbc4 commit 569b86a

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

src/coreclr/jit/codegenarm64test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4725,6 +4725,16 @@ void CodeGen::genArm64EmitterUnitTestsSve()
47254725
theEmitter->emitIns_R_R_R(INS_sve_lsr, EA_SCALABLE, REG_V0, REG_P0, REG_V0, INS_OPTS_SCALABLE_S,
47264726
INS_SCALABLE_OPTS_WIDE); // LSR <Zdn>.<T>, <Pg>/M, <Zdn>.<T>, <Zm>.D
47274727

4728+
// IF_SVE_CJ_2A
4729+
theEmitter->emitIns_R_R(INS_sve_rev, EA_SCALABLE, REG_P1, REG_P2,
4730+
INS_OPTS_SCALABLE_B); // REV <Pd>.<T>, <Pn>.<T>
4731+
theEmitter->emitIns_R_R(INS_sve_rev, EA_SCALABLE, REG_P4, REG_P5,
4732+
INS_OPTS_SCALABLE_H); // REV <Pd>.<T>, <Pn>.<T>
4733+
theEmitter->emitIns_R_R(INS_sve_rev, EA_SCALABLE, REG_P3, REG_P7,
4734+
INS_OPTS_SCALABLE_S); // REV <Pd>.<T>, <Pn>.<T>
4735+
theEmitter->emitIns_R_R(INS_sve_rev, EA_SCALABLE, REG_P0, REG_P6,
4736+
INS_OPTS_SCALABLE_D); // REV <Pd>.<T>, <Pn>.<T>
4737+
47284738
// IF_SVE_CK_2A
47294739
theEmitter->emitIns_R_R(INS_sve_punpkhi, EA_SCALABLE, REG_P1, REG_P7); // PUNPKHI <Pd>.H, <Pn>.B
47304740
theEmitter->emitIns_R_R(INS_sve_punpklo, EA_SCALABLE, REG_P5, REG_P3); // PUNPKLO <Pd>.H, <Pn>.B

src/coreclr/jit/emitarm64.cpp

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,14 @@ void emitter::emitInsSanityCheck(instrDesc* id)
11021102
assert(isPredicateRegister(id->idReg3())); // MMMM
11031103
break;
11041104

1105+
case IF_SVE_CJ_2A: // ........xx...... .......NNNN.DDDD -- SVE reverse predicate elements
1106+
elemsize = id->idOpSize();
1107+
assert(isScalableVectorSize(elemsize));
1108+
assert(insOptsScalableStandard(id->idInsOpt())); // xx
1109+
assert(isPredicateRegister(id->idReg1())); // DDDD
1110+
assert(isPredicateRegister(id->idReg2())); // NNNN
1111+
break;
1112+
11051113
// Scalable, 4 regs, to predicate register.
11061114
case IF_SVE_CX_4A: // ........xx.mmmmm ...gggnnnnn.DDDD -- SVE integer compare vectors
11071115
elemsize = id->idOpSize();
@@ -7893,6 +7901,13 @@ void emitter::emitIns_R_R(instruction ins,
78937901
fmt = IF_SVE_DG_2A;
78947902
break;
78957903

7904+
case INS_sve_rev:
7905+
assert(insOptsScalableStandard(opt));
7906+
assert(isPredicateRegister(reg1)); // DDDD
7907+
assert(isPredicateRegister(reg2)); // NNNN
7908+
fmt = IF_SVE_CJ_2A;
7909+
break;
7910+
78967911
case INS_sve_ptest:
78977912
assert(opt == INS_OPTS_SCALABLE_B);
78987913
assert(isPredicateRegister(reg1)); // gggg
@@ -16293,6 +16308,7 @@ void emitter::emitIns_Call(EmitCallType callType,
1629316308
case IF_SVE_CF_2C:
1629416309
case IF_SVE_CF_2D:
1629516310
case IF_SVE_CI_3A:
16311+
case IF_SVE_CJ_2A:
1629616312
case IF_SVE_DE_1A:
1629716313
case IF_SVE_DH_1A:
1629816314
case IF_SVE_DJ_1A:
@@ -19884,13 +19900,6 @@ BYTE* emitter::emitOutput_InstrSve(BYTE* dst, instrDesc* id)
1988419900

1988519901
switch (fmt)
1988619902
{
19887-
case IF_SVE_CK_2A: // ................ .......NNNN.DDDD -- SVE unpack predicate elements
19888-
code = emitInsCodeSve(ins, fmt);
19889-
code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD
19890-
code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN
19891-
dst += emitOutput_Instr(dst, code);
19892-
break;
19893-
1989419903
// Scalable.
1989519904
case IF_SVE_AA_3A: // ........xx...... ...gggmmmmmddddd -- SVE bitwise logical operations (predicated)
1989619905
case IF_SVE_AB_3A: // ........xx...... ...gggmmmmmddddd -- SVE integer add/subtract vectors (predicated)
@@ -20030,6 +20039,21 @@ BYTE* emitter::emitOutput_InstrSve(BYTE* dst, instrDesc* id)
2003020039
dst += emitOutput_Instr(dst, code);
2003120040
break;
2003220041

20042+
case IF_SVE_CJ_2A: // ........xx...... .......nnnn.dddd -- SVE reverse predicate elements
20043+
code = emitInsCodeSve(ins, fmt);
20044+
code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD
20045+
code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN
20046+
code |= insEncodeElemsize(optGetSveElemsize(id->idInsOpt())); // xx
20047+
dst += emitOutput_Instr(dst, code);
20048+
break;
20049+
20050+
case IF_SVE_CK_2A: // ................ .......NNNN.DDDD -- SVE unpack predicate elements
20051+
code = emitInsCodeSve(ins, fmt);
20052+
code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD
20053+
code |= insEncodeReg_P_8_to_5(id->idReg2()); // NNNN
20054+
dst += emitOutput_Instr(dst, code);
20055+
break;
20056+
2003320057
// Scalable to general register.
2003420058
case IF_SVE_CO_3A: // ........xx...... ...gggmmmmmddddd -- SVE conditionally extract element to general register
2003520059
case IF_SVE_CS_3A: // ........xx...... ...gggnnnnnddddd -- SVE extract element to general register
@@ -23389,6 +23413,12 @@ void emitter::emitDispInsHelp(
2338923413
break;
2339023414
}
2339123415

23416+
// <Pd>.<T>, <Pn>.<T>
23417+
case IF_SVE_CJ_2A: // ........xx...... .......NNNN.DDDD -- SVE reverse predicate elements
23418+
emitDispPredicateReg(id->idReg1(), insGetPredicateType(fmt, 1), id->idInsOpt(), true); // DDDD
23419+
emitDispPredicateReg(id->idReg2(), insGetPredicateType(fmt, 2), id->idInsOpt(), false); // NNNN
23420+
break;
23421+
2339223422
// <Pdn>.<T>, <Pv>, <Pdn>.<T>
2339323423
case IF_SVE_DF_2A: // ........xx...... .......VVVV.DDDD -- SVE predicate next active
2339423424
emitDispPredicateReg(id->idReg1(), insGetPredicateType(fmt, 1), id->idInsOpt(), true); // DDDD
@@ -26349,10 +26379,7 @@ emitter::insExecutionCharacteristics emitter::getInsExecutionCharacteristics(ins
2634926379
break;
2635026380

2635126381
case IF_SVE_CI_3A: // ........xx..MMMM .......NNNN.DDDD -- SVE permute predicate elements
26352-
result.insThroughput = PERFSCORE_THROUGHPUT_2C;
26353-
result.insLatency = PERFSCORE_LATENCY_2C;
26354-
break;
26355-
26382+
case IF_SVE_CJ_2A: // ........xx...... .......NNNN.DDDD -- SVE reverse predicate elements
2635626383
case IF_SVE_CK_2A: // ................ .......NNNN.DDDD -- SVE unpack predicate elements
2635726384
result.insThroughput = PERFSCORE_THROUGHPUT_2C;
2635826385
result.insLatency = PERFSCORE_LATENCY_2C;

0 commit comments

Comments
 (0)