diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-05-17 12:19:57 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-05-17 12:19:57 +0000 |
| commit | 6aafc5e19d30a517f39a8ff7d7705d3b0b39c3ec (patch) | |
| tree | 9712c9f8440d7348b3091ee8b2afd17fad183ea0 /llvm/lib/Target | |
| parent | 1448f5689e29f049dd50abb3afa5df4c6dfe585d (diff) | |
| download | bcm5719-llvm-6aafc5e19d30a517f39a8ff7d7705d3b0b39c3ec.tar.gz bcm5719-llvm-6aafc5e19d30a517f39a8ff7d7705d3b0b39c3ec.zip | |
AMDGPU/GlobalISel: Legalize G_FRINT
llvm-svn: 361026
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp | 41 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h | 3 |
2 files changed, 44 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp index 63b517f04ff..64ae29ec998 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp @@ -293,6 +293,18 @@ AMDGPULegalizerInfo::AMDGPULegalizerInfo(const GCNSubtarget &ST, .legalFor({S32, S64}) .scalarize(0); + if (ST.getGeneration() >= AMDGPUSubtarget::SEA_ISLANDS) { + getActionDefinitionsBuilder(G_FRINT) + .legalFor({S32, S64}) + .clampScalar(0, S32, S64) + .scalarize(0); + } else { + getActionDefinitionsBuilder(G_FRINT) + .legalFor({S32}) + .customFor({S64}) + .clampScalar(0, S32, S64) + .scalarize(0); + } getActionDefinitionsBuilder(G_GEP) .legalForCartesianProduct(AddrSpaces64, {S64}) @@ -675,6 +687,8 @@ bool AMDGPULegalizerInfo::legalizeCustom(MachineInstr &MI, switch (MI.getOpcode()) { case TargetOpcode::G_ADDRSPACE_CAST: return legalizeAddrSpaceCast(MI, MRI, MIRBuilder); + case TargetOpcode::G_FRINT: + return legalizeFrint(MI, MRI, MIRBuilder); default: return false; } @@ -831,3 +845,30 @@ bool AMDGPULegalizerInfo::legalizeAddrSpaceCast( MI.eraseFromParent(); return true; } + +bool AMDGPULegalizerInfo::legalizeFrint( + MachineInstr &MI, MachineRegisterInfo &MRI, + MachineIRBuilder &MIRBuilder) const { + MIRBuilder.setInstr(MI); + + unsigned Src = MI.getOperand(1).getReg(); + LLT Ty = MRI.getType(Src); + assert(Ty.isScalar() && Ty.getSizeInBits() == 64); + + APFloat C1Val(APFloat::IEEEdouble(), "0x1.0p+52"); + APFloat C2Val(APFloat::IEEEdouble(), "0x1.fffffffffffffp+51"); + + auto C1 = MIRBuilder.buildFConstant(Ty, C1Val); + auto CopySign = MIRBuilder.buildFCopysign(Ty, C1, Src); + + // TODO: Should this propagate fast-math-flags? + auto Tmp1 = MIRBuilder.buildFAdd(Ty, Src, CopySign); + auto Tmp2 = MIRBuilder.buildFSub(Ty, Tmp1, CopySign); + + auto C2 = MIRBuilder.buildFConstant(Ty, C2Val); + auto Fabs = MIRBuilder.buildFAbs(Ty, Src); + + auto Cond = MIRBuilder.buildFCmp(CmpInst::FCMP_OGT, LLT::scalar(1), Fabs, C2); + MIRBuilder.buildSelect(MI.getOperand(0).getReg(), Cond, Src, Tmp2); + return true; +} diff --git a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h index 65fb9caa490..13ac2408a2e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.h @@ -38,6 +38,9 @@ public: bool legalizeAddrSpaceCast(MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder) const; + bool legalizeFrint(MachineInstr &MI, MachineRegisterInfo &MRI, + MachineIRBuilder &MIRBuilder) const; + }; } // End llvm namespace. #endif |

