https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120553
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Uroš Bizjak from comment #3)
> (In reply to Richard Biener from comment #1)
> > might be also interesting on x86-64 when using bts can use a smaller
> > immediate than the now used orq and thus improve instruction size (but it
> > clobbers flags).
> There is *iordi_1_bts pattern available, but for some reason not exercised
> for the testcase in the description.
I tried this testcase:
long foo1 (long c) { return c >= 0 ? 0x400000000 : -1 ; }
that resulted in:
testq %rdi, %rdi
movq $-1, %rax
movabsq $17179869184, %rdx
cmovns %rdx, %rax
ret
when the constant fits in the immediate field of the instruction (e.g.
0x40000000):
movq %rdi, %rax
sarq $63, %rax
orq $1073741824, %rax
ret