CORE-V: Auto-generation for Post-Increment Load & Store Instructions and Register-Register Load & Store Instructions
Post-Increment load and store instructions perform a load, or a store, respectively, while at the same time incrementing the address that was used for the memory access. Since it is a post-incrementing scheme, the base address is used for the access and the modified address is written back to the register-file.
There are versions of those instructions that use immediate and those that use registers as offsets. The base address always comes from a register.
-
gcc/common/config/riscv/riscv-common.cc: Definedxcvmemextension. -
gcc/config/riscv/corev.md: Implemented RTL pattern for CORE-V post-inc load/store and reg-reg load/store:
-
cv_load<mode>_postinc, -
cv_load_<optab><SHORT:mode>_postinc, -
cv_store<mode>_postinc, -
cv_load<mode>, -
cv_load<mode>, -
cv_load_<optab><SHORT:mode>, -
cv_store<mode>.
-
-
gcc/config/riscv/predicates.md: Implementedmem_post_incandmem_plus_regpredicate and modifiedmove_operand. -
gcc/config/riscv/riscv-opts.h: Created Mask and Target macros for CORE-V post-inc load/store. -
gcc/config/riscv/riscv-protos.h: Definedriscv_legitimate_post_inc_pto verify if post inc instructions are valid. -
gcc/config/riscv/riscv.cc:- Defined and implemented a new RISC-V address type:
ADDRESS_REG_INC. - Implemented a
POST_MODIFYcase inriscv_classify_address. - Modified the
PLUScase for reg-reg load/store underXCVMEMtarget. - Implemented
riscv_legitimate_post_inc_p. - Modified
riscv_output_moveto includeADDRESS_REG_INC
- Defined and implemented a new RISC-V address type:
-
gcc/config/riscv/riscv.h: Defined CORE-V Macros for post-inc:HAVE_POST_MODIFY_DISPHAVE_POST_MODIFY_REG- Modified
INDEX_REG_CLASSto acceptGR_REGSunderXCVMEMtarget.
GCC Compilation Tests for
- Post Increment Register-Immediate Load/Store
- Post Increment Register-Register Load/Store
- Regiser-Register Load/Store
All post-increment tests do not support optimisation levels -O0, -Os, -Og, -Oz.
-
gcc/testsuite/gcc.target/riscv/cv-mem-lb-compile-1.c: Created. -
gcc/testsuite/gcc.target/riscv/cv-mem-lb-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lb-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lbu-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lbu-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lbu-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lh-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lh-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lh-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lhu-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lhu-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lhu-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lw-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lw-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-lw-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sb-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sb-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sb-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sh-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sh-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sh-compile-3.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sw-compile-1.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sw-compile-2.c: Likewise. -
gcc/testsuite/gcc.target/riscv/cv-mem-sw-compile-3.c: Likewise.