summaryrefslogtreecommitdiffstats
path: root/utils/TableGen/NeonEmitter.cpp
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2010-12-03 00:34:12 +0000
committerBob Wilson <bob.wilson@apple.com>2010-12-03 00:34:12 +0000
commitb0d98692a68cf7d5a8fce6115d8bf918126177a8 (patch)
tree9bdaa2de62fc0da672c1e8fd94f4d7181e2c4dbb /utils/TableGen/NeonEmitter.cpp
parent194aa58066fc7298b8c76f74b38d690fd8c06e9a (diff)
downloadexternal_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.cpp18
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;