aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2023-12-05 10:11:24 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2023-12-05 10:11:24 +0000
commitc86ee4f683e05e5809597d96b5eeb261c9c92cac (patch)
tree8c8e34fe813a17c24c80346a7863c502cce7d839 /libgcc
parent7e04bd1fadf3410c3d24b56f650a52ff53d01a3c (diff)
downloadgcc-c86ee4f683e05e5809597d96b5eeb261c9c92cac.zip
gcc-c86ee4f683e05e5809597d96b5eeb261c9c92cac.tar.gz
gcc-c86ee4f683e05e5809597d96b5eeb261c9c92cac.tar.bz2
aarch64: Distinguish streaming-compatible AdvSIMD insns
The vast majority of Advanced SIMD instructions are not available in streaming mode, but some of the load/store/move instructions are. This patch adds a new target feature macro called TARGET_BASE_SIMD for this streaming-compatible subset. The vector-to-vector move instructions are not streaming-compatible, so we need to use the SVE move instructions where enabled, or fall back to the nofp16 handling otherwise. I haven't found a good way of testing the SVE EXT alternative in aarch64_simd_mov_from_<mode>high, but I'd rather provide it than not. gcc/ * config/aarch64/aarch64.h (TARGET_BASE_SIMD): New macro. (TARGET_SIMD): Require PSTATE.SM to be 0. (AARCH64_ISA_SM_OFF): New macro. * config/aarch64/aarch64.cc (aarch64_array_mode_supported_p): Allow Advanced SIMD structure modes for TARGET_BASE_SIMD. (aarch64_print_operand): Support '%Z'. (aarch64_secondary_reload): Expect SVE moves to be used for Advanced SIMD modes if SVE is enabled and non-streaming Advanced SIMD isn't. (aarch64_register_move_cost): Likewise. (aarch64_simd_container_mode): Extend Advanced SIMD mode handling to TARGET_BASE_SIMD. (aarch64_expand_cpymem): Expand commentary. * config/aarch64/aarch64.md (arches): Add base_simd and nobase_simd. (arch_enabled): Handle it. (*mov<mode>_aarch64): Extend UMOV alternative to TARGET_BASE_SIMD. (*movti_aarch64): Use an SVE move instruction if non-streaming SIMD isn't available. (*mov<TFD:mode>_aarch64): Likewise. (load_pair_dw_tftf): Extend to TARGET_BASE_SIMD. (store_pair_dw_tftf): Likewise. (loadwb_pair<TX:mode>_<P:mode>): Likewise. (storewb_pair<TX:mode>_<P:mode>): Likewise. * config/aarch64/aarch64-simd.md (*aarch64_simd_mov<VDMOV:mode>): Allow UMOV in streaming mode. (*aarch64_simd_mov<VQMOV:mode>): Use an SVE move instruction if non-streaming SIMD isn't available. (aarch64_store_lane0<mode>): Depend on TARGET_FLOAT rather than TARGET_SIMD. (aarch64_simd_mov_from_<mode>low): Likewise. Use fmov if Advanced SIMD is completely disabled. (aarch64_simd_mov_from_<mode>high): Use SVE EXT instructions if non-streaming SIMD isn't available. gcc/testsuite/ * gcc.target/aarch64/movdf_2.c: New test. * gcc.target/aarch64/movdi_3.c: Likewise. * gcc.target/aarch64/movhf_2.c: Likewise. * gcc.target/aarch64/movhi_2.c: Likewise. * gcc.target/aarch64/movqi_2.c: Likewise. * gcc.target/aarch64/movsf_2.c: Likewise. * gcc.target/aarch64/movsi_2.c: Likewise. * gcc.target/aarch64/movtf_3.c: Likewise. * gcc.target/aarch64/movtf_4.c: Likewise. * gcc.target/aarch64/movti_3.c: Likewise. * gcc.target/aarch64/movti_4.c: Likewise. * gcc.target/aarch64/movv16qi_4.c: Likewise. * gcc.target/aarch64/movv16qi_5.c: Likewise. * gcc.target/aarch64/movv8qi_4.c: Likewise. * gcc.target/aarch64/sme/arm_neon_1.c: Likewise. * gcc.target/aarch64/sme/arm_neon_2.c: Likewise. * gcc.target/aarch64/sme/arm_neon_3.c: Likewise.
Diffstat (limited to 'libgcc')
0 files changed, 0 insertions, 0 deletions