diff options
author | Bob Wilson <bob.wilson@apple.com> | 2010-12-03 00:34:12 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@apple.com> | 2010-12-03 00:34:12 +0000 |
commit | b0d98692a68cf7d5a8fce6115d8bf918126177a8 (patch) | |
tree | 9bdaa2de62fc0da672c1e8fd94f4d7181e2c4dbb /utils/TableGen/NeonEmitter.cpp | |
parent | 194aa58066fc7298b8c76f74b38d690fd8c06e9a (diff) | |
download | external_llvm-b0d98692a68cf7d5a8fce6115d8bf918126177a8.zip external_llvm-b0d98692a68cf7d5a8fce6115d8bf918126177a8.tar.gz external_llvm-b0d98692a68cf7d5a8fce6115d8bf918126177a8.tar.bz2 |
Add support for "_lane" variants of VMUL, VMLA, and VMLS Neon intrinsics.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120764 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/NeonEmitter.cpp')
-rw-r--r-- | utils/TableGen/NeonEmitter.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index 6aa3d9c..dc6b353 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -523,6 +523,15 @@ static std::string Duplicate(unsigned nElts, StringRef typestr, return s; } +static std::string SplatLane(unsigned nElts, const std::string &vec, + const std::string &lane) { + std::string s = "__builtin_shufflevector(" + vec + ", " + vec; + for (unsigned i = 0; i < nElts; ++i) + s += ", " + lane; + s += ")"; + return s; +} + static unsigned GetNumElements(StringRef typestr, bool &quad) { quad = false; bool dummy = false; @@ -572,18 +581,27 @@ static std::string GenOpString(OpKind op, const std::string &proto, case OpMulN: s += "__a * " + Duplicate(nElts, typestr, "__b") + ";"; break; + case OpMulLane: + s += "__a * " + SplatLane(nElts, "__b", "__c") + ";"; + break; case OpMul: s += "__a * __b;"; break; case OpMlaN: s += "__a + (__b * " + Duplicate(nElts, typestr, "__c") + ");"; break; + case OpMlaLane: + s += "__a + (__b * " + SplatLane(nElts, "__c", "__d") + ");"; + break; case OpMla: s += "__a + (__b * __c);"; break; case OpMlsN: s += "__a - (__b * " + Duplicate(nElts, typestr, "__c") + ");"; break; + case OpMlsLane: + s += "__a - (__b * " + SplatLane(nElts, "__c", "__d") + ");"; + break; case OpMls: s += "__a - (__b * __c);"; break; |