+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.
 
   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
       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