[PATCH] Fix 64-bit T3 invert_limb.asm on PIC again.
Torbjorn Granlund
tg at gmplib.org
Mon Apr 15 23:17:28 CEST 2013
David Miller <davem at davemloft.net> writes:
From: nisse at lysator.liu.se (Niels Möller)
Date: Mon, 15 Apr 2013 22:28:54 +0200
> David Miller <davem at davemloft.net> writes:
>
>> Accomodating a negative offset means using sethi+xor with the
>> "%hix22()" and "%lox10()" relocs, which gets us potentially right back
>> into the area where we could hit Solaris assembler/linker quirks.
>
> Maybe I'm missing something, but is there no easier way to sign extend
> from 32 to 64 bits? Under the (reasonable) assumption that the offset
> fits in the range of a signed 32-bit value, do we really need any fancy
> 64-bit relocation magic?
The problem is that sethi zero extends.
That's why you need to use a sethi+xor sequence to build a 32-bit
value sign extended to 64-bits. It's the only way to do this in
2 instructions.
And if you do form a symbol relative address this way, you need to use
%hix22() and %lox10() relocations so that the linker knows that you
are using sethi+xor rather than sethi+or.
One bit of (assumed) missing information: The xor version then will set
the sign bit of its 13 bit immediate field. And the reloc for sethi
will conditionally ones-complement its 22-bit field... I clever trick,
too bad they were daft when they designed the instruction set.
--
Torbjörn
More information about the gmp-devel
mailing list