[PATCH 3/6] x86: harmonize disp with imm handling
H.J. Lu
hjl.tools@gmail.com
Thu Jun 17 16:12:28 GMT 2021
On Thu, Jun 17, 2021 at 9:05 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 17.06.2021 18:00, H.J. Lu wrote:
> > On Thu, Jun 17, 2021 at 7:57 AM Jan Beulich <jbeulich@suse.com> wrote:
> >>
> >> On 17.06.2021 16:46, H.J. Lu wrote:
> >>> On Mon, Jun 14, 2021 at 3:25 AM Jan Beulich <jbeulich@suse.com> wrote:
> >>>> --- /dev/null
> >>>> +++ b/gas/testsuite/gas/i386/disp-imm-32.s
> >>>> @@ -0,0 +1,17 @@
> >>>> + .text
> >>>> +disp_imm:
> >>>> + mov -0xffffffff(%eax), %eax
> >>>
> >>> I don't think we should treat -0xffffffff(%eax) as 1(%eax).
> >>> We allow addresses to wraparound. I don't see a need for
> >>> displacements to wraparound.
> >>
> >> This then is entirely unexpected to the programmer. In fact the
> >> same (abstracted away behind some defines or equates) constant
> >> could be used for both purposes (and should be usable both ways,
> >> imo).
> >
> > Since hardware wraparound on DISP + BASE + INDEX * SCALE, not
> > on DISP, it is wrong to change DISP + BASE + INDEX * SCALE to
> > wraparound (DISP) + BASE + INDEX * SCALE.
>
> But this is true regardless of how small (or big) the displacement.
> Without knowing the register values, you can't know at what
> displacement values wraparound occurs. Also, unless I'm mistaken,
> wrapround(a + b) == wrapround(wrapround(a) + wrapround(b)).
Hardware does wraparound (DISP + BASE + INDEX * SCALE).
Assembler and linker should only wraparound on the final address.
--
H.J.
More information about the Binutils
mailing list