Author: mcrosier Date: Fri Oct 18 09:03:36 2013 New Revision: 192971 URL: http://llvm.org/viewvc/llvm-project?rev=192971&view=rev Log: [AArch64] Add support for NEON scalar extract narrow instructions.
Modified: cfe/trunk/include/clang/Basic/arm_neon.td cfe/trunk/lib/CodeGen/CGBuiltin.cpp cfe/trunk/test/CodeGen/aarch64-neon-intrinsics.c cfe/trunk/utils/TableGen/NeonEmitter.cpp Modified: cfe/trunk/include/clang/Basic/arm_neon.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/arm_neon.td?rev=192971&r1=192970&r2=192971&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/arm_neon.td (original) +++ cfe/trunk/include/clang/Basic/arm_neon.td Fri Oct 18 09:03:36 2013 @@ -166,7 +166,8 @@ class NoTestOpInst<string n, string p, s // i: constant int // l: constant uint64 // s: scalar of element type -// r: scalar of double width element type +// z: scalar of half width element type, signed +// r: scalar of double width element type, signed // a: scalar of element type (splat to vector type) // y: scalar of float // o: scalar of double @@ -890,4 +891,16 @@ def SCALAR_SQDMLSL : SInst<"vqdmlsl", "r //////////////////////////////////////////////////////////////////////////////// // Signed Saturating Doubling Multiply Long def SCALAR_SQDMULL : SInst<"vqdmull", "rss", "SsSi">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Signed Saturating Extract Unsigned Narrow +def SCALAR_SQXTUN : SInst<"vqmovun", "zs", "SsSiSl">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Signed Saturating Extract Narrow +def SCALAR_SQXTN : SInst<"vqmovn", "zs", "SsSiSl">; + +//////////////////////////////////////////////////////////////////////////////// +// Scalar Unsigned Saturating Extract Narrow +def SCALAR_UQXTN : SInst<"vqmovn", "zs", "SUsSUiSUl">; } Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=192971&r1=192970&r2=192971&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original) +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Fri Oct 18 09:03:36 2013 @@ -1756,6 +1756,7 @@ static Value *EmitAArch64ScalarBuiltinEx bool ExtendEle = false; bool OverloadInt = false; bool OverloadWideInt = false; + bool OverloadNarrowInt = false; const char *s = NULL; SmallVector<Value *, 4> Ops; @@ -2126,6 +2127,24 @@ static Value *EmitAArch64ScalarBuiltinEx case AArch64::BI__builtin_neon_vqdmulls_s32: Int = Intrinsic::aarch64_neon_vqdmull; s = "vqdmull"; OverloadWideInt = true; break; + // Scalar Signed Saturating Extract Unsigned Narrow + case AArch64::BI__builtin_neon_vqmovunh_s16: + case AArch64::BI__builtin_neon_vqmovuns_s32: + case AArch64::BI__builtin_neon_vqmovund_s64: + Int = Intrinsic::arm_neon_vqmovnsu; + s = "vqmovun"; OverloadNarrowInt = true; break; + // Scalar Signed Saturating Extract Narrow + case AArch64::BI__builtin_neon_vqmovnh_s16: + case AArch64::BI__builtin_neon_vqmovns_s32: + case AArch64::BI__builtin_neon_vqmovnd_s64: + Int = Intrinsic::arm_neon_vqmovns; + s = "vqmovn"; OverloadNarrowInt = true; break; + // Scalar Unsigned Saturating Extract Narrow + case AArch64::BI__builtin_neon_vqmovnh_u16: + case AArch64::BI__builtin_neon_vqmovns_u32: + case AArch64::BI__builtin_neon_vqmovnd_u64: + Int = Intrinsic::arm_neon_vqmovnu; + s = "vqmovn"; OverloadNarrowInt = true; break; } if (!Int) @@ -2159,12 +2178,14 @@ static Value *EmitAArch64ScalarBuiltinEx assert(VTy); F = CGF.CGM.getIntrinsic(Int, VTy); - } else if (OverloadWideInt) { + } else if (OverloadWideInt || OverloadNarrowInt) { // Determine the type of this overloaded AArch64 intrinsic const Expr *Arg = E->getArg(E->getNumArgs()-1); llvm::Type *Ty = CGF.ConvertType(Arg->getType()); llvm::VectorType *VTy = llvm::VectorType::get(Ty, 1); - llvm::VectorType *RTy = llvm::VectorType::getExtendedElementVectorType(VTy); + llvm::VectorType *RTy = OverloadWideInt ? + llvm::VectorType::getExtendedElementVectorType(VTy) : + llvm::VectorType::getTruncatedElementVectorType(VTy); F = CGF.CGM.getIntrinsic(Int, RTy); } else F = CGF.CGM.getIntrinsic(Int); Modified: cfe/trunk/test/CodeGen/aarch64-neon-intrinsics.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/aarch64-neon-intrinsics.c?rev=192971&r1=192970&r2=192971&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/aarch64-neon-intrinsics.c (original) +++ cfe/trunk/test/CodeGen/aarch64-neon-intrinsics.c Fri Oct 18 09:03:36 2013 @@ -7261,3 +7261,57 @@ int64_t test_vqdmulls_s32(int32_t a, int // CHECK: sqdmull {{d[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} return (int64_t)vqdmulls_s32(a, b); } + +int8_t test_vqmovunh_s16(int16_t a) { +// CHECK: test_vqmovunh_s16 +// CHECK: sqxtun {{b[0-9]+}}, {{h[0-9]+}} + return (int8_t)vqmovunh_s16(a); +} + +int16_t test_vqmovuns_s32(int32_t a) { +// CHECK: test_vqmovuns_s32 +// CHECK: sqxtun {{h[0-9]+}}, {{s[0-9]+}} + return (int16_t)vqmovuns_s32(a); +} + +int32_t test_vqmovund_s64(int64_t a) { +// CHECK: test_vqmovund_s64 +// CHECK: sqxtun {{s[0-9]+}}, {{d[0-9]+}} + return (int32_t)vqmovund_s64(a); +} + +int8_t test_vqmovnh_s16(int16_t a) { +// CHECK: test_vqmovnh_s16 +// CHECK: sqxtn {{b[0-9]+}}, {{h[0-9]+}} + return (int8_t)vqmovnh_s16(a); +} + +int16_t test_vqmovns_s32(int32_t a) { +// CHECK: test_vqmovns_s32 +// CHECK: sqxtn {{h[0-9]+}}, {{s[0-9]+}} + return (int16_t)vqmovns_s32(a); +} + +int32_t test_vqmovnd_s64(int64_t a) { +// CHECK: test_vqmovnd_s64 +// CHECK: sqxtn {{s[0-9]+}}, {{d[0-9]+}} + return (int32_t)vqmovnd_s64(a); +} + +int8_t test_vqmovnh_u16(int16_t a) { +// CHECK: test_vqmovnh_u16 +// CHECK: uqxtn {{b[0-9]+}}, {{h[0-9]+}} + return (int8_t)vqmovnh_u16(a); +} + +int16_t test_vqmovns_u32(int32_t a) { +// CHECK: test_vqmovns_u32 +// CHECK: uqxtn {{h[0-9]+}}, {{s[0-9]+}} + return (int16_t)vqmovns_u32(a); +} + +int32_t test_vqmovnd_u64(int64_t a) { +// CHECK: test_vqmovnd_u64 +// CHECK: uqxtn {{s[0-9]+}}, {{d[0-9]+}} + return (int32_t)vqmovnd_u64(a); +} Modified: cfe/trunk/utils/TableGen/NeonEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/NeonEmitter.cpp?rev=192971&r1=192970&r2=192971&view=diff ============================================================================== --- cfe/trunk/utils/TableGen/NeonEmitter.cpp (original) +++ cfe/trunk/utils/TableGen/NeonEmitter.cpp Fri Oct 18 09:03:36 2013 @@ -493,8 +493,14 @@ static char ModType(const char mod, char scal = true; usgn = true; break; + case 'z': + type = Narrow(type); + scal = true; + break; case 'r': type = Widen(type); + scal = true; + break; case 's': case 'a': scal = true; _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits