From: Chad Rosier Date: Tue, 8 Oct 2013 22:09:29 +0000 (+0000) Subject: [AArch64] Add support for NEON scalar floating-point reciprocal estimate, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3cb333070d35c9a6843e4211c9a74322f6c126ec;p=clang [AArch64] Add support for NEON scalar floating-point reciprocal estimate, reciprocal exponent, and reciprocal square root estimate instructions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192243 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/arm_neon.td b/include/clang/Basic/arm_neon.td index 6228bdc043..01934ae780 100644 --- a/include/clang/Basic/arm_neon.td +++ b/include/clang/Basic/arm_neon.td @@ -777,4 +777,16 @@ def SCALAR_SCVTFD : SInst<"vcvt_f64", "os", "Sl">; def SCALAR_UCVTFS : SInst<"vcvt_f32", "ys", "SUi">; def SCALAR_UCVTFD : SInst<"vcvt_f64", "os", "SUl">; +//////////////////////////////////////////////////////////////////////////////// +// Scalar Floating-point Reciprocal Estimate +def SCALAR_FRECPE : IInst<"vrecpe", "ss", "SfSd">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Floating-point Reciprocal Exponent +def SCALAR_FRECPX : IInst<"vrecpx", "ss", "SfSd">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Floating-point Reciprocal Square Root Estimate +def SCALAR_FRSQRTE : IInst<"vrsqrte", "ss", "SfSd">; + } diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index a2b0bbc282..8378d99171 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1985,6 +1985,21 @@ static Value *EmitAArch64ScalarBuiltinExpr(CodeGenFunction &CGF, case AArch64::BI__builtin_neon_vcvtd_f64_u64: Int = Intrinsic::aarch64_neon_vcvtf64_u64, s = "vcvtf"; OverloadInt = false; break; + // Scalar Floating-point Reciprocal Estimate + case AArch64::BI__builtin_neon_vrecpes_f32: + case AArch64::BI__builtin_neon_vrecped_f64: + Int = Intrinsic::arm_neon_vrecpe; + s = "vrecpe"; OverloadInt = true; break; + // Scalar Floating-point Reciprocal Exponent + case AArch64::BI__builtin_neon_vrecpxs_f32: + case AArch64::BI__builtin_neon_vrecpxd_f64: + Int = Intrinsic::aarch64_neon_vrecpx; + s = "vrecpx"; OverloadInt = true; break; + // Scalar Floating-point Reciprocal Square Root Estimate + case AArch64::BI__builtin_neon_vrsqrtes_f32: + case AArch64::BI__builtin_neon_vrsqrted_f64: + Int = Intrinsic::arm_neon_vrsqrte; + s = "vrsqrte"; OverloadInt = true; break; } if (!Int) diff --git a/test/CodeGen/aarch64-neon-intrinsics.c b/test/CodeGen/aarch64-neon-intrinsics.c index d672f09600..bc071bc490 100644 --- a/test/CodeGen/aarch64-neon-intrinsics.c +++ b/test/CodeGen/aarch64-neon-intrinsics.c @@ -5621,3 +5621,39 @@ float64_t test_vcvtd_f64_u64(uint64_t a) { // CHECK: ucvtf {{d[0-9]+}}, {{d[0-9]+}} return (float64_t)vcvtd_f64_u64(a); } + +float32_t test_vrecpes_f32(float32_t a) { +// CHECK: test_vrecpes_f32 +// CHECK: frecpe {{s[0-9]+}}, {{s[0-9]+}} + return vrecpes_f32(a); +} + +float64_t test_vrecped_f64(float64_t a) { +// CHECK: test_vrecped_f64 +// CHECK: frecpe {{d[0-9]+}}, {{d[0-9]+}} + return vrecped_f64(a); +} + +float32_t test_vrecpxs_f32(float32_t a) { +// CHECK: test_vrecpxs_f32 +// CHECK: frecpx {{s[0-9]+}}, {{s[0-9]+}} + return vrecpxs_f32(a); + } + +float64_t test_vrecpxd_f64(float64_t a) { +// CHECK: test_vrecpxd_f64 +// CHECK: frecpx {{d[0-9]+}}, {{d[0-9]+}} + return vrecpxd_f64(a); +} + +float32_t test_vrsqrtes_f32(float32_t a) { +// CHECK: vrsqrtes_f32 +// CHECK: frsqrte {{s[0-9]+}}, {{s[0-9]+}} + return vrsqrtes_f32(a); +} + +float64_t test_vrsqrted_f64(float64_t a) { +// CHECK: vrsqrted_f64 +// CHECK: frsqrte {{d[0-9]+}}, {{d[0-9]+}} + return vrsqrted_f64(a); +}