[llvm-commits] [llvm] r105929 - /llvm/trunk/utils/TableGen/NeonEmitter.cpp
Nate Begeman
natebegeman at mac.com
Sun Jun 13 22:17:23 PDT 2010
Author: sampo
Date: Mon Jun 14 00:17:23 2010
New Revision: 105929
URL: http://llvm.org/viewvc/llvm-project?rev=105929&view=rev
Log:
Add the last of the SemaChecking-gen code.
Modified:
llvm/trunk/utils/TableGen/NeonEmitter.cpp
Modified: llvm/trunk/utils/TableGen/NeonEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/NeonEmitter.cpp?rev=105929&r1=105928&r2=105929&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/NeonEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/NeonEmitter.cpp Mon Jun 14 00:17:23 2010
@@ -946,6 +946,28 @@
OS << "#endif /* __ARM_NEON_H */\n";
}
+static unsigned RangeFromType(StringRef typestr) {
+ // base type to get the type string for.
+ bool quad = false, dummy = false;
+ char type = ClassifyType(typestr, quad, dummy, dummy);
+
+ switch (type) {
+ case 'c':
+ return (8 << quad) - 1;
+ case 'h':
+ case 's':
+ return (4 << quad) - 1;
+ case 'f':
+ case 'i':
+ return (2 << quad) - 1;
+ case 'l':
+ return (1 << quad) - 1;
+ default:
+ throw "unhandled type!";
+ break;
+ }
+}
+
/// runHeader - generate one of three different tables which are used by clang
/// to support ARM NEON codegen. By default, this will produce the contents of
/// BuiltinsARM.def's NEON section. You may also enable the genSemaTypes or
@@ -1020,11 +1042,32 @@
}
if (genSemaRange) {
- if (Proto.find('s') == std::string::npos)
+ std::string namestr, shiftstr, rangestr;
+
+ // Builtins which are overloaded by type will need to have their upper
+ // bound computed at Sema time based on the type constant.
+ if (Proto.find('s') == std::string::npos) {
ck = ClassB;
+ if (R->getValueAsBit("isShift")) {
+ shiftstr = ", true";
+
+ // Right shifts have an 'r' in the name, left shifts do not.
+ if (name.find('r') != std::string::npos)
+ rangestr = "l = 1; ";
+ }
+ rangestr += "u = RFT(TV" + shiftstr + ")";
+ } else {
+ rangestr = "u = " + utostr(RangeFromType(TypeVec[ti]));
+ }
+ // Make sure cases appear only once.
+ namestr = MangleName(name, TypeVec[ti], ck);
+ if (EmittedMap.count(namestr))
+ continue;
+ EmittedMap[namestr] = OpNone;
OS << "case ARM::BI__builtin_neon_"
- << MangleName(name, TypeVec[ti], ck) << "\n";
+ << MangleName(name, TypeVec[ti], ck) << ": i = " << Proto.find('i')-1
+ << "; " << rangestr << "; break;\n";
continue;
}
More information about the llvm-commits
mailing list