[prev in list] [next in list] [prev in thread] [next in thread] 

List:       llvm-commits
Subject:    [llvm-commits] patch: Lower glibc's x86 bswap_32() inline asm
From:       Sami Liedes <sliedes () cc ! hut ! fi>
Date:       2009-05-27 1:29:39
Message-ID: 20090527012939.GS13196 () lh ! kyla ! fi
[Download RAW message or body]

[Attachment #2 (multipart/signed)]


This patch adds code in X86TargetAsmInfo::ExpandInlineAsm() to
recognize glibc's bswap_32() inline asm for x86 <i486 target and lower
it to llvm.bswap.i32.

	Sami


Index: lib/Target/X86/X86TargetAsmInfo.cpp
===================================================================
--- lib/Target/X86/X86TargetAsmInfo.cpp	(revision 72442)
+++ lib/Target/X86/X86TargetAsmInfo.cpp	(working copy)
@@ -402,7 +402,7 @@
 
   // TODO: should remove alternatives from the asmstring: "foo {a|b}" -> "foo a"
   std::vector<std::string> AsmPieces;
-  SplitString(AsmStr, AsmPieces, "\n");  // ; as separator?
+  SplitString(AsmStr, AsmPieces, "\n;");
 
   switch (AsmPieces.size()) {
   default: return false;
@@ -452,6 +452,27 @@
         }
       }
     }
+    // rorw $$8, ${0:w};rorl $$16, $0;rorw $$8, ${0:w}  -->  llvm.bswap.i32
+    // (from Linux <bits/byteswap.h>)
+    if (CI->getType() == Type::Int32Ty &&
+	IA->getConstraintString() == "=r,0,~{dirflag},~{fpsr},~{flags},~{cc}") {
+      std::vector<std::string> Words;
+      SplitString(AsmPieces[0], Words, " \t");
+      if (Words.size() == 3 && Words[0] == "rorw" && Words[1] == "$$8," &&
+	  Words[2] == "${0:w}") {
+        Words.clear();
+        SplitString(AsmPieces[1], Words, " \t");
+        if (Words.size() == 3 && Words[0] == "rorl" && Words[1] == "$$16," &&
+	    Words[2] == "$0") {
+          Words.clear();
+          SplitString(AsmPieces[2], Words, " \t");
+          if (Words.size() == 3 && Words[0] == "rorw" && Words[1] == "$$8," &&
+              Words[2] == "${0:w}") {
+            return LowerToBSwap(CI);
+          }
+        }
+      }
+    }
     break;
   }
   return false;

["signature.asc" (application/pgp-signature)]

_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic