The pattern mistakenly believes that fsflags can use immediate numbers,
but in fact it does not support it. Immediate numbers should use fsflagsi.
For example:
__builtin_riscv_fsflags(4);
The following error occurred:
/tmp/ccoWdWqT.s: Assembler messages:
/tmp/ccoWdWqT.s:14: Error: illegal operands `fsflags 4'
gcc/ChangeLog:
* config/riscv/riscv.md: Likewise.
---
gcc/config/riscv/riscv.md | 8 +---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 4615e811947..1ec85e30d7e 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -3074,7 +3074,7 @@ (define_insn "riscv_frcsr"
"frcsr\t%0")
(define_insn "riscv_fscsr"
- [(unspec_volatile [(match_operand:SI 0 "csr_operand" "rK")] UNSPECV_FSCSR)]
+ [(unspec_volatile [(match_operand:SI 0 "csr_operand" "r")] UNSPECV_FSCSR)]
"TARGET_HARD_FLOAT || TARGET_ZFINX"
"fscsr\t%0")
@@ -3085,9 +3085,11 @@ (define_insn "riscv_frflags"
"frflags\t%0")
(define_insn "riscv_fsflags"
- [(unspec_volatile [(match_operand:SI 0 "csr_operand" "rK")] UNSPECV_FSFLAGS)]
+ [(unspec_volatile [(match_operand:SI 0 "csr_operand" "r,K")]
UNSPECV_FSFLAGS)]
"TARGET_HARD_FLOAT || TARGET_ZFINX"
- "fsflags\t%0")
+ "@
+ fsflags\t%0
+ fsflagsi\t%0")
(define_insn "*riscv_fsnvsnan2"
[(unspec_volatile [(match_operand:ANYF 0 "register_operand" "f")
--
2.17.1