[PATCH] x86: Add {disp16} pseudo prefix
H.J. Lu
hjl.tools@gmail.com
Tue Jul 28 20:30:34 GMT 2020
On Tue, Jul 28, 2020 at 12:02 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Jul 28, 2020 at 11:43 AM Jan Beulich <jbeulich@suse.com> wrote:
> >
> > On 28.07.2020 01:23, H.J. Lu via Binutils wrote:
> > > Since (%bp)/(%ebp)/(%rbp) are encoded as 0(%bp)/0(%ebp)/0(%rbp), use
> > > disp32/disp16 on 0(%bp)/0(%ebp)/0(%rbp) for {disp32}.
> >
> > Same for (%r13d) / (%r13) afaict?
>
> Yes. {disp32} works on (%r13d) / (%r13) now:
>
> [hjl@gnu-cfl-2 testsuite]$ cat x.s
> movb (%r13),%al
> {disp8} movb (%r13),%al
> {disp32} movb (%r13),%al
>
> movb (%r13d),%al
> {disp8} movb (%r13d),%al
> {disp32} movb (%r13d),%al
> [hjl@gnu-cfl-2 testsuite]$ gcc -c x.s
> [hjl@gnu-cfl-2 testsuite]$ objdump -dw x.o
>
> x.o: file format elf64-x86-64
>
>
> Disassembly of section .text:
>
> 0000000000000000 <.text>:
> 0: 41 8a 45 00 mov 0x0(%r13),%al
> 4: 41 8a 45 00 mov 0x0(%r13),%al
> 8: 41 8a 45 00 mov 0x0(%r13),%al
> c: 67 41 8a 45 00 mov 0x0(%r13d),%al
> 11: 67 41 8a 45 00 mov 0x0(%r13d),%al
> 16: 67 41 8a 45 00 mov 0x0(%r13d),%al
> [hjl@gnu-cfl-2 testsuite]$ ../as-new -o x.o x.s
> [hjl@gnu-cfl-2 testsuite]$ objdump -dw x.o
>
> x.o: file format elf64-x86-64
>
>
> Disassembly of section .text:
>
> 0000000000000000 <.text>:
> 0: 41 8a 45 00 mov 0x0(%r13),%al
> 4: 41 8a 45 00 mov 0x0(%r13),%al
> 8: 41 8a 85 00 00 00 00 mov 0x0(%r13),%al
> f: 67 41 8a 45 00 mov 0x0(%r13d),%al
> 14: 67 41 8a 45 00 mov 0x0(%r13d),%al
> 19: 67 41 8a 85 00 00 00 00 mov 0x0(%r13d),%al
> [hjl@gnu-cfl-2 testsuite]$
>
>
> > > Note: Since there is no disp32 on 0(%bp), use disp16 instead.
> >
> > What use is it to fix the special case of (%bp) when the more general
> > case ((%bx), (%si), etc) doesn't work? I anyway think that instead of
> > ...
> >
> > > --- a/gas/config/tc-i386.c
> > > +++ b/gas/config/tc-i386.c
> > > @@ -8151,7 +8151,12 @@ build_modrm_byte (void)
> > > if (operand_type_check (i.types[op], disp) == 0)
> > > {
> > > /* fake (%bp) into 0(%bp) */
> > > - i.types[op].bitfield.disp8 = 1;
> > > + if (i.disp_encoding == disp_encoding_32bit)
> > > + /* NB: Use disp16 since there is no disp32
> > > + in 16-bit mode. */
> > > + i.types[op].bitfield.disp16 = 1;
> > > + else
> > > + i.types[op].bitfield.disp8 = 1;
> > > fake_zero_displacement = 1;
> > > }
> >
> > ... the comment you add here, support for {disp16} should be added.
> >
>
> I will add {disp16} to master branch.
>
Add {disp16} pseudo prefix and replace {disp32} pseudo prefix with
{disp16} in 16-bit mode test. Check invalid {disp16}/{disp32} pseudo
prefixes.
Note: {disp16} can be also used on branches in 32-bit mode.
--
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-x86-Add-disp16-pseudo-prefix.patch
Type: text/x-patch
Size: 13695 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20200728/db8c5c01/attachment-0001.bin>
More information about the Binutils
mailing list