Commit 16659fcf by DJ Delorie Committed by DJ Delorie

cond.md: Set condition flags properly throughout.

* config/m32c/cond.md: Set condition flags properly throughout.
* config/m32c/minmax.md: Likewise.
* config/m32c/prologue.md: Likewise.
* config/m32c/bitops.md: Likewise.
* config/m32c/muldiv.md: Likewise.
* config/m32c/mov.md: Likewise.
* config/m32c/addsub.md: Likewise.
* config/m32c/m32c.md: Likewise.
* config/m32c/jump.md: Likewise.
* config/m32c/shift.md: Likewise.

* config/m32c/cond.md (cmp<mode>): Call m32c_output_compare to
conditionally output the pattern for this.
* config/m32c/m32c.c (flags_needed_for_conditional): New.
(m32c_compare_redundant): New.
(m32c_output_compare): New.
* config/m32c/m32c-protos.h (m32c_output_compare): New.

* config/m32c/m32c.c (m32c_prepare_shift): Fix logic to clobber
dest, not src.  Allow other 4-byte modes.

From-SVN: r112591
parent 6b04402b
2006-03-31 DJ Delorie <dj@redhat.com>
* config/m32c/cond.md: Set condition flags properly throughout.
* config/m32c/minmax.md: Likewise.
* config/m32c/prologue.md: Likewise.
* config/m32c/bitops.md: Likewise.
* config/m32c/muldiv.md: Likewise.
* config/m32c/mov.md: Likewise.
* config/m32c/addsub.md: Likewise.
* config/m32c/m32c.md: Likewise.
* config/m32c/jump.md: Likewise.
* config/m32c/shift.md: Likewise.
* config/m32c/cond.md (cmp<mode>): Call m32c_output_compare to
conditionally output the pattern for this.
* config/m32c/m32c.c (flags_needed_for_conditional): New.
(m32c_compare_redundant): New.
(m32c_output_compare): New.
* config/m32c/m32c-protos.h (m32c_output_compare): New.
* config/m32c/m32c.c (m32c_prepare_shift): Fix logic to clobber
dest, not src. Allow other 4-byte modes.
2006-03-30 Denis Chertykov <denisc@overta.ru> 2006-03-30 Denis Chertykov <denisc@overta.ru>
* doc/md.texi: Refer to avr/constraints.md instead of * doc/md.texi: Refer to avr/constraints.md instead of
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
stc\t%1,%0 stc\t%1,%0
mova\t%D2[%1],%0 mova\t%D2[%1],%0
add.w\t%2,%0" add.w\t%2,%0"
[(set_attr "flags" "oszc,oszc,oszc,oszc,oszc,oszc,oszc,oszc,oszc,oszc")] [(set_attr "flags" "oszc,oszc,oszc,oszc,oszc,oszc,n,n,n,oszc")]
) )
(define_insn "addpsi3" (define_insn "addpsi3"
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
add.l\t%2,%0 add.l\t%2,%0
mova\t%d2[%1],%0 mova\t%d2[%1],%0
mova\t%D2[%1],%0" mova\t%D2[%1],%0"
[(set_attr "flags" "oszc,oszc,oszc,oszc,oszc,*,*")] [(set_attr "flags" "oszc,oszc,oszc,oszc,oszc,n,n")]
) )
(define_insn "subqi3" (define_insn "subqi3"
...@@ -134,7 +134,7 @@ ...@@ -134,7 +134,7 @@
(neg:SI (match_operand:SI 1 "mra_operand" "0,0")))] (neg:SI (match_operand:SI 1 "mra_operand" "0,0")))]
"" ""
"not.w %h0 | not.w %H0 | add.w #1,%h0 | adcf.w %H0" "not.w %h0 | not.w %H0 | add.w #1,%h0 | adcf.w %H0"
[(set_attr "flags" "oszc,oszc")] [(set_attr "flags" "x")]
) )
(define_insn "absqi2" (define_insn "absqi2"
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
(match_operand:QI 2 "" "0")))] (match_operand:QI 2 "" "0")))]
"TARGET_A16" "TARGET_A16"
"bset\t%0[%1]" "bset\t%0[%1]"
[(set_attr "flags" "sz")] [(set_attr "flags" "n")]
) )
(define_insn "bset_hi" (define_insn "bset_hi"
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
(const_int 1))] (const_int 1))]
"TARGET_A16" "TARGET_A16"
"bset\t%0[%1]" "bset\t%0[%1]"
[(set_attr "flags" "sz")] [(set_attr "flags" "n")]
) )
;;---------------------------------------------------------------------- ;;----------------------------------------------------------------------
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
(const_int 0))] (const_int 0))]
"TARGET_A16" "TARGET_A16"
"bclr\t%0[%1]" "bclr\t%0[%1]"
[(set_attr "flags" "sz")] [(set_attr "flags" "n")]
) )
...@@ -183,18 +183,17 @@ ...@@ -183,18 +183,17 @@
(define_insn "iorqi3_24" (define_insn "iorqi3_24"
[(set (match_operand:QI 0 "mra_operand" "=Sd,Rqi,RqiSd,??Rmm,RqiSd,??Rmm") [(set (match_operand:QI 0 "mra_operand" "=RqiSd,RqiSd,??Rmm,RqiSd,??Rmm")
(ior:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0,0") (ior:QI (match_operand:QI 1 "mra_operand" "%0,0,0,0,0")
(match_operand:QI 2 "mrai_operand" "Ilb,Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm")))] (match_operand:QI 2 "mrai_operand" "Ilb,iRhlSd,iRhlSd,?Rmm,?Rmm")))]
"TARGET_A24" "TARGET_A24"
"@ "@
bset\t%B2,%0 bset\t%B2,%0
bset\t%B2,%0
or.b\t%x2,%0 or.b\t%x2,%0
or.b\t%x2,%0 or.b\t%x2,%0
or.b\t%x2,%0 or.b\t%x2,%0
or.b\t%x2,%0" or.b\t%x2,%0"
[(set_attr "flags" "n,n,sz,sz,sz,sz")] [(set_attr "flags" "n,sz,sz,sz,sz")]
) )
(define_insn "iorhi3_24" (define_insn "iorhi3_24"
......
...@@ -60,7 +60,9 @@ ...@@ -60,7 +60,9 @@
"@ "@
stzx\t%1,%2,%0 stzx\t%1,%2,%0
stz\t%1,%0 stz\t%1,%0
stnz\t%2,%0") stnz\t%2,%0"
[(set_attr "flags" "n,n,n")]
)
(define_insn "stzx_24_<mode>" (define_insn "stzx_24_<mode>"
[(set (match_operand:QHI 0 "mrai_operand" "=RraSd,RraSd,RraSd") [(set (match_operand:QHI 0 "mrai_operand" "=RraSd,RraSd,RraSd")
...@@ -71,7 +73,8 @@ ...@@ -71,7 +73,8 @@
"@ "@
stzx.<bwl>\t%1,%2,%0 stzx.<bwl>\t%1,%2,%0
stz.<bwl>\t%1,%0 stz.<bwl>\t%1,%0
stnz.<bwl>\t%2,%0") stnz.<bwl>\t%2,%0"
[(set_attr "flags" "n,n,n")])
(define_insn_and_split "stzx_reversed" (define_insn_and_split "stzx_reversed"
[(set (match_operand 0 "m32c_r0_operand" "") [(set (match_operand 0 "m32c_r0_operand" "")
...@@ -94,7 +97,8 @@ ...@@ -94,7 +97,8 @@
(compare (match_operand:QHPSI 0 "mra_operand" "RraSd") (compare (match_operand:QHPSI 0 "mra_operand" "RraSd")
(match_operand:QHPSI 1 "mrai_operand" "RraSdi")))] (match_operand:QHPSI 1 "mrai_operand" "RraSdi")))]
"" ""
"cmp.<bwl>\t%1,%0") "* return m32c_output_compare(insn, operands); "
[(set_attr "flags" "oszc")])
(define_insn "b<code>" (define_insn "b<code>"
[(set (pc) [(set (pc)
...@@ -104,6 +108,7 @@ ...@@ -104,6 +108,7 @@
(pc)))] (pc)))]
"" ""
"j<code>\t%l0" "j<code>\t%l0"
[(set_attr "flags" "n")]
) )
;; m32c_conditional_register_usage changes the setcc_gen_code array to ;; m32c_conditional_register_usage changes the setcc_gen_code array to
...@@ -119,7 +124,9 @@ ...@@ -119,7 +124,9 @@
[(set (match_operand:HI 0 "mra_operand" "=RhiSd") [(set (match_operand:HI 0 "mra_operand" "=RhiSd")
(any_cond:HI (reg:CC FLG_REGNO) (const_int 0)))] (any_cond:HI (reg:CC FLG_REGNO) (const_int 0)))]
"TARGET_A24" "TARGET_A24"
"sc<code>\t%0") "sc<code>\t%0"
[(set_attr "flags" "n")]
)
(define_expand "movqicc" (define_expand "movqicc"
[(set (match_operand:QI 0 "register_operand" "") [(set (match_operand:QI 0 "register_operand" "")
...@@ -148,10 +155,10 @@ ...@@ -148,10 +155,10 @@
;; value. This pattern recovers the sign of the discarded value based ;; value. This pattern recovers the sign of the discarded value based
;; on the flags. Operand 0 is set to -1, 0, or 1. This is used for ;; on the flags. Operand 0 is set to -1, 0, or 1. This is used for
;; the cmpstr pattern. For optimal code, this should be removed if ;; the cmpstr pattern. For optimal code, this should be removed if
;; followed by a suitable CMP insn, as SCMPU sets the flags correctly ;; followed by a suitable CMP insn (see the peephole following). This
;; already (see the peephole following). This pattern is 7 bytes and ;; pattern is 7 bytes and 5 cycles. If you don't need specific
;; 5 cycles. If you don't need specific values, a 5/4 pattern can be ;; values, a 5/4 pattern can be made with SCGT and BMLT to set the
;; made with SCGT and BMLT to set the appropriate bits. ;; appropriate bits.
(define_insn "cond_to_int" (define_insn "cond_to_int"
[(set (match_operand:HI 0 "mra_qi_operand" "=Rqi") [(set (match_operand:HI 0 "mra_qi_operand" "=Rqi")
...@@ -162,7 +169,7 @@ ...@@ -162,7 +169,7 @@
(const_int -1))))] (const_int -1))))]
"TARGET_A24" "TARGET_A24"
"sceq\t%0\n\tbmgt\t1,%h0\n\tdec.w\t%0" "sceq\t%0\n\tbmgt\t1,%h0\n\tdec.w\t%0"
[(set_attr "flags" "sz")] [(set_attr "flags" "x")]
) )
;; A cond_to_int followed by a compare against zero is essentially a no-op. ;; A cond_to_int followed by a compare against zero is essentially a no-op.
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
; "jmpi.a\t%0" ; "jmpi.a\t%0"
; no 16 bit jmpi in r8c ; no 16 bit jmpi in r8c
"push.b #0 | push.w\t%0 | rts" "push.b #0 | push.w\t%0 | rts"
[(set_attr "flags" "x")]
) )
(define_insn "indirect_jump_24" (define_insn "indirect_jump_24"
...@@ -36,6 +37,7 @@ ...@@ -36,6 +37,7 @@
(match_operand:PSI 0 "register_operand" "Rpi"))] (match_operand:PSI 0 "register_operand" "Rpi"))]
"TARGET_A24" "TARGET_A24"
"jmpi.a\t%0" "jmpi.a\t%0"
[(set_attr "flags" "n")]
) )
(define_expand "indirect_jump" (define_expand "indirect_jump"
...@@ -56,6 +58,7 @@ ...@@ -56,6 +58,7 @@
(label_ref (match_operand 0 "" "")))] (label_ref (match_operand 0 "" "")))]
"" ""
"jmp.a\t%l0" "jmp.a\t%l0"
[(set_attr "flags" "n")]
) )
; No 16 bit indirect calls on r8c/m16c. */ ; No 16 bit indirect calls on r8c/m16c. */
...@@ -70,6 +73,7 @@ switch (which_alternative) { ...@@ -70,6 +73,7 @@ switch (which_alternative) {
case 1: return TARGET_A16 ? \"push.w %a0 | jsr.a\tm32c_jsri16\" : \"jsri.a\t%a0\"; case 1: return TARGET_A16 ? \"push.w %a0 | jsr.a\tm32c_jsri16\" : \"jsri.a\t%a0\";
case 2: return \"jsri.a\t%a0\"; case 2: return \"jsri.a\t%a0\";
}" }"
[(set_attr "flags" "x")]
) )
(define_insn "call_value" (define_insn "call_value"
...@@ -84,4 +88,5 @@ switch (which_alternative) { ...@@ -84,4 +88,5 @@ switch (which_alternative) {
case 1: return TARGET_A16 ? \"push.w %a1 | jsr.a\tm32c_jsri16\" : \"jsri.a\t%a1\"; case 1: return TARGET_A16 ? \"push.w %a1 | jsr.a\tm32c_jsri16\" : \"jsri.a\t%a1\";
case 2: return \"jsri.a\t%a1\"; case 2: return \"jsri.a\t%a1\";
}" }"
[(set_attr "flags" "x,x,x")]
) )
...@@ -84,6 +84,7 @@ int m32c_memory_move_cost (MM, int, int); ...@@ -84,6 +84,7 @@ int m32c_memory_move_cost (MM, int, int);
int m32c_mode_dependent_address (rtx); int m32c_mode_dependent_address (rtx);
int m32c_modes_tieable_p (MM, MM); int m32c_modes_tieable_p (MM, MM);
bool m32c_mov_ok (rtx *, MM); bool m32c_mov_ok (rtx *, MM);
char * m32c_output_compare (rtx, rtx *);
int m32c_preferred_output_reload_class (rtx, int); int m32c_preferred_output_reload_class (rtx, int);
int m32c_preferred_reload_class (rtx, int); int m32c_preferred_reload_class (rtx, int);
int m32c_prepare_move (rtx *, MM); int m32c_prepare_move (rtx *, MM);
......
...@@ -3291,9 +3291,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code) ...@@ -3291,9 +3291,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code)
else else
/* We'll only use it for the shift, no point emitting a move. */ /* We'll only use it for the shift, no point emitting a move. */
temp = operands[2]; temp = operands[2];
if (TARGET_A16 && mode == SImode) if (TARGET_A16 && GET_MODE_SIZE (mode) == 4)
{ {
/* The m16c has a limit of -16..16 for SI shifts, even when the /* The m16c has a limit of -16..16 for SI shifts, even when the
shift count is in a register. Since there are so many targets shift count is in a register. Since there are so many targets
...@@ -3318,6 +3317,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code) ...@@ -3318,6 +3317,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code)
rtx count; rtx count;
rtx label, lref, insn; rtx label, lref, insn;
emit_move_insn (operands[0], operands[1]);
count = temp; count = temp;
label = gen_label_rtx (); label = gen_label_rtx ();
lref = gen_rtx_LABEL_REF (VOIDmode, label); lref = gen_rtx_LABEL_REF (VOIDmode, label);
...@@ -3328,8 +3329,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code) ...@@ -3328,8 +3329,8 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code)
/* This is a left shift. We only need check positive counts. */ /* This is a left shift. We only need check positive counts. */
emit_jump_insn (gen_cbranchqi4 (gen_rtx_LE (VOIDmode, 0, 0), emit_jump_insn (gen_cbranchqi4 (gen_rtx_LE (VOIDmode, 0, 0),
count, GEN_INT (16), label)); count, GEN_INT (16), label));
emit_insn (func (operands[1], operands[1], GEN_INT (8))); emit_insn (func (operands[0], operands[0], GEN_INT (8)));
emit_insn (func (operands[1], operands[1], GEN_INT (8))); emit_insn (func (operands[0], operands[0], GEN_INT (8)));
insn = emit_insn (gen_addqi3 (count, count, GEN_INT (-16))); insn = emit_insn (gen_addqi3 (count, count, GEN_INT (-16)));
emit_label_after (label, insn); emit_label_after (label, insn);
} }
...@@ -3338,12 +3339,14 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code) ...@@ -3338,12 +3339,14 @@ m32c_prepare_shift (rtx * operands, int scale, int shift_code)
/* This is a right shift. We only need check negative counts. */ /* This is a right shift. We only need check negative counts. */
emit_jump_insn (gen_cbranchqi4 (gen_rtx_GE (VOIDmode, 0, 0), emit_jump_insn (gen_cbranchqi4 (gen_rtx_GE (VOIDmode, 0, 0),
count, GEN_INT (-16), label)); count, GEN_INT (-16), label));
emit_insn (func (operands[1], operands[1], GEN_INT (-8))); emit_insn (func (operands[0], operands[0], GEN_INT (-8)));
emit_insn (func (operands[1], operands[1], GEN_INT (-8))); emit_insn (func (operands[0], operands[0], GEN_INT (-8)));
insn = emit_insn (gen_addqi3 (count, count, GEN_INT (16))); insn = emit_insn (gen_addqi3 (count, count, GEN_INT (16)));
emit_label_after (label, insn); emit_label_after (label, insn);
} }
operands[1] = operands[0];
emit_insn (func (operands[0], operands[0], count));
return 1;
} }
operands[2] = temp; operands[2] = temp;
...@@ -3459,6 +3462,7 @@ m32c_expand_insv (rtx *operands) ...@@ -3459,6 +3462,7 @@ m32c_expand_insv (rtx *operands)
storing a zero, we want an AND mask, so invert it. */ storing a zero, we want an AND mask, so invert it. */
if (INTVAL (operands[3]) == 0) if (INTVAL (operands[3]) == 0)
{ {
/* Storing a zero, use an AND mask */
if (GET_MODE (op0) == HImode) if (GET_MODE (op0) == HImode)
mask ^= 0xffff; mask ^= 0xffff;
else else
...@@ -3691,6 +3695,239 @@ m32c_emit_eh_epilogue (rtx ret_addr) ...@@ -3691,6 +3695,239 @@ m32c_emit_eh_epilogue (rtx ret_addr)
emit_barrier (); emit_barrier ();
} }
/* Indicate which flags must be properly set for a given conditional. */
static int
flags_needed_for_conditional (rtx cond)
{
switch (GET_CODE (cond))
{
case LE:
case GT:
return FLAGS_OSZ;
case LEU:
case GTU:
return FLAGS_ZC;
case LT:
case GE:
return FLAGS_OS;
case LTU:
case GEU:
return FLAGS_C;
case EQ:
case NE:
return FLAGS_Z;
default:
return FLAGS_N;
}
}
#define DEBUG_CMP 0
/* Returns true if a compare insn is redundant because it would only
set flags that are already set correctly. */
static bool
m32c_compare_redundant (rtx cmp, rtx *operands)
{
int flags_needed;
int pflags;
rtx prev, pp, next;
rtx op0, op1, op2;
#if DEBUG_CMP
int prev_icode, i;
#endif
op0 = operands[0];
op1 = operands[1];
op2 = operands[2];
#if DEBUG_CMP
fprintf(stderr, "\n\033[32mm32c_compare_redundant\033[0m\n");
debug_rtx(cmp);
for (i=0; i<2; i++)
{
fprintf(stderr, "operands[%d] = ", i);
debug_rtx(operands[i]);
}
#endif
next = next_nonnote_insn (cmp);
if (!next || !INSN_P (next))
{
#if DEBUG_CMP
fprintf(stderr, "compare not followed by insn\n");
debug_rtx(next);
#endif
return false;
}
if (GET_CODE (PATTERN (next)) == SET
&& GET_CODE (XEXP ( PATTERN (next), 1)) == IF_THEN_ELSE)
{
next = XEXP (XEXP (PATTERN (next), 1), 0);
}
else if (GET_CODE (PATTERN (next)) == SET)
{
/* If this is a conditional, flags_needed will be something
other than FLAGS_N, which we test below. */
next = XEXP (PATTERN (next), 1);
}
else
{
#if DEBUG_CMP
fprintf(stderr, "compare not followed by conditional\n");
debug_rtx(next);
#endif
return false;
}
#if DEBUG_CMP
fprintf(stderr, "conditional is: ");
debug_rtx(next);
#endif
flags_needed = flags_needed_for_conditional (next);
if (flags_needed == FLAGS_N)
{
#if DEBUG_CMP
fprintf(stderr, "compare not followed by conditional\n");
debug_rtx(next);
#endif
return false;
}
/* Compare doesn't set overflow and carry the same way that
arithmetic instructions do, so we can't replace those. */
if (flags_needed & FLAGS_OC)
return false;
prev = cmp;
do {
prev = prev_nonnote_insn (prev);
if (!prev)
{
#if DEBUG_CMP
fprintf(stderr, "No previous insn.\n");
#endif
return false;
}
if (!INSN_P (prev))
{
#if DEBUG_CMP
fprintf(stderr, "Previous insn is a non-insn.\n");
#endif
return false;
}
pp = PATTERN (prev);
if (GET_CODE (pp) != SET)
{
#if DEBUG_CMP
fprintf(stderr, "Previous insn is not a SET.\n");
#endif
return false;
}
pflags = get_attr_flags (prev);
/* Looking up attributes of previous insns corrupted the recog
tables. */
INSN_UID (cmp) = -1;
recog (PATTERN (cmp), cmp, 0);
if (pflags == FLAGS_N
&& reg_mentioned_p (op0, pp))
{
#if DEBUG_CMP
fprintf(stderr, "intermediate non-flags insn uses op:\n");
debug_rtx(prev);
#endif
return false;
}
} while (pflags == FLAGS_N);
#if DEBUG_CMP
fprintf(stderr, "previous flag-setting insn:\n");
debug_rtx(prev);
debug_rtx(pp);
#endif
if (GET_CODE (pp) == SET
&& GET_CODE (XEXP (pp, 0)) == REG
&& REGNO (XEXP (pp, 0)) == FLG_REGNO
&& GET_CODE (XEXP (pp, 1)) == COMPARE)
{
/* Adjacent cbranches must have the same operands to be
redundant. */
rtx pop0 = XEXP (XEXP (pp, 1), 0);
rtx pop1 = XEXP (XEXP (pp, 1), 1);
#if DEBUG_CMP
fprintf(stderr, "adjacent cbranches\n");
debug_rtx(pop0);
debug_rtx(pop1);
#endif
if (rtx_equal_p (op0, pop0)
&& rtx_equal_p (op1, pop1))
return true;
#if DEBUG_CMP
fprintf(stderr, "prev cmp not same\n");
#endif
return false;
}
/* Else the previous insn must be a SET, with either the source or
dest equal to operands[0], and operands[1] must be zero. */
if (!rtx_equal_p (op1, const0_rtx))
{
#if DEBUG_CMP
fprintf(stderr, "operands[1] not const0_rtx\n");
#endif
return false;
}
if (GET_CODE (pp) != SET)
{
#if DEBUG_CMP
fprintf (stderr, "pp not set\n");
#endif
return false;
}
if (!rtx_equal_p (op0, SET_SRC (pp))
&& !rtx_equal_p (op0, SET_DEST (pp)))
{
#if DEBUG_CMP
fprintf(stderr, "operands[0] not found in set\n");
#endif
return false;
}
#if DEBUG_CMP
fprintf(stderr, "cmp flags %x prev flags %x\n", flags_needed, pflags);
#endif
if ((pflags & flags_needed) == flags_needed)
return true;
return false;
}
/* Return the pattern for a compare. This will be commented out if
the compare is redundant, else a normal pattern is returned. Thus,
the assembler output says where the compare would have been. */
char *
m32c_output_compare (rtx insn, rtx *operands)
{
static char template[] = ";cmp.b\t%1,%0";
/* ^ 5 */
template[5] = " bwll"[GET_MODE_SIZE(GET_MODE(operands[0]))];
if (m32c_compare_redundant (insn, operands))
{
#if DEBUG_CMP
fprintf(stderr, "cbranch: cmp not needed\n");
#endif
return template;
}
#if DEBUG_CMP
fprintf(stderr, "cbranch: cmp needed: `%s'\n", template);
#endif
return template + 1;
}
/* The Global `targetm' Variable. */ /* The Global `targetm' Variable. */
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
......
...@@ -70,9 +70,13 @@ ...@@ -70,9 +70,13 @@
(define_insn "nop" (define_insn "nop"
[(const_int 0)] [(const_int 0)]
"" ""
"nop") "nop"
[(set_attr "flags" "n")]
)
(define_insn "no_insn" (define_insn "no_insn"
[(const_int 1)] [(const_int 1)]
"" ""
"") ""
[(set_attr "flags" "n")]
)
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
(match_operand:QI 2 "mrai_operand" "iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm")))] (match_operand:QI 2 "mrai_operand" "iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm")))]
"TARGET_A24" "TARGET_A24"
"min.b\t%2,%0" "min.b\t%2,%0"
[(set_attr "flags" "n")]
) )
(define_insn "sminhi3" (define_insn "sminhi3"
...@@ -36,6 +37,7 @@ ...@@ -36,6 +37,7 @@
(match_operand:HI 2 "mrai_operand" "iRhiSd,?Rmm,iRhiSd,?Rmm")))] (match_operand:HI 2 "mrai_operand" "iRhiSd,?Rmm,iRhiSd,?Rmm")))]
"TARGET_A24" "TARGET_A24"
"min.w\t%2,%0" "min.w\t%2,%0"
[(set_attr "flags" "n")]
) )
(define_insn "smaxqi3" (define_insn "smaxqi3"
...@@ -44,6 +46,7 @@ ...@@ -44,6 +46,7 @@
(match_operand:QI 2 "mrai_operand" "iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm")))] (match_operand:QI 2 "mrai_operand" "iRhlSdRaa,?Rmm,iRhlSdRaa,?Rmm,iRhlSd,?Rmm")))]
"TARGET_A24" "TARGET_A24"
"max.b\t%2,%0" "max.b\t%2,%0"
[(set_attr "flags" "n")]
) )
(define_insn "smaxhi3" (define_insn "smaxhi3"
...@@ -52,4 +55,5 @@ ...@@ -52,4 +55,5 @@
(match_operand:HI 2 "mrai_operand" "iRhiSd,?Rmm,iRhiSd,?Rmm")))] (match_operand:HI 2 "mrai_operand" "iRhiSd,?Rmm,iRhiSd,?Rmm")))]
"TARGET_A24" "TARGET_A24"
"max.w\t%2,%0" "max.w\t%2,%0"
[(set_attr "flags" "n")]
) )
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
pop.w\t%0 pop.w\t%0
pushc\t%1 pushc\t%1
popc\t%0" popc\t%0"
[(set_attr "flags" "sz,sz,sz,*,*,*,*,*,*")] [(set_attr "flags" "sz,sz,sz,n,n,n,n,n,n")]
) )
(define_expand "movhi" (define_expand "movhi"
...@@ -97,7 +97,7 @@ ...@@ -97,7 +97,7 @@
pushc\t%1 pushc\t%1
popc\t%0 popc\t%0
#" #"
[(set_attr "flags" "sz,sz,*,*,*,*,*,*")] [(set_attr "flags" "sz,sz,n,n,n,n,n,*")]
) )
...@@ -182,6 +182,7 @@ ...@@ -182,6 +182,7 @@
(match_operand 0 "a_operand" "Raa"))] (match_operand 0 "a_operand" "Raa"))]
"" ""
"push.l\t%0" "push.l\t%0"
[(set_attr "flags" "n")]
) )
(define_insn "movsi_24" (define_insn "movsi_24"
...@@ -193,6 +194,7 @@ ...@@ -193,6 +194,7 @@
mov.l\t%1,%0 mov.l\t%1,%0
# #
push.l\t%1" push.l\t%1"
[(set_attr "flags" "sz,sz,*,n")]
) )
(define_expand "movdi" (define_expand "movdi"
...@@ -220,6 +222,7 @@ ...@@ -220,6 +222,7 @@
(match_operand:QI 0 "mrai_operand" "iRqiSd*Rmm"))] (match_operand:QI 0 "mrai_operand" "iRqiSd*Rmm"))]
"" ""
"push.b\t%0" "push.b\t%0"
[(set_attr "flags" "n")]
) )
(define_expand "pushhi" (define_expand "pushhi"
...@@ -240,6 +243,7 @@ ...@@ -240,6 +243,7 @@
"@ "@
push.w\t%0 push.w\t%0
pushc\t%0" pushc\t%0"
[(set_attr "flags" "n,n")]
) )
(define_insn "pushhi_24" (define_insn "pushhi_24"
...@@ -247,6 +251,7 @@ ...@@ -247,6 +251,7 @@
(match_operand:HI 0 "mrai_operand" "iRhiSd*Rmm"))] (match_operand:HI 0 "mrai_operand" "iRhiSd*Rmm"))]
"TARGET_A24" "TARGET_A24"
"push.w\t%0" "push.w\t%0"
[(set_attr "flags" "n")]
) )
;(define_insn "pushpi" ;(define_insn "pushpi"
...@@ -263,6 +268,7 @@ ...@@ -263,6 +268,7 @@
(match_operand:SI 0 "mrai_operand" "iRsiSd*Rmm"))] (match_operand:SI 0 "mrai_operand" "iRsiSd*Rmm"))]
"TARGET_A24" "TARGET_A24"
"push.l\t%0" "push.l\t%0"
[(set_attr "flags" "n")]
) )
(define_expand "pophi" (define_expand "pophi"
...@@ -283,6 +289,7 @@ ...@@ -283,6 +289,7 @@
"@ "@
pop.w\t%0 pop.w\t%0
popc\t%0" popc\t%0"
[(set_attr "flags" "n,n")]
) )
(define_insn "pophi_24" (define_insn "pophi_24"
...@@ -290,6 +297,7 @@ ...@@ -290,6 +297,7 @@
(mem:HI (post_inc:PSI (reg:PSI SP_REGNO))))] (mem:HI (post_inc:PSI (reg:PSI SP_REGNO))))]
"TARGET_A24" "TARGET_A24"
"pop.w\t%0" "pop.w\t%0"
[(set_attr "flags" "n")]
) )
(define_insn "poppsi" (define_insn "poppsi"
...@@ -297,6 +305,7 @@ ...@@ -297,6 +305,7 @@
(mem:PSI (post_inc:PSI (reg:PSI SP_REGNO))))] (mem:PSI (post_inc:PSI (reg:PSI SP_REGNO))))]
"TARGET_A24" "TARGET_A24"
"popc\t%0" "popc\t%0"
[(set_attr "flags" "n")]
) )
...@@ -316,7 +325,7 @@ ...@@ -316,7 +325,7 @@
"* "*
if (REGNO(operands[0]) == 0) return \"exts.w\t%1\"; if (REGNO(operands[0]) == 0) return \"exts.w\t%1\";
else return \"mov.w r1,r3 | sha.w #-8,r3 | sha.w #-7,r3\";" else return \"mov.w r1,r3 | sha.w #-8,r3 | sha.w #-7,r3\";"
[(set_attr "flags" "sz")] [(set_attr "flags" "x")]
) )
(define_insn "extendpsisi2" (define_insn "extendpsisi2"
...@@ -324,6 +333,7 @@ ...@@ -324,6 +333,7 @@
(sign_extend:SI (match_operand:PSI 1 "mr_operand" "0")))] (sign_extend:SI (match_operand:PSI 1 "mr_operand" "0")))]
"" ""
"; expand psi %1 to si %0" "; expand psi %1 to si %0"
[(set_attr "flags" "n")]
) )
(define_insn "zero_extendpsisi2" (define_insn "zero_extendpsisi2"
...@@ -331,6 +341,7 @@ ...@@ -331,6 +341,7 @@
(zero_extend:SI (match_operand:PSI 1 "mr_operand" "0")))] (zero_extend:SI (match_operand:PSI 1 "mr_operand" "0")))]
"" ""
"; expand psi %1 to si %0" "; expand psi %1 to si %0"
[(set_attr "flags" "n")]
) )
(define_insn "zero_extendhipsi2" (define_insn "zero_extendhipsi2"
...@@ -338,6 +349,7 @@ ...@@ -338,6 +349,7 @@
(truncate:PSI (zero_extend:SI (match_operand:HI 1 "register_operand" "R03"))))] (truncate:PSI (zero_extend:SI (match_operand:HI 1 "register_operand" "R03"))))]
"" ""
"mov.w\t%1,%0" "mov.w\t%1,%0"
[(set_attr "flags" "sz")]
) )
(define_insn "zero_extendhisi2" (define_insn "zero_extendhisi2"
...@@ -345,6 +357,7 @@ ...@@ -345,6 +357,7 @@
(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0")))] (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0")))]
"" ""
"mov.w\t#0,%H0" "mov.w\t#0,%H0"
[(set_attr "flags" "x")]
) )
(define_insn "zero_extendqihi2" (define_insn "zero_extendqihi2"
...@@ -354,6 +367,7 @@ ...@@ -354,6 +367,7 @@
"@ "@
mov.b\t#0,%H0 mov.b\t#0,%H0
and.w\t#255,%0" and.w\t#255,%0"
[(set_attr "flags" "x,x")]
) )
(define_insn "truncsipsi2_16" (define_insn "truncsipsi2_16"
...@@ -365,6 +379,7 @@ ...@@ -365,6 +379,7 @@
# #
ldc\t%1,%0 ldc\t%1,%0
stc\t%1,%0" stc\t%1,%0"
[(set_attr "flags" "n,*,n,n")]
) )
(define_insn "trunchiqi2" (define_insn "trunchiqi2"
...@@ -372,6 +387,7 @@ ...@@ -372,6 +387,7 @@
(truncate:QI (match_operand:HI 1 "mra_qi_operand" "0")))] (truncate:QI (match_operand:HI 1 "mra_qi_operand" "0")))]
"" ""
"; no-op trunc hi %1 to qi %0" "; no-op trunc hi %1 to qi %0"
[(set_attr "flags" "n")]
) )
(define_insn "truncsipsi2_24" (define_insn "truncsipsi2_24"
...@@ -383,6 +399,7 @@ ...@@ -383,6 +399,7 @@
mov.l\t%1,%0 mov.l\t%1,%0
ldc\t%1,%0 ldc\t%1,%0
stc\t%1,%0" stc\t%1,%0"
[(set_attr "flags" "n,sz,n,n")]
) )
(define_expand "truncsipsi2" (define_expand "truncsipsi2"
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
(match_operand 2 "immediate_operand" "i,i")))] (match_operand 2 "immediate_operand" "i,i")))]
"" ""
"mul.b\t%2,%1" "mul.b\t%2,%1"
[(set_attr "flags" "o")]
) )
; Here is the pattern for registers and such. ; Here is the pattern for registers and such.
...@@ -38,6 +39,7 @@ ...@@ -38,6 +39,7 @@
(sign_extend:HI (match_operand:QI 2 "mra_operand" "RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm"))))] (sign_extend:HI (match_operand:QI 2 "mra_operand" "RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm"))))]
"" ""
"mul.b\t%2,%1" "mul.b\t%2,%1"
[(set_attr "flags" "o")]
) )
; Don't try to sign_extend a const_int. Same for all other multiplies. ; Don't try to sign_extend a const_int. Same for all other multiplies.
...@@ -56,6 +58,7 @@ ...@@ -56,6 +58,7 @@
(match_operand 2 "immediate_operand" "i,i")))] (match_operand 2 "immediate_operand" "i,i")))]
"" ""
"mulu.b\t%U2,%1" "mulu.b\t%U2,%1"
[(set_attr "flags" "o")]
) )
(define_insn "umulqihi3_r" (define_insn "umulqihi3_r"
...@@ -64,6 +67,7 @@ ...@@ -64,6 +67,7 @@
(zero_extend:HI (match_operand:QI 2 "mra_operand" "RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm"))))] (zero_extend:HI (match_operand:QI 2 "mra_operand" "RqiSd,?Rmm,RqiSd,?Rmm,RhlSd,?Rmm"))))]
"" ""
"mulu.b\t%U2,%1" "mulu.b\t%U2,%1"
[(set_attr "flags" "o")]
) )
(define_expand "umulqihi3" (define_expand "umulqihi3"
...@@ -81,6 +85,7 @@ ...@@ -81,6 +85,7 @@
(match_operand 2 "immediate_operand" "i,i")))] (match_operand 2 "immediate_operand" "i,i")))]
"" ""
"mul.w\t%2,%1" "mul.w\t%2,%1"
[(set_attr "flags" "o")]
) )
(define_insn "mulhisi3_r" (define_insn "mulhisi3_r"
...@@ -89,6 +94,7 @@ ...@@ -89,6 +94,7 @@
(sign_extend:SI (match_operand:HI 2 "mra_operand" "RhiSd,?Rmm,RhiSd,?Rmm"))))] (sign_extend:SI (match_operand:HI 2 "mra_operand" "RhiSd,?Rmm,RhiSd,?Rmm"))))]
"" ""
"mul.w\t%2,%1" "mul.w\t%2,%1"
[(set_attr "flags" "o")]
) )
(define_expand "mulhisi3" (define_expand "mulhisi3"
...@@ -106,6 +112,7 @@ ...@@ -106,6 +112,7 @@
(match_operand 2 "immediate_operand" "i,i")))] (match_operand 2 "immediate_operand" "i,i")))]
"" ""
"mulu.w\t%u2,%1" "mulu.w\t%u2,%1"
[(set_attr "flags" "o")]
) )
(define_insn "umulhisi3_r" (define_insn "umulhisi3_r"
...@@ -114,6 +121,7 @@ ...@@ -114,6 +121,7 @@
(zero_extend:SI (match_operand:HI 2 "mra_operand" "RhiSd,?Rmm,RhiSd,?Rmm"))))] (zero_extend:SI (match_operand:HI 2 "mra_operand" "RhiSd,?Rmm,RhiSd,?Rmm"))))]
"" ""
"mulu.w\t%u2,%1" "mulu.w\t%u2,%1"
[(set_attr "flags" "o")]
) )
(define_expand "umulhisi3" (define_expand "umulhisi3"
...@@ -175,6 +183,7 @@ ...@@ -175,6 +183,7 @@
] ]
"0" "0"
"div.b\t%2" "div.b\t%2"
[(set_attr "flags" "o")]
) )
(define_expand "udivmodqi4" (define_expand "udivmodqi4"
...@@ -199,6 +208,7 @@ ...@@ -199,6 +208,7 @@
] ]
"0" "0"
"divu.b\t%2" "divu.b\t%2"
[(set_attr "flags" "o")]
) )
(define_expand "divmodhi4" (define_expand "divmodhi4"
...@@ -223,6 +233,7 @@ ...@@ -223,6 +233,7 @@
] ]
"" ""
"div.w\t%2" "div.w\t%2"
[(set_attr "flags" "o")]
) )
(define_expand "udivmodhi4" (define_expand "udivmodhi4"
...@@ -247,4 +258,5 @@ ...@@ -247,4 +258,5 @@
] ]
"" ""
"divu.w\t%2" "divu.w\t%2"
[(set_attr "flags" "o")]
) )
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
] ]
"TARGET_A16" "TARGET_A16"
"enter\t%0" "enter\t%0"
[(set_attr "flags" "x")]
) )
(define_insn "prologue_enter_24" (define_insn "prologue_enter_24"
...@@ -56,6 +57,7 @@ ...@@ -56,6 +57,7 @@
] ]
"TARGET_A24" "TARGET_A24"
"enter\t%0" "enter\t%0"
[(set_attr "flags" "x")]
) )
; Just a comment, for debugging the assembler output. ; Just a comment, for debugging the assembler output.
...@@ -63,6 +65,7 @@ ...@@ -63,6 +65,7 @@
[(unspec_volatile [(const_int 0)] UNS_PROLOGUE_END)] [(unspec_volatile [(const_int 0)] UNS_PROLOGUE_END)]
"" ""
"; end of prologue" "; end of prologue"
[(set_attr "flags" "n")]
) )
...@@ -86,6 +89,7 @@ ...@@ -86,6 +89,7 @@
] UNS_EH_EPILOGUE))] ] UNS_EH_EPILOGUE))]
"" ""
"jmp.a\t__m32c_eh_return" "jmp.a\t__m32c_eh_return"
[(set_attr "flags" "x")]
) )
(define_insn "epilogue_exitd" (define_insn "epilogue_exitd"
...@@ -100,6 +104,7 @@ ...@@ -100,6 +104,7 @@
] ]
"" ""
"exitd" "exitd"
[(set_attr "flags" "x")]
) )
(define_insn "epilogue_reit" (define_insn "epilogue_reit"
...@@ -110,6 +115,7 @@ ...@@ -110,6 +115,7 @@
] ]
"" ""
"reit" "reit"
[(set_attr "flags" "x")]
) )
(define_insn "epilogue_rts" (define_insn "epilogue_rts"
...@@ -117,12 +123,14 @@ ...@@ -117,12 +123,14 @@
] ]
"" ""
"rts" "rts"
[(set_attr "flags" "x")]
) )
(define_insn "epilogue_start" (define_insn "epilogue_start"
[(unspec_volatile [(const_int 0)] UNS_EPILOGUE_START)] [(unspec_volatile [(const_int 0)] UNS_EPILOGUE_START)]
"" ""
"; start of epilogue" "; start of epilogue"
[(set_attr "flags" "n")]
) )
...@@ -131,9 +139,13 @@ ...@@ -131,9 +139,13 @@
(define_insn "pushm" (define_insn "pushm"
[(unspec [(match_operand 0 "const_int_operand" "i")] UNS_PUSHM)] [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_PUSHM)]
"" ""
"pushm\t%p0") "pushm\t%p0"
[(set_attr "flags" "n")]
)
(define_insn "popm" (define_insn "popm"
[(unspec [(match_operand 0 "const_int_operand" "i")] UNS_POPM)] [(unspec [(match_operand 0 "const_int_operand" "i")] UNS_POPM)]
"" ""
"popm\t%p0") "popm\t%p0"
[(set_attr "flags" "n")]
)
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
"@ "@
sha.b\t%2,%0 sha.b\t%2,%0
mov.b\t%2,r1h\n\tsha.b\tr1h,%0" mov.b\t%2,r1h\n\tsha.b\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "ashrqi3_i" (define_insn "ashrqi3_i"
...@@ -50,6 +51,7 @@ ...@@ -50,6 +51,7 @@
"@ "@
sha.b\t%2,%0 sha.b\t%2,%0
mov.b\t%2,r1h\n\tsha.b\tr1h,%0" mov.b\t%2,r1h\n\tsha.b\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "lshrqi3_i" (define_insn "lshrqi3_i"
...@@ -61,6 +63,7 @@ ...@@ -61,6 +63,7 @@
"@ "@
shl.b\t%2,%0 shl.b\t%2,%0
mov.b\t%2,r1h\n\tshl.b\tr1h,%0" mov.b\t%2,r1h\n\tshl.b\tr1h,%0"
[(set_attr "flags" "szc,szc")]
) )
...@@ -105,6 +108,7 @@ ...@@ -105,6 +108,7 @@
"@ "@
sha.w\t%2,%0 sha.w\t%2,%0
mov.b\t%2,r1h\n\tsha.w\tr1h,%0" mov.b\t%2,r1h\n\tsha.w\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "ashrhi3_i" (define_insn "ashrhi3_i"
...@@ -116,6 +120,7 @@ ...@@ -116,6 +120,7 @@
"@ "@
sha.w\t%2,%0 sha.w\t%2,%0
mov.b\t%2,r1h\n\tsha.w\tr1h,%0" mov.b\t%2,r1h\n\tsha.w\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "lshrhi3_i" (define_insn "lshrhi3_i"
...@@ -127,6 +132,7 @@ ...@@ -127,6 +132,7 @@
"@ "@
shl.w\t%2,%0 shl.w\t%2,%0
mov.b\t%2,r1h\n\tshl.w\tr1h,%0" mov.b\t%2,r1h\n\tshl.w\tr1h,%0"
[(set_attr "flags" "szc,szc")]
) )
...@@ -175,6 +181,7 @@ ...@@ -175,6 +181,7 @@
"@ "@
sha.l\t%2,%0 sha.l\t%2,%0
mov.b\t%2,r1h\n\tsha.l\tr1h,%0" mov.b\t%2,r1h\n\tsha.l\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "ashrpsi3_i" (define_insn "ashrpsi3_i"
...@@ -186,6 +193,7 @@ ...@@ -186,6 +193,7 @@
"@ "@
sha.l\t%2,%0 sha.l\t%2,%0
mov.b\t%2,r1h\n\tsha.l\tr1h,%0" mov.b\t%2,r1h\n\tsha.l\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "lshrpsi3_i" (define_insn "lshrpsi3_i"
...@@ -197,6 +205,7 @@ ...@@ -197,6 +205,7 @@
"@ "@
shl.l\t%2,%0 shl.l\t%2,%0
mov.b\t%2,r1h\n\tshl.l\tr1h,%0" mov.b\t%2,r1h\n\tshl.l\tr1h,%0"
[(set_attr "flags" "szc,szc")]
) )
...@@ -248,7 +257,7 @@ ...@@ -248,7 +257,7 @@
"@ "@
sha.l\t%2,%0 sha.l\t%2,%0
mov.b\t%2,r1h\n\tsha.l\tr1h,%0" mov.b\t%2,r1h\n\tsha.l\tr1h,%0"
[(set_attr "flags" "sz,sz")] [(set_attr "flags" "oszc,oszc")]
) )
(define_insn "ashrsi3_16" (define_insn "ashrsi3_16"
...@@ -260,6 +269,7 @@ ...@@ -260,6 +269,7 @@
"@ "@
sha.l\t%2,%0 sha.l\t%2,%0
mov.b\t%2,r1h\n\tsha.l\tr1h,%0" mov.b\t%2,r1h\n\tsha.l\tr1h,%0"
[(set_attr "flags" "oszc,oszc")]
) )
(define_insn "lshrsi3_16" (define_insn "lshrsi3_16"
...@@ -271,6 +281,7 @@ ...@@ -271,6 +281,7 @@
"@ "@
shl.l\t%2,%0 shl.l\t%2,%0
mov.b\t%2,r1h\n\tshl.l\tr1h,%0" mov.b\t%2,r1h\n\tshl.l\tr1h,%0"
[(set_attr "flags" "szc,szc")]
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment