Hi all,
This patch fixes the PR by folding the ((x ^ y) & m) ^ x form of the RTL
to a bit-select instruction rather than the previous (x & ~m) | (y & m)
form.
This is in sync with the match.pd change that introduced the folding:
Author: mpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed Dec 17 11:48:33 2014 +0000
PR middle-end/63568
match.pd: Add (x & ~m) | (y & m) -> ((x ^ y) & m) ^ x pattern.
I decided to replace the previous pattern rather than add a new combine
pattern.
I initially thought of leaving the previous pattern in case we used some
target intrinsics to expand to the and-not-ior form in RTL, but I see
that all the relevant intrinsics in arm_neon.h are implemented using the
tree-level operators and so their combinations fold into this
xor-and-xor form.
This patch gets the gcc.target/aarch64/vbslq_u64_1.c test passing again,
so I'm not adding a new test.
Bootstrapped and tested on aarch64-linux.
Ok for trunk?
Thanks,
Kyrill
2014-01-16 Kyrylo Tkachov <kyrylo.tkac...@arm.com>
PR target/64448
* config/aarch64/aarch64-simd.md (aarch64_simd_bsl<mode>_internal):
Match xor-and-xor RTL pattern.
commit 9db06d318d3d0626d9161204e8db18faf39271bb
Author: Kyrylo Tkachov <kyrylo.tkac...@arm.com>
Date: Fri Jan 9 09:59:15 2015 +0000
[AArch64] Match bfi with new folding ops
diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md
index 9651b99..495c6e7 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -1986,15 +1986,14 @@ (define_insn "aarch64_reduc_<maxmin_uns>_internal<mode>"
;; bif op0, op1, mask
(define_insn "aarch64_simd_bsl<mode>_internal"
- [(set (match_operand:VSDQ_I_DI 0 "register_operand" "=w,w,w")
- (ior:VSDQ_I_DI
+ [(set (match_operand:VSDQ_I_DI 0 "register_operand" "=w,w,w")
+ (xor:VSDQ_I_DI
(and:VSDQ_I_DI
- (not:<V_cmp_result>
- (match_operand:<V_cmp_result> 1 "register_operand" " 0,w,w"))
- (match_operand:VSDQ_I_DI 3 "register_operand" " w,0,w"))
- (and:VSDQ_I_DI
- (match_dup:<V_cmp_result> 1)
- (match_operand:VSDQ_I_DI 2 "register_operand" " w,w,0"))
+ (xor:VSDQ_I_DI
+ (match_operand:<V_cmp_result> 3 "register_operand" "w,0,w")
+ (match_operand:VSDQ_I_DI 2 "register_operand" "w,w,0"))
+ (match_operand:VSDQ_I_DI 1 "register_operand" "0,w,w"))
+ (match_dup:<V_cmp_result> 3)
))]
"TARGET_SIMD"
"@