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:
parent
3e98014384
commit
036a2b7a60
@ -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
|
||||||
|
@ -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))"))
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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")])
|
||||||
|
Loading…
Reference in New Issue
Block a user