* [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) @ 2020-07-27 23:23 H.J. Lu 2020-07-28 10:39 ` H.J. Lu 2020-07-28 18:43 ` Jan Beulich 0 siblings, 2 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-27 23:23 UTC (permalink / raw) To: binutils 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}. Note: Since there is no disp32 on 0(%bp), use disp16 instead. PR gas/26305 * config/tc-i386.c (build_modrm_byte): Use disp32/disp16 on (%bp)/(%ebp)/(%rbp) for {disp32}. * testsuite/gas/i386/pseudos.s: Add (%bp)/(%ebp) tests. * testsuite/gas/i386/x86-64-pseudos.s: Add (%ebp)/(%rbp) tests. * testsuite/gas/i386/pseudos.d: Updated. * testsuite/gas/i386/x86-64-pseudos.d: Likewise. --- gas/config/tc-i386.c | 12 ++++++++++-- gas/testsuite/gas/i386/pseudos.d | 18 ++++++++++++++++++ gas/testsuite/gas/i386/pseudos.s | 24 ++++++++++++++++++++++++ gas/testsuite/gas/i386/x86-64-pseudos.d | 12 ++++++++++++ gas/testsuite/gas/i386/x86-64-pseudos.s | 16 ++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9ab841383c..11d0e992f9 100644 --- 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; } } @@ -8196,7 +8201,10 @@ build_modrm_byte (void) if (i.base_reg->reg_num == 5 && i.disp_operands == 0) { fake_zero_displacement = 1; - i.types[op].bitfield.disp8 = 1; + if (i.disp_encoding == disp_encoding_32bit) + i.types[op].bitfield.disp32 = 1; + else + i.types[op].bitfield.disp8 = 1; } i.sib.scale = i.log2_scale_factor; if (i.index_reg == 0) diff --git a/gas/testsuite/gas/i386/pseudos.d b/gas/testsuite/gas/i386/pseudos.d index 00c10a520b..76aae367b4 100644 --- a/gas/testsuite/gas/i386/pseudos.d +++ b/gas/testsuite/gas/i386/pseudos.d @@ -288,6 +288,15 @@ Disassembly of section .text: +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -316,4 +325,13 @@ Disassembly of section .text: +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al #pass diff --git a/gas/testsuite/gas/i386/pseudos.s b/gas/testsuite/gas/i386/pseudos.s index 19900dd7e5..bc18654ced 100644 --- a/gas/testsuite/gas/i386/pseudos.s +++ b/gas/testsuite/gas/i386/pseudos.s @@ -293,6 +293,18 @@ _start: {disp8} movaps 128(%eax),%xmm2 {disp32} movaps 128(%eax),%xmm2 + movb (%ebp),%al + {disp8} movb (%ebp),%al + {disp32} movb (%ebp),%al + + movb (%bx),%al + {disp8} movb (%bx),%al + {disp32} movb (%bx),%al + + movb (%bp),%al + {disp8} movb (%bp),%al + {disp32} movb (%bp),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -322,3 +334,15 @@ _start: movaps xmm2,XMMWORD PTR [eax+128] {disp8} movaps xmm2,XMMWORD PTR [eax+128] {disp32} movaps xmm2,XMMWORD PTR [eax+128] + + mov al, BYTE PTR [ebp] + {disp8} mov al, BYTE PTR [ebp] + {disp32} mov al, BYTE PTR [ebp] + + mov al, BYTE PTR [bx] + {disp8} mov al, BYTE PTR [bx] + {disp32} mov al, BYTE PTR [bx] + + mov al, BYTE PTR [bp] + {disp8} mov al, BYTE PTR [bp] + {disp32} mov al, BYTE PTR [bp] diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.d b/gas/testsuite/gas/i386/x86-64-pseudos.d index d5f4e05711..0fb18a3369 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.d +++ b/gas/testsuite/gas/i386/x86-64-pseudos.d @@ -315,6 +315,12 @@ Disassembly of section .text: +[a-f0-9]+: 41 0f 28 10 movaps \(%r8\),%xmm2 +[a-f0-9]+: 40 0f 38 01 01 rex phaddw \(%rcx\),%mm0 +[a-f0-9]+: 41 0f 38 01 00 phaddw \(%r8\),%mm0 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -353,4 +359,10 @@ Disassembly of section .text: +[a-f0-9]+: 41 0f 28 10 movaps \(%r8\),%xmm2 +[a-f0-9]+: 40 0f 38 01 01 rex phaddw \(%rcx\),%mm0 +[a-f0-9]+: 41 0f 38 01 00 phaddw \(%r8\),%mm0 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al #pass diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.s b/gas/testsuite/gas/i386/x86-64-pseudos.s index 1bd8818121..3b3638cf75 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.s +++ b/gas/testsuite/gas/i386/x86-64-pseudos.s @@ -320,6 +320,14 @@ _start: {rex} phaddw (%rcx),%mm0 {rex} phaddw (%r8),%mm0 + movb (%rbp),%al + {disp8} movb (%rbp),%al + {disp32} movb (%rbp),%al + + movb (%ebp),%al + {disp8} movb (%ebp),%al + {disp32} movb (%ebp),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -359,3 +367,11 @@ _start: {rex} movaps xmm2,XMMWORD PTR [r8] {rex} phaddw mm0,QWORD PTR [rcx] {rex} phaddw mm0,QWORD PTR [r8] + + mov al, BYTE PTR [rbp] + {disp8} mov al, BYTE PTR [rbp] + {disp32} mov al, BYTE PTR [rbp] + + mov al, BYTE PTR [ebp] + {disp8} mov al, BYTE PTR [ebp] + {disp32} mov al, BYTE PTR [ebp] -- 2.26.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) 2020-07-27 23:23 [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) H.J. Lu @ 2020-07-28 10:39 ` H.J. Lu 2020-07-28 18:43 ` Jan Beulich 1 sibling, 0 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-28 10:39 UTC (permalink / raw) To: Binutils [-- Attachment #1: Type: text/plain, Size: 723 bytes --] On Mon, Jul 27, 2020 at 4:23 PM H.J. Lu <hjl.tools@gmail.com> 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}. > > Note: Since there is no disp32 on 0(%bp), use disp16 instead. > > PR gas/26305 > * config/tc-i386.c (build_modrm_byte): Use disp32/disp16 on > (%bp)/(%ebp)/(%rbp) for {disp32}. > * testsuite/gas/i386/pseudos.s: Add (%bp)/(%ebp) tests. > * testsuite/gas/i386/x86-64-pseudos.s: Add (%ebp)/(%rbp) tests. > * testsuite/gas/i386/pseudos.d: Updated. > * testsuite/gas/i386/x86-64-pseudos.d: Likewise. I am checking in this and will backport it to 2.35 branch. -- H.J. [-- Attachment #2: 0001-x86-Handle-disp32-for-bp-ebp-rbp.patch --] [-- Type: text/x-patch, Size: 7995 bytes --] From 9b31794493e5b8768d9df9700535f42e1e092438 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Mon, 27 Jul 2020 16:02:54 -0700 Subject: [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) 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}. Note: Since there is no disp32 on 0(%bp), use disp16 instead. PR gas/26305 * config/tc-i386.c (build_modrm_byte): Use disp32/disp16 on (%bp)/(%ebp)/(%rbp) for {disp32}. * doc/c-i386.texi: Update {disp32} documentation. * testsuite/gas/i386/pseudos.s: Add (%bp)/(%ebp) tests. * testsuite/gas/i386/x86-64-pseudos.s: Add (%ebp)/(%rbp) tests. * testsuite/gas/i386/pseudos.d: Updated. * testsuite/gas/i386/x86-64-pseudos.d: Likewise. --- gas/config/tc-i386.c | 12 ++++++++++-- gas/doc/c-i386.texi | 2 +- gas/testsuite/gas/i386/pseudos.d | 18 ++++++++++++++++++ gas/testsuite/gas/i386/pseudos.s | 24 ++++++++++++++++++++++++ gas/testsuite/gas/i386/x86-64-pseudos.d | 12 ++++++++++++ gas/testsuite/gas/i386/x86-64-pseudos.s | 16 ++++++++++++++++ 6 files changed, 81 insertions(+), 3 deletions(-) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9ab841383c..11d0e992f9 100644 --- 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; } } @@ -8196,7 +8201,10 @@ build_modrm_byte (void) if (i.base_reg->reg_num == 5 && i.disp_operands == 0) { fake_zero_displacement = 1; - i.types[op].bitfield.disp8 = 1; + if (i.disp_encoding == disp_encoding_32bit) + i.types[op].bitfield.disp32 = 1; + else + i.types[op].bitfield.disp8 = 1; } i.sib.scale = i.log2_scale_factor; if (i.index_reg == 0) diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi index 3813f5eb59..8be708e745 100644 --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -822,7 +822,7 @@ Different encoding options can be specified via pseudo prefixes: @samp{@{disp8@}} -- prefer 8-bit displacement. @item -@samp{@{disp32@}} -- prefer 32-bit displacement. +@samp{@{disp32@}} -- prefer 32-bit (16-bit in 16-bit mode) displacement. @item @samp{@{load@}} -- prefer load-form instruction. diff --git a/gas/testsuite/gas/i386/pseudos.d b/gas/testsuite/gas/i386/pseudos.d index 00c10a520b..76aae367b4 100644 --- a/gas/testsuite/gas/i386/pseudos.d +++ b/gas/testsuite/gas/i386/pseudos.d @@ -288,6 +288,15 @@ Disassembly of section .text: +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -316,4 +325,13 @@ Disassembly of section .text: +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 0f 28 90 80 00 00 00 movaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al + +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al #pass diff --git a/gas/testsuite/gas/i386/pseudos.s b/gas/testsuite/gas/i386/pseudos.s index 19900dd7e5..bc18654ced 100644 --- a/gas/testsuite/gas/i386/pseudos.s +++ b/gas/testsuite/gas/i386/pseudos.s @@ -293,6 +293,18 @@ _start: {disp8} movaps 128(%eax),%xmm2 {disp32} movaps 128(%eax),%xmm2 + movb (%ebp),%al + {disp8} movb (%ebp),%al + {disp32} movb (%ebp),%al + + movb (%bx),%al + {disp8} movb (%bx),%al + {disp32} movb (%bx),%al + + movb (%bp),%al + {disp8} movb (%bp),%al + {disp32} movb (%bp),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -322,3 +334,15 @@ _start: movaps xmm2,XMMWORD PTR [eax+128] {disp8} movaps xmm2,XMMWORD PTR [eax+128] {disp32} movaps xmm2,XMMWORD PTR [eax+128] + + mov al, BYTE PTR [ebp] + {disp8} mov al, BYTE PTR [ebp] + {disp32} mov al, BYTE PTR [ebp] + + mov al, BYTE PTR [bx] + {disp8} mov al, BYTE PTR [bx] + {disp32} mov al, BYTE PTR [bx] + + mov al, BYTE PTR [bp] + {disp8} mov al, BYTE PTR [bp] + {disp32} mov al, BYTE PTR [bp] diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.d b/gas/testsuite/gas/i386/x86-64-pseudos.d index d5f4e05711..0fb18a3369 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.d +++ b/gas/testsuite/gas/i386/x86-64-pseudos.d @@ -315,6 +315,12 @@ Disassembly of section .text: +[a-f0-9]+: 41 0f 28 10 movaps \(%r8\),%xmm2 +[a-f0-9]+: 40 0f 38 01 01 rex phaddw \(%rcx\),%mm0 +[a-f0-9]+: 41 0f 38 01 00 phaddw \(%r8\),%mm0 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -353,4 +359,10 @@ Disassembly of section .text: +[a-f0-9]+: 41 0f 28 10 movaps \(%r8\),%xmm2 +[a-f0-9]+: 40 0f 38 01 01 rex phaddw \(%rcx\),%mm0 +[a-f0-9]+: 41 0f 38 01 00 phaddw \(%r8\),%mm0 + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 45 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%rbp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al #pass diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.s b/gas/testsuite/gas/i386/x86-64-pseudos.s index 1bd8818121..3b3638cf75 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.s +++ b/gas/testsuite/gas/i386/x86-64-pseudos.s @@ -320,6 +320,14 @@ _start: {rex} phaddw (%rcx),%mm0 {rex} phaddw (%r8),%mm0 + movb (%rbp),%al + {disp8} movb (%rbp),%al + {disp32} movb (%rbp),%al + + movb (%ebp),%al + {disp8} movb (%ebp),%al + {disp32} movb (%ebp),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -359,3 +367,11 @@ _start: {rex} movaps xmm2,XMMWORD PTR [r8] {rex} phaddw mm0,QWORD PTR [rcx] {rex} phaddw mm0,QWORD PTR [r8] + + mov al, BYTE PTR [rbp] + {disp8} mov al, BYTE PTR [rbp] + {disp32} mov al, BYTE PTR [rbp] + + mov al, BYTE PTR [ebp] + {disp8} mov al, BYTE PTR [ebp] + {disp32} mov al, BYTE PTR [ebp] -- 2.26.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) 2020-07-27 23:23 [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) H.J. Lu 2020-07-28 10:39 ` H.J. Lu @ 2020-07-28 18:43 ` Jan Beulich 2020-07-28 19:02 ` H.J. Lu 1 sibling, 1 reply; 15+ messages in thread From: Jan Beulich @ 2020-07-28 18:43 UTC (permalink / raw) To: H.J. Lu; +Cc: binutils 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? > 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. Jan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) 2020-07-28 18:43 ` Jan Beulich @ 2020-07-28 19:02 ` H.J. Lu 2020-07-28 20:30 ` [PATCH] x86: Add {disp16} pseudo prefix H.J. Lu 0 siblings, 1 reply; 15+ messages in thread From: H.J. Lu @ 2020-07-28 19:02 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils 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. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH] x86: Add {disp16} pseudo prefix 2020-07-28 19:02 ` H.J. Lu @ 2020-07-28 20:30 ` H.J. Lu 2020-07-29 20:26 ` Jan Beulich 0 siblings, 1 reply; 15+ messages in thread From: H.J. Lu @ 2020-07-28 20:30 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils [-- Attachment #1: Type: text/plain, Size: 3027 bytes --] 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. [-- Attachment #2: 0001-x86-Add-disp16-pseudo-prefix.patch --] [-- Type: text/x-patch, Size: 13695 bytes --] From caa5adabc759b3c45cceb2170ce2c0ebb44a32de Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Tue, 28 Jul 2020 13:19:17 -0700 Subject: [PATCH] x86: Add {disp16} pseudo prefix 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. gas/ PR gas/26305 * config/tc-i386.c (_i386_insn::disp_encoding): Add disp_encoding_16bit. (parse_insn): Handle {disp16}. (build_modrm_byte): Handle {disp16}. (i386_index_check): Check invalid {disp16} and {disp32} pseudo prefixes. * doc/c-i386.texi: Update {disp32} documentation and document {disp16}. * testsuite/gas/i386/inval-pseudo.s: Add {disp32}/{disp16} tests. * testsuite/gas/i386/pseudos.s: Add {disp16} tests. * testsuite/gas/i386/x86-64-pseudos.s: Add (%r13)/(%r13d) tests. * testsuite/gas/i386/inval-pseudo.l: Updated. * testsuite/gas/i386/pseudos.d: Likewise. * testsuite/gas/i386/x86-64-pseudos.d: Likewise. opcodes/ PR gas/26305 * i386-opc.tbl: Add {disp16}. * i386-tbl.h: Regenerated. --- gas/config/tc-i386.c | 32 +++++++++++++++++++++---- gas/doc/c-i386.texi | 5 +++- gas/testsuite/gas/i386/inval-pseudo.l | 11 ++++++++- gas/testsuite/gas/i386/inval-pseudo.s | 5 ++++ gas/testsuite/gas/i386/pseudos.d | 20 ++++++++++++---- gas/testsuite/gas/i386/pseudos.s | 24 +++++++++++++++---- gas/testsuite/gas/i386/x86-64-pseudos.d | 12 ++++++++++ gas/testsuite/gas/i386/x86-64-pseudos.s | 16 +++++++++++++ opcodes/i386-opc.tbl | 1 + opcodes/i386-tbl.h | 12 ++++++++++ 10 files changed, 124 insertions(+), 14 deletions(-) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 11d0e992f9..9e96656e95 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -409,11 +409,12 @@ struct _i386_insn dir_encoding_swap } dir_encoding; - /* Prefer 8bit or 32bit displacement in encoding. */ + /* Prefer 8bit, 16bit, 32bit displacement in encoding. */ enum { disp_encoding_default = 0, disp_encoding_8bit, + disp_encoding_16bit, disp_encoding_32bit } disp_encoding; @@ -5155,6 +5156,10 @@ parse_insn (char *line, char *mnemonic) /* {nooptimize} */ i.no_optimize = TRUE; break; + case 0x9: + /* {disp16} */ + i.disp_encoding = disp_encoding_16bit; + break; default: abort (); } @@ -8151,9 +8156,7 @@ build_modrm_byte (void) if (operand_type_check (i.types[op], disp) == 0) { /* fake (%bp) into 0(%bp) */ - if (i.disp_encoding == disp_encoding_32bit) - /* NB: Use disp16 since there is no disp32 - in 16-bit mode. */ + if (i.disp_encoding == disp_encoding_16bit) i.types[op].bitfield.disp16 = 1; else i.types[op].bitfield.disp8 = 1; @@ -8166,6 +8169,16 @@ build_modrm_byte (void) default: /* (%si) -> 4 or (%di) -> 5 */ i.rm.regmem = i.base_reg->reg_num - 6 + 4; } + if (!fake_zero_displacement + && !i.disp_operands + && i.disp_encoding) + { + fake_zero_displacement = 1; + if (i.disp_encoding == disp_encoding_8bit) + i.types[op].bitfield.disp8 = 1; + else + i.types[op].bitfield.disp16 = 1; + } i.rm.mode = mode_from_disp_size (i.types[op]); } else /* i.base_reg and 32/64 bit mode */ @@ -11012,6 +11025,14 @@ i386_index_check (const char *operand_string) if (addr_mode != CODE_16BIT) { /* 32-bit/64-bit checks. */ + if (i.disp_encoding == disp_encoding_16bit) + { + bad_disp: + as_bad (_("invalid `%s' prefix"), + addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}"); + return 0; + } + if ((i.base_reg && ((addr_mode == CODE_64BIT ? !i.base_reg->reg_type.bitfield.qword @@ -11049,6 +11070,9 @@ i386_index_check (const char *operand_string) else { /* 16-bit checks. */ + if (i.disp_encoding == disp_encoding_32bit) + goto bad_disp; + if ((i.base_reg && (!i.base_reg->reg_type.bitfield.word || !i.base_reg->reg_type.bitfield.baseindex)) diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi index 8be708e745..64a563aacb 100644 --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -822,7 +822,10 @@ Different encoding options can be specified via pseudo prefixes: @samp{@{disp8@}} -- prefer 8-bit displacement. @item -@samp{@{disp32@}} -- prefer 32-bit (16-bit in 16-bit mode) displacement. +@samp{@{disp32@}} -- prefer 32-bit displacement. + +@item +@samp{@{disp16@}} -- prefer 16-bit displacement. @item @samp{@{load@}} -- prefer load-form instruction. diff --git a/gas/testsuite/gas/i386/inval-pseudo.l b/gas/testsuite/gas/i386/inval-pseudo.l index cf344f6986..dbffa301a8 100644 --- a/gas/testsuite/gas/i386/inval-pseudo.l +++ b/gas/testsuite/gas/i386/inval-pseudo.l @@ -1,5 +1,9 @@ .*: Assembler messages: .*:3: Error: .* +.*:5: Error: .* +.*:6: Error: .* +.*:8: Error: .* +.*:9: Error: .* GAS LISTING .* @@ -7,5 +11,10 @@ GAS LISTING .* [ ]*2[ ]+\?\?\?\? 90 nop [ ]*3[ ]+\{disp32\} [ ]*4[ ]+\?\?\?\? 90 nop -[ ]*5[ ]+\?\?\?\? 00000000 \.p2align 4,0 +[ ]*5[ ]+\{disp32\} movb \(%bp\),%al +[ ]*6[ ]+\{disp16\} movb \(%ebp\),%al +[ ]*7[ ]+\.code64 +[ ]*8[ ]+\{disp16\} movb \(%ebp\),%al +[ ]*9[ ]+\{disp16\} movb \(%rbp\),%al +[ ]*10[ ]+\?\?\?\? 00000000 \.p2align 4,0 #... diff --git a/gas/testsuite/gas/i386/inval-pseudo.s b/gas/testsuite/gas/i386/inval-pseudo.s index a40362b8f9..2c4b3c3766 100644 --- a/gas/testsuite/gas/i386/inval-pseudo.s +++ b/gas/testsuite/gas/i386/inval-pseudo.s @@ -2,4 +2,9 @@ nop {disp32} nop + {disp32} movb (%bp),%al + {disp16} movb (%ebp),%al + .code64 + {disp16} movb (%ebp),%al + {disp16} movb (%rbp),%al .p2align 4,0 diff --git a/gas/testsuite/gas/i386/pseudos.d b/gas/testsuite/gas/i386/pseudos.d index 76aae367b4..4457f3642d 100644 --- a/gas/testsuite/gas/i386/pseudos.d +++ b/gas/testsuite/gas/i386/pseudos.d @@ -291,9 +291,15 @@ Disassembly of section .text: +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 04 mov \(%si\),%al + +[a-f0-9]+: 67 8a 44 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 84 00 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 05 mov \(%di\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%di\),%al + +[a-f0-9]+: 67 8a 85 00 00 mov 0x0\(%di\),%al +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 47 00 mov 0x0\(%bx\),%al + +[a-f0-9]+: 67 8a 87 00 00 mov 0x0\(%bx\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al @@ -328,9 +334,15 @@ Disassembly of section .text: +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 04 mov \(%si\),%al + +[a-f0-9]+: 67 8a 44 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 84 00 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 05 mov \(%di\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%di\),%al + +[a-f0-9]+: 67 8a 85 00 00 mov 0x0\(%di\),%al +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 47 00 mov 0x0\(%bx\),%al + +[a-f0-9]+: 67 8a 87 00 00 mov 0x0\(%bx\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al diff --git a/gas/testsuite/gas/i386/pseudos.s b/gas/testsuite/gas/i386/pseudos.s index bc18654ced..3fd2da16bd 100644 --- a/gas/testsuite/gas/i386/pseudos.s +++ b/gas/testsuite/gas/i386/pseudos.s @@ -297,13 +297,21 @@ _start: {disp8} movb (%ebp),%al {disp32} movb (%ebp),%al + movb (%si),%al + {disp8} movb (%si),%al + {disp16} movb (%si),%al + + movb (%di),%al + {disp8} movb (%di),%al + {disp16} movb (%di),%al + movb (%bx),%al {disp8} movb (%bx),%al - {disp32} movb (%bx),%al + {disp16} movb (%bx),%al movb (%bp),%al {disp8} movb (%bp),%al - {disp32} movb (%bp),%al + {disp16} movb (%bp),%al .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 @@ -339,10 +347,18 @@ _start: {disp8} mov al, BYTE PTR [ebp] {disp32} mov al, BYTE PTR [ebp] + mov al, BYTE PTR [si] + {disp8} mov al, BYTE PTR [si] + {disp16} mov al, BYTE PTR [si] + + mov al, BYTE PTR [di] + {disp8} mov al, BYTE PTR [di] + {disp16} mov al, BYTE PTR [di] + mov al, BYTE PTR [bx] {disp8} mov al, BYTE PTR [bx] - {disp32} mov al, BYTE PTR [bx] + {disp16} mov al, BYTE PTR [bx] mov al, BYTE PTR [bp] {disp8} mov al, BYTE PTR [bp] - {disp32} mov al, BYTE PTR [bp] + {disp16} mov al, BYTE PTR [bp] diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.d b/gas/testsuite/gas/i386/x86-64-pseudos.d index 0fb18a3369..55a12b9261 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.d +++ b/gas/testsuite/gas/i386/x86-64-pseudos.d @@ -321,6 +321,12 @@ Disassembly of section .text: +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 85 00 00 00 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 85 00 00 00 00 mov 0x0\(%r13d\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -365,4 +371,10 @@ Disassembly of section .text: +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 85 00 00 00 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 85 00 00 00 00 mov 0x0\(%r13d\),%al #pass diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.s b/gas/testsuite/gas/i386/x86-64-pseudos.s index 3b3638cf75..5f5fe5c574 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.s +++ b/gas/testsuite/gas/i386/x86-64-pseudos.s @@ -328,6 +328,14 @@ _start: {disp8} movb (%ebp),%al {disp32} movb (%ebp),%al + movb (%r13),%al + {disp8} movb (%r13),%al + {disp32} movb (%r13),%al + + movb (%r13d),%al + {disp8} movb (%r13d),%al + {disp32} movb (%r13d),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -375,3 +383,11 @@ _start: mov al, BYTE PTR [ebp] {disp8} mov al, BYTE PTR [ebp] {disp32} mov al, BYTE PTR [ebp] + + mov al, BYTE PTR [r13] + {disp8} mov al, BYTE PTR [r13] + {disp32} mov al, BYTE PTR [r13] + + mov al, BYTE PTR [r13] + {disp8} mov al, BYTE PTR [r13d] + {disp32} mov al, BYTE PTR [r13d] diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index bb7fb02dde..56601707b0 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -845,6 +845,7 @@ rex.wrxb, 0, 0x4f, None, 1, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ld {evex}, 0, 0x6, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } {rex}, 0, 0x7, None, 0, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } {nooptimize}, 0, 0x8, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{disp16}, 0, 0x9, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } // 486 extensions. diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h index a3aa69175a..e4e7a3ed58 100644 --- a/opcodes/i386-tbl.h +++ b/opcodes/i386-tbl.h @@ -7704,6 +7704,18 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, + { "{disp16}", 0x9, None, 0, 0, + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 } } } }, { "bswap", 0xfc8, None, 2, 1, { { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 2.26.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Add {disp16} pseudo prefix 2020-07-28 20:30 ` [PATCH] x86: Add {disp16} pseudo prefix H.J. Lu @ 2020-07-29 20:26 ` Jan Beulich 2020-07-29 22:53 ` H.J. Lu 0 siblings, 1 reply; 15+ messages in thread From: Jan Beulich @ 2020-07-29 20:26 UTC (permalink / raw) To: H.J. Lu; +Cc: Binutils On 28.07.2020 22:30, H.J. Lu wrote: > 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. The inval-pseudo test is a 32-bit one; you shouldn't use .code64 there, or you'll cause FAILs on 32-bit only builds. > Note: {disp16} can be also used on branches in 32-bit mode. But you don't add any tests to this effect, so it's hard to see what exactly this means. To be honest I'm not sure this is helpful: A means to widen the default displacement may be useful, but one to narrow not just the displacement, but also the resulting new IP? I was also wanting to ask that you group the new pseudo prefix with its sibling ones in the opcode table, but I realize the use of hard coded numbers makes this cumbersome. Time to do away with that? I also have a tangential question: Shouldn't e.g. {disp8} vmovaps %xmm0,128(%eax) be taken as a request to use EVEX encoding, to satisfy the pseudo prefix? Unless {vex} was also specified, at which point things become "interesting" (but the way they're documented I think {vex} has to have more wight here). Jan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Add {disp16} pseudo prefix 2020-07-29 20:26 ` Jan Beulich @ 2020-07-29 22:53 ` H.J. Lu 2020-07-29 23:39 ` V2 " H.J. Lu 2020-07-31 6:22 ` Jan Beulich 0 siblings, 2 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-29 22:53 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils On Wed, Jul 29, 2020 at 1:26 PM Jan Beulich <jbeulich@suse.com> wrote: > > On 28.07.2020 22:30, H.J. Lu wrote: > > 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. > > The inval-pseudo test is a 32-bit one; you shouldn't use .code64 there, > or you'll cause FAILs on 32-bit only builds. I will fix it. > > Note: {disp16} can be also used on branches in 32-bit mode. > > But you don't add any tests to this effect, so it's hard to see what > exactly this means. To be honest I'm not sure this is helpful: A means > to widen the default displacement may be useful, but one to narrow not > just the displacement, but also the resulting new IP? {disp16} can be used to generate "branch rel16". But implementation may be non-trivial. > I was also wanting to ask that you group the new pseudo prefix with > its sibling ones in the opcode table, but I realize the use of > hard coded numbers makes this cumbersome. Time to do away with that? I will take a look. > I also have a tangential question: Shouldn't e.g. > > {disp8} vmovaps %xmm0,128(%eax) > > be taken as a request to use EVEX encoding, to satisfy the pseudo > prefix? Unless {vex} was also specified, at which point things > become "interesting" (but the way they're documented I think > {vex} has to have more wight here). > {disp8} is a hint for VEX. It shouldn't change to EVEX. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
* V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-29 22:53 ` H.J. Lu @ 2020-07-29 23:39 ` H.J. Lu 2020-07-31 7:03 ` Jan Beulich 2020-08-04 12:36 ` H.J. Lu 2020-07-31 6:22 ` Jan Beulich 1 sibling, 2 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-29 23:39 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils [-- Attachment #1: Type: text/plain, Size: 4826 bytes --] On Wed, Jul 29, 2020 at 3:53 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Wed, Jul 29, 2020 at 1:26 PM Jan Beulich <jbeulich@suse.com> wrote: > > > > On 28.07.2020 22:30, H.J. Lu wrote: > > > 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. > > > > The inval-pseudo test is a 32-bit one; you shouldn't use .code64 there, > > or you'll cause FAILs on 32-bit only builds. > > I will fix it. > > > > Note: {disp16} can be also used on branches in 32-bit mode. > > > > But you don't add any tests to this effect, so it's hard to see what > > exactly this means. To be honest I'm not sure this is helpful: A means > > to widen the default displacement may be useful, but one to narrow not > > just the displacement, but also the resulting new IP? > > {disp16} can be used to generate "branch rel16". But implementation > may be non-trivial. > > > I was also wanting to ask that you group the new pseudo prefix with > > its sibling ones in the opcode table, but I realize the use of > > hard coded numbers makes this cumbersome. Time to do away with that? > > I will take a look. > > > I also have a tangential question: Shouldn't e.g. > > > > {disp8} vmovaps %xmm0,128(%eax) > > > > be taken as a request to use EVEX encoding, to satisfy the pseudo > > prefix? Unless {vex} was also specified, at which point things > > become "interesting" (but the way they're documented I think > > {vex} has to have more wight here). > > > > {disp8} is a hint for VEX. It shouldn't change to EVEX. > Here is the updated patch. -- H.J. [-- Attachment #2: 0001-x86-Add-disp16-pseudo-prefix.patch --] [-- Type: text/x-patch, Size: 28654 bytes --] From 0cc9077962b4373d39be8de25b1e9c46e63a3e28 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Tue, 28 Jul 2020 13:19:17 -0700 Subject: [PATCH] x86: Add {disp16} pseudo prefix Use Prefix_XXX for pseudo prefixes. Add {disp16} pseudo prefix and replace {disp32} pseudo prefix with {disp16} in 16-bit mode test. Check invalid {disp16}/{disp32} pseudo prefixes. gas/ PR gas/26305 * config/tc-i386.c (_i386_insn::disp_encoding): Add disp_encoding_16bit. (parse_insn): Check Prefix_XXX for pseudo prefixes. Handle {disp16}. (build_modrm_byte): Handle {disp16}. (i386_index_check): Check invalid {disp16} and {disp32} pseudo prefixes. * doc/c-i386.texi: Update {disp32} documentation and document {disp16}. * testsuite/gas/i386/i386.exp: Run x86-64-inval-pseudo. * testsuite/gas/i386/inval-pseudo.s: Add {disp32}/{disp16} tests. * testsuite/gas/i386/pseudos.s: Add {disp8}/{disp32} vmovaps tests with 128-byte displacement. Add {disp16} tests. * testsuite/gas/i386/x86-64-pseudos.s: Add {disp8}/{disp32} vmovaps test. Add (%r13)/(%r13d) tests. * testsuite/gas/i386/x86-64-inval-pseudo.l: New file. * testsuite/gas/i386/x86-64-inval-pseudo.s: Likewise. * testsuite/gas/i386/inval-pseudo.l: Updated. * testsuite/gas/i386/pseudos.d: Likewise. * testsuite/gas/i386/x86-64-pseudos.d: Likewise. opcodes/ PR gas/26305 * i386-opc.h (Prefix_Disp8): New. (Prefix_Disp16): Likewise. (Prefix_Disp32): Likewise. (Prefix_Load): Likewise. (Prefix_Store): Likewise. (Prefix_VEX): Likewise. (Prefix_VEX3): Likewise. (Prefix_EVEX): Likewise. (Prefix_REX): Likewise. (Prefix_NoOptimize): Likewise. * i386-opc.tbl: Use Prefix_XXX on pseudo prefixes. Add {disp16}. * i386-tbl.h: Regenerated. --- gas/config/tc-i386.c | 50 +++++++++++++++----- gas/doc/c-i386.texi | 5 +- gas/testsuite/gas/i386/i386.exp | 1 + gas/testsuite/gas/i386/inval-pseudo.l | 6 ++- gas/testsuite/gas/i386/inval-pseudo.s | 2 + gas/testsuite/gas/i386/pseudos.d | 28 +++++++++-- gas/testsuite/gas/i386/pseudos.s | 35 ++++++++++++-- gas/testsuite/gas/i386/x86-64-inval-pseudo.l | 10 ++++ gas/testsuite/gas/i386/x86-64-inval-pseudo.s | 4 ++ gas/testsuite/gas/i386/x86-64-pseudos.d | 22 ++++++++- gas/testsuite/gas/i386/x86-64-pseudos.s | 27 +++++++++++ opcodes/i386-opc.h | 12 +++++ opcodes/i386-opc.tbl | 21 ++++---- opcodes/i386-tbl.h | 32 +++++++++---- 14 files changed, 211 insertions(+), 44 deletions(-) create mode 100644 gas/testsuite/gas/i386/x86-64-inval-pseudo.l create mode 100644 gas/testsuite/gas/i386/x86-64-inval-pseudo.s diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 11d0e992f9..7c21df8d9a 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -409,11 +409,12 @@ struct _i386_insn dir_encoding_swap } dir_encoding; - /* Prefer 8bit or 32bit displacement in encoding. */ + /* Prefer 8bit, 16bit, 32bit displacement in encoding. */ enum { disp_encoding_default = 0, disp_encoding_8bit, + disp_encoding_16bit, disp_encoding_32bit } disp_encoding; @@ -5119,39 +5120,43 @@ parse_insn (char *line, char *mnemonic) /* Handle pseudo prefixes. */ switch (current_templates->start->base_opcode) { - case 0x0: + case Prefix_Disp8: /* {disp8} */ i.disp_encoding = disp_encoding_8bit; break; - case 0x1: + case Prefix_Disp16: + /* {disp16} */ + i.disp_encoding = disp_encoding_16bit; + break; + case Prefix_Disp32: /* {disp32} */ i.disp_encoding = disp_encoding_32bit; break; - case 0x2: + case Prefix_Load: /* {load} */ i.dir_encoding = dir_encoding_load; break; - case 0x3: + case Prefix_Store: /* {store} */ i.dir_encoding = dir_encoding_store; break; - case 0x4: + case Prefix_VEX: /* {vex} */ i.vec_encoding = vex_encoding_vex; break; - case 0x5: + case Prefix_VEX3: /* {vex3} */ i.vec_encoding = vex_encoding_vex3; break; - case 0x6: + case Prefix_EVEX: /* {evex} */ i.vec_encoding = vex_encoding_evex; break; - case 0x7: + case Prefix_REX: /* {rex} */ i.rex_encoding = TRUE; break; - case 0x8: + case Prefix_NoOptimize: /* {nooptimize} */ i.no_optimize = TRUE; break; @@ -8151,9 +8156,7 @@ build_modrm_byte (void) if (operand_type_check (i.types[op], disp) == 0) { /* fake (%bp) into 0(%bp) */ - if (i.disp_encoding == disp_encoding_32bit) - /* NB: Use disp16 since there is no disp32 - in 16-bit mode. */ + if (i.disp_encoding == disp_encoding_16bit) i.types[op].bitfield.disp16 = 1; else i.types[op].bitfield.disp8 = 1; @@ -8166,6 +8169,16 @@ build_modrm_byte (void) default: /* (%si) -> 4 or (%di) -> 5 */ i.rm.regmem = i.base_reg->reg_num - 6 + 4; } + if (!fake_zero_displacement + && !i.disp_operands + && i.disp_encoding) + { + fake_zero_displacement = 1; + if (i.disp_encoding == disp_encoding_8bit) + i.types[op].bitfield.disp8 = 1; + else + i.types[op].bitfield.disp16 = 1; + } i.rm.mode = mode_from_disp_size (i.types[op]); } else /* i.base_reg and 32/64 bit mode */ @@ -11012,6 +11025,14 @@ i386_index_check (const char *operand_string) if (addr_mode != CODE_16BIT) { /* 32-bit/64-bit checks. */ + if (i.disp_encoding == disp_encoding_16bit) + { + bad_disp: + as_bad (_("invalid `%s' prefix"), + addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}"); + return 0; + } + if ((i.base_reg && ((addr_mode == CODE_64BIT ? !i.base_reg->reg_type.bitfield.qword @@ -11049,6 +11070,9 @@ i386_index_check (const char *operand_string) else { /* 16-bit checks. */ + if (i.disp_encoding == disp_encoding_32bit) + goto bad_disp; + if ((i.base_reg && (!i.base_reg->reg_type.bitfield.word || !i.base_reg->reg_type.bitfield.baseindex)) diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi index 8be708e745..64a563aacb 100644 --- a/gas/doc/c-i386.texi +++ b/gas/doc/c-i386.texi @@ -822,7 +822,10 @@ Different encoding options can be specified via pseudo prefixes: @samp{@{disp8@}} -- prefer 8-bit displacement. @item -@samp{@{disp32@}} -- prefer 32-bit (16-bit in 16-bit mode) displacement. +@samp{@{disp32@}} -- prefer 32-bit displacement. + +@item +@samp{@{disp16@}} -- prefer 16-bit displacement. @item @samp{@{load@}} -- prefer load-form instruction. diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 0ac9c1f129..0a863ff3bd 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -1105,6 +1105,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t run_list_test "x86-64-cet-shstk-inval" run_dump_test "x86-64-pseudos" run_list_test "x86-64-pseudos-bad" + run_list_test "x86-64-inval-pseudo" "-al" run_dump_test "x86-64-notrack" run_dump_test "x86-64-notrack-intel" run_list_test "x86-64-notrackbad" "-al" diff --git a/gas/testsuite/gas/i386/inval-pseudo.l b/gas/testsuite/gas/i386/inval-pseudo.l index cf344f6986..9df0a9851f 100644 --- a/gas/testsuite/gas/i386/inval-pseudo.l +++ b/gas/testsuite/gas/i386/inval-pseudo.l @@ -1,5 +1,7 @@ .*: Assembler messages: .*:3: Error: .* +.*:5: Error: .* +.*:6: Error: .* GAS LISTING .* @@ -7,5 +9,7 @@ GAS LISTING .* [ ]*2[ ]+\?\?\?\? 90 nop [ ]*3[ ]+\{disp32\} [ ]*4[ ]+\?\?\?\? 90 nop -[ ]*5[ ]+\?\?\?\? 00000000 \.p2align 4,0 +[ ]*5[ ]+\{disp32\} movb \(%bp\),%al +[ ]*6[ ]+\{disp16\} movb \(%ebp\),%al +[ ]*7[ ]+\?\?\?\? 00000000 \.p2align 4,0 #... diff --git a/gas/testsuite/gas/i386/inval-pseudo.s b/gas/testsuite/gas/i386/inval-pseudo.s index a40362b8f9..b5a6233eb1 100644 --- a/gas/testsuite/gas/i386/inval-pseudo.s +++ b/gas/testsuite/gas/i386/inval-pseudo.s @@ -2,4 +2,6 @@ nop {disp32} nop + {disp32} movb (%bp),%al + {disp16} movb (%ebp),%al .p2align 4,0 diff --git a/gas/testsuite/gas/i386/pseudos.d b/gas/testsuite/gas/i386/pseudos.d index 76aae367b4..4f029f154b 100644 --- a/gas/testsuite/gas/i386/pseudos.d +++ b/gas/testsuite/gas/i386/pseudos.d @@ -22,6 +22,10 @@ Disassembly of section .text: +[a-f0-9]+: c5 f8 28 90 00 00 00 00 vmovaps 0x0\(%eax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 50 00 vmovaps 0x0\(%eax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 90 00 00 00 00 vmovaps 0x0\(%eax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 50 08 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 89 c8 mov %ecx,%eax +[a-f0-9]+: 8b c1 mov %ecx,%eax +[a-f0-9]+: 89 c8 mov %ecx,%eax @@ -291,9 +295,15 @@ Disassembly of section .text: +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 04 mov \(%si\),%al + +[a-f0-9]+: 67 8a 44 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 84 00 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 05 mov \(%di\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%di\),%al + +[a-f0-9]+: 67 8a 85 00 00 mov 0x0\(%di\),%al +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 47 00 mov 0x0\(%bx\),%al + +[a-f0-9]+: 67 8a 87 00 00 mov 0x0\(%bx\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al @@ -311,6 +321,10 @@ Disassembly of section .text: +[a-f0-9]+: c5 f8 28 90 00 00 00 00 vmovaps 0x0\(%eax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 50 00 vmovaps 0x0\(%eax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 90 00 00 00 00 vmovaps 0x0\(%eax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 50 08 vmovaps 0x80\(%eax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 90 80 00 00 00 vmovaps 0x80\(%eax\),%xmm2 +[a-f0-9]+: 89 c8 mov %ecx,%eax +[a-f0-9]+: 8b c1 mov %ecx,%eax +[a-f0-9]+: 89 c8 mov %ecx,%eax @@ -328,9 +342,15 @@ Disassembly of section .text: +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 67 8a 04 mov \(%si\),%al + +[a-f0-9]+: 67 8a 44 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 84 00 00 mov 0x0\(%si\),%al + +[a-f0-9]+: 67 8a 05 mov \(%di\),%al + +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%di\),%al + +[a-f0-9]+: 67 8a 85 00 00 mov 0x0\(%di\),%al +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al - +[a-f0-9]+: 67 8a 07 mov \(%bx\),%al + +[a-f0-9]+: 67 8a 47 00 mov 0x0\(%bx\),%al + +[a-f0-9]+: 67 8a 87 00 00 mov 0x0\(%bx\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 46 00 mov 0x0\(%bp\),%al +[a-f0-9]+: 67 8a 86 00 00 mov 0x0\(%bp\),%al diff --git a/gas/testsuite/gas/i386/pseudos.s b/gas/testsuite/gas/i386/pseudos.s index bc18654ced..603e112ac8 100644 --- a/gas/testsuite/gas/i386/pseudos.s +++ b/gas/testsuite/gas/i386/pseudos.s @@ -17,6 +17,11 @@ _start: {evex} {disp8} vmovaps (%eax),%xmm2 {evex} {disp32} vmovaps (%eax),%xmm2 + {vex} {disp8} vmovaps 128(%eax),%xmm2 + {vex} {disp32} vmovaps 128(%eax),%xmm2 + {evex} {disp8} vmovaps 128(%eax),%xmm2 + {evex} {disp32} vmovaps 128(%eax),%xmm2 + mov %ecx, %eax {load} mov %ecx, %eax {store} mov %ecx, %eax @@ -297,13 +302,21 @@ _start: {disp8} movb (%ebp),%al {disp32} movb (%ebp),%al + movb (%si),%al + {disp8} movb (%si),%al + {disp16} movb (%si),%al + + movb (%di),%al + {disp8} movb (%di),%al + {disp16} movb (%di),%al + movb (%bx),%al {disp8} movb (%bx),%al - {disp32} movb (%bx),%al + {disp16} movb (%bx),%al movb (%bp),%al {disp8} movb (%bp),%al - {disp32} movb (%bp),%al + {disp16} movb (%bp),%al .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 @@ -320,6 +333,12 @@ _start: {disp32} vmovaps xmm2,XMMWORD PTR [eax] {evex} {disp8} vmovaps xmm2,XMMWORD PTR [eax] {evex} {disp32} vmovaps xmm2,XMMWORD PTR [eax] + + {vex} {disp8} vmovaps xmm2,XMMWORD PTR [eax+128] + {vex} {disp32} vmovaps xmm2,XMMWORD PTR [eax+128] + {evex} {disp8} vmovaps xmm2,XMMWORD PTR [eax+128] + {evex} {disp32} vmovaps xmm2,XMMWORD PTR [eax+128] + mov eax,ecx {load} mov eax,ecx {store} mov eax,ecx @@ -339,10 +358,18 @@ _start: {disp8} mov al, BYTE PTR [ebp] {disp32} mov al, BYTE PTR [ebp] + mov al, BYTE PTR [si] + {disp8} mov al, BYTE PTR [si] + {disp16} mov al, BYTE PTR [si] + + mov al, BYTE PTR [di] + {disp8} mov al, BYTE PTR [di] + {disp16} mov al, BYTE PTR [di] + mov al, BYTE PTR [bx] {disp8} mov al, BYTE PTR [bx] - {disp32} mov al, BYTE PTR [bx] + {disp16} mov al, BYTE PTR [bx] mov al, BYTE PTR [bp] {disp8} mov al, BYTE PTR [bp] - {disp32} mov al, BYTE PTR [bp] + {disp16} mov al, BYTE PTR [bp] diff --git a/gas/testsuite/gas/i386/x86-64-inval-pseudo.l b/gas/testsuite/gas/i386/x86-64-inval-pseudo.l new file mode 100644 index 0000000000..13ad0fb768 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-inval-pseudo.l @@ -0,0 +1,10 @@ +.*: Assembler messages: +.*:2: Error: .* +.*:3: Error: .* +GAS LISTING .* + + +[ ]*1[ ]+\.text +[ ]*2[ ]+\{disp16\} movb \(%ebp\),%al +[ ]*3[ ]+\{disp16\} movb \(%rbp\),%al +#... diff --git a/gas/testsuite/gas/i386/x86-64-inval-pseudo.s b/gas/testsuite/gas/i386/x86-64-inval-pseudo.s new file mode 100644 index 0000000000..c10b14c209 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-inval-pseudo.s @@ -0,0 +1,4 @@ + .text + {disp16} movb (%ebp),%al + {disp16} movb (%rbp),%al + .p2align 4,0 diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.d b/gas/testsuite/gas/i386/x86-64-pseudos.d index 0fb18a3369..5d039dc6f9 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.d +++ b/gas/testsuite/gas/i386/x86-64-pseudos.d @@ -22,6 +22,10 @@ Disassembly of section .text: +[a-f0-9]+: c5 f8 28 90 00 00 00 00 vmovaps 0x0\(%rax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 50 00 vmovaps 0x0\(%rax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 90 00 00 00 00 vmovaps 0x0\(%rax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 50 08 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 +[a-f0-9]+: 48 89 c8 mov %rcx,%rax +[a-f0-9]+: 48 8b c1 mov %rcx,%rax +[a-f0-9]+: 48 89 c8 mov %rcx,%rax @@ -304,7 +308,7 @@ Disassembly of section .text: +[a-f0-9]+: 40 d3 e0 rex shl %cl,%eax +[a-f0-9]+: 40 a0 01 00 00 00 00 00 00 00 rex movabs 0x1,%al +[a-f0-9]+: 40 38 ca rex cmp %cl,%dl - +[a-f0-9]+: 40 b3 01 rex mov \$(0x)?1,%bl + +[a-f0-9]+: 40 b3 01 rex mov \$(0x)1,%bl +[a-f0-9]+: f2 40 0f 38 f0 c1 rex crc32 %cl,%eax +[a-f0-9]+: 40 89 c3 rex mov %eax,%ebx +[a-f0-9]+: 41 89 c6 mov %eax,%r14d @@ -321,6 +325,12 @@ Disassembly of section .text: +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 85 00 00 00 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 85 00 00 00 00 mov 0x0\(%r13d\),%al +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 28 d7 vmovaps %xmm7,%xmm2 +[a-f0-9]+: c4 e1 78 29 fa vmovaps %xmm7,%xmm2 @@ -335,6 +345,10 @@ Disassembly of section .text: +[a-f0-9]+: c5 f8 28 90 00 00 00 00 vmovaps 0x0\(%rax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 50 00 vmovaps 0x0\(%rax\),%xmm2 +[a-f0-9]+: 62 f1 7c 08 28 90 00 00 00 00 vmovaps 0x0\(%rax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: c5 f8 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 50 08 vmovaps 0x80\(%rax\),%xmm2 + +[a-f0-9]+: 62 f1 7c 08 28 90 80 00 00 00 vmovaps 0x80\(%rax\),%xmm2 +[a-f0-9]+: 48 89 c8 mov %rcx,%rax +[a-f0-9]+: 48 8b c1 mov %rcx,%rax +[a-f0-9]+: 48 89 c8 mov %rcx,%rax @@ -365,4 +379,10 @@ Disassembly of section .text: +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 45 00 mov 0x0\(%ebp\),%al +[a-f0-9]+: 67 8a 85 00 00 00 00 mov 0x0\(%ebp\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 85 00 00 00 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 41 8a 45 00 mov 0x0\(%r13\),%al + +[a-f0-9]+: 67 41 8a 45 00 mov 0x0\(%r13d\),%al + +[a-f0-9]+: 67 41 8a 85 00 00 00 00 mov 0x0\(%r13d\),%al #pass diff --git a/gas/testsuite/gas/i386/x86-64-pseudos.s b/gas/testsuite/gas/i386/x86-64-pseudos.s index 3b3638cf75..3818df9708 100644 --- a/gas/testsuite/gas/i386/x86-64-pseudos.s +++ b/gas/testsuite/gas/i386/x86-64-pseudos.s @@ -17,6 +17,11 @@ _start: {evex} {disp8} vmovaps (%rax),%xmm2 {evex} {disp32} vmovaps (%rax),%xmm2 + {vex} {disp8} vmovaps 128(%rax),%xmm2 + {vex} {disp32} vmovaps 128(%rax),%xmm2 + {evex} {disp8} vmovaps 128(%rax),%xmm2 + {evex} {disp32} vmovaps 128(%rax),%xmm2 + mov %rcx, %rax {load} mov %rcx, %rax {store} mov %rcx, %rax @@ -328,6 +333,14 @@ _start: {disp8} movb (%ebp),%al {disp32} movb (%ebp),%al + movb (%r13),%al + {disp8} movb (%r13),%al + {disp32} movb (%r13),%al + + movb (%r13d),%al + {disp8} movb (%r13d),%al + {disp32} movb (%r13d),%al + .intel_syntax noprefix {vex3} vmovaps xmm2,xmm7 {vex3} {load} vmovaps xmm2,xmm7 @@ -343,6 +356,12 @@ _start: {disp32} vmovaps xmm2,XMMWORD PTR [rax] {evex} {disp8} vmovaps xmm2,XMMWORD PTR [rax] {evex} {disp32} vmovaps xmm2,XMMWORD PTR [rax] + + {vex} {disp8} vmovaps xmm2,XMMWORD PTR [rax+128] + {vex} {disp32} vmovaps xmm2,XMMWORD PTR [rax+128] + {evex} {disp8} vmovaps xmm2,XMMWORD PTR [rax+128] + {evex} {disp32} vmovaps xmm2,XMMWORD PTR [rax+128] + mov rax,rcx {load} mov rax,rcx {store} mov rax,rcx @@ -375,3 +394,11 @@ _start: mov al, BYTE PTR [ebp] {disp8} mov al, BYTE PTR [ebp] {disp32} mov al, BYTE PTR [ebp] + + mov al, BYTE PTR [r13] + {disp8} mov al, BYTE PTR [r13] + {disp32} mov al, BYTE PTR [r13] + + mov al, BYTE PTR [r13] + {disp8} mov al, BYTE PTR [r13d] + {disp32} mov al, BYTE PTR [r13d] diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h index b8a6dfc25c..09ee615db1 100644 --- a/opcodes/i386-opc.h +++ b/opcodes/i386-opc.h @@ -889,6 +889,18 @@ typedef struct insn_template #define Opcode_SIMD_FloatD 0x1 /* Direction bit for SIMD fp insns. */ #define Opcode_SIMD_IntD 0x10 /* Direction bit for SIMD int insns. */ +/* Pseudo prefixes. */ +#define Prefix_Disp8 0 /* {disp8} */ +#define Prefix_Disp16 1 /* {disp16} */ +#define Prefix_Disp32 2 /* {disp32} */ +#define Prefix_Load 3 /* {load} */ +#define Prefix_Store 4 /* {store} */ +#define Prefix_VEX 5 /* {vex} */ +#define Prefix_VEX3 6 /* {vex3} */ +#define Prefix_EVEX 7 /* {evex} */ +#define Prefix_REX 8 /* {rex} */ +#define Prefix_NoOptimize 9 /* {nooptimize} */ + /* extension_opcode is the 3 bit extension for group <n> insns. This field is also used to store the 8-bit opcode suffix for the AMD 3DNow! instructions. diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index bb7fb02dde..181d0df1ce 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -835,16 +835,17 @@ rex.wrxb, 0, 0x4f, None, 1, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ld // Pseudo prefixes (opcode_length == 0) -{disp8}, 0, 0x0, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{disp32}, 0, 0x1, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{load}, 0, 0x2, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{store}, 0, 0x3, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{vex}, 0, 0x4, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{vex2}, 0, 0x4, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{vex3}, 0, 0x5, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{evex}, 0, 0x6, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{rex}, 0, 0x7, None, 0, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } -{nooptimize}, 0, 0x8, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{disp8}, 0, Prefix_Disp8, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{disp16}, 0, Prefix_Disp16, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{disp32}, 0, Prefix_Disp32, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{load}, 0, Prefix_Load, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{store}, 0, Prefix_Store, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{vex}, 0, Prefix_VEX, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{vex2}, 0, Prefix_VEX, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{vex3}, 0, Prefix_VEX3, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{evex}, 0, Prefix_EVEX, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{rex}, 0, Prefix_REX, None, 0, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } +{nooptimize}, 0, Prefix_NoOptimize, None, 0, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|IsPrefix, { 0 } // 486 extensions. diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h index a3aa69175a..413c730f86 100644 --- a/opcodes/i386-tbl.h +++ b/opcodes/i386-tbl.h @@ -7584,7 +7584,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{disp8}", 0x0, None, 0, 0, + { "{disp8}", 0, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7596,7 +7596,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{disp32}", 0x1, None, 0, 0, + { "{disp16}", 1, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7608,7 +7608,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{load}", 0x2, None, 0, 0, + { "{disp32}", 2, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7620,7 +7620,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{store}", 0x3, None, 0, 0, + { "{load}", 3, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7632,7 +7632,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{vex}", 0x4, None, 0, 0, + { "{store}", 4, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7644,7 +7644,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{vex2}", 0x4, None, 0, 0, + { "{vex}", 5, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7656,7 +7656,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{vex3}", 0x5, None, 0, 0, + { "{vex2}", 5, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7668,7 +7668,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{evex}", 0x6, None, 0, 0, + { "{vex3}", 6, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7680,7 +7680,19 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{rex}", 0x7, None, 0, 0, + { "{evex}", 7, None, 0, 0, + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 } } } }, + { "{rex}", 8, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -7692,7 +7704,7 @@ const insn_template i386_optab[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } } }, - { "{nooptimize}", 0x8, None, 0, 0, + { "{nooptimize}", 9, None, 0, 0, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -- 2.26.2 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-29 23:39 ` V2 " H.J. Lu @ 2020-07-31 7:03 ` Jan Beulich 2020-07-31 11:52 ` H.J. Lu 2020-08-04 12:36 ` H.J. Lu 1 sibling, 1 reply; 15+ messages in thread From: Jan Beulich @ 2020-07-31 7:03 UTC (permalink / raw) To: H.J. Lu; +Cc: Binutils On 30.07.2020 01:39, H.J. Lu wrote: > Here is the updated patch. Just one more thing: Wouldn't it make sense to mark {disp16} CpuNo64, at least as long as it's not usable for controlling branch displacements (which, as said, I think it shouldn't get enabled for)? Jan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-31 7:03 ` Jan Beulich @ 2020-07-31 11:52 ` H.J. Lu 2020-07-31 12:28 ` Jan Beulich 0 siblings, 1 reply; 15+ messages in thread From: H.J. Lu @ 2020-07-31 11:52 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils On Fri, Jul 31, 2020 at 12:03 AM Jan Beulich <jbeulich@suse.com> wrote: > > On 30.07.2020 01:39, H.J. Lu wrote: > > Here is the updated patch. > > Just one more thing: Wouldn't it make sense to mark {disp16} CpuNo64, > at least as long as it's not usable for controlling branch displacements > (which, as said, I think it shouldn't get enabled for)? Since {disp16} can only be used for memory reference in 16-bit mode, CpuNo64 isn't appropriate here. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-31 11:52 ` H.J. Lu @ 2020-07-31 12:28 ` Jan Beulich 2020-07-31 12:34 ` H.J. Lu 0 siblings, 1 reply; 15+ messages in thread From: Jan Beulich @ 2020-07-31 12:28 UTC (permalink / raw) To: H.J. Lu; +Cc: Binutils On 31.07.2020 13:52, H.J. Lu wrote: > On Fri, Jul 31, 2020 at 12:03 AM Jan Beulich <jbeulich@suse.com> wrote: >> >> On 30.07.2020 01:39, H.J. Lu wrote: >>> Here is the updated patch. >> >> Just one more thing: Wouldn't it make sense to mark {disp16} CpuNo64, >> at least as long as it's not usable for controlling branch displacements >> (which, as said, I think it shouldn't get enabled for)? > > Since {disp16} can only be used for memory reference in 16-bit mode, > CpuNo64 isn't appropriate here. Wouldn't the diagnostic be more to the point? (The prefix isn't limited to 16-bit mode, but to 16-bit addressing, which can also be used from 32-bit mode, but not from 64-bit mode.) Jan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-31 12:28 ` Jan Beulich @ 2020-07-31 12:34 ` H.J. Lu 0 siblings, 0 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-31 12:34 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils On Fri, Jul 31, 2020 at 5:28 AM Jan Beulich <jbeulich@suse.com> wrote: > > On 31.07.2020 13:52, H.J. Lu wrote: > > On Fri, Jul 31, 2020 at 12:03 AM Jan Beulich <jbeulich@suse.com> wrote: > >> > >> On 30.07.2020 01:39, H.J. Lu wrote: > >>> Here is the updated patch. > >> > >> Just one more thing: Wouldn't it make sense to mark {disp16} CpuNo64, > >> at least as long as it's not usable for controlling branch displacements > >> (which, as said, I think it shouldn't get enabled for)? > > > > Since {disp16} can only be used for memory reference in 16-bit mode, > > CpuNo64 isn't appropriate here. > > Wouldn't the diagnostic be more to the point? (The prefix isn't limited > to 16-bit mode, but to 16-bit addressing, which can also be used from > 32-bit mode, but not from 64-bit mode.) It is checked with /* 32-bit/64-bit checks. */ if (i.disp_encoding == disp_encoding_16bit) { bad_disp: as_bad (_("invalid `%s' prefix"), addr_mode == CODE_16BIT ? "{disp32}" : "{disp16}"); return 0; } and testcases are added. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: V2 [PATCH] x86: Add {disp16} pseudo prefix 2020-07-29 23:39 ` V2 " H.J. Lu 2020-07-31 7:03 ` Jan Beulich @ 2020-08-04 12:36 ` H.J. Lu 1 sibling, 0 replies; 15+ messages in thread From: H.J. Lu @ 2020-08-04 12:36 UTC (permalink / raw) To: Jan Beulich, Nick Clifton; +Cc: Binutils On Wed, Jul 29, 2020 at 4:39 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Wed, Jul 29, 2020 at 3:53 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > > > On Wed, Jul 29, 2020 at 1:26 PM Jan Beulich <jbeulich@suse.com> wrote: > > > > > > On 28.07.2020 22:30, H.J. Lu wrote: > > > > 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. > > > > > > The inval-pseudo test is a 32-bit one; you shouldn't use .code64 there, > > > or you'll cause FAILs on 32-bit only builds. > > > > I will fix it. > > > > > > Note: {disp16} can be also used on branches in 32-bit mode. > > > > > > But you don't add any tests to this effect, so it's hard to see what > > > exactly this means. To be honest I'm not sure this is helpful: A means > > > to widen the default displacement may be useful, but one to narrow not > > > just the displacement, but also the resulting new IP? > > > > {disp16} can be used to generate "branch rel16". But implementation > > may be non-trivial. > > > > > I was also wanting to ask that you group the new pseudo prefix with > > > its sibling ones in the opcode table, but I realize the use of > > > hard coded numbers makes this cumbersome. Time to do away with that? > > > > I will take a look. > > > > > I also have a tangential question: Shouldn't e.g. > > > > > > {disp8} vmovaps %xmm0,128(%eax) > > > > > > be taken as a request to use EVEX encoding, to satisfy the pseudo > > > prefix? Unless {vex} was also specified, at which point things > > > become "interesting" (but the way they're documented I think > > > {vex} has to have more wight here). > > > > > > > {disp8} is a hint for VEX. It shouldn't change to EVEX. > > > > Here is the updated patch. > > -- > H.J. I am backporting it to 2.35 branch. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Add {disp16} pseudo prefix 2020-07-29 22:53 ` H.J. Lu 2020-07-29 23:39 ` V2 " H.J. Lu @ 2020-07-31 6:22 ` Jan Beulich 2020-07-31 11:44 ` H.J. Lu 1 sibling, 1 reply; 15+ messages in thread From: Jan Beulich @ 2020-07-31 6:22 UTC (permalink / raw) To: H.J. Lu; +Cc: Binutils On 30.07.2020 00:53, H.J. Lu wrote: > On Wed, Jul 29, 2020 at 1:26 PM Jan Beulich <jbeulich@suse.com> wrote: >> On 28.07.2020 22:30, H.J. Lu wrote: >>> Note: {disp16} can be also used on branches in 32-bit mode. >> >> But you don't add any tests to this effect, so it's hard to see what >> exactly this means. To be honest I'm not sure this is helpful: A means >> to widen the default displacement may be useful, but one to narrow not >> just the displacement, but also the resulting new IP? > > {disp16} can be used to generate "branch rel16". But implementation > may be non-trivial. Oh, so you mean it could be used in principle, not that it now can be used right with the introduction of the new pseudo prefix? If so, I simply misunderstood your use of "can", sorry. Jan ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] x86: Add {disp16} pseudo prefix 2020-07-31 6:22 ` Jan Beulich @ 2020-07-31 11:44 ` H.J. Lu 0 siblings, 0 replies; 15+ messages in thread From: H.J. Lu @ 2020-07-31 11:44 UTC (permalink / raw) To: Jan Beulich; +Cc: Binutils On Thu, Jul 30, 2020 at 11:22 PM Jan Beulich <jbeulich@suse.com> wrote: > > On 30.07.2020 00:53, H.J. Lu wrote: > > On Wed, Jul 29, 2020 at 1:26 PM Jan Beulich <jbeulich@suse.com> wrote: > >> On 28.07.2020 22:30, H.J. Lu wrote: > >>> Note: {disp16} can be also used on branches in 32-bit mode. > >> > >> But you don't add any tests to this effect, so it's hard to see what > >> exactly this means. To be honest I'm not sure this is helpful: A means > >> to widen the default displacement may be useful, but one to narrow not > >> just the displacement, but also the resulting new IP? > > > > {disp16} can be used to generate "branch rel16". But implementation > > may be non-trivial. > > Oh, so you mean it could be used in principle, not that it now > can be used right with the introduction of the new pseudo > prefix? If so, I simply misunderstood your use of "can", sorry. > Yes. -- H.J. ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2020-08-04 12:37 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-07-27 23:23 [PATCH] x86: Handle {disp32} for (%bp)/(%ebp)/(%rbp) H.J. Lu 2020-07-28 10:39 ` H.J. Lu 2020-07-28 18:43 ` Jan Beulich 2020-07-28 19:02 ` H.J. Lu 2020-07-28 20:30 ` [PATCH] x86: Add {disp16} pseudo prefix H.J. Lu 2020-07-29 20:26 ` Jan Beulich 2020-07-29 22:53 ` H.J. Lu 2020-07-29 23:39 ` V2 " H.J. Lu 2020-07-31 7:03 ` Jan Beulich 2020-07-31 11:52 ` H.J. Lu 2020-07-31 12:28 ` Jan Beulich 2020-07-31 12:34 ` H.J. Lu 2020-08-04 12:36 ` H.J. Lu 2020-07-31 6:22 ` Jan Beulich 2020-07-31 11:44 ` H.J. Lu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).