]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Support basic floating-point dynamic rounding mode
authorPan Li <pan2.li@intel.com>
Fri, 14 Jul 2023 02:14:07 +0000 (10:14 +0800)
committerPan Li <pan2.li@intel.com>
Tue, 18 Jul 2023 01:17:40 +0000 (09:17 +0800)
commit45dd1d91671cbc4a868ec41ada5f070aa487d02d
tree752b5008287f23c6b2466c885e0f2bfeed6deb1f
parent473c1b58f1fc6f87920fce8d41e0d9545097a700
RISC-V: Support basic floating-point dynamic rounding mode

This patch would like to support the basic floating-point dynamic
rounding modes for the RVV.

We implement the dynamic rounding mode by below steps.
1. Set entry to DYN and exit to DYN_EXIT.
2. Add one rtl variable into machine_function for backup/restore.
3. Backup frm value when entry.
4. Restore frm value when exit and prev mode is not DYN.
5. Restore frm when mode switching to DYN.
6. Set frm when mode switching to STATIC.

Take one flow to describe the scenarios.

           +-------------+
           | Entry (DYN) | <- frrm a5
           +-------------+
          /               \
    +-------+            +-----------+
    | VFADD | <- fsrm a5 | VFADD RTZ | <- fsrmi 1(RTZ)
    +-------+            +-----------+
          |                    |
    +-------+            +-----------+
    | VFADD |            | VFADD RTZ |
    +-------+            +-----------+
          |                       |
+-----------+                 +-------+
| VFADD RUP | <- fsrmi 3(RUP) | VFADD | <- fsrm a5
+-----------+                 +-------+
          |                  /
+-----------+               /
| VFADD RUP |              /
+-----------+             /
           \             /
            +-----------------+
            | Exit (DYN_EXIT) | <- fsrm a5
            +-----------------+

Please *NOTE* inline asm and call during the cfun will be implemented
in another PATCH(s).

Signed-off-by: Pan Li <pan2.li@intel.com>
Co-Authored-By: Juzhe-Zhong <juzhe.zhong@rivai.ai>
gcc/ChangeLog:

* config/riscv/riscv.cc (struct machine_function): Add new field.
(riscv_static_frm_mode_p): New function.
(riscv_emit_frm_mode_set): New function for emit FRM.
(riscv_emit_mode_set): Extract function for FRM.
(riscv_mode_needed): Fix the TODO.
(riscv_mode_entry): Initial dynamic frm RTL.
(riscv_mode_exit): Return DYN_EXIT.
* config/riscv/riscv.md: Add rdfrm.
* config/riscv/vector-iterators.md (unspecv): Add DYN_EXIT unspecv.
* config/riscv/vector.md (frm_modee): Add new mode dyn_exit.
(fsrm): Removed.
(fsrmsi_backup): New pattern for swap.
(fsrmsi_restore): New pattern for restore.
(fsrmsi_restore_exit): New pattern for restore exit.
(frrmsi): New pattern for backup.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/base/float-point-frm-insert-1.c: Adjust
test cases.
* gcc.target/riscv/rvv/base/float-point-frm-insert-10.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-2.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-3.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-4.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-5.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-6.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-7.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-8.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-insert-9.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-run-1.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-run-2.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-frm-run-3.c: Ditto.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-1.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-10.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-11.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-12.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-13.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-14.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-15.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-16.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-17.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-18.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-19.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-2.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-20.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-21.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-22.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-23.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-24.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-25.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-26.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-27.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-28.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-29.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-3.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-30.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-31.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-32.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-4.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-5.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-6.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-7.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-8.c: New test.
* gcc.target/riscv/rvv/base/float-point-dynamic-frm-9.c: New test.
49 files changed:
gcc/config/riscv/riscv.cc
gcc/config/riscv/riscv.md
gcc/config/riscv/vector-iterators.md
gcc/config/riscv/vector.md
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-17.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-18.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-19.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-20.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-21.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-22.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-23.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-24.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-25.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-26.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-27.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-28.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-29.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-30.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-31.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-1.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-10.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-2.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-3.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-4.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-5.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-6.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-7.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-8.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-9.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-run-1.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-run-2.c
gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-run-3.c