Skip to content

Commit

Permalink
JIT ARM64-SVE: Add BV_2B (dotnet#99534)
Browse files Browse the repository at this point in the history
  • Loading branch information
amanasifkhalid committed Mar 11, 2024
1 parent 9f0a327 commit fb2d0f1
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/coreclr/jit/codegenarm64test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5507,6 +5507,14 @@ void CodeGen::genArm64EmitterUnitTestsSve()
theEmitter->emitIns_R_R_I(INS_sve_mov, EA_SCALABLE, REG_V27, REG_P13, -5632, INS_OPTS_SCALABLE_H,
INS_SCALABLE_OPTS_PREDICATE_MERGE); // MOV <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}

// IF_SVE_BV_2B
theEmitter->emitIns_R_R(INS_sve_fmov, EA_SCALABLE, REG_V0, REG_P1,
INS_OPTS_SCALABLE_H); // FMOV <Zd>.<T>, <Pg>/M, #0.0
theEmitter->emitIns_R_R(INS_sve_fmov, EA_SCALABLE, REG_V2, REG_P3,
INS_OPTS_SCALABLE_S); // FMOV <Zd>.<T>, <Pg>/M, #0.0
theEmitter->emitIns_R_R(INS_sve_fmov, EA_SCALABLE, REG_V4, REG_P5,
INS_OPTS_SCALABLE_D); // FMOV <Zd>.<T>, <Pg>/M, #0.0

// IF_SVE_BZ_3A
theEmitter->emitIns_R_R_R(INS_sve_tbl, EA_SCALABLE, REG_V0, REG_V1, REG_V2,
INS_OPTS_SCALABLE_B); // TBL <Zd>.<T>, {<Zn>.<T>}, <Zm>.<T>
Expand Down
41 changes: 40 additions & 1 deletion src/coreclr/jit/emitarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,12 @@ void emitter::emitInsSanityCheck(instrDesc* id)
assert(isValidSimm8(imm)); // iiiiiiii
break;

case IF_SVE_BV_2B: // ........xx..gggg ...........ddddd -- SVE copy integer immediate (predicated)
assert(insOptsScalableAtLeastHalf(id->idInsOpt())); // xx
assert(isVectorRegister(id->idReg1())); // ddddd
assert(isPredicateRegister(id->idReg2())); // gggg
break;

case IF_SVE_CE_2A: // ................ ......nnnnn.DDDD -- SVE move predicate from vector
assert(isPredicateRegister(id->idReg1())); // DDDD
assert(isVectorRegister(id->idReg2())); // nnnnn
Expand Down Expand Up @@ -9449,6 +9455,18 @@ void emitter::emitIns_R_R(instruction ins,
fmt = IF_SVE_BI_2A;
break;

case INS_sve_fmov:
assert(insOptsScalableAtLeastHalf(opt));
assert(isVectorRegister(reg1)); // ddddd
assert(isPredicateRegister(reg2)); // gggg
assert(isValidVectorElemsize(optGetSveElemsize(opt))); // xx
fmt = IF_SVE_BV_2B;

// CPY is an alias for FMOV, and MOV is an alias for CPY.
// Thus, MOV is the preferred disassembly.
ins = INS_sve_mov;
break;

default:
unreached();
break;
Expand Down Expand Up @@ -10288,7 +10306,7 @@ void emitter::emitIns_R_R_I(instruction ins,
}
else
{
assert(sopt == INS_SCALABLE_OPTS_NONE);
assert(insScalableOptsNone(sopt));
fmt = IF_SVE_BV_2A;
}

Expand Down Expand Up @@ -24771,6 +24789,18 @@ BYTE* emitter::emitOutput_InstrSve(BYTE* dst, instrDesc* id)
dst += emitOutput_Instr(dst, code);
break;

case IF_SVE_BV_2B: // ........xx..gggg ...........ddddd -- SVE copy integer immediate (predicated)
// In emitIns, we set this format's instruction to MOV, as that is the preferred disassembly.
// However, passing (MOV, IF_SVE_BV_2B) to emitInsCodeSve will assert with "encoding_found",
// as FMOV is the only instruction associated with this encoding format.
// Thus, always pass FMOV here, and use MOV elsewhere for simplicity.
code = emitInsCodeSve(INS_sve_fmov, fmt);
code |= insEncodeReg_V_4_to_0(id->idReg1()); // ddddd
code |= insEncodeReg_P_19_to_16(id->idReg2()); // gggg
code |= insEncodeElemsize(optGetSveElemsize(id->idInsOpt())); // xx
dst += emitOutput_Instr(dst, code);
break;

case IF_SVE_CE_2A: // ................ ......nnnnn.DDDD -- SVE move predicate from vector
code = emitInsCodeSve(ins, fmt);
code |= insEncodeReg_P_3_to_0(id->idReg1()); // DDDD
Expand Down Expand Up @@ -30527,6 +30557,7 @@ void emitter::emitDispInsHelp(
break;

// <Zd>.<T>, <Pg>/Z, #<imm>{, <shift>}
// <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}
case IF_SVE_BV_2A: // ........xx..gggg ..hiiiiiiiiddddd -- SVE copy integer immediate (predicated)
case IF_SVE_BV_2A_J: // ........xx..gggg ..hiiiiiiiiddddd -- SVE copy integer immediate (predicated)
{
Expand All @@ -30537,6 +30568,13 @@ void emitter::emitDispInsHelp(
break;
}

// <Zd>.<T>, <Pg>/M, #<imm>
case IF_SVE_BV_2B: // ........xx..gggg ...........ddddd -- SVE copy integer immediate (predicated)
emitDispSveReg(id->idReg1(), id->idInsOpt(), true); // ddddd
emitDispPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // gggg
emitDispImm(0, false);
break;

// <Zd>.<T>, <Zn>.<T>[<imm>]
case IF_SVE_BX_2A: // ...........ixxxx ......nnnnnddddd -- sve_int_perm_dupq_i
imm = emitGetInsSC(id);
Expand Down Expand Up @@ -33088,6 +33126,7 @@ emitter::insExecutionCharacteristics emitter::getInsExecutionCharacteristics(ins

case IF_SVE_BV_2A: // ........xx..gggg ..hiiiiiiiiddddd -- SVE copy integer immediate (predicated)
case IF_SVE_BV_2A_J: // ........xx..gggg ..hiiiiiiiiddddd -- SVE copy integer immediate (predicated)
case IF_SVE_BV_2B: // ........xx..gggg ...........ddddd -- SVE copy integer immediate (predicated)
result.insThroughput = PERFSCORE_THROUGHPUT_2C;
result.insLatency = PERFSCORE_LATENCY_2C;
break;
Expand Down

0 comments on commit fb2d0f1

Please sign in to comment.