@@ -1102,6 +1102,14 @@ void emitter::emitInsSanityCheck(instrDesc* id)
1102
1102
assert(isPredicateRegister(id->idReg3())); // MMMM
1103
1103
break;
1104
1104
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
+
1105
1113
// Scalable, 4 regs, to predicate register.
1106
1114
case IF_SVE_CX_4A: // ........xx.mmmmm ...gggnnnnn.DDDD -- SVE integer compare vectors
1107
1115
elemsize = id->idOpSize();
@@ -7893,6 +7901,13 @@ void emitter::emitIns_R_R(instruction ins,
7893
7901
fmt = IF_SVE_DG_2A;
7894
7902
break;
7895
7903
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
+
7896
7911
case INS_sve_ptest:
7897
7912
assert(opt == INS_OPTS_SCALABLE_B);
7898
7913
assert(isPredicateRegister(reg1)); // gggg
@@ -16293,6 +16308,7 @@ void emitter::emitIns_Call(EmitCallType callType,
16293
16308
case IF_SVE_CF_2C:
16294
16309
case IF_SVE_CF_2D:
16295
16310
case IF_SVE_CI_3A:
16311
+ case IF_SVE_CJ_2A:
16296
16312
case IF_SVE_DE_1A:
16297
16313
case IF_SVE_DH_1A:
16298
16314
case IF_SVE_DJ_1A:
@@ -19884,13 +19900,6 @@ BYTE* emitter::emitOutput_InstrSve(BYTE* dst, instrDesc* id)
19884
19900
19885
19901
switch (fmt)
19886
19902
{
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
-
19894
19903
// Scalable.
19895
19904
case IF_SVE_AA_3A: // ........xx...... ...gggmmmmmddddd -- SVE bitwise logical operations (predicated)
19896
19905
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)
20030
20039
dst += emitOutput_Instr(dst, code);
20031
20040
break;
20032
20041
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
+
20033
20057
// Scalable to general register.
20034
20058
case IF_SVE_CO_3A: // ........xx...... ...gggmmmmmddddd -- SVE conditionally extract element to general register
20035
20059
case IF_SVE_CS_3A: // ........xx...... ...gggnnnnnddddd -- SVE extract element to general register
@@ -23389,6 +23413,12 @@ void emitter::emitDispInsHelp(
23389
23413
break;
23390
23414
}
23391
23415
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
+
23392
23422
// <Pdn>.<T>, <Pv>, <Pdn>.<T>
23393
23423
case IF_SVE_DF_2A: // ........xx...... .......VVVV.DDDD -- SVE predicate next active
23394
23424
emitDispPredicateReg(id->idReg1(), insGetPredicateType(fmt, 1), id->idInsOpt(), true); // DDDD
@@ -26349,10 +26379,7 @@ emitter::insExecutionCharacteristics emitter::getInsExecutionCharacteristics(ins
26349
26379
break;
26350
26380
26351
26381
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
26356
26383
case IF_SVE_CK_2A: // ................ .......NNNN.DDDD -- SVE unpack predicate elements
26357
26384
result.insThroughput = PERFSCORE_THROUGHPUT_2C;
26358
26385
result.insLatency = PERFSCORE_LATENCY_2C;
0 commit comments