Hi folks,

I have a backend hook (x86_64) for builtin function expansion, so
I have this:

expand_simple_binop (DImode, ASHIFT, op0,
                                GEN_INT (32),op0,1,OPTAB_DIRECT);

to generate op0 = op0<<32 (op0 is the first argument of this builtin
function, with type SIZE_T)

The thing goes well in the assemble code, where I got:
        movq    104(%rbx), %rax
        salq    $32, %rax
        addq    80(%rbx), %rax

as expected.

But at execution time, it gives me a strange behavior,
So I disassemble the code,

401135:       48 8b 43 68             mov    0x68(%rbx),%rax
401140:       48 c1 e0 20             shl    $0x20,%rax
401144:       48 03 43 50             add    0x50(%rbx),%rax

and it turns out salq are changed to shl which leads to the
strange behavior. shl only allows shift less or equal than 31.

Not sure why and how to fix this...

Thanks,
Feng

Reply via email to