switch (intrin.numOperands)
{
case 1:
- GetEmitter()->emitIns_R_R(ins, emitSize, targetReg, op1Reg, opt);
+ if (intrin.op1->isContained())
+ {
+ assert(ins == INS_ld1);
+
+ // Emit 'ldr target, [base, index]'
+ GenTreeAddrMode* lea = intrin.op1->AsAddrMode();
+ assert(lea->GetScale() == 1);
+ assert(lea->Offset() == 0);
+ GetEmitter()->emitIns_R_R_R(INS_ldr, emitSize, targetReg, lea->Base()->GetRegNum(),
+ lea->Index()->GetRegNum());
+ }
+ else
+ {
+ GetEmitter()->emitIns_R_R(ins, emitSize, targetReg, op1Reg, opt);
+ }
break;
case 2:
unreached();
}
}
+ else if ((intrin.id == NI_AdvSimd_LoadVector128) || (intrin.id == NI_AdvSimd_LoadVector64))
+ {
+ assert(intrin.numOperands == 1);
+ assert(HWIntrinsicInfo::lookupCategory(intrin.id) == HW_Category_MemoryLoad);
+
+ GenTree* addr = node->Op(1);
+ if (TryCreateAddrMode(addr, true, node) && IsSafeToContainMem(node, addr))
+ {
+ assert(addr->OperIs(GT_LEA));
+ MakeSrcContained(node, addr);
+ }
+ }
}
#endif // FEATURE_HW_INTRINSICS