x86: adjust segment override prefix emission

Since we already suppress the prefix altogether when it's the default
one for the chosen addressing mode, let's do so also when instruction
prefix and override specified with the memory operand match. (Note that
insn prefix specified segment overrides never get discarded.)
This commit is contained in:
Jan Beulich
2020-02-14 14:04:23 +01:00
parent 92334ad2c6
commit b677388436
4 changed files with 29 additions and 6 deletions

View File

@ -1,3 +1,11 @@
2020-02-14 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (process_operands): Also skip segment
override prefix emission if it matches an already present one.
* testsuite/gas/i386/prefix32.s: Add double segment override
cases.
* testsuite/gas/i386/prefix32.l: Adjust expectations.
2020-02-14 Jan Beulich <jbeulich@suse.com> 2020-02-14 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (process_operands): Drop ineffectual segment * config/tc-i386.c (process_operands): Drop ineffectual segment

View File

@ -7178,11 +7178,13 @@ duplicate:
} }
/* If a segment was explicitly specified, and the specified segment /* If a segment was explicitly specified, and the specified segment
is not the default, use an opcode prefix to select it. If we is neither the default nor the one already recorded from a prefix,
never figured out what the default segment is, then default_seg use an opcode prefix to select it. If we never figured out what
will be zero at this point, and the specified segment prefix will the default segment is, then default_seg will be zero at this
always be used. */ point, and the specified segment prefix will always be used. */
if ((i.seg[0]) && (i.seg[0] != default_seg)) if (i.seg[0]
&& i.seg[0] != default_seg
&& i.seg[0]->seg_prefix != i.prefix[SEG_PREFIX])
{ {
if (!add_prefix (i.seg[0]->seg_prefix)) if (!add_prefix (i.seg[0]->seg_prefix))
return 0; return 0;

View File

@ -8,6 +8,7 @@
.*:19: Error: same type of prefix .* .*:19: Error: same type of prefix .*
.*:20: Error: data size .* `vaddps' .*:20: Error: data size .* `vaddps'
.*:21: Error: data size .* `vaddpd' .*:21: Error: data size .* `vaddpd'
.*:25: Error: same type of prefix .*
GAS LISTING .* GAS LISTING .*
#... #...
[ ]*1[ ]+\.text [ ]*1[ ]+\.text
@ -33,4 +34,10 @@ GAS LISTING .*
[ ]*20[ ]+data16 vaddps %xmm0, %xmm0, %xmm0 [ ]*20[ ]+data16 vaddps %xmm0, %xmm0, %xmm0
[ ]*21[ ]+data16 vaddpd %xmm0, %xmm0, %xmm0 [ ]*21[ ]+data16 vaddpd %xmm0, %xmm0, %xmm0
[ ]*22[ ]* [ ]*22[ ]*
[ ]*23[ ]*[\?]+ 0+[ \t]+\.p2align 4,0 [ ]*23[ ]+\.Lsegment:
[ ]*24[ ]+\?\?\?\? 368B4500[ ]+ss mov %ss:\(%ebp\), %eax
[ ]*25[ ]+ss mov %ds:\(%ebp\), %eax
[ ]*26[ ]+\?\?\?\? 3E8B4500[ ]+ds mov %ss:\(%ebp\), %eax
[ ]*27[ ]+\?\?\?\? 3E8B4500[ ]+ds mov %ds:\(%ebp\), %eax
[ ]*28[ ]*
#pass

View File

@ -20,4 +20,10 @@ prefix:
data16 vaddps %xmm0, %xmm0, %xmm0 data16 vaddps %xmm0, %xmm0, %xmm0
data16 vaddpd %xmm0, %xmm0, %xmm0 data16 vaddpd %xmm0, %xmm0, %xmm0
.Lsegment:
ss mov %ss:(%ebp), %eax
ss mov %ds:(%ebp), %eax
ds mov %ss:(%ebp), %eax
ds mov %ds:(%ebp), %eax
.p2align 4,0 .p2align 4,0