mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-05 23:21:23 +08:00
vax-protos.h (vax_output_int_move, [...]): New prototypes.
* vax-protos.h (vax_output_int_move, vax_output_int_add, vax_output_conditional_branch): New prototypes. * vax.c (vax_output_int_move, vax_output_int_add): New functions, extracted from vax.md mov and add patterns. (vax_output_conditional_branch): New function to output conditional branch instructions. * vax.md: Use mode macros for arithmetic and mov patterns. Use code macros for the jump patterns. From-SVN: r97111
This commit is contained in:
parent
500d77012d
commit
20acd2261e
@ -1,3 +1,14 @@
|
|||||||
|
2005-03-27 Steven Bosscher <stevenb@suse.de>
|
||||||
|
|
||||||
|
* vax-protos.h (vax_output_int_move, vax_output_int_add,
|
||||||
|
vax_output_conditional_branch): New prototypes.
|
||||||
|
* vax.c (vax_output_int_move, vax_output_int_add): New functions,
|
||||||
|
extracted from vax.md mov and add patterns.
|
||||||
|
(vax_output_conditional_branch): New function to output conditional
|
||||||
|
branch instructions.
|
||||||
|
* vax.md: Use mode macros for arithmetic and mov patterns.
|
||||||
|
Use code macros for the jump patterns.
|
||||||
|
|
||||||
2005-03-26 Andrew Pinski <pinskia@physics.uc.edu>
|
2005-03-26 Andrew Pinski <pinskia@physics.uc.edu>
|
||||||
|
|
||||||
* Makefile.in (libbackend.o): Depend on version files;
|
* Makefile.in (libbackend.o): Depend on version files;
|
||||||
@ -56,7 +67,7 @@
|
|||||||
2005-03-25 John David Anglin <dave.anglin@nrc-crnc.gc.ca>
|
2005-03-25 John David Anglin <dave.anglin@nrc-crnc.gc.ca>
|
||||||
|
|
||||||
PR target/15491
|
PR target/15491
|
||||||
* vax.c (vax_rtx_costs_1): Merge with vax_rtx_costs.
|
* vax.c (vax_rtx_costs_1): Merge with vax_rtx_costs.
|
||||||
(vax_rtx_costs): Return false when passed unsupported rtx's. Handle
|
(vax_rtx_costs): Return false when passed unsupported rtx's. Handle
|
||||||
FLOAT_EXTEND, FLOAT_TRUNCATE and TRUNCATE. Fix costs for POST_INC,
|
FLOAT_EXTEND, FLOAT_TRUNCATE and TRUNCATE. Fix costs for POST_INC,
|
||||||
PRE_DEC, NEG and NOT.
|
PRE_DEC, NEG and NOT.
|
||||||
@ -284,7 +295,7 @@
|
|||||||
|
|
||||||
2005-03-22 Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
|
2005-03-22 Richard Guenther <rguenth@tat.physik.uni-tuebingen.de>
|
||||||
Jan Hubicka <jh@suse.cz>
|
Jan Hubicka <jh@suse.cz>
|
||||||
Steven Bosscher <stevenb@suse.de
|
Steven Bosscher <stevenb@suse.de>
|
||||||
|
|
||||||
* cgraphunit.c (cgraph_estimate_size_after_inlining): Compute
|
* cgraphunit.c (cgraph_estimate_size_after_inlining): Compute
|
||||||
call cost based on argument sizes.
|
call cost based on argument sizes.
|
||||||
|
@ -26,6 +26,9 @@ extern void split_quadword_operands (rtx *, rtx *, int);
|
|||||||
extern void print_operand_address (FILE *, rtx);
|
extern void print_operand_address (FILE *, rtx);
|
||||||
extern int vax_float_literal (rtx);
|
extern int vax_float_literal (rtx);
|
||||||
extern void vax_notice_update_cc (rtx, rtx);
|
extern void vax_notice_update_cc (rtx, rtx);
|
||||||
|
extern const char * vax_output_int_move (rtx, rtx *, enum machine_mode);
|
||||||
|
extern const char * vax_output_int_add (rtx, rtx *, enum machine_mode);
|
||||||
|
extern const char * vax_output_conditional_branch (enum rtx_code);
|
||||||
#endif /* RTX_CODE */
|
#endif /* RTX_CODE */
|
||||||
|
|
||||||
#ifdef REAL_VALUE_TYPE
|
#ifdef REAL_VALUE_TYPE
|
||||||
|
@ -899,3 +899,201 @@ vax_notice_update_cc (rtx exp, rtx insn ATTRIBUTE_UNUSED)
|
|||||||
/* Actual condition, one line up, should be that value2's address
|
/* Actual condition, one line up, should be that value2's address
|
||||||
depends on value1, but that is too much of a pain. */
|
depends on value1, but that is too much of a pain. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Output integer move instructions. */
|
||||||
|
|
||||||
|
const char *
|
||||||
|
vax_output_int_move (rtx insn ATTRIBUTE_UNUSED, rtx *operands,
|
||||||
|
enum machine_mode mode)
|
||||||
|
{
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case SImode:
|
||||||
|
if (GET_CODE (operands[1]) == SYMBOL_REF || GET_CODE (operands[1]) == CONST)
|
||||||
|
{
|
||||||
|
if (push_operand (operands[0], SImode))
|
||||||
|
return "pushab %a1";
|
||||||
|
return "movab %a1,%0";
|
||||||
|
}
|
||||||
|
if (operands[1] == const0_rtx)
|
||||||
|
return "clrl %0";
|
||||||
|
if (GET_CODE (operands[1]) == CONST_INT
|
||||||
|
&& (unsigned) INTVAL (operands[1]) >= 64)
|
||||||
|
{
|
||||||
|
int i = INTVAL (operands[1]);
|
||||||
|
if ((unsigned)(~i) < 64)
|
||||||
|
return "mcoml %N1,%0";
|
||||||
|
if ((unsigned)i < 0x100)
|
||||||
|
return "movzbl %1,%0";
|
||||||
|
if (i >= -0x80 && i < 0)
|
||||||
|
return "cvtbl %1,%0";
|
||||||
|
if ((unsigned)i < 0x10000)
|
||||||
|
return "movzwl %1,%0";
|
||||||
|
if (i >= -0x8000 && i < 0)
|
||||||
|
return "cvtwl %1,%0";
|
||||||
|
}
|
||||||
|
if (push_operand (operands[0], SImode))
|
||||||
|
return "pushl %1";
|
||||||
|
return "movl %1,%0";
|
||||||
|
|
||||||
|
case HImode:
|
||||||
|
if (GET_CODE (operands[1]) == CONST_INT)
|
||||||
|
{
|
||||||
|
int i = INTVAL (operands[1]);
|
||||||
|
if (i == 0)
|
||||||
|
return "clrw %0";
|
||||||
|
else if ((unsigned int)i < 64)
|
||||||
|
return "movw %1,%0";
|
||||||
|
else if ((unsigned int)~i < 64)
|
||||||
|
return "mcomw %H1,%0";
|
||||||
|
else if ((unsigned int)i < 256)
|
||||||
|
return "movzbw %1,%0";
|
||||||
|
}
|
||||||
|
return "movw %1,%0";
|
||||||
|
|
||||||
|
case QImode:
|
||||||
|
if (GET_CODE (operands[1]) == CONST_INT)
|
||||||
|
{
|
||||||
|
int i = INTVAL (operands[1]);
|
||||||
|
if (i == 0)
|
||||||
|
return "clrb %0";
|
||||||
|
else if ((unsigned int)~i < 64)
|
||||||
|
return "mcomb %B1,%0";
|
||||||
|
}
|
||||||
|
return "movb %1,%0";
|
||||||
|
|
||||||
|
default:
|
||||||
|
gcc_unreachable ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output integer add instructions.
|
||||||
|
|
||||||
|
The space-time-opcode tradeoffs for addition vary by model of VAX.
|
||||||
|
|
||||||
|
On a VAX 3 "movab (r1)[r2],r3" is faster than "addl3 r1,r2,r3",
|
||||||
|
but it not faster on other models.
|
||||||
|
|
||||||
|
"movab #(r1),r2" is usually shorter than "addl3 #,r1,r2", and is
|
||||||
|
faster on a VAX 3, but some VAXen (e.g. VAX 9000) will stall if
|
||||||
|
a register is used in an address too soon after it is set.
|
||||||
|
Compromise by using movab only when it is shorter than the add
|
||||||
|
or the base register in the address is one of sp, ap, and fp,
|
||||||
|
which are not modified very often. */
|
||||||
|
|
||||||
|
const char *
|
||||||
|
vax_output_int_add (rtx insn ATTRIBUTE_UNUSED, rtx *operands,
|
||||||
|
enum machine_mode mode)
|
||||||
|
{
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case SImode:
|
||||||
|
if (rtx_equal_p (operands[0], operands[1]))
|
||||||
|
{
|
||||||
|
if (operands[2] == const1_rtx)
|
||||||
|
return "incl %0";
|
||||||
|
if (operands[2] == constm1_rtx)
|
||||||
|
return "decl %0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subl2 $%n2,%0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) INTVAL (operands[2]) >= 64
|
||||||
|
&& GET_CODE (operands[1]) == REG
|
||||||
|
&& ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768)
|
||||||
|
|| REGNO (operands[1]) > 11))
|
||||||
|
return "movab %c2(%1),%0";
|
||||||
|
return "addl2 %2,%0";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtx_equal_p (operands[0], operands[2]))
|
||||||
|
return "addl2 %1,%0";
|
||||||
|
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& INTVAL (operands[2]) < 32767
|
||||||
|
&& INTVAL (operands[2]) > -32768
|
||||||
|
&& GET_CODE (operands[1]) == REG
|
||||||
|
&& push_operand (operands[0], SImode))
|
||||||
|
return "pushab %c2(%1)";
|
||||||
|
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subl3 $%n2,%1,%0";
|
||||||
|
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) INTVAL (operands[2]) >= 64
|
||||||
|
&& GET_CODE (operands[1]) == REG
|
||||||
|
&& ((INTVAL (operands[2]) < 32767 && INTVAL (operands[2]) > -32768)
|
||||||
|
|| REGNO (operands[1]) > 11))
|
||||||
|
return "movab %c2(%1),%0";
|
||||||
|
|
||||||
|
/* Add this if using gcc on a VAX 3xxx:
|
||||||
|
if (REG_P (operands[1]) && REG_P (operands[2]))
|
||||||
|
return "movab (%1)[%2],%0";
|
||||||
|
*/
|
||||||
|
return "addl3 %1,%2,%0";
|
||||||
|
|
||||||
|
case HImode:
|
||||||
|
if (rtx_equal_p (operands[0], operands[1]))
|
||||||
|
{
|
||||||
|
if (operands[2] == const1_rtx)
|
||||||
|
return "incw %0";
|
||||||
|
if (operands[2] == constm1_rtx)
|
||||||
|
return "decw %0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subw2 $%n2,%0";
|
||||||
|
return "addw2 %2,%0";
|
||||||
|
}
|
||||||
|
if (rtx_equal_p (operands[0], operands[2]))
|
||||||
|
return "addw2 %1,%0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subw3 $%n2,%1,%0";
|
||||||
|
return "addw3 %1,%2,%0";
|
||||||
|
|
||||||
|
case QImode:
|
||||||
|
if (rtx_equal_p (operands[0], operands[1]))
|
||||||
|
{
|
||||||
|
if (operands[2] == const1_rtx)
|
||||||
|
return "incb %0";
|
||||||
|
if (operands[2] == constm1_rtx)
|
||||||
|
return "decb %0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subb2 $%n2,%0";
|
||||||
|
return "addb2 %2,%0";
|
||||||
|
}
|
||||||
|
if (rtx_equal_p (operands[0], operands[2]))
|
||||||
|
return "addb2 %1,%0";
|
||||||
|
if (GET_CODE (operands[2]) == CONST_INT
|
||||||
|
&& (unsigned) (- INTVAL (operands[2])) < 64)
|
||||||
|
return "subb3 $%n2,%1,%0";
|
||||||
|
return "addb3 %1,%2,%0";
|
||||||
|
|
||||||
|
default:
|
||||||
|
gcc_unreachable ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output a conditional branch. */
|
||||||
|
const char *
|
||||||
|
vax_output_conditional_branch (enum rtx_code code)
|
||||||
|
{
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case EQ: return "jeql %l0";
|
||||||
|
case NE: return "jneq %l0";
|
||||||
|
case GT: return "jgtr %l0";
|
||||||
|
case LT: return "jlss %l0";
|
||||||
|
case GTU: return "jgtru %l0";
|
||||||
|
case LTU: return "jlssu %l0";
|
||||||
|
case GE: return "jgeq %l0";
|
||||||
|
case LE: return "jleq %l0";
|
||||||
|
case GEU: return "jgequ %l0";
|
||||||
|
case LEU: return "jlequ %l0";
|
||||||
|
default:
|
||||||
|
gcc_unreachable ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user