From bed34e8314ab4f7439bcda61eb221ae13833200d Mon Sep 17 00:00:00 2001 From: jgreenhalgh Date: Mon, 24 Mar 2014 12:05:38 +0000 Subject: [AArch64] Logical vector shift right conformance gcc/ * config/aarch64/aarch64-simd-builtins.def (lshr): DI mode excluded. (lshr_simd): DI mode added. * config/aarch64/aarch64-simd.md (aarch64_lshr_simddi): New pattern. (aarch64_ushr_simddi): Likewise. * config/aarch64/aarch64.md (UNSPEC_USHR64): New unspec. * config/aarch64/arm_neon.h (vshr_n_u64): Intrinsic fixed. (vshrd_n_u64): Likewise. gcc/testsuite/ * gcc.target/aarch64/ushr64_1.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@208789 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/aarch64/aarch64-simd.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'gcc/config/aarch64/aarch64-simd.md') diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index 4dffb59e856..6048d605c72 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -724,6 +724,31 @@ DONE; }) +(define_expand "aarch64_lshr_simddi" + [(match_operand:DI 0 "register_operand" "=w") + (match_operand:DI 1 "register_operand" "w") + (match_operand:SI 2 "aarch64_shift_imm64_di" "")] + "TARGET_SIMD" + { + if (INTVAL (operands[2]) == 64) + emit_insn (gen_aarch64_ushr_simddi (operands[0], operands[1])); + else + emit_insn (gen_lshrdi3 (operands[0], operands[1], operands[2])); + DONE; + } +) + +;; SIMD shift by 64. This pattern is a special case as standard pattern does +;; not handle NEON shifts by 64. +(define_insn "aarch64_ushr_simddi" + [(set (match_operand:DI 0 "register_operand" "=w") + (unspec:DI + [(match_operand:DI 1 "register_operand" "w")] UNSPEC_USHR64))] + "TARGET_SIMD" + "ushr\t%d0, %d1, 64" + [(set_attr "type" "neon_shift_imm")] +) + (define_expand "vec_set" [(match_operand:VQ_S 0 "register_operand") (match_operand: 1 "register_operand") -- cgit v1.2.1