223 const unsigned Opc =
MI.getOpcode();
238 unsigned GPRSize = Subtarget.
getXLen();
240 unsigned NumOperands =
MI.getNumOperands();
246 case TargetOpcode::G_ADD:
247 case TargetOpcode::G_SUB:
248 case TargetOpcode::G_SHL:
249 case TargetOpcode::G_ASHR:
250 case TargetOpcode::G_LSHR:
251 case TargetOpcode::G_AND:
252 case TargetOpcode::G_OR:
253 case TargetOpcode::G_XOR:
254 case TargetOpcode::G_MUL:
255 case TargetOpcode::G_SDIV:
256 case TargetOpcode::G_SREM:
257 case TargetOpcode::G_SMULH:
258 case TargetOpcode::G_SMAX:
259 case TargetOpcode::G_SMIN:
260 case TargetOpcode::G_UDIV:
261 case TargetOpcode::G_UREM:
262 case TargetOpcode::G_UMULH:
263 case TargetOpcode::G_UMAX:
264 case TargetOpcode::G_UMIN:
265 case TargetOpcode::G_PTR_ADD:
266 case TargetOpcode::G_PTRTOINT:
267 case TargetOpcode::G_INTTOPTR:
268 case TargetOpcode::G_FADD:
269 case TargetOpcode::G_FSUB:
270 case TargetOpcode::G_FMUL:
271 case TargetOpcode::G_FDIV:
272 case TargetOpcode::G_FABS:
273 case TargetOpcode::G_FNEG:
274 case TargetOpcode::G_FSQRT:
275 case TargetOpcode::G_FMAXNUM:
276 case TargetOpcode::G_FMINNUM: {
286 Mapping = GPRValueMapping;
290 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
293 "Operand has incompatible type");
296 assert(
Size ==
OpTy.getSizeInBits() &&
"Operand has incompatible size");
302 case TargetOpcode::G_SEXTLOAD:
303 case TargetOpcode::G_ZEXTLOAD:
306 case TargetOpcode::G_IMPLICIT_DEF: {
310 auto Mapping = GPRValueMapping;
318 else if (anyUseOnlyUseFP(Dst, MRI,
TRI))
329 case TargetOpcode::G_LOAD: {
333 OpdsMapping[1] = GPRValueMapping;
340 OpdsMapping[0] = GPRValueMapping;
347 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
356 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(), MRI,
TRI)) {
367 case TargetOpcode::G_STORE: {
371 OpdsMapping[1] = GPRValueMapping;
378 OpdsMapping[0] = GPRValueMapping;
385 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
392 if (onlyDefinesFP(*
DefMI, MRI,
TRI))
396 case TargetOpcode::G_SELECT: {
402 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
403 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
416 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
427 return onlyUsesFP(UseMI, MRI, TRI);
444 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
454 OpdsMapping[1] = GPRValueMapping;
460 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
463 case RISCV::G_FCVT_W_RV64:
464 case RISCV::G_FCVT_WU_RV64:
465 case TargetOpcode::G_FPTOSI:
466 case TargetOpcode::G_FPTOUI:
467 case TargetOpcode::G_LROUND:
468 case TargetOpcode::G_LLROUND:
469 case RISCV::G_FCLASS: {
471 OpdsMapping[0] = GPRValueMapping;
475 case TargetOpcode::G_SITOFP:
476 case TargetOpcode::G_UITOFP: {
479 OpdsMapping[1] = GPRValueMapping;
482 case TargetOpcode::G_FCMP: {
485 unsigned Size = Ty.getSizeInBits();
487 OpdsMapping[0] = GPRValueMapping;
491 case TargetOpcode::G_MERGE_VALUES: {
494 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
497 OpdsMapping[1] = GPRValueMapping;
498 OpdsMapping[2] = GPRValueMapping;
502 case TargetOpcode::G_UNMERGE_VALUES: {
505 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
507 OpdsMapping[0] = GPRValueMapping;
508 OpdsMapping[1] = GPRValueMapping;
513 case TargetOpcode::G_SPLAT_VECTOR: {
525 OpdsMapping[1] = GPRValueMapping;
528 case TargetOpcode::G_INTRINSIC: {
532 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
533 unsigned ScalarIdx = -1;
534 if (
II->hasScalarOperand()) {
535 ScalarIdx =
II->ScalarOperand + 2;
537 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
545 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
549 OpdsMapping[Idx] = GPRValueMapping;
554 if (IntrinsicID == Intrinsic::riscv_vsetvli ||
555 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
556 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
560 OpdsMapping[Idx] = GPRValueMapping;
567 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
568 auto &MO =
MI.getOperand(Idx);
569 if (!MO.isReg() || !MO.getReg())
581 OpdsMapping[Idx] = GPRValueMapping;