predicates.md (addsubx_operand): New.

* config/xtensa/predicates.md (addsubx_operand): New.
	* config/xtensa/xtensa.c (xtensa_emit_branch): New.
	(xtensa_emit_bit_branch): New.
	(xtensa_emit_movcc): New.
	* config/xtensa/xtensa.md (any_minmax): New code macro.
	(minmax): New code attribute.
	(any_cond, any_scc, any_scc_sf): New code macros.
	(*addx2, *addx4, *addx8): Delete.
	(*addx): New.
	(*subx2, *subx4, *subx8): Delete.
	(*subx): New.
	(sminsi3, uminsi3, smaxsi3, umaxsi3): Use any_minmax macro.
	(beq, bne, bgt, bge, blt, ble, bgtu, bgeu, bltu, bleu): Use any_cond.
	(*btrue, *bfalse, *ubtrue, *ubfalse): Use xtensa_emit_branch.
	(*bittrue, *bitfalse): Use xtensa_emit_bit_branch.
	(seq, sne, sgt, sge, slt, sle): Use any_scc macro.
	(movsicc_internal0, movsicc_internal1): Use xtensa_emit_movcc.
	(movsfcc_internal0, movsfcc_internal1): Likewise.
	(seq_sf, slt_sf, sle_sf): Use any_scc_sf macro.
	* config/xtensa/xtensa-protos.h: (xtensa_emit_branch): New.
	(xtensa_emit_bit_branch): New.
	(xtensa_emit_movcc): New.
	(function_arg_boundary): Add missing prototype.

From-SVN: r118952
This commit is contained in:
Bob Wilson 2006-11-17 23:10:48 +00:00 committed by Bob Wilson
parent 3e98014384
commit 036a2b7a60
5 changed files with 189 additions and 530 deletions

View File

@ -1,3 +1,29 @@
2006-11-17 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/predicates.md (addsubx_operand): New.
* config/xtensa/xtensa.c (xtensa_emit_branch): New.
(xtensa_emit_bit_branch): New.
(xtensa_emit_movcc): New.
* config/xtensa/xtensa.md (any_minmax): New code macro.
(minmax): New code attribute.
(any_cond, any_scc, any_scc_sf): New code macros.
(*addx2, *addx4, *addx8): Delete.
(*addx): New.
(*subx2, *subx4, *subx8): Delete.
(*subx): New.
(sminsi3, uminsi3, smaxsi3, umaxsi3): Use any_minmax macro.
(beq, bne, bgt, bge, blt, ble, bgtu, bgeu, bltu, bleu): Use any_cond.
(*btrue, *bfalse, *ubtrue, *ubfalse): Use xtensa_emit_branch.
(*bittrue, *bitfalse): Use xtensa_emit_bit_branch.
(seq, sne, sgt, sge, slt, sle): Use any_scc macro.
(movsicc_internal0, movsicc_internal1): Use xtensa_emit_movcc.
(movsfcc_internal0, movsfcc_internal1): Likewise.
(seq_sf, slt_sf, sle_sf): Use any_scc_sf macro.
* config/xtensa/xtensa-protos.h: (xtensa_emit_branch): New.
(xtensa_emit_bit_branch): New.
(xtensa_emit_movcc): New.
(function_arg_boundary): Add missing prototype.
2006-11-17 Bob Wilson <bob.wilson@acm.org> 2006-11-17 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.md (tstsi): Delete * config/xtensa/xtensa.md (tstsi): Delete

View File

@ -1,5 +1,5 @@
;; Predicate definitions for Xtensa. ;; Predicate definitions for Xtensa.
;; Copyright (C) 2005 Free Software Foundation, Inc. ;; Copyright (C) 2005, 2006 Free Software Foundation, Inc.
;; ;;
;; This file is part of GCC. ;; This file is part of GCC.
;; ;;
@ -24,6 +24,12 @@
|| xtensa_simm8x256 (INTVAL (op))")) || xtensa_simm8x256 (INTVAL (op))"))
(match_operand 0 "register_operand"))) (match_operand 0 "register_operand")))
(define_predicate "addsubx_operand"
(and (match_code "const_int")
(match_test "INTVAL (op) == 2
|| INTVAL (op) == 4
|| INTVAL (op) == 8")))
(define_predicate "arith_operand" (define_predicate "arith_operand"
(ior (and (match_code "const_int") (ior (and (match_code "const_int")
(match_test "xtensa_simm8 (INTVAL (op))")) (match_test "xtensa_simm8 (INTVAL (op))"))

View File

@ -50,6 +50,9 @@ extern int xtensa_emit_move_sequence (rtx *, enum machine_mode);
extern rtx xtensa_copy_incoming_a7 (rtx); extern rtx xtensa_copy_incoming_a7 (rtx);
extern void xtensa_expand_nonlocal_goto (rtx *); extern void xtensa_expand_nonlocal_goto (rtx *);
extern void xtensa_emit_loop_end (rtx, rtx *); extern void xtensa_emit_loop_end (rtx, rtx *);
extern char *xtensa_emit_branch (bool, bool, rtx *);
extern char *xtensa_emit_bit_branch (bool, bool, rtx *);
extern char *xtensa_emit_movcc (bool, bool, bool, rtx *);
extern char *xtensa_emit_call (int, rtx *); extern char *xtensa_emit_call (int, rtx *);
#ifdef TREE_CODE #ifdef TREE_CODE
@ -71,6 +74,7 @@ extern enum reg_class xtensa_secondary_reload_class (enum reg_class,
extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree); extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree);
extern struct rtx_def *function_arg (CUMULATIVE_ARGS *, enum machine_mode, extern struct rtx_def *function_arg (CUMULATIVE_ARGS *, enum machine_mode,
tree, int); tree, int);
extern int function_arg_boundary (enum machine_mode, tree);
#endif /* TREE_CODE */ #endif /* TREE_CODE */
extern void xtensa_setup_frame_addresses (void); extern void xtensa_setup_frame_addresses (void);

View File

@ -1368,6 +1368,101 @@ xtensa_emit_loop_end (rtx insn, rtx *operands)
} }
char *
xtensa_emit_branch (bool inverted, bool immed, rtx *operands)
{
static char result[64];
enum rtx_code code;
const char *op;
code = GET_CODE (operands[3]);
switch (code)
{
case EQ: op = inverted ? "ne" : "eq"; break;
case NE: op = inverted ? "eq" : "ne"; break;
case LT: op = inverted ? "ge" : "lt"; break;
case GE: op = inverted ? "lt" : "ge"; break;
case LTU: op = inverted ? "geu" : "ltu"; break;
case GEU: op = inverted ? "ltu" : "geu"; break;
default: gcc_unreachable ();
}
if (immed)
{
if (INTVAL (operands[1]) == 0)
sprintf (result, "b%sz%s\t%%0, %%2", op,
(TARGET_DENSITY && (code == EQ || code == NE)) ? ".n" : "");
else
sprintf (result, "b%si\t%%0, %%d1, %%2", op);
}
else
sprintf (result, "b%s\t%%0, %%1, %%2", op);
return result;
}
char *
xtensa_emit_bit_branch (bool inverted, bool immed, rtx *operands)
{
static char result[64];
const char *op;
switch (GET_CODE (operands[3]))
{
case EQ: op = inverted ? "bs" : "bc"; break;
case NE: op = inverted ? "bc" : "bs"; break;
default: gcc_unreachable ();
}
if (immed)
{
unsigned bitnum = INTVAL (operands[1]) & 0x1f;
operands[1] = GEN_INT (bitnum);
sprintf (result, "b%si\t%%0, %%d1, %%2", op);
}
else
sprintf (result, "b%s\t%%0, %%1, %%2", op);
return result;
}
char *
xtensa_emit_movcc (bool inverted, bool isfp, bool isbool, rtx *operands)
{
static char result[64];
enum rtx_code code;
const char *op;
code = GET_CODE (operands[4]);
if (isbool)
{
switch (code)
{
case EQ: op = inverted ? "t" : "f"; break;
case NE: op = inverted ? "f" : "t"; break;
default: gcc_unreachable ();
}
}
else
{
switch (code)
{
case EQ: op = inverted ? "nez" : "eqz"; break;
case NE: op = inverted ? "eqz" : "nez"; break;
case LT: op = inverted ? "gez" : "ltz"; break;
case GE: op = inverted ? "ltz" : "gez"; break;
default: gcc_unreachable ();
}
}
sprintf (result, "mov%s%s\t%%0, %%%d, %%1",
op, isfp ? ".s" : "", inverted ? 3 : 2);
return result;
}
char * char *
xtensa_emit_call (int callop, rtx *operands) xtensa_emit_call (int callop, rtx *operands)
{ {

View File

@ -45,6 +45,24 @@
;; <su> is like <u>, but the signed form expands to "s" rather than "". ;; <su> is like <u>, but the signed form expands to "s" rather than "".
(define_code_attr su [(sign_extend "s") (zero_extend "u")]) (define_code_attr su [(sign_extend "s") (zero_extend "u")])
;; This code macro allows four integer min/max operations to be
;; generated from one template.
(define_code_macro any_minmax [smin umin smax umax])
;; <minmax> expands to the opcode name for any_minmax operations.
(define_code_attr minmax [(smin "min") (umin "minu")
(smax "max") (umax "maxu")])
;; This code macro allows all branch instructions to be generated from
;; a single define_expand template.
(define_code_macro any_cond [eq ne gt ge lt le gtu geu ltu leu])
;; This code macro is for setting a register from a comparison.
(define_code_macro any_scc [eq ne gt ge lt le])
;; This code macro is for floating-point comparisons.
(define_code_macro any_scc_sf [eq lt le])
;; Attributes. ;; Attributes.
@ -170,35 +188,13 @@
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "2,2,3,3,3")]) (set_attr "length" "2,2,3,3,3")])
(define_insn "*addx2" (define_insn "*addx"
[(set (match_operand:SI 0 "register_operand" "=a") [(set (match_operand:SI 0 "register_operand" "=a")
(plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 2)) (match_operand:SI 3 "addsubx_operand" "i"))
(match_operand:SI 2 "register_operand" "r")))] (match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX" "TARGET_ADDX"
"addx2\t%0, %1, %2" "addx%3\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "*addx4"
[(set (match_operand:SI 0 "register_operand" "=a")
(plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 4))
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX"
"addx4\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "*addx8"
[(set (match_operand:SI 0 "register_operand" "=a")
(plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 8))
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX"
"addx8\t%0, %1, %2"
[(set_attr "type" "arith") [(set_attr "type" "arith")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "3")]) (set_attr "length" "3")])
@ -257,35 +253,13 @@
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "3")]) (set_attr "length" "3")])
(define_insn "*subx2" (define_insn "*subx"
[(set (match_operand:SI 0 "register_operand" "=a") [(set (match_operand:SI 0 "register_operand" "=a")
(minus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") (minus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 2)) (match_operand:SI 3 "addsubx_operand" "i"))
(match_operand:SI 2 "register_operand" "r")))] (match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX" "TARGET_ADDX"
"subx2\t%0, %1, %2" "subx%3\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "*subx4"
[(set (match_operand:SI 0 "register_operand" "=a")
(minus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 4))
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX"
"subx4\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "*subx8"
[(set (match_operand:SI 0 "register_operand" "=a")
(minus:SI (mult:SI (match_operand:SI 1 "register_operand" "r")
(const_int 8))
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_ADDX"
"subx8\t%0, %1, %2"
[(set_attr "type" "arith") [(set_attr "type" "arith")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "3")]) (set_attr "length" "3")])
@ -537,42 +511,12 @@
;; Min and max. ;; Min and max.
(define_insn "sminsi3" (define_insn "<code>si3"
[(set (match_operand:SI 0 "register_operand" "=a") [(set (match_operand:SI 0 "register_operand" "=a")
(smin:SI (match_operand:SI 1 "register_operand" "%r") (any_minmax:SI (match_operand:SI 1 "register_operand" "%r")
(match_operand:SI 2 "register_operand" "r")))] (match_operand:SI 2 "register_operand" "r")))]
"TARGET_MINMAX" "TARGET_MINMAX"
"min\t%0, %1, %2" "<minmax>\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "uminsi3"
[(set (match_operand:SI 0 "register_operand" "=a")
(umin:SI (match_operand:SI 1 "register_operand" "%r")
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_MINMAX"
"minu\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "smaxsi3"
[(set (match_operand:SI 0 "register_operand" "=a")
(smax:SI (match_operand:SI 1 "register_operand" "%r")
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_MINMAX"
"max\t%0, %1, %2"
[(set_attr "type" "arith")
(set_attr "mode" "SI")
(set_attr "length" "3")])
(define_insn "umaxsi3"
[(set (match_operand:SI 0 "register_operand" "=a")
(umax:SI (match_operand:SI 1 "register_operand" "%r")
(match_operand:SI 2 "register_operand" "r")))]
"TARGET_MINMAX"
"maxu\t%0, %1, %2"
[(set_attr "type" "arith") [(set_attr "type" "arith")
(set_attr "mode" "SI") (set_attr "mode" "SI")
(set_attr "length" "3")]) (set_attr "length" "3")])
@ -1236,113 +1180,14 @@
;; Conditional branches. ;; Conditional branches.
(define_expand "beq" (define_expand "b<code>"
[(set (pc) [(set (pc)
(if_then_else (eq (cc0) (const_int 0)) (if_then_else (any_cond (cc0) (const_int 0))
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
(pc)))] (pc)))]
"" ""
{ {
xtensa_expand_conditional_branch (operands, EQ); xtensa_expand_conditional_branch (operands, <CODE>);
DONE;
})
(define_expand "bne"
[(set (pc)
(if_then_else (ne (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, NE);
DONE;
})
(define_expand "bgt"
[(set (pc)
(if_then_else (gt (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, GT);
DONE;
})
(define_expand "bge"
[(set (pc)
(if_then_else (ge (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, GE);
DONE;
})
(define_expand "blt"
[(set (pc)
(if_then_else (lt (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, LT);
DONE;
})
(define_expand "ble"
[(set (pc)
(if_then_else (le (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, LE);
DONE;
})
(define_expand "bgtu"
[(set (pc)
(if_then_else (gtu (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, GTU);
DONE;
})
(define_expand "bgeu"
[(set (pc)
(if_then_else (geu (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, GEU);
DONE;
})
(define_expand "bltu"
[(set (pc)
(if_then_else (ltu (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, LTU);
DONE;
})
(define_expand "bleu"
[(set (pc)
(if_then_else (leu (cc0) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
""
{
xtensa_expand_conditional_branch (operands, LEU);
DONE; DONE;
}) })
@ -1351,50 +1196,13 @@
(define_insn "*btrue" (define_insn "*btrue"
[(set (pc) [(set (pc)
(if_then_else (match_operator 3 "branch_operator" (if_then_else (match_operator 3 "branch_operator"
[(match_operand:SI 0 "register_operand" "r,r") [(match_operand:SI 0 "register_operand" "r,r")
(match_operand:SI 1 "branch_operand" "K,r")]) (match_operand:SI 1 "branch_operand" "K,r")])
(label_ref (match_operand 2 "" "")) (label_ref (match_operand 2 "" ""))
(pc)))] (pc)))]
"" ""
{ {
if (which_alternative == 1) return xtensa_emit_branch (false, which_alternative == 0, operands);
{
switch (GET_CODE (operands[3]))
{
case EQ: return "beq\t%0, %1, %2";
case NE: return "bne\t%0, %1, %2";
case LT: return "blt\t%0, %1, %2";
case GE: return "bge\t%0, %1, %2";
default: gcc_unreachable ();
}
}
else if (INTVAL (operands[1]) == 0)
{
switch (GET_CODE (operands[3]))
{
case EQ: return (TARGET_DENSITY
? "beqz.n\t%0, %2"
: "beqz\t%0, %2");
case NE: return (TARGET_DENSITY
? "bnez.n\t%0, %2"
: "bnez\t%0, %2");
case LT: return "bltz\t%0, %2";
case GE: return "bgez\t%0, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case EQ: return "beqi\t%0, %d1, %2";
case NE: return "bnei\t%0, %d1, %2";
case LT: return "blti\t%0, %d1, %2";
case GE: return "bgei\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump,jump") [(set_attr "type" "jump,jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1403,50 +1211,13 @@
(define_insn "*bfalse" (define_insn "*bfalse"
[(set (pc) [(set (pc)
(if_then_else (match_operator 3 "branch_operator" (if_then_else (match_operator 3 "branch_operator"
[(match_operand:SI 0 "register_operand" "r,r") [(match_operand:SI 0 "register_operand" "r,r")
(match_operand:SI 1 "branch_operand" "K,r")]) (match_operand:SI 1 "branch_operand" "K,r")])
(pc) (pc)
(label_ref (match_operand 2 "" ""))))] (label_ref (match_operand 2 "" ""))))]
"" ""
{ {
if (which_alternative == 1) return xtensa_emit_branch (true, which_alternative == 0, operands);
{
switch (GET_CODE (operands[3]))
{
case EQ: return "bne\t%0, %1, %2";
case NE: return "beq\t%0, %1, %2";
case LT: return "bge\t%0, %1, %2";
case GE: return "blt\t%0, %1, %2";
default: gcc_unreachable ();
}
}
else if (INTVAL (operands[1]) == 0)
{
switch (GET_CODE (operands[3]))
{
case EQ: return (TARGET_DENSITY
? "bnez.n\t%0, %2"
: "bnez\t%0, %2");
case NE: return (TARGET_DENSITY
? "beqz.n\t%0, %2"
: "beqz\t%0, %2");
case LT: return "bgez\t%0, %2";
case GE: return "bltz\t%0, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case EQ: return "bnei\t%0, %d1, %2";
case NE: return "beqi\t%0, %d1, %2";
case LT: return "bgei\t%0, %d1, %2";
case GE: return "blti\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump,jump") [(set_attr "type" "jump,jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1455,31 +1226,13 @@
(define_insn "*ubtrue" (define_insn "*ubtrue"
[(set (pc) [(set (pc)
(if_then_else (match_operator 3 "ubranch_operator" (if_then_else (match_operator 3 "ubranch_operator"
[(match_operand:SI 0 "register_operand" "r,r") [(match_operand:SI 0 "register_operand" "r,r")
(match_operand:SI 1 "ubranch_operand" "L,r")]) (match_operand:SI 1 "ubranch_operand" "L,r")])
(label_ref (match_operand 2 "" "")) (label_ref (match_operand 2 "" ""))
(pc)))] (pc)))]
"" ""
{ {
if (which_alternative == 1) return xtensa_emit_branch (false, which_alternative == 0, operands);
{
switch (GET_CODE (operands[3]))
{
case LTU: return "bltu\t%0, %1, %2";
case GEU: return "bgeu\t%0, %1, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case LTU: return "bltui\t%0, %d1, %2";
case GEU: return "bgeui\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump,jump") [(set_attr "type" "jump,jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1494,25 +1247,7 @@
(label_ref (match_operand 2 "" ""))))] (label_ref (match_operand 2 "" ""))))]
"" ""
{ {
if (which_alternative == 1) return xtensa_emit_branch (true, which_alternative == 0, operands);
{
switch (GET_CODE (operands[3]))
{
case LTU: return "bgeu\t%0, %1, %2";
case GEU: return "bltu\t%0, %1, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case LTU: return "bgeui\t%0, %d1, %2";
case GEU: return "bltui\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump,jump") [(set_attr "type" "jump,jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1532,27 +1267,7 @@
(pc)))] (pc)))]
"" ""
{ {
if (which_alternative == 0) return xtensa_emit_bit_branch (false, which_alternative == 0, operands);
{
unsigned bitnum = INTVAL(operands[1]) & 0x1f;
operands[1] = GEN_INT(bitnum);
switch (GET_CODE (operands[3]))
{
case EQ: return "bbci\t%0, %d1, %2";
case NE: return "bbsi\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case EQ: return "bbc\t%0, %1, %2";
case NE: return "bbs\t%0, %1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump") [(set_attr "type" "jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1570,27 +1285,7 @@
(label_ref (match_operand 2 "" ""))))] (label_ref (match_operand 2 "" ""))))]
"" ""
{ {
if (which_alternative == 0) return xtensa_emit_bit_branch (true, which_alternative == 0, operands);
{
unsigned bitnum = INTVAL (operands[1]) & 0x1f;
operands[1] = GEN_INT (bitnum);
switch (GET_CODE (operands[3]))
{
case EQ: return "bbsi\t%0, %d1, %2";
case NE: return "bbci\t%0, %d1, %2";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[3]))
{
case EQ: return "bbs\t%0, %1, %2";
case NE: return "bbc\t%0, %1, %2";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "jump") [(set_attr "type" "jump")
(set_attr "mode" "none") (set_attr "mode" "none")
@ -1677,67 +1372,13 @@
;; Setting a register from a comparison. ;; Setting a register from a comparison.
(define_expand "seq" (define_expand "s<code>"
[(set (match_operand:SI 0 "register_operand" "") [(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))] (any_scc:SI (match_dup 1)
(match_dup 2)))]
"" ""
{ {
operands[1] = gen_rtx_EQ (SImode, branch_cmp[0], branch_cmp[1]); operands[1] = gen_rtx_<CODE> (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands))
FAIL;
DONE;
})
(define_expand "sne"
[(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))]
""
{
operands[1] = gen_rtx_NE (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands))
FAIL;
DONE;
})
(define_expand "sgt"
[(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))]
""
{
operands[1] = gen_rtx_GT (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands))
FAIL;
DONE;
})
(define_expand "sge"
[(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))]
""
{
operands[1] = gen_rtx_GE (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands))
FAIL;
DONE;
})
(define_expand "slt"
[(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))]
""
{
operands[1] = gen_rtx_LT (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands))
FAIL;
DONE;
})
(define_expand "sle"
[(set (match_operand:SI 0 "register_operand" "")
(match_dup 1))]
""
{
operands[1] = gen_rtx_LE (SImode, branch_cmp[0], branch_cmp[1]);
if (!xtensa_expand_scc (operands)) if (!xtensa_expand_scc (operands))
FAIL; FAIL;
DONE; DONE;
@ -1779,29 +1420,7 @@
(match_operand:SI 3 "register_operand" "0,r")))] (match_operand:SI 3 "register_operand" "0,r")))]
"" ""
{ {
if (which_alternative == 0) return xtensa_emit_movcc (which_alternative == 1, false, false, operands);
{
switch (GET_CODE (operands[4]))
{
case EQ: return "moveqz\t%0, %2, %1";
case NE: return "movnez\t%0, %2, %1";
case LT: return "movltz\t%0, %2, %1";
case GE: return "movgez\t%0, %2, %1";
default: gcc_unreachable ();
}
}
else
{
switch (GET_CODE (operands[4]))
{
case EQ: return "movnez\t%0, %3, %1";
case NE: return "moveqz\t%0, %3, %1";
case LT: return "movgez\t%0, %3, %1";
case GE: return "movltz\t%0, %3, %1";
default: gcc_unreachable ();
}
}
gcc_unreachable ();
} }
[(set_attr "type" "move,move") [(set_attr "type" "move,move")
(set_attr "mode" "SI") (set_attr "mode" "SI")
@ -1816,18 +1435,7 @@
(match_operand:SI 3 "register_operand" "0,r")))] (match_operand:SI 3 "register_operand" "0,r")))]
"TARGET_BOOLEANS" "TARGET_BOOLEANS"
{ {
int isEq = (GET_CODE (operands[4]) == EQ); return xtensa_emit_movcc (which_alternative == 1, false, true, operands);
switch (which_alternative)
{
case 0:
if (isEq) return "movf\t%0, %2, %1";
return "movt\t%0, %2, %1";
case 1:
if (isEq) return "movt\t%0, %3, %1";
return "movf\t%0, %3, %1";
default:
gcc_unreachable ();
}
} }
[(set_attr "type" "move,move") [(set_attr "type" "move,move")
(set_attr "mode" "SI") (set_attr "mode" "SI")
@ -1842,52 +1450,8 @@
(match_operand:SF 3 "register_operand" "0,r,0,f")))] (match_operand:SF 3 "register_operand" "0,r,0,f")))]
"" ""
{ {
switch (which_alternative) return xtensa_emit_movcc ((which_alternative & 1) == 1,
{ which_alternative >= 2, false, operands);
case 0:
switch (GET_CODE (operands[4]))
{
case EQ: return "moveqz\t%0, %2, %1";
case NE: return "movnez\t%0, %2, %1";
case LT: return "movltz\t%0, %2, %1";
case GE: return "movgez\t%0, %2, %1";
default: gcc_unreachable ();
}
break;
case 1:
switch (GET_CODE (operands[4]))
{
case EQ: return "movnez\t%0, %3, %1";
case NE: return "moveqz\t%0, %3, %1";
case LT: return "movgez\t%0, %3, %1";
case GE: return "movltz\t%0, %3, %1";
default: gcc_unreachable ();
}
break;
case 2:
switch (GET_CODE (operands[4]))
{
case EQ: return "moveqz.s %0, %2, %1";
case NE: return "movnez.s %0, %2, %1";
case LT: return "movltz.s %0, %2, %1";
case GE: return "movgez.s %0, %2, %1";
default: gcc_unreachable ();
}
break;
case 3:
switch (GET_CODE (operands[4]))
{
case EQ: return "movnez.s %0, %3, %1";
case NE: return "moveqz.s %0, %3, %1";
case LT: return "movgez.s %0, %3, %1";
case GE: return "movltz.s %0, %3, %1";
default: gcc_unreachable ();
}
break;
default:
gcc_unreachable ();
}
gcc_unreachable ();
} }
[(set_attr "type" "move,move,move,move") [(set_attr "type" "move,move,move,move")
(set_attr "mode" "SF") (set_attr "mode" "SF")
@ -1902,24 +1466,8 @@
(match_operand:SF 3 "register_operand" "0,r,0,f")))] (match_operand:SF 3 "register_operand" "0,r,0,f")))]
"TARGET_BOOLEANS" "TARGET_BOOLEANS"
{ {
int isEq = (GET_CODE (operands[4]) == EQ); return xtensa_emit_movcc ((which_alternative & 1) == 1,
switch (which_alternative) which_alternative >= 2, true, operands);
{
case 0:
if (isEq) return "movf\t%0, %2, %1";
return "movt\t%0, %2, %1";
case 1:
if (isEq) return "movt\t%0, %3, %1";
return "movf\t%0, %3, %1";
case 2:
if (isEq) return "movf.s\t%0, %2, %1";
return "movt.s\t%0, %2, %1";
case 3:
if (isEq) return "movt.s\t%0, %3, %1";
return "movf.s\t%0, %3, %1";
default:
gcc_unreachable ();
}
} }
[(set_attr "type" "move,move,move,move") [(set_attr "type" "move,move,move,move")
(set_attr "mode" "SF") (set_attr "mode" "SF")
@ -1928,32 +1476,12 @@
;; Floating-point comparisons. ;; Floating-point comparisons.
(define_insn "seq_sf" (define_insn "s<code>_sf"
[(set (match_operand:CC 0 "register_operand" "=b") [(set (match_operand:CC 0 "register_operand" "=b")
(eq:CC (match_operand:SF 1 "register_operand" "f") (any_scc_sf:CC (match_operand:SF 1 "register_operand" "f")
(match_operand:SF 2 "register_operand" "f")))] (match_operand:SF 2 "register_operand" "f")))]
"TARGET_HARD_FLOAT" "TARGET_HARD_FLOAT"
"oeq.s\t%0, %1, %2" "o<code>.s\t%0, %1, %2"
[(set_attr "type" "farith")
(set_attr "mode" "BL")
(set_attr "length" "3")])
(define_insn "slt_sf"
[(set (match_operand:CC 0 "register_operand" "=b")
(lt:CC (match_operand:SF 1 "register_operand" "f")
(match_operand:SF 2 "register_operand" "f")))]
"TARGET_HARD_FLOAT"
"olt.s\t%0, %1, %2"
[(set_attr "type" "farith")
(set_attr "mode" "BL")
(set_attr "length" "3")])
(define_insn "sle_sf"
[(set (match_operand:CC 0 "register_operand" "=b")
(le:CC (match_operand:SF 1 "register_operand" "f")
(match_operand:SF 2 "register_operand" "f")))]
"TARGET_HARD_FLOAT"
"ole.s\t%0, %1, %2"
[(set_attr "type" "farith") [(set_attr "type" "farith")
(set_attr "mode" "BL") (set_attr "mode" "BL")
(set_attr "length" "3")]) (set_attr "length" "3")])