This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 6/6] [ARC] Various instruction pattern fixes
- From: Claudiu Zissulescu <Claudiu dot Zissulescu at synopsys dot com>
- To: <gcc-patches at gcc dot gnu dot org>
- Cc: <Claudiu dot Zissulescu at synopsys dot com>, <gnu at amylaar dot uk>, <Francois dot Bedard at synopsys dot com>, <jeremy dot bennett at embecosm dot com>
- Date: Mon, 18 Apr 2016 16:33:48 +0200
- Subject: [PATCH 6/6] [ARC] Various instruction pattern fixes
- Authentication-results: sourceware.org; auth=none
- References: <1460990028-5718-1-git-send-email-claziss at synopsys dot com>
OK to apply?
Claudiu
gcc/
2016-04-18 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (mulsidi3): Change operand 0 predicate to
register_operand.
(umulsidi3): Likewise.
(indirect_jump): Fix jump instruction assembly patterns.
(arcset<code>): Change operand 1 predicate to nonmemory_operand.
(arcsetltu, arcsetgeu): Likewise.
(arcsethi, arcsetls): Fix pattern.
---
gcc/config/arc/arc.md | 125 +++++++++++++++++++++++++++-----------------------
1 file changed, 67 insertions(+), 58 deletions(-)
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
index 6731072..170ac1c 100644
--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -1964,7 +1964,7 @@
(set_attr "cond" "nocond,canuse,nocond,canuse_limm,canuse,nocond")])
(define_expand "mulsidi3"
- [(set (match_operand:DI 0 "nonimmediate_operand" "")
+ [(set (match_operand:DI 0 "register_operand" "")
(mult:DI (sign_extend:DI(match_operand:SI 1 "register_operand" ""))
(sign_extend:DI(match_operand:SI 2 "nonmemory_operand" ""))))]
"TARGET_ANY_MPY"
@@ -2200,9 +2200,9 @@
}")
(define_expand "umulsidi3"
- [(set (match_operand:DI 0 "nonimmediate_operand" "")
- (mult:DI (zero_extend:DI(match_operand:SI 1 "register_operand" ""))
- (zero_extend:DI(match_operand:SI 2 "nonmemory_operand" ""))))]
+ [(set (match_operand:DI 0 "register_operand" "")
+ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" ""))
+ (zero_extend:DI (match_operand:SI 2 "nonmemory_operand" ""))))]
""
{
if (TARGET_MPY)
@@ -3673,7 +3673,12 @@
(define_insn "indirect_jump"
[(set (pc) (match_operand:SI 0 "nonmemory_operand" "L,I,Cal,Rcqq,r"))]
""
- "j%!%* [%0]%&"
+ "@
+ j%!%* %0%&
+ j%!%* %0%&
+ j%!%* %0%&
+ j%!%* [%0]%&
+ j%!%* [%0]%&"
[(set_attr "type" "jump")
(set_attr "iscompact" "false,false,false,maybe,false")
(set_attr "cond" "canuse,canuse_limm,canuse,canuse,canuse")])
@@ -5425,90 +5430,94 @@
(define_code_iterator arcCC_cond [eq ne gt lt ge le])
(define_insn "arcset<code>"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r")
- (arcCC_cond:SI (match_operand:SI 1 "register_operand" "0,r,0,r,0,0,r")
- (match_operand:SI 2 "nonmemory_operand" "r,r,L,L,I,n,n")))]
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r,r")
+ (arcCC_cond:SI (match_operand:SI 1 "nonmemory_operand" "0,r,n,0,r,0,0,r")
+ (match_operand:SI 2 "nonmemory_operand" "r,r,r,L,L,I,n,n")))]
"TARGET_V2 && TARGET_CODE_DENSITY"
"set<code>%? %0, %1, %2"
- [(set_attr "length" "4,4,4,4,4,8,8")
+ [(set_attr "length" "4,4,8,4,4,4,8,8")
(set_attr "iscompact" "false")
(set_attr "type" "compare")
- (set_attr "predicable" "yes,no,yes,no,no,yes,no")
- (set_attr "cond" "canuse,nocond,canuse,nocond,nocond,canuse,nocond")
+ (set_attr "predicable" "yes,no,no,yes,no,no,yes,no")
+ (set_attr "cond" "canuse,nocond,nocond,canuse,nocond,nocond,canuse,nocond")
])
(define_insn "arcsetltu"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r, r, r")
- (ltu:SI (match_operand:SI 1 "register_operand" "0,r,0,r,0, 0, r")
- (match_operand:SI 2 "nonmemory_operand" "r,r,L,L,I, n, n")))]
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r, r, r")
+ (ltu:SI (match_operand:SI 1 "nonmemory_operand" "0,r,n,0,r,0, 0, r")
+ (match_operand:SI 2 "nonmemory_operand" "r,r,r,L,L,I, n, n")))]
"TARGET_V2 && TARGET_CODE_DENSITY"
"setlo%? %0, %1, %2"
- [(set_attr "length" "4,4,4,4,4,8,8")
+ [(set_attr "length" "4,4,8,4,4,4,8,8")
(set_attr "iscompact" "false")
(set_attr "type" "compare")
- (set_attr "predicable" "yes,no,yes,no,no,yes,no")
- (set_attr "cond" "canuse,nocond,canuse,nocond,nocond,canuse,nocond")
+ (set_attr "predicable" "yes,no,no,yes,no,no,yes,no")
+ (set_attr "cond" "canuse,nocond,nocond,canuse,nocond,nocond,canuse,nocond")
])
(define_insn "arcsetgeu"
- [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r, r, r")
- (geu:SI (match_operand:SI 1 "register_operand" "0,r,0,r,0, 0, r")
- (match_operand:SI 2 "nonmemory_operand" "r,r,L,L,I, n, n")))]
+ [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r, r, r")
+ (geu:SI (match_operand:SI 1 "nonmemory_operand" "0,r,n,0,r,0, 0, r")
+ (match_operand:SI 2 "nonmemory_operand" "r,r,r,L,L,I, n, n")))]
"TARGET_V2 && TARGET_CODE_DENSITY"
"seths%? %0, %1, %2"
- [(set_attr "length" "4,4,4,4,4,8,8")
+ [(set_attr "length" "4,4,8,4,4,4,8,8")
(set_attr "iscompact" "false")
(set_attr "type" "compare")
- (set_attr "predicable" "yes,no,yes,no,no,yes,no")
- (set_attr "cond" "canuse,nocond,canuse,nocond,nocond,canuse,nocond")
+ (set_attr "predicable" "yes,no,no,yes,no,no,yes,no")
+ (set_attr "cond" "canuse,nocond,nocond,canuse,nocond,nocond,canuse,nocond")
])
;; Special cases of SETCC
(define_insn_and_split "arcsethi"
- [(set (match_operand:SI 0 "register_operand" "=r,r, r,r")
- (gtu:SI (match_operand:SI 1 "register_operand" "r,r, r,r")
- (match_operand:SI 2 "nonmemory_operand" "0,r,C62,n")))]
+ [(set (match_operand:SI 0 "register_operand" "=r, r,r,r")
+ (gtu:SI (match_operand:SI 1 "nonmemory_operand" "r, r,r,n")
+ (match_operand:SI 2 "nonmemory_operand" "r,C62,n,r")))]
"TARGET_V2 && TARGET_CODE_DENSITY"
- "setlo%? %0, %2, %1"
- "reload_completed
- && CONST_INT_P (operands[2])
- && satisfies_constraint_C62 (operands[2])"
+ "#"
+ "reload_completed"
[(const_int 0)]
"{
- /* sethi a,b,u6 => seths a,b,u6 + 1. */
- operands[2] = GEN_INT (INTVAL (operands[2]) + 1);
- emit_insn (gen_arcsetgeu (operands[0], operands[1], operands[2]));
- DONE;
+ if (CONST_INT_P (operands[2]) && satisfies_constraint_C62 (operands[2]))
+ {
+ /* sethi a,b,u6 => seths a,b,u6 + 1. */
+ operands[2] = GEN_INT (INTVAL (operands[2]) + 1);
+ emit_insn (gen_arcsetgeu (operands[0], operands[1], operands[2]));
+ DONE;
+ }
+ else
+ {
+ emit_insn (gen_arcsetltu (operands[0], operands[2], operands[1]));
+ DONE;
+ }
}"
- [(set_attr "length" "4,4,4,8")
- (set_attr "iscompact" "false")
- (set_attr "type" "compare")
- (set_attr "predicable" "yes,no,no,no")
- (set_attr "cond" "canuse,nocond,nocond,nocond")]
-)
+ [(set_attr "length" "4,4,8,8")
+ (set_attr "type" "compare")])
(define_insn_and_split "arcsetls"
- [(set (match_operand:SI 0 "register_operand" "=r,r, r,r")
- (leu:SI (match_operand:SI 1 "register_operand" "r,r, r,r")
- (match_operand:SI 2 "nonmemory_operand" "0,r,C62,n")))]
+ [(set (match_operand:SI 0 "register_operand" "=r, r,r,r")
+ (leu:SI (match_operand:SI 1 "nonmemory_operand" "r, r,r,n")
+ (match_operand:SI 2 "nonmemory_operand" "r,C62,n,r")))]
"TARGET_V2 && TARGET_CODE_DENSITY"
- "seths%? %0, %2, %1"
- "reload_completed
- && CONST_INT_P (operands[2])
- && satisfies_constraint_C62 (operands[2])"
+ "#"
+ "reload_completed"
[(const_int 0)]
"{
- /* setls a,b,u6 => setlo a,b,u6 + 1. */
- operands[2] = GEN_INT (INTVAL (operands[2]) + 1);
- emit_insn (gen_arcsetltu (operands[0], operands[1], operands[2]));
- DONE;
- }"
- [(set_attr "length" "4,4,4,8")
- (set_attr "iscompact" "false")
- (set_attr "type" "compare")
- (set_attr "predicable" "yes,no,no,no")
- (set_attr "cond" "canuse,nocond,nocond,nocond")]
-)
+ if (CONST_INT_P (operands[2]) && satisfies_constraint_C62 (operands[2]))
+ {
+ /* setls a,b,u6 => setlo a,b,u6 + 1. */
+ operands[2] = GEN_INT (INTVAL (operands[2]) + 1);
+ emit_insn (gen_arcsetltu (operands[0], operands[1], operands[2]));
+ DONE;
+ }
+ else
+ {
+ emit_insn (gen_arcsetgeu (operands[0], operands[2], operands[1]));
+ DONE;
+ }
+ }"
+ [(set_attr "length" "4,4,8,8")
+ (set_attr "type" "compare")])
; Any mode that needs to be solved by secondary reload
(define_mode_iterator SRI [QI HI])
--
1.9.1