From 4f0d671b970c029a619d6c9ec99d08133e0e54c7 Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Tue, 11 Nov 2014 23:10:44 +0000 Subject: [PATCH] [FastISel][AArch64] Add support for fabs intrinsic. Lower the llvm.fabs intrinsic to the 'fabs' MI instruction. This fixes rdar://problem/18946552. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221729 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/AArch64/AArch64FastISel.cpp | 26 +++++++++++++++++++++ test/CodeGen/AArch64/fast-isel-intrinsic.ll | 19 +++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 test/CodeGen/AArch64/fast-isel-intrinsic.ll diff --git a/lib/Target/AArch64/AArch64FastISel.cpp b/lib/Target/AArch64/AArch64FastISel.cpp index 8ec0ce4c926..5381e0c059b 100644 --- a/lib/Target/AArch64/AArch64FastISel.cpp +++ b/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/test/CodeGen/AArch64/fast-isel-intrinsic.ll b/test/CodeGen/AArch64/fast-isel-intrinsic.ll new file mode 100644 index 00000000000..fd1198a5a4e --- /dev/null +++ b/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) -- 2.34.1