From c4ba09da6064c61ff75890987d6e73a5fc7a6125 Mon Sep 17 00:00:00 2001 From: Bob Wilson Date: Tue, 7 Dec 2010 20:02:45 +0000 Subject: [PATCH] Add new built-in operations for vmull and vmull_n so they can be implemented without requiring clang builtins. Radar 8446238. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121173 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/NeonEmitter.cpp | 18 ++++++++++++++++++ utils/TableGen/NeonEmitter.h | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index 3752db0f4d0..7fdc1cacd69 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -508,6 +508,15 @@ static std::string GenMacroLocals(const std::string &proto, StringRef typestr) { return s; } +// Use the vmovl builtin to sign-extend or zero-extend a vector. +static std::string Extend(const std::string &proto, StringRef typestr, + const std::string &a) { + std::string s; + s = MangleName("vmovl", typestr, ClassS); + s += "(" + a + ")"; + return s; +} + static std::string Duplicate(unsigned nElts, StringRef typestr, const std::string &a) { std::string s; @@ -587,6 +596,15 @@ static std::string GenOpString(OpKind op, const std::string &proto, case OpMul: s += "__a * __b;"; break; + case OpMullN: + s += Extend(proto, typestr, "__a") + " * " + + Extend(proto, typestr, + Duplicate(nElts << (int)quad, typestr, "__b")) + ";"; + break; + case OpMull: + s += Extend(proto, typestr, "__a") + " * " + + Extend(proto, typestr, "__b") + ";"; + break; case OpMlaN: s += "__a + (__b * " + Duplicate(nElts, typestr, "__c") + ");"; break; diff --git a/utils/TableGen/NeonEmitter.h b/utils/TableGen/NeonEmitter.h index 3d122ffbba9..0ee856c26bd 100644 --- a/utils/TableGen/NeonEmitter.h +++ b/utils/TableGen/NeonEmitter.h @@ -26,9 +26,11 @@ enum OpKind { OpAdd, OpSub, OpMul, + OpMull, OpMla, OpMls, OpMulN, + OpMullN, OpMlaN, OpMlsN, OpMulLane, @@ -79,9 +81,11 @@ namespace llvm { OpMap["OP_ADD"] = OpAdd; OpMap["OP_SUB"] = OpSub; OpMap["OP_MUL"] = OpMul; + OpMap["OP_MULL"] = OpMull; OpMap["OP_MLA"] = OpMla; OpMap["OP_MLS"] = OpMls; OpMap["OP_MUL_N"] = OpMulN; + OpMap["OP_MULL_N"]= OpMullN; OpMap["OP_MLA_N"] = OpMlaN; OpMap["OP_MLS_N"] = OpMlsN; OpMap["OP_MUL_LN"]= OpMulLane;