summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1992-01-23 19:10:22 +0000
committerrms <rms@138bc75d-0d04-0410-961f-82ee72b054a4>1992-01-23 19:10:22 +0000
commit6e6532260c4915ccca0bf6bf822b6fc355c34a54 (patch)
tree376e21a1ff340d5159d0764b8c9eb25f196b0c8e /gcc
parent84d7282ff60b5f29f4006a306ff0ba4e75fce3c4 (diff)
downloadgcc-6e6532260c4915ccca0bf6bf822b6fc355c34a54.tar.gz
*** empty log message ***
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i860/i860.md305
1 files changed, 88 insertions, 217 deletions
diff --git a/gcc/config/i860/i860.md b/gcc/config/i860/i860.md
index 8b4ab420db8..debb179898a 100644
--- a/gcc/config/i860/i860.md
+++ b/gcc/config/i860/i860.md
@@ -692,32 +692,38 @@
;; Generation of conditionals.
-;; The first step is the emission of a standard-looking compare insn.
-;; Then a standard-named conditional branch pattern is run.
-;; That branch pattern looks back at the compare insn and deletes it.
-;; It then emits a machine-specific compare insn and a branch-if-true
-;; or a branch-if-false.
+;; We save the compare operands in the cmpxx patterns and use then when
+;; we generate the branch.
-;; These patterns have `abort' because they are supposed to be deleted
-;; in that fashion.
-
-(define_insn "cmpsi"
+(define_expand "cmpsi"
[(set (cc0) (compare (match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "compare_operand" "")))]
""
- "* abort ();")
+ "
+{ i860_compare_op0 = operands[0];
+ i860_compare_op1 = operands[1];
+ DONE;
+}")
-(define_insn "cmpsf"
+(define_expand "cmpsf"
[(set (cc0) (compare (match_operand:SF 0 "register_operand" "")
(match_operand:SF 1 "register_operand" "")))]
""
- "* abort ();")
+ "
+{ i860_compare_op0 = operands[0];
+ i860_compare_op1 = operands[1];
+ DONE;
+}")
-(define_insn "cmpdf"
+(define_expand "cmpdf"
[(set (cc0) (compare (match_operand:DF 0 "register_operand" "")
(match_operand:DF 1 "register_operand" "")))]
""
- "* abort ();")
+ "
+{ i860_compare_op0 = operands[0];
+ i860_compare_op1 = operands[1];
+ DONE;
+}")
;; These are the standard-named conditional branch patterns.
;; Detailed comments are found in the first one only.
@@ -731,42 +737,21 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- /* Get out of the sequence just started for us. */
-
- end_sequence ();
- prev = get_last_insn ();
-
- /* Examine the preceding compare insn, and get rid of it. */
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
-
- /* Now once again start a sequence for our new instructions. */
-
- start_sequence ();
-
/* Emit a single-condition compare insn according to
the type of operands and the condition to be tested. */
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpeqsi (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmpeqsf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpeqdf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
+ emit_insn (gen_cmpeqsi (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmpeqsf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpeqdf (i860_compare_op0, i860_compare_op1));
else
abort ();
/* Emit branch-if-true. */
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
-
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
DONE;
}")
@@ -779,28 +764,16 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpeqsi (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmpeqsf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpeqdf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
+ emit_insn (gen_cmpeqsi (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmpeqsf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpeqdf (i860_compare_op0, i860_compare_op1));
else
abort ();
- emit_jump_insn (gen_flipped_cbranch (label));
+
+ emit_jump_insn (gen_flipped_cbranch (operands[0]));
DONE;
}")
@@ -814,28 +787,16 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpgtsi (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmpgtsf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpgtdf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
+ emit_insn (gen_cmpgtsi (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmpgtsf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpgtdf (i860_compare_op0, i860_compare_op1));
else
abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
DONE;
}")
@@ -848,28 +809,16 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpltsi (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmpltsf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpltdf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
+ emit_insn (gen_cmpltsi (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmpltsf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpltdf (i860_compare_op0, i860_compare_op1));
else
abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
DONE;
}")
@@ -882,33 +831,20 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
{
- emit_insn (gen_cmpgtsi (recog_operand[0], recog_operand[1]));
- emit_jump_insn (gen_flipped_cbranch (label));
+ emit_insn (gen_cmpgtsi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_cbranch (operands[0]));
}
else
{
- if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmplesf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpledf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmplesf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpledf (i860_compare_op0, i860_compare_op1));
else
abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
}
DONE;
}")
@@ -922,33 +858,20 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) == MODE_INT)
{
- emit_insn (gen_cmpltsi (recog_operand[0], recog_operand[1]));
- emit_jump_insn (gen_flipped_cbranch (label));
+ emit_insn (gen_cmpltsi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_cbranch (operands[0]));
}
else
{
- if (code == CODE_FOR_cmpsf)
- emit_insn (gen_cmpgesf (recog_operand[0], recog_operand[1]));
- else if (code == CODE_FOR_cmpdf)
- emit_insn (gen_cmpgedf (recog_operand[0], recog_operand[1]));
+ if (GET_MODE (i860_compare_op0) == SFmode)
+ emit_insn (gen_cmpgesf (i860_compare_op0, i860_compare_op1));
+ else if (GET_MODE (i860_compare_op0) == DFmode)
+ emit_insn (gen_cmpgedf (i860_compare_op0, i860_compare_op1));
else
- abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+ abort ();
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
}
DONE;
}")
@@ -962,24 +885,11 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpleusi (recog_operand[0], recog_operand[1]));
- else
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
abort ();
- emit_jump_insn (gen_flipped_cbranch (label));
+
+ emit_insn (gen_cmpleusi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_cbranch (operands[0]));
DONE;
}")
@@ -992,24 +902,11 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpgeusi (recog_operand[0], recog_operand[1]));
- else
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
abort ();
- emit_jump_insn (gen_flipped_cbranch (label));
+
+ emit_insn (gen_cmpgeusi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_cbranch (operands[0]));
DONE;
}")
@@ -1022,24 +919,11 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpgeusi (recog_operand[0], recog_operand[1]));
- else
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+
+ emit_insn (gen_cmpgeusi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
DONE;
}")
@@ -1052,24 +936,11 @@
""
"
{
- rtx label = operands[0];
- enum insn_code code;
- rtx prev;
-
- end_sequence ();
- prev = get_last_insn ();
-
- code = recog_memoized (prev);
- insn_extract (prev);
- NEXT_INSN (PREV_INSN (prev)) = 0;
- set_last_insn (PREV_INSN (prev));
- start_sequence ();
-
- if (code == CODE_FOR_cmpsi)
- emit_insn (gen_cmpleusi (recog_operand[0], recog_operand[1]));
- else
+ if (GET_MODE_CLASS (GET_MODE (i860_compare_op0)) != MODE_INT)
abort ();
- emit_jump_insn (gen_flipped_inverse_cbranch (label));
+
+ emit_insn (gen_cmpleusi (i860_compare_op0, i860_compare_op1));
+ emit_jump_insn (gen_flipped_inverse_cbranch (operands[0]));
DONE;
}")
@@ -1847,8 +1718,8 @@
(define_insn "addsi3"
[(set (match_operand:SI 0 "register_operand" "=r,*f")
- (plus:SI (match_operand:SI 1 "nonmemory_operand" "%r,!*f")
- (match_operand:SI 2 "arith_operand" "rI,!*f")))]
+ (plus:SI (match_operand:SI 1 "nonmemory_operand" "%r,*f")
+ (match_operand:SI 2 "arith_operand" "rI,*f")))]
""
"*
{
@@ -1867,8 +1738,8 @@
(define_insn "subsi3"
[(set (match_operand:SI 0 "register_operand" "=r,r,*f")
- (minus:SI (match_operand:SI 1 "register_operand" "r,I,!*f")
- (match_operand:SI 2 "arith_operand" "rI,r,!*f")))]
+ (minus:SI (match_operand:SI 1 "register_operand" "r,I,*f")
+ (match_operand:SI 2 "arith_operand" "rI,r,*f")))]
""
"*
{