244 const unsigned Opc =
MI.getOpcode();
259 unsigned GPRSize = Subtarget.
getXLen();
261 unsigned NumOperands =
MI.getNumOperands();
267 case TargetOpcode::G_ADD:
268 case TargetOpcode::G_SUB:
269 case TargetOpcode::G_SHL:
270 case TargetOpcode::G_ASHR:
271 case TargetOpcode::G_LSHR:
272 case TargetOpcode::G_AND:
273 case TargetOpcode::G_OR:
274 case TargetOpcode::G_XOR:
275 case TargetOpcode::G_MUL:
276 case TargetOpcode::G_SDIV:
277 case TargetOpcode::G_SREM:
278 case TargetOpcode::G_SMULH:
279 case TargetOpcode::G_SMAX:
280 case TargetOpcode::G_SMIN:
281 case TargetOpcode::G_UDIV:
282 case TargetOpcode::G_UREM:
283 case TargetOpcode::G_UMULH:
284 case TargetOpcode::G_UMAX:
285 case TargetOpcode::G_UMIN:
286 case TargetOpcode::G_PTR_ADD:
287 case TargetOpcode::G_PTRTOINT:
288 case TargetOpcode::G_INTTOPTR:
289 case TargetOpcode::G_FADD:
290 case TargetOpcode::G_FSUB:
291 case TargetOpcode::G_FMUL:
292 case TargetOpcode::G_FDIV:
293 case TargetOpcode::G_FABS:
294 case TargetOpcode::G_FNEG:
295 case TargetOpcode::G_FSQRT:
296 case TargetOpcode::G_FMAXNUM:
297 case TargetOpcode::G_FMINNUM: {
298 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
307 Mapping = GPRValueMapping;
311 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
314 "Operand has incompatible type");
317 assert(
Size ==
OpTy.getSizeInBits() &&
"Operand has incompatible size");
323 case TargetOpcode::G_SEXTLOAD:
324 case TargetOpcode::G_ZEXTLOAD:
327 case TargetOpcode::G_IMPLICIT_DEF: {
329 LLT DstTy =
MRI.getType(Dst);
331 auto Mapping = GPRValueMapping;
339 else if (anyUseOnlyUseFP(Dst,
MRI,
TRI))
350 case TargetOpcode::G_LOAD: {
351 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
354 OpdsMapping[1] = GPRValueMapping;
361 OpdsMapping[0] = GPRValueMapping;
369 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
375 assert(ST.hasStdExtD() &&
"s64 load without D or Zilsd");
383 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(),
MRI,
TRI)) {
394 case TargetOpcode::G_STORE: {
395 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
398 OpdsMapping[1] = GPRValueMapping;
405 OpdsMapping[0] = GPRValueMapping;
413 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
419 assert(ST.hasStdExtD() &&
"s64 store without D or Zilsd");
429 case TargetOpcode::G_SELECT: {
430 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
434 LLT TestTy =
MRI.getType(Sel.getCondReg());
435 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
436 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
451 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
460 if (
any_of(
MRI.use_nodbg_instructions(
MI.getOperand(0).getReg()),
462 return onlyUsesFP(UseMI, MRI, TRI);
479 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
489 OpdsMapping[1] = GPRValueMapping;
495 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
498 case RISCV::G_FCVT_W_RV64:
499 case RISCV::G_FCVT_WU_RV64:
500 case RISCV::G_FCVT_X:
501 case RISCV::G_FCVT_XU:
502 case TargetOpcode::G_FPTOSI:
503 case TargetOpcode::G_FPTOUI:
504 case TargetOpcode::G_LROUND:
505 case TargetOpcode::G_LLROUND:
506 case TargetOpcode::G_INTRINSIC_LRINT:
507 case TargetOpcode::G_INTRINSIC_LLRINT:
508 case RISCV::G_FCLASS: {
509 LLT Ty =
MRI.getType(
MI.getOperand(1).getReg());
510 OpdsMapping[0] = GPRValueMapping;
514 case TargetOpcode::G_SITOFP:
515 case TargetOpcode::G_UITOFP: {
516 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
518 OpdsMapping[1] = GPRValueMapping;
521 case TargetOpcode::G_FCMP: {
522 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
524 unsigned Size = Ty.getSizeInBits();
526 OpdsMapping[0] = GPRValueMapping;
530 case TargetOpcode::G_MERGE_VALUES: {
532 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
533 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
539 "s64 merge without D or Zilsd");
540 OpdsMapping[1] = GPRValueMapping;
541 OpdsMapping[2] = GPRValueMapping;
545 case TargetOpcode::G_UNMERGE_VALUES: {
547 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
548 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
554 "s64 unmerge without D or Zilsd");
555 OpdsMapping[0] = GPRValueMapping;
556 OpdsMapping[1] = GPRValueMapping;
560 case TargetOpcode::G_SPLAT_VECTOR: {
563 .getKnownMinValue());
565 LLT ScalarTy =
MRI.getType(
MI.getOperand(1).getReg());
572 OpdsMapping[1] = GPRValueMapping;
575 case TargetOpcode::G_INTRINSIC: {
579 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
580 unsigned ScalarIdx = -1;
581 if (
II->hasScalarOperand()) {
582 ScalarIdx =
II->ScalarOperand + 2;
584 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
592 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
596 OpdsMapping[Idx] = GPRValueMapping;
601 if (IntrinsicID == Intrinsic::riscv_orc_b ||
602 IntrinsicID == Intrinsic::riscv_vsetvli ||
603 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
604 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
608 OpdsMapping[Idx] = GPRValueMapping;
615 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
616 auto &MO =
MI.getOperand(Idx);
617 if (!MO.isReg() || !MO.getReg())
619 LLT Ty =
MRI.getType(MO.getReg());
629 OpdsMapping[Idx] = GPRValueMapping;