207 const unsigned Opc =
MI.getOpcode();
223 assert((GPRSize == 32 || GPRSize == 64) &&
"Unexpected GPR size");
225 unsigned NumOperands =
MI.getNumOperands();
231 case TargetOpcode::G_ADD:
232 case TargetOpcode::G_SUB:
233 case TargetOpcode::G_SHL:
234 case TargetOpcode::G_ASHR:
235 case TargetOpcode::G_LSHR:
236 case TargetOpcode::G_AND:
237 case TargetOpcode::G_OR:
238 case TargetOpcode::G_XOR:
239 case TargetOpcode::G_MUL:
240 case TargetOpcode::G_SDIV:
241 case TargetOpcode::G_SREM:
242 case TargetOpcode::G_SMULH:
243 case TargetOpcode::G_SMAX:
244 case TargetOpcode::G_SMIN:
245 case TargetOpcode::G_UDIV:
246 case TargetOpcode::G_UREM:
247 case TargetOpcode::G_UMULH:
248 case TargetOpcode::G_UMAX:
249 case TargetOpcode::G_UMIN:
250 case TargetOpcode::G_PTR_ADD:
251 case TargetOpcode::G_PTRTOINT:
252 case TargetOpcode::G_INTTOPTR:
253 case TargetOpcode::G_FADD:
254 case TargetOpcode::G_FSUB:
255 case TargetOpcode::G_FMUL:
256 case TargetOpcode::G_FDIV:
257 case TargetOpcode::G_FABS:
258 case TargetOpcode::G_FNEG:
259 case TargetOpcode::G_FSQRT:
260 case TargetOpcode::G_FMAXNUM:
261 case TargetOpcode::G_FMINNUM: {
262 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
271 Mapping = GPRValueMapping;
275 for (
unsigned Idx = 1; Idx != NumOperands; ++Idx) {
276 LLT OpTy =
MRI.getType(
MI.getOperand(Idx).getReg());
278 "Operand has incompatible type");
287 case TargetOpcode::G_SEXTLOAD:
288 case TargetOpcode::G_ZEXTLOAD:
291 case TargetOpcode::G_IMPLICIT_DEF: {
293 LLT DstTy =
MRI.getType(Dst);
295 auto Mapping = GPRValueMapping;
303 else if (anyUseOnlyUseFP(Dst,
MRI,
TRI))
314 case TargetOpcode::G_LOAD: {
315 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
318 OpdsMapping[1] = GPRValueMapping;
325 OpdsMapping[0] = GPRValueMapping;
332 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
341 if (anyUseOnlyUseFP(
MI.getOperand(0).getReg(),
MRI,
TRI)) {
352 case TargetOpcode::G_STORE: {
353 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
356 OpdsMapping[1] = GPRValueMapping;
363 OpdsMapping[0] = GPRValueMapping;
370 if (GPRSize == 32 &&
Size.getFixedValue() == 64) {
381 case TargetOpcode::G_SELECT: {
382 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
386 LLT TestTy =
MRI.getType(Sel.getCondReg());
387 assert(TestTy.
isVector() &&
"Unexpected condition argument type");
388 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] =
401 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
410 if (
any_of(
MRI.use_nodbg_instructions(
MI.getOperand(0).getReg()),
412 return onlyUsesFP(UseMI, MRI, TRI);
429 for (
unsigned Idx = 2; Idx < 4; ++Idx) {
439 OpdsMapping[1] = GPRValueMapping;
445 OpdsMapping[0] = OpdsMapping[2] = OpdsMapping[3] = Mapping;
448 case RISCV::G_FCVT_W_RV64:
449 case RISCV::G_FCVT_WU_RV64:
450 case TargetOpcode::G_FPTOSI:
451 case TargetOpcode::G_FPTOUI:
452 case RISCV::G_FCLASS: {
453 LLT Ty =
MRI.getType(
MI.getOperand(1).getReg());
454 OpdsMapping[0] = GPRValueMapping;
458 case TargetOpcode::G_SITOFP:
459 case TargetOpcode::G_UITOFP: {
460 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
462 OpdsMapping[1] = GPRValueMapping;
465 case TargetOpcode::G_FCMP: {
466 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
468 unsigned Size = Ty.getSizeInBits();
470 OpdsMapping[0] = GPRValueMapping;
474 case TargetOpcode::G_MERGE_VALUES: {
476 LLT Ty =
MRI.getType(
MI.getOperand(0).getReg());
477 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
480 OpdsMapping[1] = GPRValueMapping;
481 OpdsMapping[2] = GPRValueMapping;
485 case TargetOpcode::G_UNMERGE_VALUES: {
487 LLT Ty =
MRI.getType(
MI.getOperand(2).getReg());
488 if (GPRSize == 32 && Ty.getSizeInBits() == 64) {
490 OpdsMapping[0] = GPRValueMapping;
491 OpdsMapping[1] = GPRValueMapping;
496 case TargetOpcode::G_SPLAT_VECTOR: {
499 .getKnownMinValue());
501 LLT ScalarTy =
MRI.getType(
MI.getOperand(1).getReg());
508 OpdsMapping[1] = GPRValueMapping;
511 case TargetOpcode::G_INTRINSIC: {
515 RISCVVIntrinsicsTable::getRISCVVIntrinsicInfo(IntrinsicID)) {
516 unsigned ScalarIdx = -1;
517 if (
II->hasScalarOperand()) {
518 ScalarIdx =
II->ScalarOperand + 2;
520 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
528 }
else if (
II->IsFPIntrinsic && ScalarIdx == Idx) {
532 OpdsMapping[Idx] = GPRValueMapping;
540 for (
unsigned Idx = 0; Idx < NumOperands; ++Idx) {
541 auto &MO =
MI.getOperand(Idx);
542 if (!MO.isReg() || !MO.getReg())
544 LLT Ty =
MRI.getType(MO.getReg());
554 OpdsMapping[Idx] = GPRValueMapping;