diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 1cb6eeb..a41edad 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -1291,6 +1291,18 @@ [(set_attr "type" "neon_shift_imm_narrow_q")] ) +(define_insn "aarch64_simd_vec_pack_trunc_hi_" + [(set (match_operand: 0 "register_operand" "=w") + (vec_concat: + (truncate: (match_operand:VQN 1 "register_operand" "w")) + (vec_select: + (match_operand: 3 "register_operand" "0") + (match_operand: 2 "vect_par_cnst_hi_half" ""))))] + "TARGET_SIMD" + "xtn2\\t%0., %1." + [(set_attr "type" "neon_shift_imm_narrow_q")] +) + (define_expand "vec_pack_trunc_" [(match_operand: 0 "register_operand" "") (match_operand:VDN 1 "register_operand" "") @@ -1309,20 +1321,39 @@ ;; For quads. -(define_insn "vec_pack_trunc_" - [(set (match_operand: 0 "register_operand" "=&w") +(define_expand "vec_pack_trunc_" + [(set (match_operand: 0 "register_operand" "") (vec_concat: - (truncate: (match_operand:VQN 1 "register_operand" "w")) - (truncate: (match_operand:VQN 2 "register_operand" "w"))))] + (truncate: (match_operand:VQN 1 "register_operand" "")) + (truncate: (match_operand:VQN 2 "register_operand" ""))))] "TARGET_SIMD" { if (BYTES_BIG_ENDIAN) - return "xtn\\t%0., %2.\;xtn2\\t%0., %1."; + { + rtx low_part = gen_lowpart (mode, operands[0]); + emit_insn (gen_aarch64_simd_vec_pack_trunc_ (low_part, + operands[2])); + rtx high_part = aarch64_simd_vect_par_cnst_half (mode, + true); + emit_insn (gen_aarch64_simd_vec_pack_trunc_hi_ (operands[0], + operands[1], + high_part, + operands[0])); + } else - return "xtn\\t%0., %1.\;xtn2\\t%0., %2."; + { + rtx low_part = gen_lowpart (mode, operands[0]); + emit_insn (gen_aarch64_simd_vec_pack_trunc_ (low_part, + operands[1])); + rtx high_part = aarch64_simd_vect_par_cnst_half (mode, + true); + emit_insn (gen_aarch64_simd_vec_pack_trunc_hi_ (operands[0], + operands[2], + high_part, + operands[0])); + } + DONE; } - [(set_attr "type" "multiple") - (set_attr "length" "8")] ) ;; Widening operations.