@@ -1128,6 +1128,8 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
1128
1128
// FIXME: Don't know how to handle secondary types yet.
1129
1129
if (TypeIdx != 0 )
1130
1130
return UnableToLegalize;
1131
+
1132
+ MIRBuilder.setInstr (MI);
1131
1133
switch (MI.getOpcode ()) {
1132
1134
default :
1133
1135
return UnableToLegalize;
@@ -1141,8 +1143,6 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
1141
1143
if (Size % NarrowSize != 0 )
1142
1144
return UnableToLegalize;
1143
1145
1144
- MIRBuilder.setInstr (MI);
1145
-
1146
1146
SmallVector<unsigned , 2 > Src1Regs, Src2Regs, DstRegs;
1147
1147
extractParts (MI.getOperand (1 ).getReg (), NarrowTy, NumParts, Src1Regs);
1148
1148
extractParts (MI.getOperand (2 ).getReg (), NarrowTy, NumParts, Src2Regs);
@@ -1157,6 +1157,48 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
1157
1157
MI.eraseFromParent ();
1158
1158
return Legalized;
1159
1159
}
1160
+ case TargetOpcode::G_LOAD:
1161
+ case TargetOpcode::G_STORE: {
1162
+ bool IsLoad = MI.getOpcode () == TargetOpcode::G_LOAD;
1163
+ unsigned ValReg = MI.getOperand (0 ).getReg ();
1164
+ unsigned AddrReg = MI.getOperand (1 ).getReg ();
1165
+ unsigned NarrowSize = NarrowTy.getSizeInBits ();
1166
+ unsigned Size = MRI.getType (ValReg).getSizeInBits ();
1167
+ unsigned NumParts = Size / NarrowSize;
1168
+
1169
+ SmallVector<unsigned , 8 > NarrowRegs;
1170
+ if (!IsLoad)
1171
+ extractParts (ValReg, NarrowTy, NumParts, NarrowRegs);
1172
+
1173
+ const LLT OffsetTy =
1174
+ LLT::scalar (MRI.getType (AddrReg).getScalarSizeInBits ());
1175
+ MachineFunction &MF = *MI.getMF ();
1176
+ MachineMemOperand *MMO = *MI.memoperands_begin ();
1177
+ for (unsigned Idx = 0 ; Idx < NumParts; ++Idx) {
1178
+ unsigned Adjustment = Idx * NarrowTy.getSizeInBits () / 8 ;
1179
+ unsigned Alignment = MinAlign (MMO->getAlignment (), Adjustment);
1180
+ unsigned NewAddrReg = 0 ;
1181
+ MIRBuilder.materializeGEP (NewAddrReg, AddrReg, OffsetTy, Adjustment);
1182
+ MachineMemOperand &NewMMO = *MF.getMachineMemOperand (
1183
+ MMO->getPointerInfo ().getWithOffset (Adjustment), MMO->getFlags (),
1184
+ NarrowTy.getSizeInBits () / 8 , Alignment);
1185
+ if (IsLoad) {
1186
+ unsigned Dst = MRI.createGenericVirtualRegister (NarrowTy);
1187
+ NarrowRegs.push_back (Dst);
1188
+ MIRBuilder.buildLoad (Dst, NewAddrReg, NewMMO);
1189
+ } else {
1190
+ MIRBuilder.buildStore (NarrowRegs[Idx], NewAddrReg, NewMMO);
1191
+ }
1192
+ }
1193
+ if (IsLoad) {
1194
+ if (NarrowTy.isVector ())
1195
+ MIRBuilder.buildConcatVectors (ValReg, NarrowRegs);
1196
+ else
1197
+ MIRBuilder.buildBuildVector (ValReg, NarrowRegs);
1198
+ }
1199
+ MI.eraseFromParent ();
1200
+ return Legalized;
1201
+ }
1160
1202
}
1161
1203
}
1162
1204
0 commit comments