This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] ARM: use plus_constant and other cleanups
- From: Richard Earnshaw <rearnsha at gcc dot gnu dot org>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 22 Nov 2005 14:34:34 +0000
- Subject: [PATCH] ARM: use plus_constant and other cleanups
This patch cleans up a number of minor defects in the ARM back-end.
None of them are really fatal, but in some cases we were producing RTL
that wasn't really correct or was non-canonical.
- We would occasionally output (PLUS (reg) (const_int 0))
- We generated SET with a mode other than VOIDmode.
Tested on arm-elf and on arm-netbsd.
2005-11-22 Richard Earnshaw <richard.earnshaw@arm.com>
* arm.c (emit_set_insn): New function.
(arm_split_constant): Call it.
(arm_gen_compare_reg, arm_reload_in_hi, arm_reload_out_hi): Likewise.
(arm_legitimize_address): Likewise. Use plus_constant.
(arm_expand_prologue): Likewise. Use VOIDmode in SET.
(thumb_expand_prologue): Likewise.
(arm_gen_load_multiple): Use VOIDmode in SET.
(arm_gen_store_multiple): Likewise.
(vfp_emit_fstmx): Likewise. Use plus_constant.
(emit_multi_reg_push): Likewise.
(emit_sfm): Use plus_constant.
*** arm.c (revision 107360)
--- arm.c (local)
*************** static rtx arm_expand_binop_builtin (enu
*** 142,147 ****
--- 142,148 ----
static rtx arm_expand_unop_builtin (enum insn_code, tree, rtx, int);
static rtx arm_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
static void emit_constant_insn (rtx cond, rtx pattern);
+ static rtx emit_set_insn (rtx, rtx);
static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
*************** enum tls_reloc {
*** 708,713 ****
--- 709,722 ----
TLS_LE32
};
+ /* Emit an insn that's a simple single-set. Both the operands must be known
+ to be valid. */
+ inline static rtx
+ emit_set_insn (rtx x, rtx y)
+ {
+ return emit_insn (gen_rtx_SET (VOIDmode, x, y));
+ }
+
/* Return the number of bits set in VALUE. */
static unsigned
bit_count (unsigned long value)
*************** arm_split_constant (enum rtx_code code,
*** 1673,1694 ****
{
/* Currently SET is the only monadic value for CODE, all
the rest are diadic. */
! emit_insn (gen_rtx_SET (VOIDmode, target, GEN_INT (val)));
return 1;
}
else
{
rtx temp = subtargets ? gen_reg_rtx (mode) : target;
! emit_insn (gen_rtx_SET (VOIDmode, temp, GEN_INT (val)));
/* For MINUS, the value is subtracted from, since we never
have subtraction of a constant. */
if (code == MINUS)
! emit_insn (gen_rtx_SET (VOIDmode, target,
! gen_rtx_MINUS (mode, temp, source)));
else
! emit_insn (gen_rtx_SET (VOIDmode, target,
! gen_rtx_fmt_ee (code, mode, source, temp)));
return 2;
}
}
--- 1682,1702 ----
{
/* Currently SET is the only monadic value for CODE, all
the rest are diadic. */
! emit_set_insn (target, GEN_INT (val));
return 1;
}
else
{
rtx temp = subtargets ? gen_reg_rtx (mode) : target;
! emit_set_insn (temp, GEN_INT (val));
/* For MINUS, the value is subtracted from, since we never
have subtraction of a constant. */
if (code == MINUS)
! emit_set_insn (target, gen_rtx_MINUS (mode, temp, source));
else
! emit_set_insn (target,
! gen_rtx_fmt_ee (code, mode, source, temp));
return 2;
}
}
*************** arm_legitimize_address (rtx x, rtx orig_
*** 3970,3980 ****
}
base_reg = gen_reg_rtx (SImode);
! val = force_operand (gen_rtx_PLUS (SImode, xop0,
! GEN_INT (n)), NULL_RTX);
emit_move_insn (base_reg, val);
! x = (low_n == 0 ? base_reg
! : gen_rtx_PLUS (SImode, base_reg, GEN_INT (low_n)));
}
else if (xop0 != XEXP (x, 0) || xop1 != XEXP (x, 1))
x = gen_rtx_PLUS (SImode, xop0, xop1);
--- 3978,3986 ----
}
base_reg = gen_reg_rtx (SImode);
! val = force_operand (plus_constant (xop0, n), NULL_RTX);
emit_move_insn (base_reg, val);
! x = plus_constant (base_reg, low_n);
}
else if (xop0 != XEXP (x, 0) || xop1 != XEXP (x, 1))
x = gen_rtx_PLUS (SImode, xop0, xop1);
*************** arm_legitimize_address (rtx x, rtx orig_
*** 4022,4028 ****
index -= mask;
}
base_reg = force_reg (SImode, GEN_INT (base));
! x = gen_rtx_PLUS (SImode, base_reg, GEN_INT (index));
}
if (flag_pic)
--- 4028,4034 ----
index -= mask;
}
base_reg = force_reg (SImode, GEN_INT (base));
! x = plus_constant (base_reg, index);
}
if (flag_pic)
*************** arm_gen_load_multiple (int base_regno, i
*** 6223,6230 ****
if (write_back)
{
XVECEXP (result, 0, 0)
! = gen_rtx_SET (GET_MODE (from), from,
! plus_constant (from, count * 4 * sign));
i = 1;
count++;
}
--- 6229,6235 ----
if (write_back)
{
XVECEXP (result, 0, 0)
! = gen_rtx_SET (VOIDmode, from, plus_constant (from, count * 4 * sign));
i = 1;
count++;
}
*************** arm_gen_store_multiple (int base_regno,
*** 6287,6293 ****
if (write_back)
{
XVECEXP (result, 0, 0)
! = gen_rtx_SET (GET_MODE (to), to,
plus_constant (to, count * 4 * sign));
i = 1;
count++;
--- 6292,6298 ----
if (write_back)
{
XVECEXP (result, 0, 0)
! = gen_rtx_SET (VOIDmode, to,
plus_constant (to, count * 4 * sign));
i = 1;
count++;
*************** arm_gen_compare_reg (enum rtx_code code,
*** 6737,6744 ****
enum machine_mode mode = SELECT_CC_MODE (code, x, y);
rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM);
! emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
! gen_rtx_COMPARE (mode, x, y)));
return cc_reg;
}
--- 6742,6748 ----
enum machine_mode mode = SELECT_CC_MODE (code, x, y);
rtx cc_reg = gen_rtx_REG (mode, CC_REGNUM);
! emit_set_insn (cc_reg, gen_rtx_COMPARE (mode, x, y));
return cc_reg;
}
*************** arm_reload_in_hi (rtx *operands)
*** 6792,6798 ****
{
rtx base_plus = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
! emit_insn (gen_rtx_SET (VOIDmode, base_plus, base));
base = base_plus;
}
else if (GET_CODE (base) == PLUS)
--- 6796,6802 ----
{
rtx base_plus = gen_rtx_REG (SImode, REGNO (operands[2]) + 1);
! emit_set_insn (base_plus, base);
base = base_plus;
}
else if (GET_CODE (base) == PLUS)
*************** arm_reload_in_hi (rtx *operands)
*** 6850,6869 ****
plus_constant (base,
offset + 1))));
if (!BYTES_BIG_ENDIAN)
! emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_SUBREG (SImode, operands[0], 0),
! gen_rtx_IOR (SImode,
! gen_rtx_ASHIFT
! (SImode,
! gen_rtx_SUBREG (SImode, operands[0], 0),
! GEN_INT (8)),
! scratch)));
! else
! emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_SUBREG (SImode, operands[0], 0),
! gen_rtx_IOR (SImode,
! gen_rtx_ASHIFT (SImode, scratch,
! GEN_INT (8)),
! gen_rtx_SUBREG (SImode, operands[0],
! 0))));
}
/* Handle storing a half-word to memory during reload by synthesizing as two
--- 6854,6872 ----
plus_constant (base,
offset + 1))));
if (!BYTES_BIG_ENDIAN)
! emit_set_insn (gen_rtx_SUBREG (SImode, operands[0], 0),
! gen_rtx_IOR (SImode,
! gen_rtx_ASHIFT
! (SImode,
! gen_rtx_SUBREG (SImode, operands[0], 0),
! GEN_INT (8)),
! scratch));
! else
! emit_set_insn (gen_rtx_SUBREG (SImode, operands[0], 0),
! gen_rtx_IOR (SImode,
! gen_rtx_ASHIFT (SImode, scratch,
! GEN_INT (8)),
! gen_rtx_SUBREG (SImode, operands[0], 0)));
}
/* Handle storing a half-word to memory during reload by synthesizing as two
*************** arm_reload_out_hi (rtx *operands)
*** 6938,6944 ****
}
}
! emit_insn (gen_rtx_SET (VOIDmode, base_plus, base));
base = base_plus;
}
else if (GET_CODE (base) == PLUS)
--- 6941,6947 ----
}
}
! emit_set_insn (base_plus, base);
base = base_plus;
}
else if (GET_CODE (base) == PLUS)
*************** vfp_emit_fstmx (int base_reg, int count)
*** 8445,8452 ****
UNSPEC_PUSH_MULT));
tmp = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! gen_rtx_PLUS (SImode, stack_pointer_rtx,
! GEN_INT (-(count * 8 + 4))));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
--- 8448,8454 ----
UNSPEC_PUSH_MULT));
tmp = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! plus_constant (stack_pointer_rtx, -(count * 8 + 4)));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
*************** vfp_emit_fstmx (int base_reg, int count)
*** 8464,8472 ****
tmp = gen_rtx_SET (VOIDmode,
gen_frame_mem (DFmode,
! gen_rtx_PLUS (SImode,
! stack_pointer_rtx,
! GEN_INT (i * 8))),
reg);
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, i + 1) = tmp;
--- 8466,8473 ----
tmp = gen_rtx_SET (VOIDmode,
gen_frame_mem (DFmode,
! plus_constant (stack_pointer_rtx,
! i * 8)),
reg);
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, i + 1) = tmp;
*************** emit_multi_reg_push (unsigned long mask)
*** 10207,10217 ****
par = emit_insn (par);
! tmp = gen_rtx_SET (SImode,
stack_pointer_rtx,
! gen_rtx_PLUS (SImode,
! stack_pointer_rtx,
! GEN_INT (-4 * num_regs)));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
--- 10208,10216 ----
par = emit_insn (par);
! tmp = gen_rtx_SET (VOIDmode,
stack_pointer_rtx,
! plus_constant (stack_pointer_rtx, -4 * num_regs));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
*************** emit_sfm (int base_reg, int count)
*** 10276,10284 ****
tmp = gen_rtx_SET (VOIDmode,
stack_pointer_rtx,
! gen_rtx_PLUS (SImode,
! stack_pointer_rtx,
! GEN_INT (-12 * count)));
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
--- 10275,10282 ----
tmp = gen_rtx_SET (VOIDmode,
stack_pointer_rtx,
! plus_constant (stack_pointer_rtx, -12 * count));
!
RTX_FRAME_RELATED_P (tmp) = 1;
XVECEXP (dwarf, 0, 0) = tmp;
*************** arm_expand_prologue (void)
*** 10611,10635 ****
inherited from the caller. */
if (regs_ever_live[3] == 0)
! {
! insn = gen_rtx_REG (SImode, 3);
! insn = gen_rtx_SET (SImode, insn, ip_rtx);
! insn = emit_insn (insn);
! }
else if (args_to_push == 0)
{
rtx dwarf;
- insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
- insn = gen_frame_mem (SImode, insn);
- insn = gen_rtx_SET (VOIDmode, insn, ip_rtx);
- insn = emit_insn (insn);
fp_offset = 4;
/* Just tell the dwarf backend that we adjusted SP. */
dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! gen_rtx_PLUS (SImode, stack_pointer_rtx,
! GEN_INT (-fp_offset)));
RTX_FRAME_RELATED_P (insn) = 1;
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
dwarf, REG_NOTES (insn));
--- 10609,10627 ----
inherited from the caller. */
if (regs_ever_live[3] == 0)
! insn = emit_set_insn (gen_rtx_REG (SImode, 3), ip_rtx);
else if (args_to_push == 0)
{
rtx dwarf;
+ insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx);
+ insn = emit_set_insn (gen_frame_mem (SImode, insn), ip_rtx);
fp_offset = 4;
/* Just tell the dwarf backend that we adjusted SP. */
dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
! plus_constant (stack_pointer_rtx,
! -fp_offset));
RTX_FRAME_RELATED_P (insn) = 1;
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
dwarf, REG_NOTES (insn));
*************** arm_expand_prologue (void)
*** 10652,10672 ****
args_to_push = 0;
/* Now reuse r3 to preserve IP. */
! insn = gen_rtx_REG (SImode, 3);
! insn = gen_rtx_SET (SImode, insn, ip_rtx);
! (void) emit_insn (insn);
}
}
! if (fp_offset)
! {
! insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset));
! insn = gen_rtx_SET (SImode, ip_rtx, insn);
! }
! else
! insn = gen_movsi (ip_rtx, stack_pointer_rtx);
!
! insn = emit_insn (insn);
RTX_FRAME_RELATED_P (insn) = 1;
}
--- 10644,10655 ----
args_to_push = 0;
/* Now reuse r3 to preserve IP. */
! emit_set_insn (gen_rtx_REG (SImode, 3), ip_rtx);
}
}
! insn = emit_set_insn (ip_rtx,
! plus_constant (stack_pointer_rtx, fp_offset));
RTX_FRAME_RELATED_P (insn) = 1;
}
*************** arm_expand_prologue (void)
*** 10691,10701 ****
if ((func_type == ARM_FT_ISR || func_type == ARM_FT_FIQ)
&& (live_regs_mask & (1 << LR_REGNUM)) != 0
&& ! frame_pointer_needed)
! emit_insn (gen_rtx_SET (SImode,
! gen_rtx_REG (SImode, LR_REGNUM),
! gen_rtx_PLUS (SImode,
! gen_rtx_REG (SImode, LR_REGNUM),
! GEN_INT (-4))));
if (live_regs_mask)
{
--- 10674,10684 ----
if ((func_type == ARM_FT_ISR || func_type == ARM_FT_FIQ)
&& (live_regs_mask & (1 << LR_REGNUM)) != 0
&& ! frame_pointer_needed)
! {
! rtx lr = gen_rtx_REG (SImode, LR_REGNUM);
!
! emit_set_insn (lr, plus_constant (lr, -4));
! }
if (live_regs_mask)
{
*************** arm_expand_prologue (void)
*** 10710,10717 ****
{
insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
insn = gen_frame_mem (V2SImode, insn);
! insn = emit_insn (gen_rtx_SET (VOIDmode, insn,
! gen_rtx_REG (V2SImode, reg)));
RTX_FRAME_RELATED_P (insn) = 1;
saved_regs += 8;
}
--- 10693,10699 ----
{
insn = gen_rtx_PRE_DEC (V2SImode, stack_pointer_rtx);
insn = gen_frame_mem (V2SImode, insn);
! insn = emit_set_insn (insn, gen_rtx_REG (V2SImode, reg));
RTX_FRAME_RELATED_P (insn) = 1;
saved_regs += 8;
}
*************** arm_expand_prologue (void)
*** 10729,10736 ****
{
insn = gen_rtx_PRE_DEC (XFmode, stack_pointer_rtx);
insn = gen_frame_mem (XFmode, insn);
! insn = emit_insn (gen_rtx_SET (VOIDmode, insn,
! gen_rtx_REG (XFmode, reg)));
RTX_FRAME_RELATED_P (insn) = 1;
saved_regs += 12;
}
--- 10711,10717 ----
{
insn = gen_rtx_PRE_DEC (XFmode, stack_pointer_rtx);
insn = gen_frame_mem (XFmode, insn);
! insn = emit_set_insn (insn, gen_rtx_REG (XFmode, reg));
RTX_FRAME_RELATED_P (insn) = 1;
saved_regs += 12;
}
*************** arm_expand_prologue (void)
*** 10806,10817 ****
insn = gen_rtx_REG (SImode, 3);
else /* if (current_function_pretend_args_size == 0) */
{
! insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx,
! GEN_INT (4));
insn = gen_frame_mem (SImode, insn);
}
! emit_insn (gen_rtx_SET (SImode, ip_rtx, insn));
/* Add a USE to stop propagate_one_insn() from barfing. */
emit_insn (gen_prologue_use (ip_rtx));
}
--- 10787,10797 ----
insn = gen_rtx_REG (SImode, 3);
else /* if (current_function_pretend_args_size == 0) */
{
! insn = plus_constant (hard_frame_pointer_rtx, 4);
insn = gen_frame_mem (SImode, insn);
}
! emit_set_insn (ip_rtx, insn);
/* Add a USE to stop propagate_one_insn() from barfing. */
emit_insn (gen_prologue_use (ip_rtx));
}
*************** thumb_expand_prologue (void)
*** 13665,13671 ****
insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx, reg));
RTX_FRAME_RELATED_P (insn) = 1;
! dwarf = gen_rtx_SET (SImode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
-amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
--- 13645,13651 ----
insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx, reg));
RTX_FRAME_RELATED_P (insn) = 1;
! dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
-amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
*************** thumb_expand_prologue (void)
*** 13691,13697 ****
insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx, reg));
RTX_FRAME_RELATED_P (insn) = 1;
! dwarf = gen_rtx_SET (SImode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
-amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
--- 13671,13677 ----
insn = emit_insn (gen_addsi3 (stack_pointer_rtx,
stack_pointer_rtx, reg));
RTX_FRAME_RELATED_P (insn) = 1;
! dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
-amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
*************** thumb_expand_prologue (void)
*** 13715,13721 ****
insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
hard_frame_pointer_rtx,
stack_pointer_rtx));
! dwarf = gen_rtx_SET (SImode, hard_frame_pointer_rtx,
plus_constant (stack_pointer_rtx, amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,
--- 13695,13701 ----
insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx,
hard_frame_pointer_rtx,
stack_pointer_rtx));
! dwarf = gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
plus_constant (stack_pointer_rtx, amount));
RTX_FRAME_RELATED_P (dwarf) = 1;
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf,