summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2009-10-27 22:48:31 +0000
committerBill Wendling <isanbard@gmail.com>2009-10-27 22:48:31 +0000
commit5a5692734541abe3c218b5c5eedbd84b0c0162a9 (patch)
tree27fb2c9b6aca12d3d2def0aa0e1aa3034055be4d
parent3dab2778571b5bb00b35a0adcb7011dc85158beb (diff)
downloadexternal_llvm-5a5692734541abe3c218b5c5eedbd84b0c0162a9.zip
external_llvm-5a5692734541abe3c218b5c5eedbd84b0c0162a9.tar.gz
external_llvm-5a5692734541abe3c218b5c5eedbd84b0c0162a9.tar.bz2
Move and clarify note.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85334 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/README.txt33
-rw-r--r--lib/Target/X86/README.txt31
2 files changed, 33 insertions, 31 deletions
diff --git a/lib/Target/README.txt b/lib/Target/README.txt
index 04392da..794eaa9 100644
--- a/lib/Target/README.txt
+++ b/lib/Target/README.txt
@@ -1600,3 +1600,36 @@ in test/Transforms/SCCP/ipsccp-basic.ll:test5b.
//===---------------------------------------------------------------------===//
+int func(int a, int b) { if (a & 0x80) b |= 0x80; else b &= ~0x80; return b; }
+
+Generates this:
+
+define i32 @func(i32 %a, i32 %b) nounwind readnone ssp {
+entry:
+ %0 = and i32 %a, 128 ; <i32> [#uses=1]
+ %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
+ %2 = or i32 %b, 128 ; <i32> [#uses=1]
+ %3 = and i32 %b, -129 ; <i32> [#uses=1]
+ %b_addr.0 = select i1 %1, i32 %3, i32 %2 ; <i32> [#uses=1]
+ ret i32 %b_addr.0
+}
+
+However, it's functionally equivalent to:
+
+ b = (b & ~0x80) | (a & 0x80);
+
+Which generates this:
+
+define i32 @func(i32 %a, i32 %b) nounwind readnone ssp {
+entry:
+ %0 = and i32 %b, -129 ; <i32> [#uses=1]
+ %1 = and i32 %a, 128 ; <i32> [#uses=1]
+ %2 = or i32 %0, %1 ; <i32> [#uses=1]
+ ret i32 %2
+}
+
+This can be generalized for other forms:
+
+ b = (b & ~0x80) | (a & 0x40) << 1;
+
+//===---------------------------------------------------------------------===//
diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt
index 876bb65..9b7aab8 100644
--- a/lib/Target/X86/README.txt
+++ b/lib/Target/X86/README.txt
@@ -1954,34 +1954,3 @@ carried over to machine instructions. Asm printer (or JIT) can use this
information to add the "lock" prefix.
//===---------------------------------------------------------------------===//
-
-int func(int a, int b) { if (a & 0x80) b |= 0x80; else b &= ~0x80; return b; }
-
-Current:
-
-
- movb %sil, %al
- andb $127, %sil
- orb $-128, %al
- testb %dil, %dil
- js LBB1_2
- movb %sil, %al
-LBB1_2:
- movsbl %al, %eax
-
-
-Better:
-
- movl %esi, %eax
- orl $-128, %eax
- andl $127, %esi
- testb %dil, %dil
- cmovns %esi, %eax
- movsbl %al,%eax
-
-Best (recognize this as 'b = (b & ~0x80) | (a & 0x80)'):
-
- andb $-128, %dil
- andb $127, %sil
- orb %dil, %sil
- movsbl %sil, %eax