From 6483dc50673f92345eeaea582d5a9993412f972f Mon Sep 17 00:00:00 2001 From: Nate Begeman Date: Thu, 3 Jun 2010 21:35:22 +0000 Subject: [PATCH] Add some additional capabilities to the neon emitter llvm-svn: 105416 --- utils/TableGen/NeonEmitter.cpp | 35 ++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/utils/TableGen/NeonEmitter.cpp b/utils/TableGen/NeonEmitter.cpp index cc828a5ccae..90df782f871 100644 --- a/utils/TableGen/NeonEmitter.cpp +++ b/utils/TableGen/NeonEmitter.cpp @@ -41,7 +41,8 @@ enum OpKind { OpOr, OpXor, OpAndNot, - OpOrNot + OpOrNot, + OpCast }; static void ParseTypes(Record *r, std::string &s, @@ -85,6 +86,19 @@ static char Widen(const char t) { return '\0'; } +static char Narrow(const char t) { + switch (t) { + case 's': + return 'c'; + case 'i': + return 's'; + case 'l': + return 'i'; + default: throw "unhandled type in widen!"; + } + return '\0'; +} + static char ClassifyType(StringRef ty, bool &quad, bool &poly, bool &usgn) { unsigned off = 0; @@ -167,6 +181,13 @@ static std::string TypeString(const char mod, StringRef typestr) { pntr = true; scal = true; break; + case 'h': + type = Narrow(type); + break; + case 'e': + type = Narrow(type); + usgn = true; + break; default: break; } @@ -308,9 +329,11 @@ static std::string GenOpString(OpKind op, const std::string &proto, if (structTypes) s += "(" + ts + "){"; - std::string a = structTypes ? "a.val" : "a"; - std::string b = structTypes ? "b.val" : "b"; - std::string c = structTypes ? "c.val" : "c"; + std::string a, b, c; + if (proto.size() > 1) + a = (structTypes && proto[1] != 'l') ? "a.val" : "a"; + b = structTypes ? "b.val" : "b"; + c = structTypes ? "c.val" : "c"; switch(op) { case OpAdd: @@ -364,6 +387,9 @@ static std::string GenOpString(OpKind op, const std::string &proto, case OpOrNot: s += a + " | ~" + b; break; + case OpCast: + s += "(__neon_" + ts + ")" + a; + break; default: throw "unknown OpKind!"; break; @@ -489,6 +515,7 @@ void NeonEmitter::run(raw_ostream &OS) { OpMap["OP_XOR"] = OpXor; OpMap["OP_ANDN"] = OpAndNot; OpMap["OP_ORN"] = OpOrNot; + OpMap["OP_CAST"] = OpCast; // Unique the return+pattern types, and assign them. for (unsigned i = 0, e = RV.size(); i != e; ++i) {