@@ -2435,10 +2435,10 @@ bool AMDGPULegalizerInfo::legalizeRawBufferStore(MachineInstr &MI,
2435
2435
return Ty == S32;
2436
2436
}
2437
2437
2438
- bool AMDGPULegalizerInfo::legalizeRawBufferLoad (MachineInstr &MI,
2439
- MachineRegisterInfo &MRI,
2440
- MachineIRBuilder &B,
2441
- bool IsFormat) const {
2438
+ bool AMDGPULegalizerInfo::legalizeBufferLoad (MachineInstr &MI,
2439
+ MachineRegisterInfo &MRI,
2440
+ MachineIRBuilder &B,
2441
+ bool IsFormat) const {
2442
2442
B.setInstr (MI);
2443
2443
2444
2444
// FIXME: Verifier should enforce 1 MMO for these intrinsics.
@@ -2448,9 +2448,19 @@ bool AMDGPULegalizerInfo::legalizeRawBufferLoad(MachineInstr &MI,
2448
2448
2449
2449
Register Dst = MI.getOperand (0 ).getReg ();
2450
2450
Register RSrc = MI.getOperand (2 ).getReg ();
2451
- Register VOffset = MI.getOperand (3 ).getReg ();
2452
- Register SOffset = MI.getOperand (4 ).getReg ();
2453
- unsigned AuxiliaryData = MI.getOperand (5 ).getImm ();
2451
+
2452
+ // The struct intrinsic variants add one additional operand over raw.
2453
+ const bool HasVIndex = MI.getNumOperands () == 7 ;
2454
+ Register VIndex;
2455
+ int OpOffset = 0 ;
2456
+ if (HasVIndex) {
2457
+ VIndex = MI.getOperand (3 ).getReg ();
2458
+ OpOffset = 1 ;
2459
+ }
2460
+
2461
+ Register VOffset = MI.getOperand (3 + OpOffset).getReg ();
2462
+ Register SOffset = MI.getOperand (4 + OpOffset).getReg ();
2463
+ unsigned AuxiliaryData = MI.getOperand (5 + OpOffset).getImm ();
2454
2464
unsigned ImmOffset;
2455
2465
unsigned TotalOffset;
2456
2466
@@ -2493,17 +2503,18 @@ bool AMDGPULegalizerInfo::legalizeRawBufferLoad(MachineInstr &MI,
2493
2503
else
2494
2504
LoadDstReg = Dst;
2495
2505
2496
- Register VIndex = B.buildConstant (S32, 0 ).getReg (0 );
2506
+ if (!VIndex)
2507
+ VIndex = B.buildConstant (S32, 0 ).getReg (0 );
2497
2508
2498
2509
B.buildInstr (Opc)
2499
- .addDef (LoadDstReg) // vdata
2500
- .addUse (RSrc) // rsrc
2501
- .addUse (VIndex) // vindex
2502
- .addUse (VOffset) // voffset
2503
- .addUse (SOffset) // soffset
2504
- .addImm (ImmOffset) // offset(imm)
2505
- .addImm (AuxiliaryData) // cachepolicy, swizzled buffer(imm)
2506
- .addImm (0 ) // idxen(imm)
2510
+ .addDef (LoadDstReg) // vdata
2511
+ .addUse (RSrc) // rsrc
2512
+ .addUse (VIndex) // vindex
2513
+ .addUse (VOffset) // voffset
2514
+ .addUse (SOffset) // soffset
2515
+ .addImm (ImmOffset) // offset(imm)
2516
+ .addImm (AuxiliaryData) // cachepolicy, swizzled buffer(imm)
2517
+ .addImm (HasVIndex ? - 1 : 0 ) // idxen(imm)
2507
2518
.addMemOperand (MMO);
2508
2519
2509
2520
if (LoadDstReg != Dst) {
@@ -2662,9 +2673,10 @@ bool AMDGPULegalizerInfo::legalizeIntrinsic(MachineInstr &MI,
2662
2673
case Intrinsic::amdgcn_raw_buffer_store_format:
2663
2674
return legalizeRawBufferStore (MI, MRI, B, true );
2664
2675
case Intrinsic::amdgcn_raw_buffer_load:
2665
- return legalizeRawBufferLoad (MI, MRI, B, false );
2676
+ case Intrinsic::amdgcn_struct_buffer_load:
2677
+ return legalizeBufferLoad (MI, MRI, B, false );
2666
2678
case Intrinsic::amdgcn_raw_buffer_load_format:
2667
- return legalizeRawBufferLoad (MI, MRI, B, true );
2679
+ return legalizeBufferLoad (MI, MRI, B, true );
2668
2680
case Intrinsic::amdgcn_atomic_inc:
2669
2681
return legalizeAtomicIncDec (MI, B, true );
2670
2682
case Intrinsic::amdgcn_atomic_dec:
0 commit comments