diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2013-10-16 16:09:16 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2013-10-16 16:09:16 +0000 |
commit | 069b90463d933b7d5756402178d11de3f6223d1a (patch) | |
tree | edcd8415e349aceba01fabfef9d4625047f22559 | |
parent | 178b1cefc7e633433e6245818244bf7d30a198a4 (diff) | |
download | bcm5719-llvm-069b90463d933b7d5756402178d11de3f6223d1a.tar.gz bcm5719-llvm-069b90463d933b7d5756402178d11de3f6223d1a.zip |
[AArch64] Add support for NEON scalar signed saturating accumulated of unsigned
value and unsigned saturating accumulate of signed value instructions.
llvm-svn: 192801
-rw-r--r-- | clang/include/clang/Basic/arm_neon.td | 8 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 14 | ||||
-rw-r--r-- | clang/test/CodeGen/aarch64-neon-intrinsics.c | 48 |
3 files changed, 70 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/arm_neon.td b/clang/include/clang/Basic/arm_neon.td index 2cca85cc95b..06fb9a3c378 100644 --- a/clang/include/clang/Basic/arm_neon.td +++ b/clang/include/clang/Basic/arm_neon.td @@ -862,4 +862,12 @@ def SCALAR_SQABS : SInst<"vqabs", "ss", "ScSsSiSl">; //////////////////////////////////////////////////////////////////////////////// // Scalar Signed Saturating Negate def SCALAR_SQNEG : SInst<"vqneg", "ss", "ScSsSiSl">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Signed Saturating Accumulated of Unsigned Value +def SCALAR_SUQADD : SInst<"vuqadd", "sss", "ScSsSiSl">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Unsigned Saturating Accumulated of Unsigned Value +def SCALAR_USQADD : SInst<"vsqadd", "sss", "SUcSUsSUiSUl">; } diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 361758c51b4..41ca24ed832 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -2088,6 +2088,20 @@ static Value *EmitAArch64ScalarBuiltinExpr(CodeGenFunction &CGF, case AArch64::BI__builtin_neon_vqnegd_s64: Int = Intrinsic::arm_neon_vqneg; s = "vqneg"; OverloadInt = true; break; + // Scalar Signed Saturating Accumulated of Unsigned Value + case AArch64::BI__builtin_neon_vuqaddb_s8: + case AArch64::BI__builtin_neon_vuqaddh_s16: + case AArch64::BI__builtin_neon_vuqadds_s32: + case AArch64::BI__builtin_neon_vuqaddd_s64: + Int = Intrinsic::aarch64_neon_vuqadd; + s = "vuqadd"; OverloadInt = true; break; + // Scalar Unsigned Saturating Accumulated of Unsigned Value + case AArch64::BI__builtin_neon_vsqaddb_u8: + case AArch64::BI__builtin_neon_vsqaddh_u16: + case AArch64::BI__builtin_neon_vsqadds_u32: + case AArch64::BI__builtin_neon_vsqaddd_u64: + Int = Intrinsic::aarch64_neon_vsqadd; + s = "vsqadd"; OverloadInt = true; break; } if (!Int) diff --git a/clang/test/CodeGen/aarch64-neon-intrinsics.c b/clang/test/CodeGen/aarch64-neon-intrinsics.c index a77b56eb716..54b4e7536af 100644 --- a/clang/test/CodeGen/aarch64-neon-intrinsics.c +++ b/clang/test/CodeGen/aarch64-neon-intrinsics.c @@ -7165,3 +7165,51 @@ int64_t test_vqnegd_s64(int64_t a) { // CHECK: sqneg {{d[0-9]+}}, {{d[0-9]+}} return (int64_t)vqnegd_s64(a); } + +int8_t test_vuqaddb_s8(int8_t a, int8_t b) { +// CHECK: test_vuqaddb_s8 +// CHECK: suqadd {{b[0-9]+}}, {{b[0-9]+}} + return (int8_t)vuqaddb_s8(a, b); +} + +int16_t test_vuqaddh_s16(int16_t a, int16_t b) { +// CHECK: test_vuqaddh_s16 +// CHECK: suqadd {{h[0-9]+}}, {{h[0-9]+}} + return (int16_t)vuqaddh_s16(a, b); +} + +int32_t test_vuqadds_s32(int32_t a, int32_t b) { +// CHECK: test_vuqadds_s32 +// CHECK: suqadd {{s[0-9]+}}, {{s[0-9]+}} + return (int32_t)vuqadds_s32(a, b); +} + +int64_t test_vuqaddd_s64(int64_t a, int64_t b) { +// CHECK: test_vuqaddd_s64 +// CHECK: suqadd {{d[0-9]+}}, {{d[0-9]+}} + return (int64_t)vuqaddd_s64(a, b); +} + +uint8_t test_vsqaddb_u8(uint8_t a, uint8_t b) { +// CHECK: test_vsqaddb_u8 +// CHECK: usqadd {{b[0-9]+}}, {{b[0-9]+}} + return (uint8_t)vsqaddb_u8(a, b); +} + +uint16_t test_vsqaddh_u16(uint16_t a, uint16_t b) { +// CHECK: test_vsqaddh_u16 +// CHECK: usqadd {{h[0-9]+}}, {{h[0-9]+}} + return (uint16_t)vsqaddh_u16(a, b); +} + +uint32_t test_vsqadds_u32(uint32_t a, uint32_t b) { +// CHECK: test_vsqadds_u32 +// CHECK: usqadd {{s[0-9]+}}, {{s[0-9]+}} + return (uint32_t)vsqadds_u32(a, b); +} + +uint64_t test_vsqaddd_u64(uint64_t a, uint64_t b) { +// CHECK: test_vsqaddd_u64 +// CHECK: usqadd {{d[0-9]+}}, {{d[0-9]+}} + return (uint64_t)vsqaddd_u64(a, b); +} |