@@ -1289,7 +1289,11 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1289
1289
else if (op1->IsLocal ())
1290
1290
{
1291
1291
// We're an existing local that is loaded from memory
1292
- lclNum = op1->AsLclVarCommon ()->GetLclNum ();
1292
+ GenTreeLclVarCommon* lclVar = op1->AsLclVarCommon ();
1293
+
1294
+ lclNum = lclVar->GetLclNum ();
1295
+ offset = lclVar->GetLclOffs ();
1296
+
1293
1297
BlockRange ().Remove (op1);
1294
1298
}
1295
1299
@@ -1300,25 +1304,32 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1300
1304
BlockRange ().InsertBefore (node, op1);
1301
1305
LowerNode (op1);
1302
1306
}
1307
+ else
1308
+ {
1309
+ assert (op1->isIndir ());
1310
+
1311
+ // We need to get the underlying address
1312
+ GenTree* addr = op1->AsIndir ()->Addr ();
1313
+ BlockRange ().Remove (op1);
1314
+ op1 = addr;
1315
+ }
1303
1316
1304
1317
// Now that we have a memory op, we need to offset it by op2 * scale
1305
- assert (op1->isMemoryOp ());
1306
-
1307
1318
if (op2->OperIsConst ())
1308
1319
{
1309
- offset = op2->AsIntCon ()->IconValue () * scale;
1320
+ offset = offset + ( op2->AsIntCon ()->IconValue () * scale) ;
1310
1321
scale = 0 ;
1311
1322
1312
1323
BlockRange ().Remove (op2);
1313
1324
op2 = nullptr ;
1314
1325
}
1315
1326
1316
- GenTree* addr = new (comp, GT_LEA) GenTreeAddrMode (op1->TypeGet (), op1, op2, scale, offset);
1317
- BlockRange ().InsertBefore (node, addr );
1318
- LowerNode (addr );
1327
+ GenTree* addrMode = new (comp, GT_LEA) GenTreeAddrMode (op1->TypeGet (), op1, op2, scale, offset);
1328
+ BlockRange ().InsertBefore (node, addrMode );
1329
+ LowerNode (addrMode );
1319
1330
1320
1331
// Finally we can indirect the memory address to get the actual value
1321
- GenTreeIndir* indir = comp->gtNewIndir (simdBaseType, addr );
1332
+ GenTreeIndir* indir = comp->gtNewIndir (simdBaseType, addrMode );
1322
1333
BlockRange ().InsertBefore (node, indir);
1323
1334
1324
1335
LIR::Use use;
0 commit comments