x86: minor improvements to optimize_disp() (part I)
authorJan Beulich <jbeulich@suse.com>
Tue, 8 Jun 2021 12:54:48 +0000 (14:54 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 8 Jun 2021 12:54:48 +0000 (14:54 +0200)
- Do the zero checking first - there's no point in doing anything else
  in this case.
- Drop two pointless & where just before it was checked that the
  respective bits are clear already anyway.

gas/ChangeLog
gas/config/tc-i386.c

index e4cf2afc21c3656ed048269e215305e6eff4ce75..5926ffffc3c82909be614f172253753858b3bedd 100644 (file)
@@ -1,3 +1,8 @@
+2021-06-08  Jan Beulich  <jbeulich@suse.com>
+
+       * config/tc-i386.c (optimize_disp): Drop redundant masking.
+       Re-order.
+
 2021-06-07  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (i386_att_operand): Re-write handling of
index a87496857f69da0df866c459c1211ae1eca6b857..9dbe6dcd954f90d0948092b5da43c50b7074327a 100644 (file)
@@ -5880,15 +5880,6 @@ optimize_disp (void)
          {
            offsetT op_disp = i.op[op].disps->X_add_number;
 
-           if (i.types[op].bitfield.disp16
-               && (op_disp & ~(offsetT) 0xffff) == 0)
-             {
-               /* If this operand is at most 16 bits, convert
-                  to a signed 16 bit number and don't use 64bit
-                  displacement.  */
-               op_disp = (((op_disp & 0xffff) ^ 0x8000) - 0x8000);
-               i.types[op].bitfield.disp64 = 0;
-             }
            if (!op_disp && i.types[op].bitfield.baseindex)
              {
                i.types[op].bitfield.disp8 = 0;
@@ -5898,9 +5889,21 @@ optimize_disp (void)
                i.types[op].bitfield.disp64 = 0;
                i.op[op].disps = 0;
                i.disp_operands--;
+               continue;
              }
+
+           if (i.types[op].bitfield.disp16
+               && (op_disp & ~(offsetT) 0xffff) == 0)
+             {
+               /* If this operand is at most 16 bits, convert
+                  to a signed 16 bit number and don't use 64bit
+                  displacement.  */
+               op_disp = ((op_disp ^ 0x8000) - 0x8000);
+               i.types[op].bitfield.disp64 = 0;
+             }
+
 #ifdef BFD64
-           else if (flag_code == CODE_64BIT)
+           if (flag_code == CODE_64BIT)
              {
                if (want_disp32 (current_templates->start)
                    && fits_in_unsigned_long (op_disp))
@@ -5913,7 +5916,6 @@ optimize_disp (void)
                    /* If this operand is at most 32 bits, convert
                       to a signed 32 bit number and don't use 64bit
                       displacement.  */
-                   op_disp &= (((offsetT) 2 << 31) - 1);
                    op_disp = (op_disp ^ ((offsetT) 1 << 31)) - ((addressT) 1 << 31);
                    i.types[op].bitfield.disp64 = 0;
                  }