[FastISel][AArch64] Add sqrt intrinsic support.

Fixes <rdar://problem/17867067>.

llvm-svn: 214388
This commit is contained in:
Juergen Ributzka 2014-07-31 06:25:33 +00:00
parent a02869de00
commit 130e77e431
2 changed files with 39 additions and 0 deletions

View File

@ -1708,6 +1708,25 @@ bool AArch64FastISel::FastLowerIntrinsicCall(const IntrinsicInst *II) {
.addImm(1);
return true;
}
case Intrinsic::sqrt: {
Type *RetTy = II->getCalledFunction()->getReturnType();
MVT VT;
if (!isTypeLegal(RetTy, VT))
return false;
unsigned Op0Reg = getRegForValue(II->getOperand(0));
if (!Op0Reg)
return false;
bool Op0IsKill = hasTrivialKill(II->getOperand(0));
unsigned ResultReg = FastEmit_r(VT, VT, ISD::FSQRT, Op0Reg, Op0IsKill);
if (!ResultReg)
return false;
UpdateValueMap(II, ResultReg);
return true;
}
case Intrinsic::sadd_with_overflow:
case Intrinsic::uadd_with_overflow:
case Intrinsic::ssub_with_overflow:

View File

@ -0,0 +1,20 @@
; RUN: llc -mtriple=arm64-apple-darwin < %s | FileCheck %s
; RUN: llc -mtriple=arm64-apple-darwin -fast-isel -fast-isel-abort < %s | FileCheck %s
define float @test_sqrt_f32(float %a) {
; CHECK-LABEL: test_sqrt_f32
; CHECK: fsqrt s0, s0
%res = call float @llvm.sqrt.f32(float %a)
ret float %res
}
declare float @llvm.sqrt.f32(float) nounwind readnone
define double @test_sqrt_f64(double %a) {
; CHECK-LABEL: test_sqrt_f64
; CHECK: fsqrt d0, d0
%res = call double @llvm.sqrt.f64(double %a)
ret double %res
}
declare double @llvm.sqrt.f64(double) nounwind readnone