[PATCH] RISC-V: Add .bfloat16 directive

Kito Cheng kito.cheng@sifive.com
Mon Jan 20 09:31:46 GMT 2025


RISC-V already support bfloat16 instruciton like Zfbfmin, Zvfbfmin and
Zvfbfwma, so I think it's reasonable to add .bfloat16 directive to
support bfloat16 data type.

And the code logic mostly support by common code already.
---
 gas/config/tc-riscv.c              |  3 ++-
 gas/doc/c-riscv.texi               | 10 ++++++++++
 gas/testsuite/gas/riscv/bfloat16.d | 10 ++++++++++
 gas/testsuite/gas/riscv/bfloat16.s | 21 +++++++++++++++++++++
 4 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 gas/testsuite/gas/riscv/bfloat16.d
 create mode 100644 gas/testsuite/gas/riscv/bfloat16.s

diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 1a32f4ee57f..fd5f67fbf6b 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -473,7 +473,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[] = "rRsSfFdDxXpPhH";
+const char FLT_CHARS[] = "rRsSfFdDxXpPhHb";
 
 /* Indicate ELF attributes are explicitly set.  */
 static bool explicit_attr = false;
@@ -5890,6 +5890,7 @@ static const pseudo_typeS riscv_pseudo_table[] =
   {"attribute", s_riscv_attribute, 0},
   {"variant_cc", s_variant_cc, 0},
   {"float16", float_cons, 'h'},
+  {"bfloat16", float_cons, 'b'},
 
   { NULL, NULL, 0 },
 };
diff --git a/gas/doc/c-riscv.texi b/gas/doc/c-riscv.texi
index d2e47455e7c..be3a09487f1 100644
--- a/gas/doc/c-riscv.texi
+++ b/gas/doc/c-riscv.texi
@@ -255,6 +255,16 @@ The @var{tag} is either an attribute number, or one of the following:
 @code{Tag_RISCV_unaligned_access}, @code{Tag_RISCV_priv_spec},
 @code{Tag_RISCV_priv_spec_minor}, @code{Tag_RISCV_priv_spec_revision}.
 
+@cindex @code{.bfloat16} directive, RISC-V
+@item .bfloat16 @var{value}
+Floating point constructors for the bfloat16 type, example usage:
+
+@smallexample
+	.bfloat16 12.0
+	.bfloat16 NaN
+	.bfloat16 0b:ffc1
+@end smallexample
+
 @end table
 
 @node RISC-V-Modifiers
diff --git a/gas/testsuite/gas/riscv/bfloat16.d b/gas/testsuite/gas/riscv/bfloat16.d
new file mode 100644
index 00000000000..0210f52c970
--- /dev/null
+++ b/gas/testsuite/gas/riscv/bfloat16.d
@@ -0,0 +1,10 @@
+# source: bfloat16.s
+# objdump: -sj .data
+# as:
+
+.*:[   ]+file format .*
+
+Contents of section \.data:
+ 0000 4041fc3d 0000f742 0080f7c2 ff7f807f.*
+ 0010 80ff7f7f 7fff8000 80800100 01807f00.*
+ 0020 7f80803f 80bf0040 00c0c1ff 81ff.*
diff --git a/gas/testsuite/gas/riscv/bfloat16.s b/gas/testsuite/gas/riscv/bfloat16.s
new file mode 100644
index 00000000000..7398fd83b45
--- /dev/null
+++ b/gas/testsuite/gas/riscv/bfloat16.s
@@ -0,0 +1,21 @@
+ .data
+       .bfloat16 12.0
+       .bfloat16 0.123
+       .bfloat16 +0.0
+       .bfloat16 123.4
+       .bfloat16 -0.0
+       .bfloat16 -123.4
+       .bfloat16 NaN
+       .bfloat16 Inf
+       .bfloat16 -Inf
+       .bfloat16 3.390e+38
+       .bfloat16 -3.390e+38
+       .bfloat16 1.175e-38
+       .bfloat16 -1.175e-38
+       .bfloat16 9.194e-41
+       .bfloat16 -9.194e-41
+       .bfloat16 1.167e-38
+       .bfloat16 -1.167e-38
+       .bfloat16 1.0, -1, 2.0, -2
+       .bfloat16 0b:ffc1       # qNaNh
+       .bfloat16 0b:ff81       # sNaNh
-- 
2.34.1



More information about the Binutils mailing list