Skip to content

Commit fa294c0

Browse files
authored
[arm64] Addressing modes for SIMD (#67490)
1 parent 966a4a7 commit fa294c0

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,21 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
367367
switch (intrin.numOperands)
368368
{
369369
case 1:
370-
GetEmitter()->emitIns_R_R(ins, emitSize, targetReg, op1Reg, opt);
370+
if (intrin.op1->isContained())
371+
{
372+
assert(ins == INS_ld1);
373+
374+
// Emit 'ldr target, [base, index]'
375+
GenTreeAddrMode* lea = intrin.op1->AsAddrMode();
376+
assert(lea->GetScale() == 1);
377+
assert(lea->Offset() == 0);
378+
GetEmitter()->emitIns_R_R_R(INS_ldr, emitSize, targetReg, lea->Base()->GetRegNum(),
379+
lea->Index()->GetRegNum());
380+
}
381+
else
382+
{
383+
GetEmitter()->emitIns_R_R(ins, emitSize, targetReg, op1Reg, opt);
384+
}
371385
break;
372386

373387
case 2:

src/coreclr/jit/lower.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5304,6 +5304,12 @@ bool Lowering::TryCreateAddrMode(GenTree* addr, bool isContainable, GenTree* par
53045304
{
53055305
return false;
53065306
}
5307+
5308+
if (((scale | offset) > 0) && parent->OperIsHWIntrinsic())
5309+
{
5310+
// For now we only support unscaled indices for SIMD loads
5311+
return false;
5312+
}
53075313
#endif
53085314

53095315
if (scale == 0)

src/coreclr/jit/lowerarmarch.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,18 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node)
20702070
unreached();
20712071
}
20722072
}
2073+
else if ((intrin.id == NI_AdvSimd_LoadVector128) || (intrin.id == NI_AdvSimd_LoadVector64))
2074+
{
2075+
assert(intrin.numOperands == 1);
2076+
assert(HWIntrinsicInfo::lookupCategory(intrin.id) == HW_Category_MemoryLoad);
2077+
2078+
GenTree* addr = node->Op(1);
2079+
if (TryCreateAddrMode(addr, true, node) && IsSafeToContainMem(node, addr))
2080+
{
2081+
assert(addr->OperIs(GT_LEA));
2082+
MakeSrcContained(node, addr);
2083+
}
2084+
}
20732085
}
20742086
#endif // FEATURE_HW_INTRINSICS
20752087

0 commit comments

Comments
 (0)