221 const unsigned Opc =
MI.getOpcode();
236 unsigned GPRSize = Subtarget.
getXLen();
238 unsigned NumOperands =
MI.getNumOperands();
244 case TargetOpcode::G_ADD:
245 case TargetOpcode::G_SUB:
246 case TargetOpcode::G_SHL:
247 case TargetOpcode::G_ASHR:
248 case TargetOpcode::G_LSHR:
249 case TargetOpcode::G_AND:
250 case TargetOpcode::G_OR:
251 case TargetOpcode::G_XOR:
252 case TargetOpcode::G_MUL:
253 case TargetOpcode::G_SDIV:
254 case TargetOpcode::G_SREM:
255 case TargetOpcode::G_SMULH:
256 case TargetOpcode::G_SMAX:
257 case TargetOpcode::G_SMIN:
258 case TargetOpcode::G_UDIV:
259 case TargetOpcode::G_UREM:
260 case TargetOpcode::G_UMULH:
261 case TargetOpcode::G_UMAX:
262 case TargetOpcode::G_UMIN:
263 case TargetOpcode::G_PTR_ADD:
264 case TargetOpcode::G_PTRTOINT:
265 case TargetOpcode::G_INTTOPTR:
266 case TargetOpcode::G_FADD:
267 case TargetOpcode::G_FSUB:
268 case TargetOpcode::G_FMUL:
269 case TargetOpcode::G_FDIV:
270 case TargetOpcode::G_FABS:
271 case TargetOpcode::G_FNEG:
272 case TargetOpcode::G_FSQRT:
273 case TargetOpcode::G_FMAXNUM:
274 case TargetOpcode::G_FMINNUM: {
284 Mapping = GPRValueMapping;
288 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
291 "Operand has incompatible type");
300 case TargetOpcode::G_SEXTLOAD:
301 case TargetOpcode::G_ZEXTLOAD:
304 case TargetOpcode::G_IMPLICIT_DEF: {
308 auto Mapping = GPRValueMapping;
316 else if (anyUseOnlyUseFP(Dst, MRI,
TRI))
327 case TargetOpcode::G_LOAD: {
331 OpdsMapping[1] = GPRValueMapping;
338 OpdsMapping[0] = GPRValueMapping;
345 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
354 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(), MRI,
TRI)) {
365 case TargetOpcode::G_STORE: {
369 OpdsMapping[1] = GPRValueMapping;
376 OpdsMapping[0] = GPRValueMapping;
383 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
390 if (onlyDefinesFP(*
DefMI, MRI,
TRI))
394 case TargetOpcode::G_SELECT: {
400 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
401 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
414 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
425 return onlyUsesFP(UseMI, MRI, TRI);
442 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
452 OpdsMapping[1] = GPRValueMapping;
458 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
461 case RISCV::G_FCVT_W_RV64:
462 case RISCV::G_FCVT_WU_RV64:
463 case TargetOpcode::G_FPTOSI:
464 case TargetOpcode::G_FPTOUI:
465 case RISCV::G_FCLASS: {
467 OpdsMapping[0] = GPRValueMapping;
471 case TargetOpcode::G_SITOFP:
472 case TargetOpcode::G_UITOFP: {
475 OpdsMapping[1] = GPRValueMapping;
478 case TargetOpcode::G_FCMP: {
481 unsigned Size = Ty.getSizeInBits();
483 OpdsMapping[0] = GPRValueMapping;
487 case TargetOpcode::G_MERGE_VALUES: {
490 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
493 OpdsMapping[1] = GPRValueMapping;
494 OpdsMapping[2] = GPRValueMapping;
498 case TargetOpcode::G_UNMERGE_VALUES: {
501 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
503 OpdsMapping[0] = GPRValueMapping;
504 OpdsMapping[1] = GPRValueMapping;
509 case TargetOpcode::G_SPLAT_VECTOR: {
521 OpdsMapping[1] = GPRValueMapping;
524 case TargetOpcode::G_INTRINSIC: {
528 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
529 unsigned ScalarIdx = -1;
530 if (
II->hasScalarOperand()) {
531 ScalarIdx =
II->ScalarOperand + 2;
533 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
541 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
545 OpdsMapping[Idx] = GPRValueMapping;
550 if (IntrinsicID == Intrinsic::riscv_vsetvli ||
551 IntrinsicID == Intrinsic::riscv_vsetvlimax) {
552 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
556 OpdsMapping[Idx] = GPRValueMapping;
563 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
564 auto &MO =
MI.getOperand(Idx);
565 if (!MO.isReg() || !MO.getReg())
577 OpdsMapping[Idx] = GPRValueMapping;