aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-i386.c47
2 files changed, 34 insertions, 19 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 669fb6b..aeacaa6 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,11 @@
2021-04-23 Jan Beulich <jbeulich@suse.com>
+ * config/tc-i386.c (i386_finalize_displacement): Move Disp32S
+ check ...
+ (md_assemble): ... here.
+
+2021-04-23 Jan Beulich <jbeulich@suse.com>
+
* config/tc-i386.c (optimize_disp): Move down BFD64 section.
Move up setting of disp32.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 5180320..8098f50 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4740,6 +4740,34 @@ md_assemble (char *line)
if (i.imm_operands)
optimize_imm ();
+ if (i.disp_operands && flag_code == CODE_64BIT && !i.prefix[ADDR_PREFIX])
+ {
+ for (j = 0; j < i.operands; ++j)
+ {
+ const expressionS *exp = i.op[j].disps;
+
+ if (!operand_type_check (i.types[j], disp))
+ continue;
+
+ if (exp->X_op != O_constant)
+ continue;
+
+ /* Since displacement is signed extended to 64bit, don't allow
+ disp32 and turn off disp32s if they are out of range. */
+ i.types[j].bitfield.disp32 = 0;
+ if (fits_in_signed_long (exp->X_add_number))
+ continue;
+
+ i.types[j].bitfield.disp32s = 0;
+ if (i.types[j].bitfield.baseindex)
+ {
+ as_bad (_("0x%" BFD_VMA_FMT "x out of range of signed 32bit displacement"),
+ exp->X_add_number);
+ return;
+ }
+ }
+ }
+
/* Don't optimize displacement for movabs since it only takes 64bit
displacement. */
if (i.disp_operands
@@ -10912,25 +10940,6 @@ i386_finalize_displacement (segT exp_seg ATTRIBUTE_UNUSED, expressionS *exp,
ret = 0;
}
- else if (flag_code == CODE_64BIT
- && !i.prefix[ADDR_PREFIX]
- && exp->X_op == O_constant)
- {
- /* Since displacement is signed extended to 64bit, don't allow
- disp32 and turn off disp32s if they are out of range. */
- i.types[this_operand].bitfield.disp32 = 0;
- if (!fits_in_signed_long (exp->X_add_number))
- {
- i.types[this_operand].bitfield.disp32s = 0;
- if (i.types[this_operand].bitfield.baseindex)
- {
- as_bad (_("0x%" BFD_VMA_FMT "x out of range of signed 32bit displacement"),
- exp->X_add_number);
- ret = 0;
- }
- }
- }
-
#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
else if (exp->X_op != O_constant
&& OUTPUT_FLAVOR == bfd_target_aout_flavour