221 const unsigned Opc =
MI.getOpcode();
237 assert((GPRSize == 32 || GPRSize == 64) &&
"Unexpected GPR size");
239 unsigned NumOperands =
MI.getNumOperands();
245 case TargetOpcode::G_ADD:
246 case TargetOpcode::G_SUB:
247 case TargetOpcode::G_SHL:
248 case TargetOpcode::G_ASHR:
249 case TargetOpcode::G_LSHR:
250 case TargetOpcode::G_AND:
251 case TargetOpcode::G_OR:
252 case TargetOpcode::G_XOR:
253 case TargetOpcode::G_MUL:
254 case TargetOpcode::G_SDIV:
255 case TargetOpcode::G_SREM:
256 case TargetOpcode::G_SMULH:
257 case TargetOpcode::G_SMAX:
258 case TargetOpcode::G_SMIN:
259 case TargetOpcode::G_UDIV:
260 case TargetOpcode::G_UREM:
261 case TargetOpcode::G_UMULH:
262 case TargetOpcode::G_UMAX:
263 case TargetOpcode::G_UMIN:
264 case TargetOpcode::G_PTR_ADD:
265 case TargetOpcode::G_PTRTOINT:
266 case TargetOpcode::G_INTTOPTR:
267 case TargetOpcode::G_FADD:
268 case TargetOpcode::G_FSUB:
269 case TargetOpcode::G_FMUL:
270 case TargetOpcode::G_FDIV:
271 case TargetOpcode::G_FABS:
272 case TargetOpcode::G_FNEG:
273 case TargetOpcode::G_FSQRT:
274 case TargetOpcode::G_FMAXNUM:
275 case TargetOpcode::G_FMINNUM: {
276 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
285 Mapping = GPRValueMapping;
289 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
290 LLT OpTy =
MRI.getType(
MI.getOperand(Idx).getReg());
292 "Operand has incompatible type");
301 case TargetOpcode::G_SEXTLOAD:
302 case TargetOpcode::G_ZEXTLOAD:
305 case TargetOpcode::G_IMPLICIT_DEF: {
307 LLT DstTy =
MRI.getType(Dst);
309 auto Mapping = GPRValueMapping;
317 else if (anyUseOnlyUseFP(Dst,
MRI,
TRI))
328 case TargetOpcode::G_LOAD: {
329 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
332 OpdsMapping[1] = GPRValueMapping;
339 OpdsMapping[0] = GPRValueMapping;
346 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
355 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(),
MRI,
TRI)) {
366 case TargetOpcode::G_STORE: {
367 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
370 OpdsMapping[1] = GPRValueMapping;
377 OpdsMapping[0] = GPRValueMapping;
384 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
395 case TargetOpcode::G_SELECT: {
396 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
400 LLT TestTy =
MRI.getType(Sel.getCondReg());
401 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
402 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
415 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
424 if (
any_of(
MRI.use_nodbg_instructions(
MI.getOperand(0).getReg()),
426 return onlyUsesFP(UseMI, MRI, TRI);
443 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
453 OpdsMapping[1] = GPRValueMapping;
459 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
462 case RISCV::G_FCVT_W_RV64:
463 case RISCV::G_FCVT_WU_RV64:
464 case TargetOpcode::G_FPTOSI:
465 case TargetOpcode::G_FPTOUI:
466 case RISCV::G_FCLASS: {
467 LLT Ty =
MRI.getType(
MI.getOperand(1).getReg());
468 OpdsMapping[0] = GPRValueMapping;
472 case TargetOpcode::G_SITOFP:
473 case TargetOpcode::G_UITOFP: {
474 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
476 OpdsMapping[1] = GPRValueMapping;
479 case TargetOpcode::G_FCMP: {
480 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
482 unsigned Size = Ty.getSizeInBits();
484 OpdsMapping[0] = GPRValueMapping;
488 case TargetOpcode::G_MERGE_VALUES: {
490 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
491 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
494 OpdsMapping[1] = GPRValueMapping;
495 OpdsMapping[2] = GPRValueMapping;
499 case TargetOpcode::G_UNMERGE_VALUES: {
501 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
502 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
504 OpdsMapping[0] = GPRValueMapping;
505 OpdsMapping[1] = GPRValueMapping;
510 case TargetOpcode::G_SPLAT_VECTOR: {
513 .getKnownMinValue());
515 LLT ScalarTy =
MRI.getType(
MI.getOperand(1).getReg());
522 OpdsMapping[1] = GPRValueMapping;
525 case TargetOpcode::G_INTRINSIC: {
529 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
530 unsigned ScalarIdx = -1;
531 if (
II->hasScalarOperand()) {
532 ScalarIdx =
II->ScalarOperand + 2;
534 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
542 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
546 OpdsMapping[Idx] = GPRValueMapping;
551 if (IntrinsicID == Intrinsic::riscv_vsetvli ||
552 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
553 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
557 OpdsMapping[Idx] = GPRValueMapping;
564 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
565 auto &MO =
MI.getOperand(Idx);
566 if (!MO.isReg() || !MO.getReg())
568 LLT Ty =
MRI.getType(MO.getReg());
578 OpdsMapping[Idx] = GPRValueMapping;