x86: Don't pad .tfloat directive output
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 15 Aug 2021 20:17:41 +0000 (13:17 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 16 Aug 2021 21:40:30 +0000 (14:40 -0700)
.tfloat output should always be 10 bytes without padding, independent
of psABIs.  In glibc, x86 assembly codes expect 10-byte .tfloat output.
This also reduces .ds.x output and .tfloat output with hex input from
12 bytes to 10 bytes to match .tfloat output.

PR gas/28230
* NEWS: Mention changes of .ds.x output and .tfloat output with
hex input.
* config/tc-i386.c (x86_tfloat_pad): Removed.
* config/tc-i386.h (X_PRECISION_PAD): Changed to 0.
(x86_tfloat_pad): Removed.
* testsuite/gas/i386/fp.s: If NO_TFLOAT_PADDING isn't defined,
add explicit paddings after .tfloat, .ds.x, .dc.x and .dcb.x
directives.
* testsuite/gas/i386/i386.exp (ASFLAGS): Append
"--defsym NO_TFLOAT_PADDING=1" when running the fp test.

gas/NEWS
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/testsuite/gas/i386/fp.s
gas/testsuite/gas/i386/i386.exp

index 9e24e4ddc174ce00f038ac125f15eb77535979d0..8046ed541a859d68e93738ef7509ba6dda9c31de 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,9 @@
 -*- text -*-
 
+* Outputs of .ds.x directive and .tfloat directive with hex input from
+  x86 assembler have been reduced from 12 bytes to 10 bytes to match the
+  output of .tfloat directive.
+
 * Add support for Intel AVX512_FP16 instructions.
 
 Changes in 2.37:
index dc29fa2ba52d9fc367186057936df35ff51697d0..7148c07324709bf05b4a55558df0b92ee59f5e38 100644 (file)
@@ -10231,19 +10231,6 @@ x86_cons_fix_new (fragS *frag, unsigned int off, unsigned int len,
   fix_new_exp (frag, off, len, exp, 0, r);
 }
 
-/* Return the number of padding LITTLENUMs following a tbyte floating
-   point value.  */
-
-int
-x86_tfloat_pad (void)
-{
-#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
-   if (IS_ELF)
-     return object_64bit ? 3 : 1;
-#endif
-   return 0;
-}
-
 /* Export the ABI address size for use by TC_ADDRESS_BYTES for the
    purpose of the `.dc.a' internal pseudo-op.  */
 
index 2dc6312f28eb86ca6ef5d25e03a701184a1da22c..f50169cbcc07709f280c80ef635eac1ad2072e34 100644 (file)
@@ -135,8 +135,7 @@ extern void x86_cons_fix_new
 (fragS *, unsigned int, unsigned int, expressionS *, bfd_reloc_code_real_type);
 
 #define X_PRECISION     5
-#define X_PRECISION_PAD x86_tfloat_pad ()
-extern int x86_tfloat_pad (void);
+#define X_PRECISION_PAD 0
 
 #define TC_ADDRESS_BYTES x86_address_bytes
 extern int x86_address_bytes (void);
index a63464b6cd2321e7a14edebbe590647db0b20a23..90854b740add4fcd588dce7795617c077113c81a 100644 (file)
@@ -1,6 +1,13 @@
        .data
 # .tfloat is 80-bit floating point format.
        .tfloat 3.32192809488736218171e0
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
 #      .byte 0x0, 0x88, 0x1b, 0xcd, 0x4b, 0x78, 0x9a, 0xd4, 0x0, 0x40
 # .double is 64-bit floating point format.
        .double 3.32192809488736218171e0
        .p2align 4,0
 
        .ds.x 1, -1
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte -1, -1, -1, -1, -1, -1
+  .else
+       .byte -1, -1
+  .endif
+.endif
        .p2align 4,0xcc
 
        .tfloat 0x:3ffe80
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .dc.x 0x:bffd80
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .dcb.x 1, 0x:03ff80
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0xaa
 
        .hfloat 1, -2, 0x:3c00
        .single Inf
        .double Inf
        .tfloat Inf
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x44
 
        .hfloat +Inf
        .single +Inf
        .double +Inf
        .tfloat +Inf
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x33
 
        .hfloat -Inf
        .single -Inf
        .double -Inf
        .tfloat -Inf
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x22
 
        .hfloat NaN
        .single NaN
        .double NaN
        .tfloat NaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x44
 
        .hfloat +NaN
        .single +NaN
        .double +NaN
        .tfloat +NaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x33
 
        .hfloat -NaN
        .single -NaN
        .double -NaN
        .tfloat -NaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x22
 
        .hfloat QNaN
        .single QNaN
        .double QNaN
        .tfloat QNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x44
 
        .hfloat +QNaN
        .single +QNaN
        .double +QNaN
        .tfloat +QNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x33
 
        .hfloat -QNaN
        .single -QNaN
        .double -QNaN
        .tfloat -QNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x22
 
        .hfloat SNaN
        .single SNaN
        .double SNaN
        .tfloat SNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x44
 
        .hfloat +SNaN
        .single +SNaN
        .double +SNaN
        .tfloat +SNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x33
 
        .hfloat -SNaN
        .single -SNaN
        .double -SNaN
        .tfloat -SNaN
+.ifndef NO_TFLOAT_PADDING
+  .ifdef x86_64
+       .byte 0, 0, 0, 0, 0, 0
+  .else
+       .byte 0, 0
+  .endif
+.endif
        .p2align 4,0x22
index 122da6a2315b1c4bf55ee49f4247047a6886fff1..189121f1428c6dbd529e7c7996fd4056b3e133d1 100644 (file)
@@ -698,7 +698,10 @@ if [gas_32_check] then {
            run_list_test "iamcu-inval-1" "-march=iamcu -al"
        }
     } else {
+       set saved_ASFLAGS "$ASFLAGS"
+       append ASFLAGS " --defsym NO_TFLOAT_PADDING=1"
        run_dump_test "fp"
+       set $ASFLAGS "$saved_ASFLAGS"
     }
 
     # This is a PE specific test.