[llvm-commits] CVS: llvm/lib/Target/X86/X86TargetAsmInfo.cpp
Chris Lattner
sabre at nondot.org
Tue Nov 28 17:48:15 PST 2006
Changes in directory llvm/lib/Target/X86:
X86TargetAsmInfo.cpp updated: 1.10 -> 1.11
---
Log message:
Upgrade the ugly darwin 64-bit bswap idiom (bswap %eax / bswap %edx /
xchgl %eax, %edx) to llvm.bswap.i64. This compiles:
long long test2(long long A) {
return _OSSwapInt64(A);
}
to:
_test2:
movl 8(%esp), %eax
movl 4(%esp), %edx
bswapl %eax
bswapl %edx
ret
instead of:
_test2:
movl 8(%esp), %edx
movl 4(%esp), %eax
bswap %eax
bswap %edx
xchgl %eax, %edx
ret
GCC manages (with -fomit-frame-pointer) the uglier:
_test2:
subl $4, %esp
movl 8(%esp), %eax
movl 12(%esp), %edx
bswap %eax
bswap %edx
xchgl %eax, %edx
addl $4, %esp
ret
---
Diffs of the changes: (+23 -1)
X86TargetAsmInfo.cpp | 24 +++++++++++++++++++++++-
1 files changed, 23 insertions(+), 1 deletion(-)
Index: llvm/lib/Target/X86/X86TargetAsmInfo.cpp
diff -u llvm/lib/Target/X86/X86TargetAsmInfo.cpp:1.10 llvm/lib/Target/X86/X86TargetAsmInfo.cpp:1.11
--- llvm/lib/Target/X86/X86TargetAsmInfo.cpp:1.10 Tue Nov 28 19:14:06 2006
+++ llvm/lib/Target/X86/X86TargetAsmInfo.cpp Tue Nov 28 19:48:01 2006
@@ -199,7 +199,7 @@
bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const {
InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue());
- //std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints();
+ std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints();
std::string AsmStr = IA->getAsmString();
@@ -214,6 +214,7 @@
AsmPieces.clear();
SplitString(AsmStr, AsmPieces, " \t"); // Split with whitespace.
+ // bswap $0
if (AsmPieces.size() == 2 &&
AsmPieces[0] == "bswap" && AsmPieces[1] == "$0") {
// No need to check constraints, nothing other than the equivalent of
@@ -221,6 +222,27 @@
return LowerToBSwap(CI);
}
break;
+ case 3:
+ if (CI->getType() == Type::ULongTy && Constraints.size() >= 2 &&
+ Constraints[0].Codes.size() == 1 && Constraints[0].Codes[0] == "A" &&
+ Constraints[1].Codes.size() == 1 && Constraints[1].Codes[0] == "0") {
+ // bswap %eax / bswap %edx / xchgl %eax, %edx -> llvm.bswap.i64
+ std::vector<std::string> Words;
+ SplitString(AsmPieces[0], Words, " \t");
+ if (Words.size() == 2 && Words[0] == "bswap" && Words[1] == "%eax") {
+ Words.clear();
+ SplitString(AsmPieces[1], Words, " \t");
+ if (Words.size() == 2 && Words[0] == "bswap" && Words[1] == "%edx") {
+ Words.clear();
+ SplitString(AsmPieces[2], Words, " \t,");
+ if (Words.size() == 3 && Words[0] == "xchgl" && Words[1] == "%eax" &&
+ Words[2] == "%edx") {
+ return LowerToBSwap(CI);
+ }
+ }
+ }
+ }
+ break;
}
return false;
}
More information about the llvm-commits
mailing list