diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index f43f0f6af0d..eeb626f129a 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -1874,6 +1874,22 @@ [(set_attr "type" "neon_permute")] ) +(define_insn "*aarch64_trunc_concat" + [(set (match_operand: 0 "register_operand" "=w") + (truncate: + (vec_concat:VQN + (match_operand: 1 "register_operand" "w") + (match_operand: 2 "register_operand" "w"))))] + "TARGET_SIMD" +{ + if (!BYTES_BIG_ENDIAN) + return "uzp1\\t%0., %1., %2."; + else + return "uzp1\\t%0., %2., %1."; +} + [(set_attr "type" "neon_permute")] +) + ;; Packing doubles. (define_expand "vec_pack_trunc_" diff --git a/gcc/testsuite/gcc.target/aarch64/sve/truncated_concatenation_1.c b/gcc/testsuite/gcc.target/aarch64/sve/truncated_concatenation_1.c new file mode 100644 index 00000000000..95577a1a9ef --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/truncated_concatenation_1.c @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -Wall -march=armv8.2-a+sve" } */ + +#include +#include + +int8x8_t f1 (int16x4_t a, int16x4_t b) { + int8x8_t ab = vdup_n_s8 (0); + int16x8_t ab_concat = vcombine_s16 (a, b); + ab = vmovn_s16 (ab_concat); + return ab; +} + +int16x4_t f2 (int32x2_t a, int32x2_t b) { + int16x4_t ab = vdup_n_s16 (0); + int32x4_t ab_concat = vcombine_s32 (a, b); + ab = vmovn_s32 (ab_concat); + return ab; +} + +int32x2_t f3 (svint64_t a, svint64_t b) { + int32x2_t ab = vdup_n_s32 (0); + ab = vset_lane_s32 ((int)svaddv_s64 (svptrue_b64 (), a), ab, 0); + ab = vset_lane_s32 ((int)svaddv_s64 (svptrue_b64 (), b), ab, 1); + return ab; +} + +/* { dg-final { scan-assembler-not {\txtn\t} } }*/ +/* { dg-final { scan-assembler-not {\tfcvtn\t} } }*/ +/* { dg-final { scan-assembler-times {\tuzp1\tv[0-9]+\.8b, v[0-9]+\.8b, v[0-9]+\.8b} 1 } }*/ +/* { dg-final { scan-assembler-times {\tuzp1\tv[0-9]+\.4h, v[0-9]+\.4h, v[0-9]+\.4h} 1 } }*/ +/* { dg-final { scan-assembler-times {\tuzp1\tv[0-9]+\.2s, v[0-9]+\.2s, v[0-9]+\.2s} 1 } }*/ \ No newline at end of file