225 const unsigned Opc =
MI.getOpcode();
240 unsigned GPRSize = Subtarget.
getXLen();
242 unsigned NumOperands =
MI.getNumOperands();
248 case TargetOpcode::G_ADD:
249 case TargetOpcode::G_SUB:
250 case TargetOpcode::G_SHL:
251 case TargetOpcode::G_ASHR:
252 case TargetOpcode::G_LSHR:
253 case TargetOpcode::G_AND:
254 case TargetOpcode::G_OR:
255 case TargetOpcode::G_XOR:
256 case TargetOpcode::G_MUL:
257 case TargetOpcode::G_SDIV:
258 case TargetOpcode::G_SREM:
259 case TargetOpcode::G_SMULH:
260 case TargetOpcode::G_SMAX:
261 case TargetOpcode::G_SMIN:
262 case TargetOpcode::G_UDIV:
263 case TargetOpcode::G_UREM:
264 case TargetOpcode::G_UMULH:
265 case TargetOpcode::G_UMAX:
266 case TargetOpcode::G_UMIN:
267 case TargetOpcode::G_PTR_ADD:
268 case TargetOpcode::G_PTRTOINT:
269 case TargetOpcode::G_INTTOPTR:
270 case TargetOpcode::G_FADD:
271 case TargetOpcode::G_FSUB:
272 case TargetOpcode::G_FMUL:
273 case TargetOpcode::G_FDIV:
274 case TargetOpcode::G_FABS:
275 case TargetOpcode::G_FNEG:
276 case TargetOpcode::G_FSQRT:
277 case TargetOpcode::G_FMAXNUM:
278 case TargetOpcode::G_FMINNUM: {
288 Mapping = GPRValueMapping;
292 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
295 "Operand has incompatible type");
298 assert(
Size ==
OpTy.getSizeInBits() &&
"Operand has incompatible size");
304 case TargetOpcode::G_SEXTLOAD:
305 case TargetOpcode::G_ZEXTLOAD:
308 case TargetOpcode::G_IMPLICIT_DEF: {
312 auto Mapping = GPRValueMapping;
320 else if (anyUseOnlyUseFP(Dst, MRI,
TRI))
331 case TargetOpcode::G_LOAD: {
335 OpdsMapping[1] = GPRValueMapping;
342 OpdsMapping[0] = GPRValueMapping;
349 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
358 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(), MRI,
TRI)) {
369 case TargetOpcode::G_STORE: {
373 OpdsMapping[1] = GPRValueMapping;
380 OpdsMapping[0] = GPRValueMapping;
387 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
394 if (onlyDefinesFP(*
DefMI, MRI,
TRI))
398 case TargetOpcode::G_SELECT: {
404 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
405 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
418 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
429 return onlyUsesFP(UseMI, MRI, TRI);
446 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
456 OpdsMapping[1] = GPRValueMapping;
462 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
465 case RISCV::G_FCVT_W_RV64:
466 case RISCV::G_FCVT_WU_RV64:
467 case TargetOpcode::G_FPTOSI:
468 case TargetOpcode::G_FPTOUI:
469 case TargetOpcode::G_LROUND:
470 case TargetOpcode::G_LLROUND:
471 case TargetOpcode::G_INTRINSIC_LRINT:
472 case TargetOpcode::G_INTRINSIC_LLRINT:
473 case RISCV::G_FCLASS: {
475 OpdsMapping[0] = GPRValueMapping;
479 case TargetOpcode::G_SITOFP:
480 case TargetOpcode::G_UITOFP: {
483 OpdsMapping[1] = GPRValueMapping;
486 case TargetOpcode::G_FCMP: {
489 unsigned Size = Ty.getSizeInBits();
491 OpdsMapping[0] = GPRValueMapping;
495 case TargetOpcode::G_MERGE_VALUES: {
498 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
501 OpdsMapping[1] = GPRValueMapping;
502 OpdsMapping[2] = GPRValueMapping;
506 case TargetOpcode::G_UNMERGE_VALUES: {
509 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
511 OpdsMapping[0] = GPRValueMapping;
512 OpdsMapping[1] = GPRValueMapping;
517 case TargetOpcode::G_SPLAT_VECTOR: {
529 OpdsMapping[1] = GPRValueMapping;
532 case TargetOpcode::G_INTRINSIC: {
536 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
537 unsigned ScalarIdx = -1;
538 if (
II->hasScalarOperand()) {
539 ScalarIdx =
II->ScalarOperand + 2;
541 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
549 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
553 OpdsMapping[Idx] = GPRValueMapping;
558 if (IntrinsicID == Intrinsic::riscv_vsetvli ||
559 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
560 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
564 OpdsMapping[Idx] = GPRValueMapping;
571 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
572 auto &MO =
MI.getOperand(Idx);
573 if (!MO.isReg() || !MO.getReg())
585 OpdsMapping[Idx] = GPRValueMapping;