From: Jin Ma Date: Wed, 26 Jul 2023 05:41:04 +0000 (+0800) Subject: RISC-V: Fixbug for fsflags instruction error using immediate. X-Git-Tag: basepoints/gcc-15~7364 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ad0dde0af107aaf6a91e37f3aa31249e34df6ce0;p=thirdparty%2Fgcc.git RISC-V: Fixbug for fsflags instruction error using immediate. 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/testsuite/ChangeLog: * gcc.target/riscv/fsflags.c: New test. --- diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index 4615e8119474..24515bcf7065 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -3074,7 +3074,7 @@ "frcsr\t%0") (define_insn "riscv_fscsr" - [(unspec_volatile [(match_operand:SI 0 "csr_operand" "rK")] UNSPECV_FSCSR)] + [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")] UNSPECV_FSCSR)] "TARGET_HARD_FLOAT || TARGET_ZFINX" "fscsr\t%0") @@ -3087,7 +3087,7 @@ (define_insn "riscv_fsflags" [(unspec_volatile [(match_operand:SI 0 "csr_operand" "rK")] UNSPECV_FSFLAGS)] "TARGET_HARD_FLOAT || TARGET_ZFINX" - "fsflags\t%0") + "fsflags%i0\t%0") (define_insn "*riscv_fsnvsnan2" [(unspec_volatile [(match_operand:ANYF 0 "register_operand" "f") diff --git a/gcc/testsuite/gcc.target/riscv/fsflags.c b/gcc/testsuite/gcc.target/riscv/fsflags.c new file mode 100644 index 000000000000..74a97b8a7c72 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fsflags.c @@ -0,0 +1,16 @@ +/* Verify that fsflags is using the correct register or immediate. */ +/* { dg-do compile } */ +/* { dg-require-effective-target hard_float } */ +/* { dg-options "-O" } */ + +void foo1 (int a) +{ + __builtin_riscv_fsflags(a); +} +void foo2 () +{ + __builtin_riscv_fsflags(4); +} + +/* { dg-final { scan-assembler-times "fsflags\t" 1 } } */ +/* { dg-final { scan-assembler-times "fsflagsi\t" 1 } } */