[05/11] x86: introduce .hfloat directive

Message ID 65540c84-8430-f0ef-22f0-ec6c06b0a76f@suse.com
State New
Headers show
Series
  • gas: adjustments to floating point data directives handling
Related show

Commit Message

Paul Hua via Binutils July 23, 2021, 6:54 a.m.
This is to be able to generate data passed to {,V}CVTPH2PS and acted
upon by AVX512-FP16 insns. To be able to also use the hex forms
supported for other floating point formats, a small addition to the
generic hex_float() is needed.

Extend existing x86 testcases.
---
I wonder whether introduction (in generic code) of .{dc,dcb,ds}.h
directives wouldn't be warranted. The format not being supported by all
architectures if no different from, in particular, the .x or .p forms.

Comments

Paul Hua via Binutils July 23, 2021, 1:20 p.m. | #1
On Thu, Jul 22, 2021 at 11:54 PM Jan Beulich <jbeulich@suse.com> wrote:
>

> This is to be able to generate data passed to {,V}CVTPH2PS and acted

> upon by AVX512-FP16 insns. To be able to also use the hex forms

> supported for other floating point formats, a small addition to the

> generic hex_float() is needed.

>

> Extend existing x86 testcases.


OK if all prerequisites have been approved.  Thanks.

> ---

> I wonder whether introduction (in generic code) of .{dc,dcb,ds}.h

> directives wouldn't be warranted. The format not being supported by all

> architectures if no different from, in particular, the .x or .p forms.


If they aren't used for all architectures, keep them to x86.

> --- a/gas/config/tc-i386.c

> +++ b/gas/config/tc-i386.c

> @@ -511,7 +511,7 @@ const char EXP_CHARS[] = "eE";

>  /* Chars that mean this number is a floating point constant

>     As in 0f12.456

>     or    0d1.2345e12.  */

> -const char FLT_CHARS[] = "fFdDxX";

> +const char FLT_CHARS[] = "fFdDxXhH";

>

>  /* Tables for lexical analysis.  */

>  static char mnemonic_chars[256];

> @@ -1352,6 +1352,7 @@ const pseudo_typeS md_pseudo_table[] =

>    {"ffloat", float_cons, 'f'},

>    {"dfloat", float_cons, 'd'},

>    {"tfloat", float_cons, 'x'},

> +  {"hfloat", float_cons, 'h'},

>    {"value", cons, 2},

>    {"slong", signed_cons, 4},

>    {"noopt", s_ignore, 0},

> --- a/gas/doc/c-i386.texi

> +++ b/gas/doc/c-i386.texi

> @@ -1311,18 +1311,21 @@ data type.  Constructors build these dat

>  @cindex @code{single} directive, i386

>  @cindex @code{double} directive, i386

>  @cindex @code{tfloat} directive, i386

> +@cindex @code{hfloat} directive, i386

>  @cindex @code{float} directive, x86-64

>  @cindex @code{single} directive, x86-64

>  @cindex @code{double} directive, x86-64

>  @cindex @code{tfloat} directive, x86-64

> +@cindex @code{hfloat} directive, x86-64

>  @itemize @bullet

>  @item

>  Floating point constructors are @samp{.float} or @samp{.single},

> -@samp{.double}, and @samp{.tfloat} for 32-, 64-, and 80-bit formats.

> -These correspond to instruction mnemonic suffixes @samp{s}, @samp{l},

> -and @samp{t}. @samp{t} stands for 80-bit (ten byte) real.  The 80387

> -only supports this format via the @samp{fldt} (load 80-bit real to stack

> -top) and @samp{fstpt} (store 80-bit real and pop stack) instructions.

> +@samp{.double}, @samp{.tfloat}, and @samp{.hfloat} for 32-, 64-, 80-, and

> +16-bit formats respectively. The former three correspond to instruction

> +mnemonic suffixes @samp{s}, @samp{l}, and @samp{t}. @samp{t} stands for

> +80-bit (ten byte) real.  The 80387 only supports this format via the

> +@samp{fldt} (load 80-bit real to stack top) and @samp{fstpt} (store 80-bit

> +real and pop stack) instructions.

>

>  @cindex @code{word} directive, i386

>  @cindex @code{long} directive, i386

> --- a/gas/read.c

> +++ b/gas/read.c

> @@ -4852,6 +4852,11 @@ hex_float (int float_type, char *bytes)

>

>    switch (float_type)

>      {

> +    case 'h':

> +    case 'H':

> +      length = 2;

> +      break;

> +

>      case 'f':

>      case 'F':

>      case 's':

> --- a/gas/testsuite/gas/i386/fp-elf32.d

> +++ b/gas/testsuite/gas/i386/fp-elf32.d

> @@ -14,3 +14,4 @@ Contents of section .data:

>   0060 00000000 00000080 fe3f0000 00000000  .*

>   0070 00000080 fdbf0000 00000000 00000080  .*

>   0080 ff030000 aaaaaaaa aaaaaaaa aaaaaaaa  .*

> + 0090 003c00c0 003c5555 55555555 55555555  .*

> --- a/gas/testsuite/gas/i386/fp-elf64.d

> +++ b/gas/testsuite/gas/i386/fp-elf64.d

> @@ -14,3 +14,4 @@ Contents of section .data:

>   0060 00000000 00000080 fe3f0000 00000000  .*

>   0070 00000000 00000080 fdbf0000 00000000  .*

>   0080 00000000 00000080 ff030000 00000000  .*

> + 0090 003c00c0 003c5555 55555555 55555555  .*

> --- a/gas/testsuite/gas/i386/fp.d

> +++ b/gas/testsuite/gas/i386/fp.d

> @@ -12,3 +12,4 @@ Contents of section .data:

>   0050 ffffffff ffffffff ffffcccc cccccccc  .*

>   0060 00000000 00000080 fe3f0000 00000000  .*

>   0070 0080fdbf 00000000 00000080 ff03aaaa  .*

> + 0080 003c00c0 003c5555 55555555 55555555  .*

> --- a/gas/testsuite/gas/i386/fp.s

> +++ b/gas/testsuite/gas/i386/fp.s

> @@ -29,3 +29,6 @@

>         .dc.x 0x:bffd80

>         .dcb.x 1, 0x:03ff80

>         .p2align 4,0xaa

> +

> +       .hfloat 1, -2, 0x:3c00

> +       .p2align 4,0x55

>



-- 
H.J.
Paul Hua via Binutils July 23, 2021, 2:52 p.m. | #2
On 23.07.2021 15:20, H.J. Lu wrote:
> On Thu, Jul 22, 2021 at 11:54 PM Jan Beulich <jbeulich@suse.com> wrote:

>> I wonder whether introduction (in generic code) of .{dc,dcb,ds}.h

>> directives wouldn't be warranted. The format not being supported by all

>> architectures is no different from, in particular, the .x or .p forms.

> 

> If they aren't used for all architectures, keep them to x86.


Keep? I'm asking about introducing new directives. And I'm pointing
out that making them available uniformly everywhere (despite the
underlying format not supported everywhere) isn't without precedent.

Jan

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -511,7 +511,7 @@  const char EXP_CHARS[] = "eE";
 /* Chars that mean this number is a floating point constant
    As in 0f12.456
    or    0d1.2345e12.  */
-const char FLT_CHARS[] = "fFdDxX";
+const char FLT_CHARS[] = "fFdDxXhH";
 
 /* Tables for lexical analysis.  */
 static char mnemonic_chars[256];
@@ -1352,6 +1352,7 @@  const pseudo_typeS md_pseudo_table[] =
   {"ffloat", float_cons, 'f'},
   {"dfloat", float_cons, 'd'},
   {"tfloat", float_cons, 'x'},
+  {"hfloat", float_cons, 'h'},
   {"value", cons, 2},
   {"slong", signed_cons, 4},
   {"noopt", s_ignore, 0},
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -1311,18 +1311,21 @@  data type.  Constructors build these dat
 @cindex @code{single} directive, i386
 @cindex @code{double} directive, i386
 @cindex @code{tfloat} directive, i386
+@cindex @code{hfloat} directive, i386
 @cindex @code{float} directive, x86-64
 @cindex @code{single} directive, x86-64
 @cindex @code{double} directive, x86-64
 @cindex @code{tfloat} directive, x86-64
+@cindex @code{hfloat} directive, x86-64
 @itemize @bullet
 @item
 Floating point constructors are @samp{.float} or @samp{.single},
-@samp{.double}, and @samp{.tfloat} for 32-, 64-, and 80-bit formats.
-These correspond to instruction mnemonic suffixes @samp{s}, @samp{l},
-and @samp{t}. @samp{t} stands for 80-bit (ten byte) real.  The 80387
-only supports this format via the @samp{fldt} (load 80-bit real to stack
-top) and @samp{fstpt} (store 80-bit real and pop stack) instructions.
+@samp{.double}, @samp{.tfloat}, and @samp{.hfloat} for 32-, 64-, 80-, and
+16-bit formats respectively. The former three correspond to instruction
+mnemonic suffixes @samp{s}, @samp{l}, and @samp{t}. @samp{t} stands for
+80-bit (ten byte) real.  The 80387 only supports this format via the
+@samp{fldt} (load 80-bit real to stack top) and @samp{fstpt} (store 80-bit
+real and pop stack) instructions.
 
 @cindex @code{word} directive, i386
 @cindex @code{long} directive, i386
--- a/gas/read.c
+++ b/gas/read.c
@@ -4852,6 +4852,11 @@  hex_float (int float_type, char *bytes)
 
   switch (float_type)
     {
+    case 'h':
+    case 'H':
+      length = 2;
+      break;
+
     case 'f':
     case 'F':
     case 's':
--- a/gas/testsuite/gas/i386/fp-elf32.d
+++ b/gas/testsuite/gas/i386/fp-elf32.d
@@ -14,3 +14,4 @@  Contents of section .data:
  0060 00000000 00000080 fe3f0000 00000000  .*
  0070 00000080 fdbf0000 00000000 00000080  .*
  0080 ff030000 aaaaaaaa aaaaaaaa aaaaaaaa  .*
+ 0090 003c00c0 003c5555 55555555 55555555  .*
--- a/gas/testsuite/gas/i386/fp-elf64.d
+++ b/gas/testsuite/gas/i386/fp-elf64.d
@@ -14,3 +14,4 @@  Contents of section .data:
  0060 00000000 00000080 fe3f0000 00000000  .*
  0070 00000000 00000080 fdbf0000 00000000  .*
  0080 00000000 00000080 ff030000 00000000  .*
+ 0090 003c00c0 003c5555 55555555 55555555  .*
--- a/gas/testsuite/gas/i386/fp.d
+++ b/gas/testsuite/gas/i386/fp.d
@@ -12,3 +12,4 @@  Contents of section .data:
  0050 ffffffff ffffffff ffffcccc cccccccc  .*
  0060 00000000 00000080 fe3f0000 00000000  .*
  0070 0080fdbf 00000000 00000080 ff03aaaa  .*
+ 0080 003c00c0 003c5555 55555555 55555555  .*
--- a/gas/testsuite/gas/i386/fp.s
+++ b/gas/testsuite/gas/i386/fp.s
@@ -29,3 +29,6 @@ 
 	.dc.x 0x:bffd80
 	.dcb.x 1, 0x:03ff80
 	.p2align 4,0xaa
+
+	.hfloat 1, -2, 0x:3c00
+	.p2align 4,0x55