@@ -1260,15 +1260,16 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1260
1260
GenTree* op1 = node->Op (1 );
1261
1261
GenTree* op2 = node->Op (2 );
1262
1262
1263
- unsigned simdSize = node->GetSimdSize ();
1264
- var_types simdBaseType = node->GetSimdBaseType ();
1265
- var_types simdType = Compiler::getSIMDTypeForSize (simdSize);
1266
- unsigned scale = genTypeSize (simdBaseType);
1267
-
1268
1263
bool isContainableMemory = IsContainableMemoryOp (op1) && IsSafeToContainMem (node, op1);
1269
1264
1270
1265
if (isContainableMemory || !op2->OperIsConst ())
1271
1266
{
1267
+ unsigned simdSize = node->GetSimdSize ();
1268
+ var_types simdBaseType = node->GetSimdBaseType ();
1269
+ var_types simdType = Compiler::getSIMDTypeForSize (simdSize);
1270
+ unsigned scale = genTypeSize (simdBaseType);
1271
+ ssize_t offset = 0 ;
1272
+
1272
1273
// We're either already loading from memory or we need to since
1273
1274
// we don't know what actual index is going to be retrieved.
1274
1275
@@ -1295,15 +1296,24 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1295
1296
if (lclNum != BAD_VAR_NUM)
1296
1297
{
1297
1298
// We need to get the address of the local
1298
- op1 = comp->gtNewLclVarAddrNode (lclNum, simdBaseType );
1299
+ op1 = comp->gtNewLclVarAddrNode (lclNum, TYP_BYREF );
1299
1300
BlockRange ().InsertBefore (node, op1);
1300
1301
LowerNode (op1);
1301
1302
}
1302
1303
1303
1304
// Now that we have a memory op, we need to offset it by op2 * scale
1304
1305
assert (op1->isMemoryOp ());
1305
1306
1306
- GenTree* addr = new (comp, GT_LEA) GenTreeAddrMode (simdBaseType, op1, op2, scale, 0 );
1307
+ if (op2->OperIsConst ())
1308
+ {
1309
+ offset = op2->AsIntCon ()->IconValue () * scale;
1310
+ scale = 0 ;
1311
+
1312
+ BlockRange ().Remove (op2);
1313
+ op2 = nullptr ;
1314
+ }
1315
+
1316
+ GenTree* addr = new (comp, GT_LEA) GenTreeAddrMode (op1->TypeGet (), op1, op2, scale, offset);
1307
1317
BlockRange ().InsertBefore (node, addr);
1308
1318
LowerNode (addr);
1309
1319
0 commit comments