@@ -199,12 +199,8 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
199
199
const ValueMapping *GPRValueMapping =
200
200
&RISCV::ValueMappings[GPRSize == 64 ? RISCV::GPRB64Idx
201
201
: RISCV::GPRB32Idx];
202
- const ValueMapping *OperandsMapping = GPRValueMapping;
203
202
204
203
switch (Opc) {
205
- case TargetOpcode::G_INVOKE_REGION_START:
206
- OperandsMapping = getOperandsMapping ({});
207
- break ;
208
204
case TargetOpcode::G_ADD:
209
205
case TargetOpcode::G_SUB:
210
206
case TargetOpcode::G_SHL:
@@ -233,14 +229,37 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
233
229
case TargetOpcode::G_ZEXT:
234
230
case TargetOpcode::G_SEXTLOAD:
235
231
case TargetOpcode::G_ZEXTLOAD:
232
+ return getInstructionMapping (DefaultMappingID, /* Cost=*/ 1 , GPRValueMapping,
233
+ NumOperands);
234
+ case TargetOpcode::G_FADD:
235
+ case TargetOpcode::G_FSUB:
236
+ case TargetOpcode::G_FMUL:
237
+ case TargetOpcode::G_FDIV:
238
+ case TargetOpcode::G_FABS:
239
+ case TargetOpcode::G_FNEG:
240
+ case TargetOpcode::G_FSQRT:
241
+ case TargetOpcode::G_FMAXNUM:
242
+ case TargetOpcode::G_FMINNUM: {
243
+ LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
244
+ return getInstructionMapping (DefaultMappingID, /* Cost=*/ 1 ,
245
+ getFPValueMapping (Ty.getSizeInBits ()),
246
+ NumOperands);
247
+ }
248
+ }
249
+
250
+ SmallVector<const ValueMapping *, 4 > OpdsMapping (NumOperands);
251
+
252
+ switch (Opc) {
253
+ case TargetOpcode::G_INVOKE_REGION_START:
236
254
break ;
237
255
case TargetOpcode::G_LOAD: {
238
256
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
257
+ OpdsMapping[0 ] = GPRValueMapping;
258
+ OpdsMapping[1 ] = GPRValueMapping;
239
259
// Use FPR64 for s64 loads on rv32.
240
260
if (GPRSize == 32 && Ty.getSizeInBits () == 64 ) {
241
261
assert (MF.getSubtarget <RISCVSubtarget>().hasStdExtD ());
242
- OperandsMapping =
243
- getOperandsMapping ({getFPValueMapping (64 ), GPRValueMapping});
262
+ OpdsMapping[0 ] = getFPValueMapping (Ty.getSizeInBits ());
244
263
break ;
245
264
}
246
265
@@ -254,105 +273,85 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
254
273
// not, we would have had a bitcast before reaching that
255
274
// instruction.
256
275
return onlyUsesFP (UseMI, MRI, TRI);
257
- })) {
258
- OperandsMapping = getOperandsMapping (
259
- {getFPValueMapping (Ty.getSizeInBits ()), GPRValueMapping});
260
- }
276
+ }))
277
+ OpdsMapping[0 ] = getFPValueMapping (Ty.getSizeInBits ());
261
278
262
279
break ;
263
280
}
264
281
case TargetOpcode::G_STORE: {
265
282
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
283
+ OpdsMapping[0 ] = GPRValueMapping;
284
+ OpdsMapping[1 ] = GPRValueMapping;
266
285
// Use FPR64 for s64 stores on rv32.
267
286
if (GPRSize == 32 && Ty.getSizeInBits () == 64 ) {
268
287
assert (MF.getSubtarget <RISCVSubtarget>().hasStdExtD ());
269
- OperandsMapping =
270
- getOperandsMapping ({getFPValueMapping (64 ), GPRValueMapping});
288
+ OpdsMapping[0 ] = getFPValueMapping (Ty.getSizeInBits ());
271
289
break ;
272
290
}
273
291
274
292
MachineInstr *DefMI = MRI.getVRegDef (MI.getOperand (0 ).getReg ());
275
- if (onlyDefinesFP (*DefMI, MRI, TRI)) {
276
- OperandsMapping = getOperandsMapping (
277
- {getFPValueMapping (Ty.getSizeInBits ()), GPRValueMapping});
278
- }
293
+ if (onlyDefinesFP (*DefMI, MRI, TRI))
294
+ OpdsMapping[0 ] = getFPValueMapping (Ty.getSizeInBits ());
279
295
break ;
280
296
}
281
297
case TargetOpcode::G_CONSTANT:
282
298
case TargetOpcode::G_FRAME_INDEX:
283
299
case TargetOpcode::G_GLOBAL_VALUE:
284
300
case TargetOpcode::G_JUMP_TABLE:
285
301
case TargetOpcode::G_BRCOND:
286
- OperandsMapping = getOperandsMapping ({ GPRValueMapping, nullptr }) ;
302
+ OpdsMapping[ 0 ] = GPRValueMapping;
287
303
break ;
288
304
case TargetOpcode::G_BR:
289
- OperandsMapping = getOperandsMapping ({nullptr });
290
305
break ;
291
306
case TargetOpcode::G_BRJT:
292
- OperandsMapping =
293
- getOperandsMapping ({ GPRValueMapping, nullptr , GPRValueMapping}) ;
307
+ OpdsMapping[ 0 ] = GPRValueMapping;
308
+ OpdsMapping[ 2 ] = GPRValueMapping;
294
309
break ;
295
310
case TargetOpcode::G_ICMP:
296
- OperandsMapping = getOperandsMapping (
297
- {GPRValueMapping, nullptr , GPRValueMapping, GPRValueMapping});
311
+ OpdsMapping[0 ] = GPRValueMapping;
312
+ OpdsMapping[2 ] = GPRValueMapping;
313
+ OpdsMapping[3 ] = GPRValueMapping;
298
314
break ;
299
315
case TargetOpcode::G_SEXT_INREG:
300
- OperandsMapping =
301
- getOperandsMapping ({ GPRValueMapping, GPRValueMapping, nullptr }) ;
316
+ OpdsMapping[ 0 ] = GPRValueMapping;
317
+ OpdsMapping[ 1 ] = GPRValueMapping;
302
318
break ;
303
319
case TargetOpcode::G_SELECT:
304
- OperandsMapping = getOperandsMapping (
305
- {GPRValueMapping, GPRValueMapping, GPRValueMapping, GPRValueMapping});
306
- break ;
307
- case TargetOpcode::G_FADD:
308
- case TargetOpcode::G_FSUB:
309
- case TargetOpcode::G_FMUL:
310
- case TargetOpcode::G_FDIV:
311
- case TargetOpcode::G_FNEG:
312
- case TargetOpcode::G_FABS:
313
- case TargetOpcode::G_FSQRT:
314
- case TargetOpcode::G_FMAXNUM:
315
- case TargetOpcode::G_FMINNUM: {
316
- LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
317
- OperandsMapping = getFPValueMapping (Ty.getSizeInBits ());
320
+ OpdsMapping[0 ] = GPRValueMapping;
321
+ OpdsMapping[1 ] = GPRValueMapping;
322
+ OpdsMapping[2 ] = GPRValueMapping;
323
+ OpdsMapping[3 ] = GPRValueMapping;
318
324
break ;
319
- }
320
325
case TargetOpcode::G_FMA: {
321
326
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
322
- const RegisterBankInfo::ValueMapping *FPValueMapping =
323
- getFPValueMapping (Ty.getSizeInBits ());
324
- OperandsMapping = getOperandsMapping (
325
- {FPValueMapping, FPValueMapping, FPValueMapping, FPValueMapping});
327
+ std::fill_n (OpdsMapping.begin (), 4 , getFPValueMapping (Ty.getSizeInBits ()));
326
328
break ;
327
329
}
328
330
case TargetOpcode::G_FPEXT:
329
331
case TargetOpcode::G_FPTRUNC: {
330
332
LLT ToTy = MRI.getType (MI.getOperand (0 ).getReg ());
331
333
LLT FromTy = MRI.getType (MI.getOperand (1 ).getReg ());
332
- OperandsMapping =
333
- getOperandsMapping ({getFPValueMapping (ToTy.getSizeInBits ()),
334
- getFPValueMapping (FromTy.getSizeInBits ())});
334
+ OpdsMapping[0 ] = getFPValueMapping (ToTy.getSizeInBits ());
335
+ OpdsMapping[1 ] = getFPValueMapping (FromTy.getSizeInBits ());
335
336
break ;
336
337
}
337
338
case TargetOpcode::G_FPTOSI:
338
339
case TargetOpcode::G_FPTOUI: {
339
340
LLT Ty = MRI.getType (MI.getOperand (1 ).getReg ());
340
- OperandsMapping =
341
- getOperandsMapping ({GPRValueMapping,
342
- getFPValueMapping (Ty.getSizeInBits ())});
341
+ OpdsMapping[0 ] = GPRValueMapping;
342
+ OpdsMapping[1 ] = getFPValueMapping (Ty.getSizeInBits ());
343
343
break ;
344
344
}
345
345
case TargetOpcode::G_SITOFP:
346
346
case TargetOpcode::G_UITOFP: {
347
347
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
348
- OperandsMapping = getOperandsMapping (
349
- { getFPValueMapping (Ty. getSizeInBits ()), GPRValueMapping}) ;
348
+ OpdsMapping[ 0 ] = getFPValueMapping (Ty. getSizeInBits ());
349
+ OpdsMapping[ 1 ] = GPRValueMapping;
350
350
break ;
351
351
}
352
352
case TargetOpcode::G_FCONSTANT: {
353
353
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
354
- OperandsMapping =
355
- getOperandsMapping ({getFPValueMapping (Ty.getSizeInBits ()), nullptr });
354
+ OpdsMapping[0 ] = getFPValueMapping (Ty.getSizeInBits ());
356
355
break ;
357
356
}
358
357
case TargetOpcode::G_FCMP: {
@@ -361,15 +360,14 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
361
360
unsigned Size = Ty.getSizeInBits ();
362
361
assert ((Size == 32 || Size == 64 ) && " Unsupported size for G_FCMP" );
363
362
364
- auto *FPRValueMapping = getFPValueMapping (Size);
365
- OperandsMapping = getOperandsMapping (
366
- {GPRValueMapping, nullptr , FPRValueMapping, FPRValueMapping});
363
+ OpdsMapping[0 ] = GPRValueMapping;
364
+ OpdsMapping[2 ] = OpdsMapping[3 ] = getFPValueMapping (Size);
367
365
break ;
368
366
}
369
367
default :
370
368
return getInvalidInstructionMapping ();
371
369
}
372
370
373
- return getInstructionMapping (DefaultMappingID, /* Cost=*/ 1 , OperandsMapping,
374
- NumOperands);
371
+ return getInstructionMapping (DefaultMappingID, /* Cost=*/ 1 ,
372
+ getOperandsMapping (OpdsMapping), NumOperands);
375
373
}
0 commit comments