aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKito Cheng <kito.cheng@sifive.com>2025-01-20 19:24:36 +0800
committerNelson Chu <nelson@rivosinc.com>2025-02-11 14:44:19 +0800
commit83c30fcc4d10fa3783199379e358a884a64f8688 (patch)
tree1da365ee4847224e686e98b23c093e442ef70600
parent3f61a38b5e81569357bd15fbcf7fcb1dab3ee2db (diff)
downloadbinutils-83c30fcc4d10fa3783199379e358a884a64f8688.zip
binutils-83c30fcc4d10fa3783199379e358a884a64f8688.tar.gz
binutils-83c30fcc4d10fa3783199379e358a884a64f8688.tar.bz2
RISC-V: Add .bfloat16 directive
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.
-rw-r--r--gas/config/tc-riscv.c3
-rw-r--r--gas/doc/c-riscv.texi10
-rw-r--r--gas/testsuite/gas/riscv/bfloat16-be.d10
-rw-r--r--gas/testsuite/gas/riscv/bfloat16-le.d10
-rw-r--r--gas/testsuite/gas/riscv/bfloat16.s21
5 files changed, 53 insertions, 1 deletions
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index eb0d681..ac1a10a 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -470,7 +470,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[] = "rRsSfFdDxXpPhHbB";
/* Indicate ELF attributes are explicitly set. */
static bool explicit_attr = false;
@@ -5802,6 +5802,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 10cb772..314e28c 100644
--- a/gas/doc/c-riscv.texi
+++ b/gas/doc/c-riscv.texi
@@ -256,6 +256,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-be.d b/gas/testsuite/gas/riscv/bfloat16-be.d
new file mode 100644
index 0000000..21408d0
--- /dev/null
+++ b/gas/testsuite/gas/riscv/bfloat16-be.d
@@ -0,0 +1,10 @@
+# source: bfloat16.s
+# objdump: -sj .data
+# as: -mbig-endian
+
+.*:[ ]+file format .*
+
+Contents of section \.data:
+ 0000 41403dfc 000042f7 8000c2f7 7fff7f80.*
+ 0010 ff807f7f ff7f0080 80800001 8001007f.*
+ 0020 807f3f80 bf804000 c000ffc1 ff81.*
diff --git a/gas/testsuite/gas/riscv/bfloat16-le.d b/gas/testsuite/gas/riscv/bfloat16-le.d
new file mode 100644
index 0000000..2043a9c
--- /dev/null
+++ b/gas/testsuite/gas/riscv/bfloat16-le.d
@@ -0,0 +1,10 @@
+# source: bfloat16.s
+# objdump: -sj .data
+# as: -mlittle-endian
+
+.*:[ ]+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 0000000..ed92856
--- /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
+ .bfloat16 0B:ff81