[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