Hi, Version 2 of the patch adds tests to verify the benefit of this change. Ok for master? Thanks, Jonathan --- gcc/ChangeLog: 2021-06-14 Jonathan Wright * config/aarch64/aarch64-simd-builtins.def: Split generator for aarch64_qmovn builtins into scalar and vector variants. * config/aarch64/aarch64-simd.md (aarch64_qmovn_insn_le): Define. (aarch64_qmovn_insn_be): Define. (aarch64_qmovn): Split into scalar and vector variants. Change vector variant to an expander that emits the correct instruction depending on endianness. gcc/testsuite/ChangeLog: * gcc.target/aarch64/narrow_zero_high_half.c: Add new tests. From: Gcc-patches on behalf of Jonathan Wright via Gcc-patches Sent: 15 June 2021 10:59 To: gcc-patches@gcc.gnu.org Subject: [PATCH] aarch64: Model zero-high-half semantics of [SU]QXTN instructions   Hi, As subject, this patch first splits the aarch64_qmovn pattern into separate scalar and vector variants. It then further splits the vector RTL  pattern into big/little endian variants that model the zero-high-half semantics of the underlying instruction. Modeling these semantics allows for better RTL combinations while also removing some register allocation issues as the compiler now knows that the operation is totally destructive. Regression tested and bootstrapped on aarch64-none-linux-gnu - no issues. Ok for master? Thanks, Jonathan --- gcc/ChangeLog: 2021-06-14  Jonathan Wright           * config/aarch64/aarch64-simd-builtins.def: Split generator         for aarch64_qmovn builtins into scalar and vector         variants.         * config/aarch64/aarch64-simd.md (aarch64_qmovn_insn_le):         Define.         (aarch64_qmovn_insn_be): Define.         (aarch64_qmovn): Split into scalar and vector         variants. Change vector variant to an expander that emits the         correct instruction depending on endianness.