diff options
author | Bill Wendling <isanbard@gmail.com> | 2009-10-27 22:48:31 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2009-10-27 22:48:31 +0000 |
commit | 5a5692734541abe3c218b5c5eedbd84b0c0162a9 (patch) | |
tree | 27fb2c9b6aca12d3d2def0aa0e1aa3034055be4d | |
parent | 3dab2778571b5bb00b35a0adcb7011dc85158beb (diff) | |
download | external_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.txt | 33 | ||||
-rw-r--r-- | lib/Target/X86/README.txt | 31 |
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 |