aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRamana Radhakrishnan <ramana.radhakrishnan@linaro.org>2011-06-03 08:31:18 +0000
committerRamana Radhakrishnan <ramana@gcc.gnu.org>2011-06-03 08:31:18 +0000
commiteed55426a72d64a550c816392f0fa8e041071bf4 (patch)
tree5577a1f33837a61d8afb06ea672c92e9643293e9 /gcc
parentd5b6cc25028a79e054909ade4090eb90e9272f5f (diff)
downloadgcc-eed55426a72d64a550c816392f0fa8e041071bf4.zip
gcc-eed55426a72d64a550c816392f0fa8e041071bf4.tar.gz
gcc-eed55426a72d64a550c816392f0fa8e041071bf4.tar.bz2
Fix splitting of DImode orn.
From-SVN: r174597
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/arm/neon.md39
2 files changed, 37 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9ad2d40..8694bfb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2011-06-02 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
+
+ * config/arm/neon.md (orndi3_neon): Actually split it.
+
2011-06-02 Alexandre Oliva <aoliva@redhat.com>
* 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 2dfa9c1..8c31c48 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 "bic<mode>3_neon"