diff options
| author | Chad Rosier <mcrosier@codeaurora.org> | 2013-10-31 22:37:08 +0000 |
|---|---|---|
| committer | Chad Rosier <mcrosier@codeaurora.org> | 2013-10-31 22:37:08 +0000 |
| commit | 74329d6cff36eaf0e2b527620d127f225a10d528 (patch) | |
| tree | 1edf3b74451336ace6573320463e0f62848ef284 | |
| parent | 74b65cd811163f3a0ee24760b10336911a5288e8 (diff) | |
| download | bcm5719-llvm-74329d6cff36eaf0e2b527620d127f225a10d528.tar.gz bcm5719-llvm-74329d6cff36eaf0e2b527620d127f225a10d528.zip | |
[AArch64] Add support for NEON scalar fixed-point convert to floating-point instructions.
llvm-svn: 193817
| -rw-r--r-- | clang/include/clang/Basic/arm_neon.td | 12 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 14 | ||||
| -rw-r--r-- | clang/test/CodeGen/aarch64-neon-intrinsics.c | 24 |
3 files changed, 50 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/arm_neon.td b/clang/include/clang/Basic/arm_neon.td index 8f300647526..96f9aa40efa 100644 --- a/clang/include/clang/Basic/arm_neon.td +++ b/clang/include/clang/Basic/arm_neon.td @@ -821,6 +821,18 @@ def SCALAR_SQRSHRUN_N: SInst<"vqrshrun_n", "zsi", "SsSiSl">; } //////////////////////////////////////////////////////////////////////////////// +// Scalar Signed/Unsigned Fixed-point Convert To Floating-Point (Immediate) +def SCALAR_SCVTF_N_F32: SInst<"vcvt_n_f32", "ysi", "SiSUi">; +def SCALAR_SCVTF_N_F64: SInst<"vcvt_n_f64", "osi", "SlSUl">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Floating-point Convert To Signed/Unsigned Fixed-point (Immediate) +def SCALAR_FCVTZS_N_S32 : SInst<"vcvt_n_s32", "xsi", "Sf">; +def SCALAR_FCVTZU_N_U32 : SInst<"vcvt_n_u32", "usi", "Sf">; +def SCALAR_FCVTZS_N_S64 : SInst<"vcvt_n_s64", "xsi", "Sd">; +def SCALAR_FCVTZU_N_U64 : SInst<"vcvt_n_u64", "usi", "Sd">; + +//////////////////////////////////////////////////////////////////////////////// // Scalar Reduce Pairwise Addition (Scalar and Floating Point) def SCALAR_ADDP : SInst<"vpadd", "sd", "SfSHlSHd">; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1bed4888583..8f724501d26 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -2331,6 +2331,20 @@ static Value *EmitAArch64ScalarBuiltinExpr(CodeGenFunction &CGF, case AArch64::BI__builtin_neon_vqrshrund_n_s64: Int = Intrinsic::aarch64_neon_vsqrshrun; s = "vsqrshrun"; OverloadInt = true; break; + // Scalar Signed Fixed-point Convert To Floating-Point (Immediate) + case AArch64::BI__builtin_neon_vcvts_n_f32_s32: + Int = Intrinsic::aarch64_neon_vcvtf32_n_s32; + s = "vcvtf"; OverloadInt = false; break; + case AArch64::BI__builtin_neon_vcvtd_n_f64_s64: + Int = Intrinsic::aarch64_neon_vcvtf64_n_s64; + s = "vcvtf"; OverloadInt = false; break; + // Scalar Unsigned Fixed-point Convert To Floating-Point (Immediate) + case AArch64::BI__builtin_neon_vcvts_n_f32_u32: + Int = Intrinsic::aarch64_neon_vcvtf32_n_u32; + s = "vcvtf"; OverloadInt = false; break; + case AArch64::BI__builtin_neon_vcvtd_n_f64_u64: + Int = Intrinsic::aarch64_neon_vcvtf64_n_u64; + s = "vcvtf"; OverloadInt = false; break; } if (!Int) diff --git a/clang/test/CodeGen/aarch64-neon-intrinsics.c b/clang/test/CodeGen/aarch64-neon-intrinsics.c index 159918fc25e..6cc6a69ad16 100644 --- a/clang/test/CodeGen/aarch64-neon-intrinsics.c +++ b/clang/test/CodeGen/aarch64-neon-intrinsics.c @@ -7747,3 +7747,27 @@ int32_t test_vqrshrund_n_s64(int64_t a) { // CHECK: sqrshrun {{s[0-9]+}}, {{d[0-9]+}}, #63 return (int32_t)vqrshrund_n_s64(a, 63); } + +float32_t test_vcvts_n_f32_s32(int32_t a) { +// CHECK: test_vcvts_n_f32_s32 +// CHECK: scvtf {{s[0-9]+}}, {{s[0-9]+}}, #0 + return (float32_t)vcvts_n_f32_s32(a, 0); +} + +float64_t test_vcvtd_n_f64_s64(int64_t a) { +// CHECK: test_vcvtd_n_f64_s64 +// CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}, #0 + return (float64_t)vcvtd_n_f64_s64(a, 0); +} + +float32_t test_vcvts_n_f32_u32(uint32_t a) { +// CHECK: test_vcvts_n_f32_u32 +// CHECK: ucvtf {{s[0-9]+}}, {{s[0-9]+}}, #0 + return (float32_t)vcvts_n_f32_u32(a, 0); +} + +float64_t test_vcvtd_n_f64_u64(uint64_t a) { +// CHECK: test_vcvtd_n_f64_u64 +// CHECK: ucvtf {{d[0-9]+}}, {{d[0-9]+}}, #0 + return (float64_t)vcvtd_n_f64_u64(a, 0); +} |

