<rdar://problem/8228022> Wvector-conversions warnings in arm_neon.h
authorNate Begeman <natebegeman@mac.com>
Wed, 22 Sep 2010 22:28:42 +0000 (22:28 +0000)
committerNate Begeman <natebegeman@mac.com>
Wed, 22 Sep 2010 22:28:42 +0000 (22:28 +0000)
Explicitly cast arguments to the type the builtin expects, which is <vN x i8>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114596 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/NeonEmitter.cpp

index f3707f2b229035867d5082bde7f43bd76119ff88..310d5142da32329cea1c0a9f0238d79085db3d97 100644 (file)
@@ -89,7 +89,7 @@ static char Narrow(const char t) {
       return 'i';
     case 'f':
       return 'h';
-    default: throw "unhandled type in widen!";
+    default: throw "unhandled type in narrow!";
   }
   return '\0';
 }
@@ -155,6 +155,10 @@ static char ModType(const char mod, char type, bool &quad, bool &poly,
     case 'n':
       type = Widen(type);
       break;
+    case 'i':
+      type = 'i';
+      scal = true;
+      break;
     case 'l':
       type = 'l';
       scal = true;
@@ -807,14 +811,27 @@ static std::string GenBuiltin(const std::string &name, const std::string &proto,
   
   for (unsigned i = 1, e = proto.size(); i != e; ++i, ++arg) {
     std::string args = std::string(&arg, 1);
+    bool argquad = quad;
+    bool scal = false;
+
+    (void) ModType(proto[i], type, argquad, dummy, dummy, scal, dummy, dummy);
+    bool explicitcast = define && !scal;
+
     if (define)
       args = "(" + args + ")";
+    if (explicitcast) {
+      unsigned builtinelts = quad ? 16 : 8;
+      args = "(__neon_int8x" + utostr(builtinelts) + "_t)(" + args;
+    }
     
     // Handle multiple-vector values specially, emitting each subvector as an
     // argument to the __builtin.
-    if (structTypes && (proto[i] == '2' || proto[i] == '3' || proto[i] == '4')){
+    if (structTypes && (proto[i] >= '2') && (proto[i] <= '4')) {
       for (unsigned vi = 0, ve = proto[i] - '0'; vi != ve; ++vi) {
         s += args + ".val[" + utostr(vi) + "].val";
+        if (explicitcast)
+          s += ")";
+        
         if ((vi + 1) < ve)
           s += ", ";
       }
@@ -829,10 +846,10 @@ static std::string GenBuiltin(const std::string &name, const std::string &proto,
     else
       s += args;
     
-    if (structTypes && proto[i] != 's' && proto[i] != 'i' && proto[i] != 'l' &&
-        proto[i] != 'p' && proto[i] != 'c' && proto[i] != 'a') {
+    if (structTypes && !scal)
       s += ".val";
-    }
+    if (explicitcast)
+      s += ")";
     if ((i + 1) < e)
       s += ", ";
   }