diff options
| author | Juergen Ributzka <juergen@apple.com> | 2014-11-11 23:10:44 +0000 |
|---|---|---|
| committer | Juergen Ributzka <juergen@apple.com> | 2014-11-11 23:10:44 +0000 |
| commit | 89441b0dd895fa31a16d8e5d95ca9e741faf36b6 (patch) | |
| tree | a15e9639e46fe1dfbd5d60bf5d6bc7279bddbb2a /llvm | |
| parent | 97b45874bf1258c75253b994d4100e97600fc189 (diff) | |
| download | bcm5719-llvm-89441b0dd895fa31a16d8e5d95ca9e741faf36b6.tar.gz bcm5719-llvm-89441b0dd895fa31a16d8e5d95ca9e741faf36b6.zip | |
[FastISel][AArch64] Add support for fabs intrinsic.
Lower the llvm.fabs intrinsic to the 'fabs' MI instruction.
This fixes rdar://problem/18946552.
llvm-svn: 221729
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64FastISel.cpp | 26 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/fast-isel-intrinsic.ll | 19 |
2 files changed, 45 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64FastISel.cpp b/llvm/lib/Target/AArch64/AArch64FastISel.cpp index 8ec0ce4c926..5381e0c059b 100644 --- a/llvm/lib/Target/AArch64/AArch64FastISel.cpp +++ b/llvm/lib/Target/AArch64/AArch64FastISel.cpp @@ -3299,6 +3299,32 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) { updateValueMap(II, CLI.ResultReg); return true; } + case Intrinsic::fabs: { + MVT VT; + if (!isTypeLegal(II->getType(), VT)) + return false; + + unsigned Opc; + switch (VT.SimpleTy) { + default: + return false; + case MVT::f32: + Opc = AArch64::FABSSr; + break; + case MVT::f64: + Opc = AArch64::FABSDr; + break; + } + unsigned SrcReg = getRegForValue(II->getOperand(0)); + if (!SrcReg) + return false; + bool SrcRegIsKill = hasTrivialKill(II->getOperand(0)); + unsigned ResultReg = createResultReg(TLI.getRegClassFor(VT)); + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(Opc), ResultReg) + .addReg(SrcReg, getKillRegState(SrcRegIsKill)); + updateValueMap(II, ResultReg); + return true; + } case Intrinsic::trap: { BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, TII.get(AArch64::BRK)) .addImm(1); diff --git a/llvm/test/CodeGen/AArch64/fast-isel-intrinsic.ll b/llvm/test/CodeGen/AArch64/fast-isel-intrinsic.ll new file mode 100644 index 00000000000..fd1198a5a4e --- /dev/null +++ b/llvm/test/CodeGen/AArch64/fast-isel-intrinsic.ll @@ -0,0 +1,19 @@ +; RUN: llc -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -verify-machineinstrs < %s | FileCheck %s + +define float @fabs_f32(float %a) { +; CHECK-LABEL: fabs_f32 +; CHECK: fabs s0, s0 + %1 = call float @llvm.fabs.f32(float %a) + ret float %1 +} + +define double @fabs_f64(double %a) { +; CHECK-LABEL: fabs_f64 +; CHECK: fabs d0, d0 + %1 = call double @llvm.fabs.f64(double %a) + ret double %1 +} + +declare double @llvm.fabs.f64(double) +declare float @llvm.fabs.f32(float) |

