Move and clarify note.
authorBill Wendling <isanbard@gmail.com>
Tue, 27 Oct 2009 22:48:31 +0000 (22:48 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 27 Oct 2009 22:48:31 +0000 (22:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85334 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/README.txt
lib/Target/X86/README.txt

index 04392dadb7cc98909d7afd5a04106ac1632981f2..794eaa946aa03bf7c869384a436b86bb1a1f3378 100644 (file)
@@ -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;
+
+//===---------------------------------------------------------------------===//
index 876bb65acddb8ccd766366f68b6db282931e9c9a..9b7aab801eb6c45bc2a914d14e8a693ed9fdfe65 100644 (file)
@@ -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