243 lines
8.2 KiB
Diff
243 lines
8.2 KiB
Diff
|
From 09944fba5bfb8e5543ce043c70d08222cf2f97ff Mon Sep 17 00:00:00 2001
|
||
|
From: Claudiu Zissulescu <claziss@synopsys.com>
|
||
|
Date: Wed, 11 Nov 2020 12:31:10 +0200
|
||
|
Subject: [PATCH] arc: Refurbish adc/sbc patterns
|
||
|
|
||
|
The adc/sbc patterns were unecessary spliting, remove that and
|
||
|
associated functions.
|
||
|
|
||
|
gcc/ChangeLog:
|
||
|
|
||
|
2020-10-11 Claudiu Zissulescu <claziss@synopsys.com>
|
||
|
|
||
|
* config/arc/arc-protos.h (arc_scheduling_not_expected): Remove
|
||
|
it.
|
||
|
(arc_sets_cc_p): Likewise.
|
||
|
(arc_need_delay): Likewise.
|
||
|
* config/arc/arc.c (arc_sets_cc_p): Likewise.
|
||
|
(arc_need_delay): Likewise.
|
||
|
(arc_scheduling_not_expected): Likewise.
|
||
|
* config/arc/arc.md: Convert adc/sbc patterns to simple
|
||
|
instruction definitions.
|
||
|
|
||
|
Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com>
|
||
|
Signed-off-by: Veronika Kremneva <kremneva@synopsys.com>
|
||
|
---
|
||
|
gcc/config/arc/arc-protos.h | 3 --
|
||
|
gcc/config/arc/arc.c | 53 -------------------------
|
||
|
gcc/config/arc/arc.md | 95 ++++++++++++++-------------------------------
|
||
|
3 files changed, 29 insertions(+), 122 deletions(-)
|
||
|
|
||
|
diff --git a/gcc/config/arc/arc-protos.h b/gcc/config/arc/arc-protos.h
|
||
|
index c72d78e3b9e..de4cf47c818 100644
|
||
|
--- a/gcc/config/arc/arc-protos.h
|
||
|
+++ b/gcc/config/arc/arc-protos.h
|
||
|
@@ -90,10 +90,7 @@ extern void split_subsi (rtx *);
|
||
|
extern void arc_split_move (rtx *);
|
||
|
extern const char *arc_short_long (rtx_insn *insn, const char *, const char *);
|
||
|
extern rtx arc_regno_use_in (unsigned int, rtx);
|
||
|
-extern bool arc_scheduling_not_expected (void);
|
||
|
-extern bool arc_sets_cc_p (rtx_insn *insn);
|
||
|
extern int arc_label_align (rtx_insn *label);
|
||
|
-extern bool arc_need_delay (rtx_insn *insn);
|
||
|
extern bool arc_text_label (rtx_insn *insn);
|
||
|
|
||
|
extern bool arc_short_comparison_p (rtx, int);
|
||
|
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
|
||
|
index fcb83c4e23e..2daf83dd009 100644
|
||
|
--- a/gcc/config/arc/arc.c
|
||
|
+++ b/gcc/config/arc/arc.c
|
||
|
@@ -10341,59 +10341,6 @@ arc_attr_type (rtx_insn *insn)
|
||
|
return get_attr_type (insn);
|
||
|
}
|
||
|
|
||
|
-/* Return true if insn sets the condition codes. */
|
||
|
-
|
||
|
-bool
|
||
|
-arc_sets_cc_p (rtx_insn *insn)
|
||
|
-{
|
||
|
- if (NONJUMP_INSN_P (insn))
|
||
|
- if (rtx_sequence *seq = dyn_cast <rtx_sequence *> (PATTERN (insn)))
|
||
|
- insn = seq->insn (seq->len () - 1);
|
||
|
- return arc_attr_type (insn) == TYPE_COMPARE;
|
||
|
-}
|
||
|
-
|
||
|
-/* Return true if INSN is an instruction with a delay slot we may want
|
||
|
- to fill. */
|
||
|
-
|
||
|
-bool
|
||
|
-arc_need_delay (rtx_insn *insn)
|
||
|
-{
|
||
|
- rtx_insn *next;
|
||
|
-
|
||
|
- if (!flag_delayed_branch)
|
||
|
- return false;
|
||
|
- /* The return at the end of a function needs a delay slot. */
|
||
|
- if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
|
||
|
- && (!(next = next_active_insn (insn))
|
||
|
- || ((!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) != SEQUENCE)
|
||
|
- && arc_attr_type (next) == TYPE_RETURN))
|
||
|
- && (!TARGET_PAD_RETURN
|
||
|
- || (prev_active_insn (insn)
|
||
|
- && prev_active_insn (prev_active_insn (insn))
|
||
|
- && prev_active_insn (prev_active_insn (prev_active_insn (insn))))))
|
||
|
- return true;
|
||
|
- if (NONJUMP_INSN_P (insn)
|
||
|
- ? (GET_CODE (PATTERN (insn)) == USE
|
||
|
- || GET_CODE (PATTERN (insn)) == CLOBBER
|
||
|
- || GET_CODE (PATTERN (insn)) == SEQUENCE)
|
||
|
- : JUMP_P (insn)
|
||
|
- ? (GET_CODE (PATTERN (insn)) == ADDR_VEC
|
||
|
- || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
|
||
|
- : !CALL_P (insn))
|
||
|
- return false;
|
||
|
- return num_delay_slots (insn) != 0;
|
||
|
-}
|
||
|
-
|
||
|
-/* Return true if the scheduling pass(es) has/have already run,
|
||
|
- i.e. where possible, we should try to mitigate high latencies
|
||
|
- by different instruction selection. */
|
||
|
-
|
||
|
-bool
|
||
|
-arc_scheduling_not_expected (void)
|
||
|
-{
|
||
|
- return cfun->machine->arc_reorg_started;
|
||
|
-}
|
||
|
-
|
||
|
/* Code has a minimum p2 alignment of 1, which we must restore after
|
||
|
an ADDR_DIFF_VEC. */
|
||
|
|
||
|
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
|
||
|
index d4d9f59a3ea..6c09c86884f 100644
|
||
|
--- a/gcc/config/arc/arc.md
|
||
|
+++ b/gcc/config/arc/arc.md
|
||
|
@@ -2857,43 +2857,25 @@ archs4x, archs4xd"
|
||
|
(set_attr "type" "compare")
|
||
|
(set_attr "length" "4,4,8")])
|
||
|
|
||
|
-; w/c/c comes first (rather than w/0/C_0) to prevent the middle-end
|
||
|
-; needlessly prioritizing the matching constraint.
|
||
|
-; Rcw/0/C_0 comes before w/c/L so that the lower latency conditional
|
||
|
-; execution is used where possible.
|
||
|
-(define_insn_and_split "adc"
|
||
|
- [(set (match_operand:SI 0 "dest_reg_operand" "=w,Rcw,w,Rcw,w")
|
||
|
- (plus:SI (plus:SI (ltu:SI (reg:CC_C CC_REG) (const_int 0))
|
||
|
- (match_operand:SI 1 "nonmemory_operand"
|
||
|
- "%c,0,c,0,cCal"))
|
||
|
- (match_operand:SI 2 "nonmemory_operand" "c,C_0,L,I,cCal")))]
|
||
|
+(define_insn "adc"
|
||
|
+ [(set (match_operand:SI 0 "register_operand" "=r, r,r,r, r,r")
|
||
|
+ (plus:SI
|
||
|
+ (plus:SI
|
||
|
+ (ltu:SI (reg:CC_C CC_REG) (const_int 0))
|
||
|
+ (match_operand:SI 1 "nonmemory_operand" "%r, 0,r,0,Cal,r"))
|
||
|
+ (match_operand:SI 2 "nonmemory_operand" "r,C_0,L,I, r,Cal")))]
|
||
|
"register_operand (operands[1], SImode)
|
||
|
|| register_operand (operands[2], SImode)"
|
||
|
"@
|
||
|
- adc %0,%1,%2
|
||
|
- add.cs %0,%1,1
|
||
|
- adc %0,%1,%2
|
||
|
- adc %0,%1,%2
|
||
|
- adc %0,%1,%2"
|
||
|
- ; if we have a bad schedule after sched2, split.
|
||
|
- "reload_completed
|
||
|
- && !optimize_size && (!TARGET_ARC600_FAMILY)
|
||
|
- && arc_scheduling_not_expected ()
|
||
|
- && arc_sets_cc_p (prev_nonnote_insn (insn))
|
||
|
- /* If next comes a return or other insn that needs a delay slot,
|
||
|
- expect the adc to get into the delay slot. */
|
||
|
- && next_nonnote_insn (insn)
|
||
|
- && !arc_need_delay (next_nonnote_insn (insn))
|
||
|
- /* Restore operands before emitting. */
|
||
|
- && (extract_insn_cached (insn), 1)"
|
||
|
- [(set (match_dup 0) (match_dup 3))
|
||
|
- (cond_exec
|
||
|
- (ltu (reg:CC_C CC_REG) (const_int 0))
|
||
|
- (set (match_dup 0) (plus:SI (match_dup 0) (const_int 1))))]
|
||
|
- "operands[3] = simplify_gen_binary (PLUS, SImode, operands[1], operands[2]);"
|
||
|
+ adc\\t%0,%1,%2
|
||
|
+ add.cs\\t%0,%1,1
|
||
|
+ adc\\t%0,%1,%2
|
||
|
+ adc\\t%0,%1,%2
|
||
|
+ adc\\t%0,%1,%2
|
||
|
+ adc\\t%0,%1,%2"
|
||
|
[(set_attr "cond" "use")
|
||
|
(set_attr "type" "cc_arith")
|
||
|
- (set_attr "length" "4,4,4,4,8")])
|
||
|
+ (set_attr "length" "4,4,4,4,8,8")])
|
||
|
|
||
|
; combiner-splitter cmp / scc -> cmp / adc
|
||
|
(define_split
|
||
|
@@ -3025,7 +3007,7 @@ archs4x, archs4xd"
|
||
|
DONE;
|
||
|
}
|
||
|
emit_insn (gen_sub_f (l0, l1, l2));
|
||
|
- emit_insn (gen_sbc (h0, h1, h2, gen_rtx_REG (CCmode, CC_REG)));
|
||
|
+ emit_insn (gen_sbc (h0, h1, h2));
|
||
|
DONE;
|
||
|
")
|
||
|
|
||
|
@@ -3040,44 +3022,25 @@ archs4x, archs4xd"
|
||
|
(set_attr "type" "cc_arith")
|
||
|
(set_attr "length" "4")])
|
||
|
|
||
|
-; w/c/c comes first (rather than Rcw/0/C_0) to prevent the middle-end
|
||
|
-; needlessly prioritizing the matching constraint.
|
||
|
-; Rcw/0/C_0 comes before w/c/L so that the lower latency conditional execution
|
||
|
-; is used where possible.
|
||
|
-(define_insn_and_split "sbc"
|
||
|
- [(set (match_operand:SI 0 "dest_reg_operand" "=w,Rcw,w,Rcw,w")
|
||
|
- (minus:SI (minus:SI (match_operand:SI 1 "nonmemory_operand"
|
||
|
- "c,0,c,0,cCal")
|
||
|
- (ltu:SI (match_operand:CC_C 3 "cc_use_register")
|
||
|
- (const_int 0)))
|
||
|
- (match_operand:SI 2 "nonmemory_operand" "c,C_0,L,I,cCal")))]
|
||
|
+(define_insn "sbc"
|
||
|
+ [(set (match_operand:SI 0 "dest_reg_operand" "=r,r,r,r,r,r")
|
||
|
+ (minus:SI
|
||
|
+ (minus:SI
|
||
|
+ (match_operand:SI 1 "nonmemory_operand" "r, 0,r,0, r,Cal")
|
||
|
+ (ltu:SI (reg:CC_C CC_REG) (const_int 0)))
|
||
|
+ (match_operand:SI 2 "nonmemory_operand" "r,C_0,L,I,Cal,r")))]
|
||
|
"register_operand (operands[1], SImode)
|
||
|
|| register_operand (operands[2], SImode)"
|
||
|
"@
|
||
|
- sbc %0,%1,%2
|
||
|
- sub.cs %0,%1,1
|
||
|
- sbc %0,%1,%2
|
||
|
- sbc %0,%1,%2
|
||
|
- sbc %0,%1,%2"
|
||
|
- ; if we have a bad schedule after sched2, split.
|
||
|
- "reload_completed
|
||
|
- && !optimize_size && (!TARGET_ARC600_FAMILY)
|
||
|
- && arc_scheduling_not_expected ()
|
||
|
- && arc_sets_cc_p (prev_nonnote_insn (insn))
|
||
|
- /* If next comes a return or other insn that needs a delay slot,
|
||
|
- expect the adc to get into the delay slot. */
|
||
|
- && next_nonnote_insn (insn)
|
||
|
- && !arc_need_delay (next_nonnote_insn (insn))
|
||
|
- /* Restore operands before emitting. */
|
||
|
- && (extract_insn_cached (insn), 1)"
|
||
|
- [(set (match_dup 0) (match_dup 4))
|
||
|
- (cond_exec
|
||
|
- (ltu (reg:CC_C CC_REG) (const_int 0))
|
||
|
- (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1))))]
|
||
|
- "operands[4] = simplify_gen_binary (MINUS, SImode, operands[1], operands[2]);"
|
||
|
+ sbc\\t%0,%1,%2
|
||
|
+ sub.cs\\t%0,%1,1
|
||
|
+ sbc\\t%0,%1,%2
|
||
|
+ sbc\\t%0,%1,%2
|
||
|
+ sbc\\t%0,%1,%2
|
||
|
+ sbc\\t%0,%1,%2"
|
||
|
[(set_attr "cond" "use")
|
||
|
(set_attr "type" "cc_arith")
|
||
|
- (set_attr "length" "4,4,4,4,8")])
|
||
|
+ (set_attr "length" "4,4,4,4,8,8")])
|
||
|
|
||
|
(define_insn "sub_f"
|
||
|
[(set (reg:CC CC_REG)
|
||
|
--
|
||
|
2.16.2
|
||
|
|