242 const unsigned Opc =
MI.getOpcode();
257 unsigned GPRSize = Subtarget.
getXLen();
259 unsigned NumOperands =
MI.getNumOperands();
265 case TargetOpcode::G_ADD:
266 case TargetOpcode::G_SUB:
267 case TargetOpcode::G_SHL:
268 case TargetOpcode::G_ASHR:
269 case TargetOpcode::G_LSHR:
270 case TargetOpcode::G_AND:
271 case TargetOpcode::G_OR:
272 case TargetOpcode::G_XOR:
273 case TargetOpcode::G_MUL:
274 case TargetOpcode::G_SDIV:
275 case TargetOpcode::G_SREM:
276 case TargetOpcode::G_SMULH:
277 case TargetOpcode::G_SMAX:
278 case TargetOpcode::G_SMIN:
279 case TargetOpcode::G_UDIV:
280 case TargetOpcode::G_UREM:
281 case TargetOpcode::G_UMULH:
282 case TargetOpcode::G_UMAX:
283 case TargetOpcode::G_UMIN:
284 case TargetOpcode::G_PTR_ADD:
285 case TargetOpcode::G_PTRTOINT:
286 case TargetOpcode::G_INTTOPTR:
287 case TargetOpcode::G_FADD:
288 case TargetOpcode::G_FSUB:
289 case TargetOpcode::G_FMUL:
290 case TargetOpcode::G_FDIV:
291 case TargetOpcode::G_FABS:
292 case TargetOpcode::G_FNEG:
293 case TargetOpcode::G_FSQRT:
294 case TargetOpcode::G_FMAXNUM:
295 case TargetOpcode::G_FMINNUM: {
305 Mapping = GPRValueMapping;
309 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
312 "Operand has incompatible type");
315 assert(
Size ==
OpTy.getSizeInBits() &&
"Operand has incompatible size");
321 case TargetOpcode::G_SEXTLOAD:
322 case TargetOpcode::G_ZEXTLOAD:
325 case TargetOpcode::G_IMPLICIT_DEF: {
329 auto Mapping = GPRValueMapping;
337 else if (anyUseOnlyUseFP(Dst, MRI,
TRI))
348 case TargetOpcode::G_LOAD: {
352 OpdsMapping[1] = GPRValueMapping;
359 OpdsMapping[0] = GPRValueMapping;
367 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
373 assert(ST.hasStdExtD() &&
"s64 load without D or Zilsd");
381 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(), MRI,
TRI)) {
392 case TargetOpcode::G_STORE: {
396 OpdsMapping[1] = GPRValueMapping;
403 OpdsMapping[0] = GPRValueMapping;
411 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
417 assert(ST.hasStdExtD() &&
"s64 store without D or Zilsd");
423 if (onlyDefinesFP(*
DefMI, MRI,
TRI))
427 case TargetOpcode::G_SELECT: {
433 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
434 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
449 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
460 return onlyUsesFP(UseMI, MRI, TRI);
477 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
487 OpdsMapping[1] = GPRValueMapping;
493 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
496 case RISCV::G_FCVT_W_RV64:
497 case RISCV::G_FCVT_WU_RV64:
498 case TargetOpcode::G_FPTOSI:
499 case TargetOpcode::G_FPTOUI:
500 case TargetOpcode::G_LROUND:
501 case TargetOpcode::G_LLROUND:
502 case TargetOpcode::G_INTRINSIC_LRINT:
503 case TargetOpcode::G_INTRINSIC_LLRINT:
504 case RISCV::G_FCLASS: {
506 OpdsMapping[0] = GPRValueMapping;
510 case TargetOpcode::G_SITOFP:
511 case TargetOpcode::G_UITOFP: {
514 OpdsMapping[1] = GPRValueMapping;
517 case TargetOpcode::G_FCMP: {
520 unsigned Size = Ty.getSizeInBits();
522 OpdsMapping[0] = GPRValueMapping;
526 case TargetOpcode::G_MERGE_VALUES: {
529 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
535 "s64 merge without D or Zilsd");
536 OpdsMapping[1] = GPRValueMapping;
537 OpdsMapping[2] = GPRValueMapping;
541 case TargetOpcode::G_UNMERGE_VALUES: {
544 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
550 "s64 unmerge without D or Zilsd");
551 OpdsMapping[0] = GPRValueMapping;
552 OpdsMapping[1] = GPRValueMapping;
556 case TargetOpcode::G_SPLAT_VECTOR: {
568 OpdsMapping[1] = GPRValueMapping;
571 case TargetOpcode::G_INTRINSIC: {
575 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
576 unsigned ScalarIdx = -1;
577 if (
II->hasScalarOperand()) {
578 ScalarIdx =
II->ScalarOperand + 2;
580 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
588 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
592 OpdsMapping[Idx] = GPRValueMapping;
597 if (IntrinsicID == Intrinsic::riscv_orc_b ||
598 IntrinsicID == Intrinsic::riscv_vsetvli ||
599 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
600 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
604 OpdsMapping[Idx] = GPRValueMapping;
611 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
612 auto &MO =
MI.getOperand(Idx);
613 if (!MO.isReg() || !MO.getReg())
625 OpdsMapping[Idx] = GPRValueMapping;