114 lines
3.5 KiB
Diff
114 lines
3.5 KiB
Diff
|
|
From 8f2200fe8e7f17295ed6d9bbc908da533c95e089 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Jan Beulich <jbeulich@suse.com>
|
||
|
|
Date: Wed, 11 Aug 2021 08:31:41 +0200
|
||
|
|
Subject: [PATCH] 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.
|
||
|
|
|
||
|
|
diff --git a/gas/read.c b/gas/read.c
|
||
|
|
index 6bba696cebc..b8e845dd569 100644
|
||
|
|
--- a/gas/read.c
|
||
|
|
+++ b/gas/read.c
|
||
|
|
@@ -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 9e1254615ec..eefe84db310 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 0314929cf9c..0756aa1e36a 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 dd7e028b44b..b93595ac8c3 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 601709c2196..7fe642e5180 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
|
||
|
|
--
|
||
|
|
2.33.0
|
||
|
|
|