From eed55426a72d64a550c816392f0fa8e041071bf4 Mon Sep 17 00:00:00 2001 From: Ramana Radhakrishnan Date: Fri, 3 Jun 2011 08:31:18 +0000 Subject: [PATCH] Fix splitting of DImode orn. From-SVN: r174597 --- gcc/ChangeLog | 4 ++++ gcc/config/arm/neon.md | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ad2d406b8a..8694bfb2b9c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2011-06-02 Ramana Radhakrishnan + + * config/arm/neon.md (orndi3_neon): Actually split it. + 2011-06-02 Alexandre Oliva * params.def (PARAM_MAX_VARTRACK_EXPR_DEPTH): Bump default to 10. diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index 2dfa9c14ef3..8c31c48b495 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -801,17 +801,44 @@ [(set_attr "neon_type" "neon_int_1")] ) -(define_insn "orndi3_neon" - [(set (match_operand:DI 0 "s_register_operand" "=w,?=&r,?&r") - (ior:DI (not:DI (match_operand:DI 2 "s_register_operand" "w,0,r")) - (match_operand:DI 1 "s_register_operand" "w,r,0")))] +;; TODO: investigate whether we should disable +;; this and bicdi3_neon for the A8 in line with the other +;; changes above. +(define_insn_and_split "orndi3_neon" + [(set (match_operand:DI 0 "s_register_operand" "=w,?&r,?&r,?&r") + (ior:DI (not:DI (match_operand:DI 2 "s_register_operand" "w,0,0,r")) + (match_operand:DI 1 "s_register_operand" "w,r,r,0")))] "TARGET_NEON" "@ vorn\t%P0, %P1, %P2 # + # #" - [(set_attr "neon_type" "neon_int_1,*,*") - (set_attr "length" "*,8,8")] + "reload_completed && + (TARGET_NEON && !(IS_VFP_REGNUM (REGNO (operands[0]))))" + [(set (match_dup 0) (ior:SI (not:SI (match_dup 2)) (match_dup 1))) + (set (match_dup 3) (ior:SI (not:SI (match_dup 4)) (match_dup 5)))] + " + { + if (TARGET_THUMB2) + { + operands[3] = gen_highpart (SImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); + operands[4] = gen_highpart (SImode, operands[2]); + operands[2] = gen_lowpart (SImode, operands[2]); + operands[5] = gen_highpart (SImode, operands[1]); + operands[1] = gen_lowpart (SImode, operands[1]); + } + else + { + emit_insn (gen_one_cmpldi2 (operands[0], operands[2])); + emit_insn (gen_iordi3 (operands[0], operands[1], operands[0])); + DONE; + } + }" + [(set_attr "neon_type" "neon_int_1,*,*,*") + (set_attr "length" "*,16,8,8") + (set_attr "arch" "any,a,t2,t2")] ) (define_insn "bic3_neon" -- 2.30.2