Emit full function prototypes. Definitions & typedefs to come.
authorNate Begeman <natebegeman@mac.com>
Wed, 2 Jun 2010 06:17:19 +0000 (06:17 +0000)
committerNate Begeman <natebegeman@mac.com>
Wed, 2 Jun 2010 06:17:19 +0000 (06:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105315 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/NeonEmitter.cpp

index eeb0bcc15047be51d4f38c3d87daaa9bff417ced..6bedb03ad5763e243422c4efc4449c321c9ee6fd 100644 (file)
@@ -64,36 +64,41 @@ static const char Widen(const char t) {
   return '\0';
 }
 
-static std::string TypeString(const char mod, StringRef typestr) {
+static char ClassifyType(StringRef ty, bool &quad, bool &poly, bool &usgn) {
   unsigned off = 0;
   
-  bool quad = false;
-  bool poly = false;
-  bool usgn = false;
-  bool scal = false;
-  bool cnst = false;
-  bool pntr = false;
-  
   // remember quad.
-  if (typestr[off] == 'Q') {
+  if (ty[off] == 'Q') {
     quad = true;
     ++off;
   }
-    
+  
   // remember poly.
-  if (typestr[off] == 'P') {
+  if (ty[off] == 'P') {
     poly = true;
     ++off;
   }
   
   // remember unsigned.
-  if (typestr[off] == 'U') {
+  if (ty[off] == 'U') {
     usgn = true;
     ++off;
   }
   
   // base type to get the type string for.
-  char type = typestr[off];
+  return ty[off];
+}
+
+static std::string TypeString(const char mod, StringRef typestr) {
+  bool quad = false;
+  bool poly = false;
+  bool usgn = false;
+  bool scal = false;
+  bool cnst = false;
+  bool pntr = false;
+  
+  // base type to get the type string for.
+  char type = ClassifyType(typestr, quad, poly, usgn);
   
   // Based on the modifying character, change the type and width if necessary.
   switch (mod) {
@@ -220,12 +225,63 @@ static std::string TypeString(const char mod, StringRef typestr) {
 
 // Turn "vst2_lane" into "vst2q_lane_f32", etc.
 static std::string MangleName(const std::string &name, StringRef typestr) {
-  return "";
+  bool quad = false;
+  bool poly = false;
+  bool usgn = false;
+  char type = ClassifyType(typestr, quad, poly, usgn);
+
+  std::string s = name;
+  
+  switch (type) {
+    case 'c':
+      s += poly ? "_p8" : usgn ? "_u8" : "_s8";
+      break;
+    case 's':
+      s += poly ? "_p16" : usgn ? "_u16" : "_s16";
+      break;
+    case 'i':
+      s += usgn ? "_u32" : "_s32";
+      break;
+    case 'l':
+      s += usgn ? "_u64" : "_s64";
+      break;
+    case 'h':
+      s += "_f16";
+      break;
+    case 'f':
+      s += "_f32";
+      break;
+    default:
+      throw "unhandled type!";
+      break;
+  }
+
+  // Insert a 'q' before the first '_' character so that it ends up before 
+  // _lane or _n on vector-scalar operations.
+  if (quad) {
+    size_t pos = s.find('_');
+    s = s.insert(pos, "q");
+  }
+  return s;
 }
 
-// 
+// Generate the string "(argtype a, argtype b, ...)"
 static std::string GenArgs(const std::string &proto, StringRef typestr) {
-  return "";
+  char arg = 'a';
+  
+  std::string s;
+  s += "(";
+  
+  for (unsigned i = 1, e = proto.size(); i != e; ++i, ++arg) {
+    s += TypeString(proto[i], typestr);
+    s.push_back(' ');
+    s.push_back(arg);
+    if ((i + 1) < e)
+      s += ", ";
+  }
+  
+  s += ")";
+  return s;
 }
 
 void NeonEmitter::run(raw_ostream &OS) {