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 | e6b421ccb5638d44d7f8e8446b5478940f0dab6f (patch) | |
| tree | 61c998ac56fcde980650f9098667a00368683474 /llvm/utils/TableGen/NeonEmitter.cpp | |
| parent | 791934e122bd116715778d9265a4c45ac13d0702 (diff) | |
| download | bcm5719-llvm-e6b421ccb5638d44d7f8e8446b5478940f0dab6f.tar.gz bcm5719-llvm-e6b421ccb5638d44d7f8e8446b5478940f0dab6f.zip | |
Add support for "_lane" variants of VMUL, VMLA, and VMLS Neon intrinsics.
llvm-svn: 120764
Diffstat (limited to 'llvm/utils/TableGen/NeonEmitter.cpp')
| -rw-r--r-- | llvm/utils/TableGen/NeonEmitter.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/utils/TableGen/NeonEmitter.cpp b/llvm/utils/TableGen/NeonEmitter.cpp index 6aa3d9cd9e5..dc6b353bde1 100644 --- a/llvm/utils/TableGen/NeonEmitter.cpp +++ b/llvm/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; |

