aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-i386.c12
-rw-r--r--gas/testsuite/gas/i386/prefix32.l9
-rw-r--r--gas/testsuite/gas/i386/prefix32.s6
4 files changed, 29 insertions, 6 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 0cbd2a5..56d5071 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,13 @@
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>
+
* config/tc-i386.c (process_operands): Drop ineffectual segment
overrides when optimizing.
* testsuite/gas/i386/lea-optimize.d: New.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index d7d45de..0e60919 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -7178,11 +7178,13 @@ duplicate:
}
/* If a segment was explicitly specified, and the specified segment
- is not the default, use an opcode prefix to select it. If we
- never figured out what the default segment is, then default_seg
- will be zero at this point, and the specified segment prefix will
- always be used. */
- if ((i.seg[0]) && (i.seg[0] != default_seg))
+ is neither the default nor the one already recorded from a prefix,
+ use an opcode prefix to select it. If we never figured out what
+ the default segment is, then default_seg will be zero at this
+ point, and the specified segment prefix will always be used. */
+ 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))
return 0;
diff --git a/gas/testsuite/gas/i386/prefix32.l b/gas/testsuite/gas/i386/prefix32.l
index 41c8d88..09a00cd 100644
--- a/gas/testsuite/gas/i386/prefix32.l
+++ b/gas/testsuite/gas/i386/prefix32.l
@@ -8,6 +8,7 @@
.*:19: Error: same type of prefix .*
.*:20: Error: data size .* `vaddps'
.*:21: Error: data size .* `vaddpd'
+.*:25: Error: same type of prefix .*
GAS LISTING .*
#...
[ ]*1[ ]+\.text
@@ -33,4 +34,10 @@ GAS LISTING .*
[ ]*20[ ]+data16 vaddps %xmm0, %xmm0, %xmm0
[ ]*21[ ]+data16 vaddpd %xmm0, %xmm0, %xmm0
[ ]*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
diff --git a/gas/testsuite/gas/i386/prefix32.s b/gas/testsuite/gas/i386/prefix32.s
index 1ffdff1..a4382a2 100644
--- a/gas/testsuite/gas/i386/prefix32.s
+++ b/gas/testsuite/gas/i386/prefix32.s
@@ -20,4 +20,10 @@ prefix:
data16 vaddps %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