diff --git a/lib/Target/README.txt b/lib/Target/README.txt index 04392dadb7c..794eaa946aa 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 ; [#uses=1] + %1 = icmp eq i32 %0, 0 ; [#uses=1] + %2 = or i32 %b, 128 ; [#uses=1] + %3 = and i32 %b, -129 ; [#uses=1] + %b_addr.0 = select i1 %1, i32 %3, i32 %2 ; [#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 ; [#uses=1] + %1 = and i32 %a, 128 ; [#uses=1] + %2 = or i32 %0, %1 ; [#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 876bb65acdd..9b7aab801eb 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