Skip to content

Commit

Permalink
ARM64-SVE: Emit AddSequentialAcross correctly (#106292)
Browse files Browse the repository at this point in the history
  • Loading branch information
amanasifkhalid authored Aug 13, 2024
1 parent 72ea87f commit 7d3cc13
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 7 deletions.
25 changes: 18 additions & 7 deletions src/coreclr/jit/emitarm64sve.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14823,27 +14823,38 @@ void emitter::emitDispInsSveHelp(instrDesc* id)
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
break;

// <V><dn>, <Pg>, <V><dn>, <Zm>.<T>
// <R><dn>, <Pg>, <R><dn>, <Zm>.<T>
case IF_SVE_CN_3A: // ........xx...... ...gggmmmmmddddd -- SVE conditionally extract element to SIMD&FP scalar
case IF_SVE_CO_3A: // ........xx...... ...gggmmmmmddddd -- SVE conditionally extract element to general register
case IF_SVE_HJ_3A: // ........xx...... ...gggmmmmmddddd -- SVE floating-point serial reduction (predicated)
emitDispReg(id->idReg1(), size, true); // ddddd
emitDispLowPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // ggg
emitDispReg(id->idReg1(), size, true); // ddddd
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
break;

// <V><dn>, <Pg>, <V><dn>, <Zm>.<T>
case IF_SVE_HJ_3A: // ........xx...... ...gggmmmmmddddd -- SVE floating-point serial reduction (predicated)
emitDispVectorReg(id->idReg1(), id->idInsOpt(), true); // ddddd
emitDispLowPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // ggg
emitDispVectorReg(id->idReg1(), id->idInsOpt(), true); // ddddd
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
break;

// <V><d>, <Pg>, <Zn>.<T>
// <R><d>, <Pg>, <Zn>.<T>
case IF_SVE_AF_3A: // ........xx...... ...gggnnnnnddddd -- SVE bitwise logical reduction (predicated)
case IF_SVE_AK_3A: // ........xx...... ...gggnnnnnddddd -- SVE integer min/max reduction (predicated)
case IF_SVE_CR_3A: // ........xx...... ...gggnnnnnddddd -- SVE extract element to SIMD&FP scalar register
case IF_SVE_CS_3A: // ........xx...... ...gggnnnnnddddd -- SVE extract element to general register
case IF_SVE_HE_3A: // ........xx...... ...gggnnnnnddddd -- SVE floating-point recursive reduction
emitDispReg(id->idReg1(), size, true); // ddddd
emitDispPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // ggg
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
emitDispVectorReg(id->idReg1(), id->idInsOpt(), true); // ddddd
emitDispLowPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // ggg
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
break;

// <R><d>, <Pg>, <Zn>.<T>
case IF_SVE_CS_3A: // ........xx...... ...gggnnnnnddddd -- SVE extract element to general register
emitDispReg(id->idReg1(), size, true); // ddddd
emitDispLowPredicateReg(id->idReg2(), insGetPredicateType(fmt), id->idInsOpt(), true); // ggg
emitDispSveReg(id->idReg3(), id->idInsOpt(), false); // mmmmm
break;

// <Vd>.<T>, <Pg>, <Zn>.<Tb>
Expand Down
17 changes: 17 additions & 0 deletions src/coreclr/jit/hwintrinsiccodegenarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -730,6 +730,13 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
embOpt = INS_OPTS_SCALABLE_B;
break;

case NI_Sve_AddSequentialAcross:
// Predicate functionality is currently not exposed for this API,
// but the FADDA instruction only has a predicated variant.
// Thus, we expect the JIT to wrap this with CndSel.
assert(intrin.op3->IsVectorZero());
break;

default:
break;
}
Expand Down Expand Up @@ -784,6 +791,16 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
emitInsHelper(targetReg, maskReg, embMaskOp1Reg);
break;

case NI_Sve_AddSequentialAcross:
assert(targetReg != embMaskOp2Reg);
if (targetReg != embMaskOp1Reg)
{
GetEmitter()->emitIns_Mov(INS_fmov, GetEmitter()->optGetSveElemsize(embOpt),
targetReg, embMaskOp1Reg, /* canSkip */ true);
}
emitInsHelper(targetReg, maskReg, embMaskOp2Reg);
break;

default:
assert(targetReg != embMaskOp2Reg);

Expand Down

0 comments on commit 7d3cc13

Please sign in to comment.