diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-08-11 08:31:41 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-08-11 08:31:41 +0200 |
commit | 8f2200fe8e7f17295ed6d9bbc908da533c95e089 (patch) | |
tree | fc606ca2fff1395fc1965304f92a2440d21e986d /gas | |
parent | e74e2b4c336fad993b0dd31b859af919ad52ec9e (diff) | |
download | binutils-8f2200fe8e7f17295ed6d9bbc908da533c95e089.zip binutils-8f2200fe8e7f17295ed6d9bbc908da533c95e089.tar.gz binutils-8f2200fe8e7f17295ed6d9bbc908da533c95e089.tar.bz2 |
x86/ELF: fix .tfloat output with hex input
The ELF psABI-s are quite clear here: On 32-bit the data type is 12
bytes long (with 2 bytes of trailing padding), while on 64-bit it is 16
bytes long (with 6 bytes of padding). Make hex_float() capable of
handling such padding.
Note that this brings the emitted data size of .dc.x / .dcb.x in line
also for non-ELF targets; so far they were different depending on input
format (dec vs hex).
Extend the existing x86 testcases.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/read.c | 20 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/fp-elf32.d | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/fp-elf64.d | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/fp.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/fp.s | 5 |
5 files changed, 29 insertions, 4 deletions
@@ -4847,7 +4847,7 @@ parse_repeat_cons (expressionS *exp, unsigned int nbytes) static int hex_float (int float_type, char *bytes) { - int length; + int length, pad = 0; int i; switch (float_type) @@ -4868,12 +4868,22 @@ hex_float (int float_type, char *bytes) case 'x': case 'X': - length = 12; +#ifdef X_PRECISION + length = X_PRECISION * sizeof (LITTLENUM_TYPE); + pad = X_PRECISION_PAD * sizeof (LITTLENUM_TYPE); + if (!length) +#endif + length = 12; break; case 'p': case 'P': - length = 12; +#ifdef P_PRECISION + length = P_PRECISION * sizeof (LITTLENUM_TYPE); + pad = P_PRECISION_PAD * sizeof (LITTLENUM_TYPE); + if (!length) +#endif + length = 12; break; default: @@ -4926,7 +4936,9 @@ hex_float (int float_type, char *bytes) memset (bytes, 0, length - i); } - return length; + memset (bytes + length, 0, pad); + + return length + pad; } /* float_cons() diff --git a/gas/testsuite/gas/i386/fp-elf32.d b/gas/testsuite/gas/i386/fp-elf32.d index 9e12546..eefe84d 100644 --- a/gas/testsuite/gas/i386/fp-elf32.d +++ b/gas/testsuite/gas/i386/fp-elf32.d @@ -11,3 +11,6 @@ Contents of section .data: 0030 00000000 0000a044 01000000 0000a044 .* 0040 00000000 0000f03f 00000000 00000000 .* 0050 ffffffff ffffffff ffffffff cccccccc .* + 0060 00000000 00000080 fe3f0000 00000000 .* + 0070 00000080 fdbf0000 00000000 00000080 .* + 0080 ff030000 aaaaaaaa aaaaaaaa aaaaaaaa .* diff --git a/gas/testsuite/gas/i386/fp-elf64.d b/gas/testsuite/gas/i386/fp-elf64.d index 0314929..0756aa1 100644 --- a/gas/testsuite/gas/i386/fp-elf64.d +++ b/gas/testsuite/gas/i386/fp-elf64.d @@ -11,3 +11,6 @@ Contents of section .data: 0030 00000000 0000a044 01000000 0000a044 .* 0040 00000000 0000f03f 00000000 00000000 .* 0050 ffffffff ffffffff ffffffff ffffffff .* + 0060 00000000 00000080 fe3f0000 00000000 .* + 0070 00000000 00000080 fdbf0000 00000000 .* + 0080 00000000 00000080 ff030000 00000000 .* diff --git a/gas/testsuite/gas/i386/fp.d b/gas/testsuite/gas/i386/fp.d index dd7e028..b93595a 100644 --- a/gas/testsuite/gas/i386/fp.d +++ b/gas/testsuite/gas/i386/fp.d @@ -10,3 +10,5 @@ Contents of section .data: 0030 00000000 0000a044 01000000 0000a044 .* 0040 00000000 0000f03f 00000000 00000000 .* 0050 ffffffff ffffffff ffffcccc cccccccc .* + 0060 00000000 00000080 fe3f0000 00000000 .* + 0070 0080fdbf 00000000 00000080 ff03aaaa .* diff --git a/gas/testsuite/gas/i386/fp.s b/gas/testsuite/gas/i386/fp.s index 601709c..7fe642e 100644 --- a/gas/testsuite/gas/i386/fp.s +++ b/gas/testsuite/gas/i386/fp.s @@ -24,3 +24,8 @@ .ds.x 1, -1 .p2align 4,0xcc + + .tfloat 0x:3ffe80 + .dc.x 0x:bffd80 + .dcb.x 1, 0x:03ff80 + .p2align 4,0xaa |