re PR rtl-optimization/5854 (initialize_uninitialized_subregs() breaks HC11/HC12 port)

PR optimization/5854
	* config/m68hc11/m68hc11.h (CONST_OK_FOR_LETTER_VALUE_P): Use K for 0.
	Shut up warnings.
	(CONST_DOUBLE_OK_FOR_LETTER_P): Use G for 0.0.
	(EXTRA_CONSTRAINT): Use S for non-push memory operand.
	* config/m68hc11/m68hc11.c (m68hc11_split_move): Handle setting from
	const0 if scratch register was not allocated.
	(m68hc11_reload_operands, m68hc11_gen_lowpart, m68hc11_gen_highpart,
	m68hc11_z_replacement): Replace gen_rtx (CONST_INT, VOIDmode, ...)
	with GEN_INT (...).
	(m68hc11_reorg): Compute BLOCK_FOR_INSN before reload_cse_regs.
	* config/m68hc11/m68hc11.md: Replace gen_rtx (CONST_INT, VOIDmode, ...)
	with GEN_INT (...) everywhere.  Remove constraints in define_split
	patterns.
	(movdi_internal, movdf_internal, movsi_internal, movsf_internal): Don't
	require scratch register for setting 0 into regs/non-pushable memory.

From-SVN: r51194
This commit is contained in:
Jakub Jelinek 2002-03-22 23:24:05 +01:00 committed by Jakub Jelinek
parent 44d57e3602
commit 65e6c00573
4 changed files with 180 additions and 160 deletions

View File

@ -1,3 +1,22 @@
2002-03-22 Jakub Jelinek <jakub@redhat.com>
PR optimization/5854
* config/m68hc11/m68hc11.h (CONST_OK_FOR_LETTER_VALUE_P): Use K for 0.
Shut up warnings.
(CONST_DOUBLE_OK_FOR_LETTER_P): Use G for 0.0.
(EXTRA_CONSTRAINT): Use S for non-push memory operand.
* config/m68hc11/m68hc11.c (m68hc11_split_move): Handle setting from
const0 if scratch register was not allocated.
(m68hc11_reload_operands, m68hc11_gen_lowpart, m68hc11_gen_highpart,
m68hc11_z_replacement): Replace gen_rtx (CONST_INT, VOIDmode, ...)
with GEN_INT (...).
(m68hc11_reorg): Compute BLOCK_FOR_INSN before reload_cse_regs.
* config/m68hc11/m68hc11.md: Replace gen_rtx (CONST_INT, VOIDmode, ...)
with GEN_INT (...) everywhere. Remove constraints in define_split
patterns.
(movdi_internal, movdf_internal, movsi_internal, movsf_internal): Don't
require scratch register for setting 0 into regs/non-pushable memory.
2002-03-22 Alexandre Oliva <aoliva@redhat.com>
* config/mips/mips.h (MASK_RETURN_ADDR): Define.

View File

@ -778,7 +778,7 @@ m68hc11_reload_operands (operands)
/* Create the lowest part offset that still remains to be added.
If it's not a valid offset, do a 16-bit add. */
offset = gen_rtx (CONST_INT, VOIDmode, vl);
offset = GEN_INT (vl);
if (!VALID_CONSTANT_OFFSET_P (offset, mode))
{
emit_insn (gen_rtx (SET, VOIDmode, reg,
@ -789,8 +789,7 @@ m68hc11_reload_operands (operands)
{
emit_insn (gen_rtx (SET, VOIDmode, reg,
gen_rtx (PLUS, HImode, reg,
gen_rtx (CONST_INT,
VOIDmode, vh << 8))));
GEN_INT (vh << 8))));
}
emit_move_insn (operands[0],
gen_rtx (MEM, GET_MODE (operands[1]),
@ -1874,20 +1873,18 @@ m68hc11_gen_lowpart (mode, x)
return second;
}
if (mode == SImode)
return gen_rtx (CONST_INT, VOIDmode, l[0]);
return GEN_INT (l[0]);
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode (l[0], HImode));
return gen_int_mode (l[0], HImode);
}
else
{
l[0] = CONST_DOUBLE_LOW (x);
}
if (mode == SImode)
return gen_rtx (CONST_INT, VOIDmode, l[0]);
return GEN_INT (l[0]);
else if (mode == HImode && GET_MODE (x) == SFmode)
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode (l[0], HImode));
return gen_int_mode (l[0], HImode);
else
abort ();
}
@ -1953,10 +1950,9 @@ m68hc11_gen_highpart (mode, x)
return first;
}
if (mode == SImode)
return gen_rtx (CONST_INT, VOIDmode, l[1]);
return GEN_INT (l[1]);
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode ((l[1] >> 16), HImode));
return gen_int_mode ((l[1] >> 16), HImode);
}
else
{
@ -1964,10 +1960,9 @@ m68hc11_gen_highpart (mode, x)
}
if (mode == SImode)
return gen_rtx (CONST_INT, VOIDmode, l[1]);
return GEN_INT (l[1]);
else if (mode == HImode && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode ((l[0] >> 16), HImode));
return gen_int_mode ((l[0] >> 16), HImode);
else
abort ();
}
@ -1977,13 +1972,11 @@ m68hc11_gen_highpart (mode, x)
if (mode == QImode)
{
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode (val >> 8, QImode));
return gen_int_mode (val >> 8, QImode);
}
else if (mode == HImode)
{
return gen_rtx (CONST_INT, VOIDmode,
trunc_int_for_mode (val >> 16, HImode));
return gen_int_mode (val >> 16, HImode);
}
}
if (mode == QImode && D_REG_P (x))
@ -2752,6 +2745,10 @@ m68hc11_split_move (to, from, scratch)
m68hc11_split_move (high_to, high_from, scratch);
}
else if (H_REG_P (to) || H_REG_P (from)
|| (low_from == const0_rtx
&& high_from == const0_rtx
&& ! push_operand (to, GET_MODE (to))
&& ! H_REG_P (scratch))
|| (TARGET_M6812
&& (!m68hc11_register_indirect_p (from, GET_MODE (from))
|| m68hc11_small_indexed_indirect_p (from,
@ -4758,12 +4755,7 @@ m68hc11_z_replacement (insn)
src = SET_SRC (body);
dst = SET_DEST (body);
if (SP_REG_P (src) && Z_REG_P (dst))
{
emit_insn_after (gen_addhi3 (dst,
dst,
gen_rtx (CONST_INT,
VOIDmode, 2)), insn);
}
emit_insn_after (gen_addhi3 (dst, dst, const2_rtx), insn);
}
/* Replace any (REG:HI Z) occurrence by either X or Y. */
@ -4944,7 +4936,10 @@ m68hc11_reorg (first)
/* After some splitting, there are some oportunities for CSE pass.
This happens quite often when 32-bit or above patterns are split. */
if (optimize > 0 && split_done)
reload_cse_regs (first);
{
find_basic_blocks (first, max_reg_num (), 0);
reload_cse_regs (first);
}
/* Re-create the REG_DEAD notes. These notes are used in the machine
description to use the best assembly directives. */

View File

@ -813,32 +813,38 @@ extern enum reg_class m68hc11_tmp_regs_class;
C is the letter, and VALUE is a constant value.
Return 1 if VALUE is in the range specified by C.
`K' is for 0.
`L' is for range -65536 to 65536
`M' is for values whose 16-bit low part is 0
'N' is for +1 or -1.
'O' is for 16 (for rotate using swap).
'P' is for range -8 to 2 (used by addhi_sp)
'I', 'J', 'K' are not used. */
'I', 'J' are not used. */
#define CONST_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'L' ? (VALUE) >= -65536 && (VALUE) <= 65535 : \
((C) == 'K' ? (VALUE) == 0 : \
(C) == 'L' ? ((VALUE) >= -65536 && (VALUE) <= 65535) : \
(C) == 'M' ? ((VALUE) & 0x0ffffL) == 0 : \
(C) == 'N' ? ((VALUE) == 1 || (VALUE) == -1): \
(C) == 'N' ? ((VALUE) == 1 || (VALUE) == -1) : \
(C) == 'O' ? (VALUE) == 16 : \
(C) == 'P' ? (VALUE) <= 2 && (VALUE) >= -8 : 0)
(C) == 'P' ? ((VALUE) <= 2 && (VALUE) >= -8) : 0)
/* Similar, but for floating constants, and defining letters G and H.
No floating-point constants are valid on 68HC11. */
#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0
`G' is for 0.0. */
#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'G' ? (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT \
&& VALUE == CONST0_RTX (GET_MODE (VALUE))) : 0)
/* 'U' represents certain kind of memory indexed operand for 68HC12.
and any memory operand for 68HC11. */
#define EXTRA_CONSTRAINT(OP, C) \
((C) == 'U' ? m68hc11_small_indexed_indirect_p (OP, GET_MODE (OP)) \
: (C) == 'Q' ? m68hc11_symbolic_p (OP, GET_MODE (OP)) \
: (C) == 'R' ? m68hc11_indirect_p (OP, GET_MODE (OP)) : 0)
: (C) == 'R' ? m68hc11_indirect_p (OP, GET_MODE (OP)) \
: (C) == 'S' ? (memory_operand (OP, GET_MODE (OP)) \
&& non_push_operand (OP, GET_MODE (OP))) : 0)
/* Stack layout; function entry, exit and calling. */

View File

@ -552,9 +552,9 @@
(define_split /* cmpqi_z_used */
[(set (cc0)
(compare (match_operand:QI 0 "tst_operand" "dxy,m")
(match_operand:QI 1 "cmp_operand" "m,dxy")))
(use (match_operand:HI 2 "hard_reg_operand" "dxy,dxy"))
(compare (match_operand:QI 0 "tst_operand" "")
(match_operand:QI 1 "cmp_operand" "")))
(use (match_operand:HI 2 "hard_reg_operand" ""))
(use (reg:HI 11))]
"z_replacement_completed == 2"
[(set (mem:HI (pre_dec:HI (reg:HI SP_REGNUM))) (match_dup 2))
@ -579,8 +579,8 @@
"#")
(define_split
[(set (strict_low_part (match_operand:SI 0 "non_push_operand" "+um,D,D"))
(match_operand:SI 1 "general_operand" "D,Dim,u"))]
[(set (strict_low_part (match_operand:SI 0 "non_push_operand" ""))
(match_operand:SI 1 "general_operand" ""))]
"z_replacement_completed == 2"
[(set (match_dup 0) (match_dup 1))]
"")
@ -592,8 +592,8 @@
"#")
(define_split
[(set (strict_low_part (match_operand:HI 0 "non_push_operand" "+um,dA,dA"))
(match_operand:HI 1 "general_operand" "dA,dAim,u"))]
[(set (strict_low_part (match_operand:HI 0 "non_push_operand" ""))
(match_operand:HI 1 "general_operand" ""))]
"z_replacement_completed == 2"
[(set (match_dup 0) (match_dup 1))]
"")
@ -605,8 +605,8 @@
"#")
(define_split
[(set (strict_low_part (match_operand:QI 0 "non_push_operand" "+mu,dA"))
(match_operand:QI 1 "general_operand" "d,imudA"))]
[(set (strict_low_part (match_operand:QI 0 "non_push_operand" ""))
(match_operand:QI 1 "general_operand" ""))]
"z_replacement_completed == 2"
[(set (match_dup 0) (match_dup 1))]
"")
@ -651,16 +651,16 @@
")
(define_insn "movdi_internal"
[(set (match_operand:DI 0 "nonimmediate_operand" "=U,!u,U,m,m,!u")
(match_operand:DI 1 "general_operand" "iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=&d,&d,&d,&d,&d,&d"))]
[(set (match_operand:DI 0 "nonimmediate_operand" "=uS,U,!u,U,m,m,!u")
(match_operand:DI 1 "general_operand" "K,iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=X,&d,&d,&d,&d,&d,&d"))]
""
"#")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=uUm")
(match_operand:DI 1 "general_operand" "iuUm"))
(clobber (match_scratch:HI 2 "=&d"))]
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(match_operand:DI 1 "general_operand" ""))
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"m68hc11_split_move (operands[0], operands[1], operands[2]);
@ -687,16 +687,16 @@
")
(define_insn "movdf_internal"
[(set (match_operand:DF 0 "nonimmediate_operand" "=U,!u,U,m,m,!u")
(match_operand:DF 1 "general_operand" "iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=&d,&d,&d,&d,&d,&d"))]
[(set (match_operand:DF 0 "nonimmediate_operand" "=uS,U,!u,U,m,m,!u")
(match_operand:DF 1 "general_operand" "G,iU,iU,!u,mi,!u,!mu"))
(clobber (match_scratch:HI 2 "=X,&d,&d,&d,&d,&d,&d"))]
""
"#")
(define_split
[(set (match_operand:DF 0 "nonimmediate_operand" "=uUm")
(match_operand:DF 1 "general_operand" "iuUm"))
(clobber (match_scratch:HI 2 "=&d"))]
[(set (match_operand:DF 0 "nonimmediate_operand" "")
(match_operand:DF 1 "general_operand" ""))
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"m68hc11_split_move (operands[0], operands[1], operands[2]);
@ -732,16 +732,16 @@
")
(define_insn "movsi_internal"
[(set (match_operand:SI 0 "nonimmediate_operand" "=mu,?D,m,?D,?u,?u,!u,D")
(match_operand:SI 1 "general_operand" "imu,im,?D,!u,?D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=&d,X,X,X,X,&d,&d,X"))]
[(set (match_operand:SI 0 "nonimmediate_operand" "=uS,mu,?D,m,?D,?u,?u,!u,D")
(match_operand:SI 1 "general_operand" "K,imu,im,?D,!u,?D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=X,&d,X,X,X,X,&d,&d,X"))]
""
"#")
(define_split
[(set (match_operand:SI 0 "nonimmediate_operand" "=m,D,m,D,!u,!u,!u,D")
(match_operand:SI 1 "general_operand" "im,im,D,!u,D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=&d,X,X,X,X,&d,&d,X"))]
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(match_operand:SI 1 "general_operand" ""))
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"m68hc11_split_move (operands[0], operands[1], operands[2]);
@ -768,16 +768,16 @@
")
(define_insn "movsf_internal"
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,D,m,D,!u,!u,!u,D")
(match_operand:SF 1 "general_operand" "im,im,D,!u,D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=&d,X,X,X,X,&d,&d,X"))]
[(set (match_operand:SF 0 "nonimmediate_operand" "=S!u,m,D,m,D,!u,!u,!u,D")
(match_operand:SF 1 "general_operand" "G,im,im,D,!u,D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=X,&d,X,X,X,X,&d,&d,X"))]
""
"#")
(define_split
[(set (match_operand:SF 0 "nonimmediate_operand" "=m,D,m,D,!u,!u,!u,D")
(match_operand:SF 1 "general_operand" "im,im,D,!u,D,mi,!u,!D"))
(clobber (match_scratch:HI 2 "=&d,X,X,X,X,&d,&d,X"))]
[(set (match_operand:SF 0 "nonimmediate_operand" "")
(match_operand:SF 1 "general_operand" ""))
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"m68hc11_split_move (operands[0], operands[1], operands[2]);
@ -933,7 +933,7 @@
;; appear in the source operand.
;;
(define_split
[(set (match_operand:QI 0 "hard_addr_reg_operand" "=A")
[(set (match_operand:QI 0 "hard_addr_reg_operand" "")
(match_operand:QI 1 "general_operand" ""))]
"z_replacement_completed == 2 && GET_MODE (operands[0]) == QImode
&& !reg_mentioned_p (operands[0], operands[1])
@ -950,7 +950,7 @@
;;
(define_split
[(set (match_operand:QI 0 "nonimmediate_operand" "")
(match_operand:QI 1 "hard_addr_reg_operand" "=A"))]
(match_operand:QI 1 "hard_addr_reg_operand" ""))]
"z_replacement_completed == 2 && GET_MODE (operands[1]) == QImode
&& !reg_mentioned_p (operands[1], operands[0])
&& !D_REG_P (operands[0])"
@ -1097,8 +1097,8 @@
"#")
(define_split
[(set (match_operand:DI 0 "push_operand" "=<")
(zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "dmu*B")))
[(set (match_operand:DI 0 "push_operand" "")
(zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "")))
(clobber (match_scratch:HI 2 "=&dB"))]
"z_replacement_completed == 2"
[(const_int 0)]
@ -1155,8 +1155,8 @@
}")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=mu")
(zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "dmu*B")))
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(zero_extend:DI (match_operand:QI 1 "nonimmediate_operand" "")))
(clobber (match_scratch:HI 2 "=&dB"))]
"z_replacement_completed == 2"
[(const_int 0)]
@ -1194,10 +1194,10 @@
"#")
(define_split
[(set (match_operand:DI 0 "non_push_operand" "=m,m,m,!u,!u")
[(set (match_operand:DI 0 "non_push_operand" "")
(zero_extend:DI
(match_operand:HI 1 "nonimmediate_operand" "m,dA,!u,dmA,!u")))
(clobber (match_scratch:HI 2 "=&d,&dB,&dB,&dB,&dB"))]
(match_operand:HI 1 "nonimmediate_operand" "")))
(clobber (match_scratch:HI 2 ""))]
"z_replacement_completed == 2"
[(const_int 0)]
"
@ -1233,10 +1233,10 @@
"#")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=m,m,!u,!u")
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(zero_extend:DI
(match_operand:SI 1 "nonimmediate_operand" "m,Du,m,Du")))
(clobber (match_scratch:HI 2 "=d,d,&dB,d"))]
(match_operand:SI 1 "nonimmediate_operand" "")))
(clobber (match_scratch:HI 2 ""))]
"z_replacement_completed == 2"
[(const_int 0)]
"
@ -1267,10 +1267,10 @@
"#")
(define_split
[(set (match_operand:SI 0 "non_push_operand" "=D,mu,m,m,!u,!u")
[(set (match_operand:SI 0 "non_push_operand" "")
(zero_extend:SI
(match_operand:HI 1 "nonimmediate_operand" "dAmu,dA,m,!u,m,!u")))
(clobber (match_scratch:HI 2 "=X,X,&d,&dB,&dB,&dB"))]
(match_operand:HI 1 "nonimmediate_operand" "")))
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"
@ -1295,8 +1295,8 @@
"#")
(define_split
[(set (match_operand:SI 0 "non_push_operand" "=mu")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "dxy")))]
[(set (match_operand:SI 0 "non_push_operand" "")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
"reload_completed && !X_REG_P (operands[0])"
[(set (match_dup 2) (zero_extend:HI (match_dup 1)))
(set (match_dup 3) (const_int 0))]
@ -1305,8 +1305,8 @@
operands[3] = m68hc11_gen_highpart (HImode, operands[0]);")
(define_split
[(set (match_operand:SI 0 "hard_reg_operand" "=D")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "dxymu")))]
[(set (match_operand:SI 0 "hard_reg_operand" "")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
"z_replacement_completed == 2 && X_REG_P (operands[0])"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 4) (const_int 0))
@ -1584,8 +1584,8 @@
;; a temporary scratch memory location.
;;
(define_split
[(set (match_operand:SI 0 "register_operand" "=D")
(sign_extend:SI (match_operand:HI 1 "register_operand" "A")))]
[(set (match_operand:SI 0 "register_operand" "")
(sign_extend:SI (match_operand:HI 1 "register_operand" "")))]
"reload_completed && (Y_REG_P (operands[1]) || Z_REG_P (operands[1]))"
[(set (reg:HI D_REGNUM) (match_dup 1))
(set (match_dup 0) (sign_extend:SI (reg:HI D_REGNUM)))]
@ -1816,10 +1816,10 @@
(define_split /* "*addsi3_zero_extendqi" */
[(set (match_operand:SI 0 "register_operand" "=D,D")
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI (zero_extend:SI
(match_operand:QI 1 "general_operand" "dAmi,!dAmiu"))
(match_operand:SI 2 "memory_operand" "m,m")))
(match_operand:QI 1 "general_operand" ""))
(match_operand:SI 2 "memory_operand" "")))
(clobber (match_scratch:HI 3 "=X,X"))]
"reload_completed"
[(set (reg:HI D_REGNUM) (zero_extend:HI (match_dup 1)))
@ -1854,7 +1854,7 @@
{
ops[0] = operands[1];
}
ops[1] = gen_rtx (CONST_INT, VOIDmode, 0);
ops[1] = const0_rtx;
}
else
{
@ -1955,7 +1955,7 @@
}
else
{
ops[1] = gen_rtx (CONST_INT, VOIDmode, - val);
ops[1] = GEN_INT (- val);
add_insn = \"subd\\t%1\";
inc_insn = \"dex\";
incb_mem = \"dec\\t%b1\";
@ -2002,10 +2002,10 @@
}")
(define_split
[(set (match_operand:SI 0 "register_operand" "=D,u")
(plus:SI (match_operand:SI 1 "register_operand" "%0,0")
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "const_int_operand" "")))
(clobber (match_scratch:HI 3 "=X,d"))]
(clobber (match_scratch:HI 3 ""))]
"reload_completed && z_replacement_completed == 2
&& ((INTVAL (operands[2]) & 0x0FFFF) == 0)"
[(set (match_dup 5) (match_dup 6))
@ -2024,9 +2024,9 @@
")
(define_split
[(set (match_operand:SI 0 "register_operand" "=D")
(plus:SI (match_operand:SI 1 "register_operand" "%0")
(match_operand:SI 2 "general_operand" "mui")))
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "general_operand" "")))
(clobber (match_scratch:HI 3 "=X"))]
"reload_completed && z_replacement_completed == 2
&& (GET_CODE (operands[2]) != CONST_INT ||
@ -2392,7 +2392,7 @@
;; ??? It's not clear whether this is really necessary.
;;
(define_split
[(set (match_operand:QI 0 "hard_reg_operand" "=dA")
[(set (match_operand:QI 0 "hard_reg_operand" "")
(plus:QI (match_dup 0)
(match_dup 0)))]
"0 && reload_completed"
@ -2550,9 +2550,9 @@
;; reg:QI 7 -> ccr reg:QI 5 -> A
;;
(define_split /* "*subsi3" */
[(set (match_operand:SI 0 "register_operand" "=D")
(minus:SI (match_operand:SI 1 "register_operand" "0")
(match_operand:SI 2 "general_operand" "mui")))
[(set (match_operand:SI 0 "register_operand" "")
(minus:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "general_operand" "")))
(clobber (match_scratch:HI 3 "=X"))]
"reload_completed && z_replacement_completed == 2
&& X_REG_P (operands[1])"
@ -2569,9 +2569,9 @@
operands[4] = m68hc11_gen_lowpart (QImode, operands[4]);")
(define_split /* "*subsi3" */
[(set (match_operand:SI 0 "register_operand" "=D")
(minus:SI (match_operand:SI 1 "general_operand" "mui")
(match_operand:SI 2 "register_operand" "D")))
[(set (match_operand:SI 0 "register_operand" "")
(minus:SI (match_operand:SI 1 "general_operand" "")
(match_operand:SI 2 "register_operand" "")))
(clobber (match_scratch:HI 3 "=X"))]
"reload_completed && z_replacement_completed == 2
&& X_REG_P (operands[2])"
@ -2589,9 +2589,9 @@
operands[4] = m68hc11_gen_lowpart (QImode, operands[4]);")
(define_split /* "*subsi3" */
[(set (match_operand:SI 0 "nonimmediate_operand" "=u")
(minus:SI (match_operand:SI 1 "general_operand" "0")
(match_operand:SI 2 "general_operand" "mui")))
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(minus:SI (match_operand:SI 1 "general_operand" "")
(match_operand:SI 2 "general_operand" "")))
(clobber (match_scratch:HI 3 "=d"))]
"reload_completed && z_replacement_completed == 2
&& !X_REG_P (operands[0])"
@ -3045,7 +3045,7 @@
CC_STATUS_INIT;
/* The bclr instruction uses an inverted mask. */
operands[1] = gen_rtx (CONST_INT, VOIDmode, (~val) & 0x0FFFF);
operands[1] = GEN_INT ((~val) & 0x0FFFF);
/* When destination is a global variable, generate a .relax instruction
and load the address in the clobber register. That load can be
@ -3130,7 +3130,7 @@
rtx ops[2];
ops[0] = operands[0];
ops[1] = gen_rtx (CONST_INT, VOIDmode, (~val) & 0x0FF);
ops[1] = GEN_INT ((~val) & 0x0FF);
output_asm_insn (\"bclr\\t%b0, %1\", ops);
}
else if ((val & 0x0FF) != 0)
@ -3147,7 +3147,7 @@
rtx ops[2];
ops[0] = operands[0];
ops[1] = gen_rtx (CONST_INT, VOIDmode, ((~val) & 0x0FF00) >> 8);
ops[1] = GEN_INT (((~val) & 0x0FF00) >> 8);
output_asm_insn (\"bclr\\t%h0, %1\", ops);
}
else if ((val & 0x0FF00) != 0)
@ -3201,7 +3201,7 @@
}
/* The bclr instruction uses an inverted mask. */
operands[1] = gen_rtx (CONST_INT, VOIDmode, (~val) & 0x0FF);
operands[1] = GEN_INT ((~val) & 0x0FF);
/* When destination is a global variable, generate a .relax instruction
and load the address in the clobber register. That load can be
@ -3245,7 +3245,7 @@
rtx ops[2];
ops[0] = operands[0];
ops[1] = gen_rtx (CONST_INT, VOIDmode, (~val) & 0x0FF);
ops[1] = GEN_INT ((~val) & 0x0FF);
output_asm_insn (\"bclr\\t%b0, %b1\", ops);
return \"\";
}
@ -3893,10 +3893,10 @@
;;
;;
(define_split
[(set (match_operand:HI 0 "hard_addr_reg_operand" "=A")
[(set (match_operand:HI 0 "hard_addr_reg_operand" "")
(match_operator:HI 3 "m68hc11_arith_operator"
[(match_operand:HI 1 "hard_addr_reg_operand" "0")
(match_operand:HI 2 "general_operand" "dAuim")]))]
[(match_operand:HI 1 "hard_addr_reg_operand" "")
(match_operand:HI 2 "general_operand" "")]))]
"z_replacement_completed == 2
/* If we are adding a small constant to X or Y, it's
better to use one or several inx/iny instructions. */
@ -3943,10 +3943,10 @@
")
(define_split
[(set (match_operand:HI 0 "hard_addr_reg_operand" "=A")
[(set (match_operand:HI 0 "hard_addr_reg_operand" "")
(match_operator:HI 3 "m68hc11_arith_operator"
[(match_operand:HI 1 "general_operand" "mu")
(match_operand:HI 2 "general_operand" "dAuim")]))]
[(match_operand:HI 1 "general_operand" "")
(match_operand:HI 2 "general_operand" "")]))]
"z_replacement_completed == 2
/* If we are adding a small constant to X or Y, it's
better to use one or several inx/iny instructions. */
@ -3979,10 +3979,10 @@
;; The shift operators are special and must not appear here.
;;
(define_split
[(set (match_operand:HI 0 "d_register_operand" "=d")
[(set (match_operand:HI 0 "d_register_operand" "")
(match_operator:HI 3 "m68hc11_non_shift_operator"
[(match_operand:HI 1 "d_register_operand" "%0")
(match_operand:HI 2 "hard_reg_operand" "*d*A")]))]
[(match_operand:HI 1 "d_register_operand" "")
(match_operand:HI 2 "hard_reg_operand" "")]))]
"TARGET_M6811
&& z_replacement_completed == 2 && !SP_REG_P (operands[2])"
[(set (match_dup 4) (match_dup 2))
@ -3994,10 +3994,10 @@
;; logical/arithmetic operation with a pop.
;;
(define_split
[(set (match_operand:HI 0 "d_register_operand" "=d")
[(set (match_operand:HI 0 "d_register_operand" "")
(match_operator:HI 3 "m68hc11_non_shift_operator"
[(match_operand:HI 1 "d_register_operand" "%0")
(match_operand:HI 2 "hard_reg_operand" "*d*A")]))]
[(match_operand:HI 1 "d_register_operand" "")
(match_operand:HI 2 "hard_reg_operand" "")]))]
"TARGET_M6812
&& z_replacement_completed == 2 && !SP_REG_P (operands[2])"
[(set (match_dup 4) (match_dup 2))
@ -4071,10 +4071,10 @@
;; AND OR XOR PLUS MINUS ASHIFT ASHIFTRT LSHIFTRT ROTATE ROTATERT
;;
(define_split
[(set (match_operand:QI 0 "hard_addr_reg_operand" "=xy")
[(set (match_operand:QI 0 "hard_addr_reg_operand" "")
(match_operator:QI 3 "m68hc11_arith_operator"
[(match_operand:QI 1 "hard_addr_reg_operand" "%0")
(match_operand:QI 2 "general_operand" "dxyuim")]))]
[(match_operand:QI 1 "hard_addr_reg_operand" "")
(match_operand:QI 2 "general_operand" "")]))]
"z_replacement_completed == 2
/* Reject a (plus:QI (reg:QI X) (const_int 1|-1)) because the
incqi pattern generates a better code. */
@ -4342,10 +4342,10 @@
"#")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=<,um")
(ashift:DI (match_operand:DI 1 "general_operand" "umi,umi")
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(ashift:DI (match_operand:DI 1 "general_operand" "")
(const_int 32)))
(clobber (match_scratch:HI 2 "=&A,d"))]
(clobber (match_scratch:HI 2 ""))]
"reload_completed"
[(const_int 0)]
"/* Move the lowpart in the highpart first in case the shift
@ -4374,10 +4374,10 @@
"#")
(define_split
[(set (match_operand:DI 0 "non_push_operand" "=um")
(ashift:DI (match_operand:DI 1 "general_operand" "umi")
[(set (match_operand:DI 0 "non_push_operand" "")
(ashift:DI (match_operand:DI 1 "general_operand" "")
(const_int 1)))
(clobber (match_scratch:HI 2 "=d"))]
(clobber (match_scratch:HI 2 ""))]
"z_replacement_completed == 2"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 2) (ashift:HI (match_dup 2) (const_int 1)))
@ -4456,11 +4456,11 @@
"#")
(define_split
[(set (match_operand:SI 0 "register_operand" "=D")
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI
(mult:SI (match_operand:SI 2 "general_operand" "uim")
(mult:SI (match_operand:SI 2 "general_operand" "")
(const_int 65536))
(match_operand:SI 1 "general_operand" "0")))
(match_operand:SI 1 "general_operand" "")))
(clobber (match_scratch:HI 3 "=X"))]
"0 && reload_completed && z_replacement_completed == 2"
[(set (reg:HI X_REGNUM) (plus:HI (reg:HI X_REGNUM) (match_dup 4)))]
@ -4478,10 +4478,10 @@
"#")
(define_split
[(set (match_operand:SI 0 "register_operand" "=D")
(plus:SI (and:SI (match_operand:SI 1 "general_operand" "%uim")
[(set (match_operand:SI 0 "register_operand" "")
(plus:SI (and:SI (match_operand:SI 1 "general_operand" "")
(const_int 65535))
(match_operand:SI 2 "general_operand" "0")))]
(match_operand:SI 2 "general_operand" "")))]
"z_replacement_completed == 2"
[(set (reg:HI D_REGNUM) (plus:HI (reg:HI D_REGNUM) (match_dup 3)))
(set (reg:HI X_REGNUM) (plus:HI (plus:HI (reg:HI X_REGNUM) (const_int 0)) (reg:HI CC_REGNUM)))]
@ -4509,10 +4509,10 @@
"")
(define_split
[(set (match_operand:SI 0 "nonimmediate_operand" "=D,um")
(ashift:SI (match_operand:SI 1 "general_operand" "Duim,D")
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(ashift:SI (match_operand:SI 1 "general_operand" "")
(const_int 16)))
(clobber (match_scratch:HI 3 "=X,X"))]
(clobber (match_scratch:HI 3 ""))]
""
[(set (match_dup 2) (match_dup 3))
(set (match_dup 4) (const_int 0))]
@ -4538,9 +4538,9 @@
"#")
(define_split /* "*ashlsi3_const16_zexthi"*/
[(set (match_operand:SI 0 "nonimmediate_operand" "=D")
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(ashift:SI (zero_extend:HI
(match_operand:HI 1 "general_operand" "duim*a"))
(match_operand:HI 1 "general_operand" ""))
(const_int 16)))
(clobber (match_scratch:HI 2 "=X"))]
"reload_completed"
@ -5152,8 +5152,8 @@
"#")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=<,um")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "umi,umi")
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "")
(const_int 32)))
(clobber (match_scratch:HI 2 "=&A,d"))]
"reload_completed"
@ -5174,8 +5174,8 @@
"#")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=um")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "umi")
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "")
(match_operand:DI 2 "const_int_operand" "")))
(clobber (match_scratch:HI 3 "=d"))]
"z_replacement_completed && INTVAL (operands[2]) >= 56"
@ -5187,7 +5187,7 @@
(set (match_dup 5) (reg:HI D_REGNUM))
(set (match_dup 6) (reg:HI D_REGNUM))
(set (match_dup 7) (reg:HI D_REGNUM))]
"operands[8] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 56);
"operands[8] = GEN_INT (INTVAL (operands[2]) - 56);
operands[4] = m68hc11_gen_lowpart (SImode, operands[0]);
operands[5] = m68hc11_gen_highpart (HImode, operands[4]);
operands[4] = m68hc11_gen_lowpart (HImode, operands[4]);
@ -5201,8 +5201,8 @@
operands[6] = m68hc11_gen_lowpart (HImode, operands[6]);")
(define_split
[(set (match_operand:DI 0 "nonimmediate_operand" "=um")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "umi")
[(set (match_operand:DI 0 "nonimmediate_operand" "")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "")
(match_operand:DI 2 "const_int_operand" "")))
(clobber (match_scratch:HI 3 "=d"))]
"z_replacement_completed && INTVAL (operands[2]) >= 48
@ -5214,7 +5214,7 @@
(set (match_dup 5) (reg:HI D_REGNUM))
(set (match_dup 6) (reg:HI D_REGNUM))
(set (match_dup 7) (reg:HI D_REGNUM))]
"operands[8] = gen_rtx (CONST_INT, VOIDmode, INTVAL (operands[2]) - 48);
"operands[8] = GEN_INT (INTVAL (operands[2]) - 48);
operands[4] = m68hc11_gen_lowpart (SImode, operands[0]);
operands[5] = m68hc11_gen_highpart (HImode, operands[4]);
operands[4] = m68hc11_gen_lowpart (HImode, operands[4]);
@ -5234,10 +5234,10 @@
"#")
(define_split
[(set (match_operand:DI 0 "non_push_operand" "=um")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "umi")
[(set (match_operand:DI 0 "non_push_operand" "")
(lshiftrt:DI (match_operand:DI 1 "general_operand" "")
(const_int 1)))
(clobber (match_scratch:HI 2 "=d"))]
(clobber (match_scratch:HI 2 ""))]
"z_replacement_completed == 2"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 2) (lshiftrt:HI (match_dup 2) (const_int 1)))
@ -5283,10 +5283,10 @@
"")
(define_split
[(set (match_operand:SI 0 "non_push_operand" "=D,um")
(lshiftrt:SI (match_operand:SI 1 "general_operand" "uim,D")
[(set (match_operand:SI 0 "non_push_operand" "")
(lshiftrt:SI (match_operand:SI 1 "general_operand" "")
(const_int 16)))
(clobber (match_scratch:HI 3 "=X,X"))]
(clobber (match_scratch:HI 3 ""))]
"reload_completed && !(X_REG_P (operands[0]) && X_REG_P (operands[1]))"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 4) (const_int 0))]