[llvm-dev] BUGS n code generated for target i386 compiling __bswapdi3, and for target x86-64 compiling __bswapsi2()

Stefan Kanthak via llvm-dev llvm-dev at lists.llvm.org
Mon Nov 26 04:11:51 PST 2018


"Craig Topper" <craig.topper at gmail.com> wrote:

>I just compiled the two attached files in 32-bit mode and ran it.
> 
> It printed efcdab8967452301.
> 
> I verified via objdump that the my_bswap function contains the follow
> assembly which I believe matches the assembly you linked to on godbolt.
> 
> _my_bswap:
>    1f70: 55 pushl %ebp
>    1f71: 89 e5 movl %esp, %ebp
>    1f73: 8b 55 08 movl 8(%ebp), %edx
>    1f76: 8b 45 0c movl 12(%ebp), %eax
>    1f79: 0f c8 bswapl %eax
>    1f7b: 0f ca bswapl %edx
>    1f7d: 5d popl %ebp
>    1f7e: c3 retl

Contrary to my initial WRONG claim this code is CORRECT: two 32-bit BSWAP
instructions on the swapped halves of a 64-bit register are equivalent to
a 64-bit BSWAP instruction.
Sorry for the confusion, I should have slept another night before responding.

The other part of my post but holds: the following function, compiled for
x86-64, is NOT properly optimized (see <https://godbolt.org/z/uM9nvN>):

unsigned long __bswapsi2 (unsigned long ul)
{
    return (ul >> 3 * 8) & 0xff000000ul
         | (ul >>     8) & 0x00ff0000ul
         | (ul <<     8) & 0x0000ff00ul
         | (ul << 3 * 8) & 0x000000fful;
}

The expected optimized code is

__bswapsi2: # @__bswapsi2
    bswap edi
    mov   eax, edi
    ret

regards
Stefan Kanthak

[ fullquote removed ]


More information about the llvm-dev mailing list