diff options
author | ibolton <ibolton@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-04-22 09:59:50 +0000 |
---|---|---|
committer | ibolton <ibolton@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-04-22 09:59:50 +0000 |
commit | d8cd5fa003583dde4660fe9db5cb44d4efd7f86b (patch) | |
tree | 21bdb517627beddeb475418cdbbe7f824b7b35cd /gcc/config/arm/arm.md | |
parent | 17de73f22f5d78d3c556ae244fa756c98b844736 (diff) | |
download | gcc-d8cd5fa003583dde4660fe9db5cb44d4efd7f86b.tar.gz |
Optimise NotDI AND/OR ZeroExtendSI for ARMv7A
[gcc]
* config/arm/arm.md (*anddi_notdi_zesidi): New pattern.
* config/arm/thumb2.md (*iordi_notdi_zesidi): New pattern.
[gcc/testsuite]
* gcc.target/arm/anddi_notdi-1.c: New test.
* gcc.target/arm/iordi_notdi-1.c: New test case.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209614 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/arm/arm.md')
-rw-r--r-- | gcc/config/arm/arm.md | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 4b81ee27211..9aa0d352bbd 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -2863,6 +2863,28 @@ (set_attr "type" "multiple")] ) +(define_insn_and_split "*anddi_notdi_zesidi" + [(set (match_operand:DI 0 "s_register_operand" "=r") + (and:DI (not:DI (match_operand:DI 2 "s_register_operand" "r")) + (zero_extend:DI + (match_operand:SI 1 "s_register_operand" "r"))))] + "TARGET_32BIT" + "#" + "TARGET_32BIT && reload_completed" + [(set (match_dup 0) (and:SI (not:SI (match_dup 2)) (match_dup 1))) + (set (match_dup 3) (const_int 0))] + " + { + operands[3] = gen_highpart (SImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); + operands[2] = gen_lowpart (SImode, operands[2]); + }" + [(set_attr "length" "8") + (set_attr "predicable" "yes") + (set_attr "predicable_short_it" "no") + (set_attr "type" "multiple")] +) + (define_insn_and_split "*anddi_notsesidi_di" [(set (match_operand:DI 0 "s_register_operand" "=&r,&r") (and:DI (not:DI (sign_extend:DI |