mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 03:56:16 +08:00
[GlobalISel][AArch64] Add libcall lowering for fpowi. (#67114)
This adds legalization, notably libcall lowering for fpowi. It is a little different to other methods as the function takes both a float and integer register. Otherwise all vectors get scalarized and fp16 is promoted to fp32.
This commit is contained in:
@@ -532,6 +532,8 @@ static RTLIB::Libcall getRTLibDesc(unsigned Opcode, unsigned Size) {
|
||||
RTLIBCASE(REM_F);
|
||||
case TargetOpcode::G_FPOW:
|
||||
RTLIBCASE(POW_F);
|
||||
case TargetOpcode::G_FPOWI:
|
||||
RTLIBCASE(POWI_F);
|
||||
case TargetOpcode::G_FMA:
|
||||
RTLIBCASE(FMA_F);
|
||||
case TargetOpcode::G_FSIN:
|
||||
@@ -1014,6 +1016,27 @@ LegalizerHelper::libcall(MachineInstr &MI, LostDebugLocObserver &LocObserver) {
|
||||
return Status;
|
||||
break;
|
||||
}
|
||||
case TargetOpcode::G_FPOWI: {
|
||||
LLT LLTy = MRI.getType(MI.getOperand(0).getReg());
|
||||
unsigned Size = LLTy.getSizeInBits();
|
||||
Type *HLTy = getFloatTypeForLLT(Ctx, LLTy);
|
||||
Type *ITy = IntegerType::get(
|
||||
Ctx, MRI.getType(MI.getOperand(2).getReg()).getSizeInBits());
|
||||
if (!HLTy || (Size != 32 && Size != 64 && Size != 80 && Size != 128)) {
|
||||
LLVM_DEBUG(dbgs() << "No libcall available for type " << LLTy << ".\n");
|
||||
return UnableToLegalize;
|
||||
}
|
||||
auto Libcall = getRTLibDesc(MI.getOpcode(), Size);
|
||||
std::initializer_list<CallLowering::ArgInfo> Args = {
|
||||
{MI.getOperand(1).getReg(), HLTy, 0},
|
||||
{MI.getOperand(2).getReg(), ITy, 1}};
|
||||
LegalizeResult Status =
|
||||
createLibcall(MIRBuilder, Libcall, {MI.getOperand(0).getReg(), HLTy, 0},
|
||||
Args, LocObserver, &MI);
|
||||
if (Status != Legalized)
|
||||
return Status;
|
||||
break;
|
||||
}
|
||||
case TargetOpcode::G_FPEXT:
|
||||
case TargetOpcode::G_FPTRUNC: {
|
||||
Type *FromTy = getFloatTypeForLLT(Ctx, MRI.getType(MI.getOperand(1).getReg()));
|
||||
@@ -4557,6 +4580,8 @@ LegalizerHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
|
||||
return fewerElementsVectorReductions(MI, TypeIdx, NarrowTy);
|
||||
case G_SHUFFLE_VECTOR:
|
||||
return fewerElementsVectorShuffle(MI, TypeIdx, NarrowTy);
|
||||
case G_FPOWI:
|
||||
return fewerElementsVectorMultiEltType(GMI, NumElts, {2 /*pow*/});
|
||||
default:
|
||||
return UnableToLegalize;
|
||||
}
|
||||
|
||||
@@ -282,6 +282,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
|
||||
// Regardless of FP16 support, widen 16-bit elements to 32-bits.
|
||||
.minScalar(0, s32)
|
||||
.libcallFor({s32, s64});
|
||||
getActionDefinitionsBuilder(G_FPOWI)
|
||||
.scalarize(0)
|
||||
.minScalar(0, s32)
|
||||
.libcallFor({{s32, s32}, {s64, s32}});
|
||||
|
||||
getActionDefinitionsBuilder(G_INSERT)
|
||||
.legalIf(all(typeInSet(0, {s32, s64, p0}),
|
||||
|
||||
@@ -463,8 +463,8 @@
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
|
||||
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
|
||||
# DEBUG-NEXT: G_FPOWI (opcode {{[0-9]+}}): 2 type indices, 0 imm indices
|
||||
# DEBUG-NEXT:.. type index coverage check SKIPPED: no rules defined
|
||||
# DEBUG-NEXT:.. imm index coverage check SKIPPED: no rules defined
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 2, OK
|
||||
# DEBUG-NEXT: .. the first uncovered imm index: 0, OK
|
||||
# DEBUG-NEXT: G_FEXP (opcode {{[0-9]+}}): 1 type index, 0 imm indices
|
||||
# DEBUG-NEXT: .. opcode {{[0-9]+}} is aliased to {{[0-9]+}}
|
||||
# DEBUG-NEXT: .. the first uncovered type index: 1, OK
|
||||
|
||||
1424
llvm/test/CodeGen/AArch64/fpowi.ll
Normal file
1424
llvm/test/CodeGen/AArch64/fpowi.ll
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user