Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 5ef844b

Browse files
committed
Adding support for the SSE Set scalar intrinsic
1 parent 0817912 commit 5ef844b

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

src/jit/hwintrinsiccodegenxarch.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,21 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
602602
emit->emitIns_SIMD_R_R_R_I(INS_shufps, targetReg, op1Reg, op1Reg, 0, TYP_SIMD16);
603603
break;
604604

605+
case NI_SSE_SetScalar:
606+
assert(baseType == TYP_FLOAT);
607+
assert(op2 == nullptr);
608+
609+
if (op1Reg == targetReg)
610+
{
611+
regNumber tmpReg = node->GetSingleTempReg();
612+
emit->emitIns_SIMD_R_R(INS_movaps, tmpReg, op1Reg, TYP_SIMD16);
613+
op1Reg = tmpReg;
614+
}
615+
616+
emit->emitIns_SIMD_R_R_R(INS_xorps, targetReg, targetReg, targetReg, TYP_SIMD16);
617+
emit->emitIns_SIMD_R_R_R(INS_movss, targetReg, targetReg, op1Reg, TYP_SIMD16);
618+
break;
619+
605620
case NI_SSE_SetZeroVector128:
606621
assert(baseType == TYP_FLOAT);
607622
assert(op1 == nullptr);

src/jit/hwintrinsicxarch.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,7 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic,
635635
}
636636

637637
case NI_SSE_SetAllVector128:
638+
case NI_SSE_SetScalar:
638639
assert(sig->numArgs == 1);
639640
assert(getBaseTypeOfSIMDType(sig->retTypeSigClass) == TYP_FLOAT);
640641
op1 = impPopStack().val;

src/jit/lsraxarch.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2550,6 +2550,12 @@ void LinearScan::TreeNodeInfoInitHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree,
25502550
info->setInternalCandidates(this, allRegs(TYP_INT));
25512551
break;
25522552

2553+
case NI_SSE_SetScalar:
2554+
// Need an internal register to stitch together all the values into a single vector in a SIMD reg.
2555+
info->internalFloatCount = 1;
2556+
info->setInternalCandidates(this, allSIMDRegs());
2557+
break;
2558+
25532559
case NI_SSE_Shuffle:
25542560
{
25552561
assert(op1->OperIsList());

0 commit comments

Comments
 (0)