sh-protos.h: New file.
* sh-protos.h: New file. * sh.c: Include insn-config.h, toplev.h, recog.h and tm_p.h. Add static prototypes. Fix compile time warnings. * sh.h: Move prototypes to sh-protos.h. Fix compile time warnings. * sh.md: Likewise. * elf.h: Likewise. From-SVN: r31418
This commit is contained in:
parent
2b046bda6e
commit
318881c06e
|
@ -1,3 +1,14 @@
|
||||||
|
2000-01-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||||
|
|
||||||
|
* sh-protos.h: New file.
|
||||||
|
|
||||||
|
* sh.c: Include insn-config.h, toplev.h, recog.h and tm_p.h.
|
||||||
|
Add static prototypes. Fix compile time warnings.
|
||||||
|
|
||||||
|
* sh.h: Move prototypes to sh-protos.h. Fix compile time warnings.
|
||||||
|
* sh.md: Likewise.
|
||||||
|
* elf.h: Likewise.
|
||||||
|
|
||||||
2000-01-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
2000-01-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||||
|
|
||||||
* arc-protos.h: New file.
|
* arc-protos.h: New file.
|
||||||
|
|
|
@ -84,7 +84,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#undef ASM_GENERATE_INTERNAL_LABEL
|
#undef ASM_GENERATE_INTERNAL_LABEL
|
||||||
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
|
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
|
||||||
sprintf ((STRING), "*%s%s%d", LOCAL_LABEL_PREFIX, (PREFIX), (NUM))
|
sprintf ((STRING), "*%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUM))
|
||||||
|
|
||||||
#undef ASM_OUTPUT_INTERNAL_LABEL
|
#undef ASM_OUTPUT_INTERNAL_LABEL
|
||||||
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
|
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/* Definitions of target machine for GNU compiler for Hitachi Super-H.
|
||||||
|
Copyright (C) 1993-1998, 1999 Free Software Foundation, Inc.
|
||||||
|
Contributed by Steve Chamberlain (sac@cygnus.com).
|
||||||
|
Improved by Jim Wilson (wilson@cygnus.com).
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#ifdef RTX_CODE
|
||||||
|
extern struct rtx_def *sh_builtin_saveregs PARAMS ((void));
|
||||||
|
extern struct rtx_def *prepare_scc_operands PARAMS ((enum rtx_code));
|
||||||
|
|
||||||
|
/* Declare functions defined in sh.c and used in templates. */
|
||||||
|
|
||||||
|
extern const char *output_branch PARAMS ((int, rtx, rtx *));
|
||||||
|
extern const char *output_ieee_ccmpeq PARAMS ((rtx, rtx *));
|
||||||
|
extern const char *output_branchy_insn PARAMS ((enum rtx_code, const char *, rtx, rtx *));
|
||||||
|
extern const char *output_movedouble PARAMS ((rtx, rtx[], enum machine_mode));
|
||||||
|
extern const char *output_movepcrel PARAMS ((rtx, rtx[], enum machine_mode));
|
||||||
|
extern const char *output_far_jump PARAMS ((rtx, rtx));
|
||||||
|
|
||||||
|
extern void machine_dependent_reorg PARAMS ((rtx));
|
||||||
|
extern struct rtx_def *sfunc_uses_reg PARAMS ((rtx));
|
||||||
|
extern int barrier_align PARAMS ((rtx));
|
||||||
|
extern int fp_zero_operand PARAMS ((rtx));
|
||||||
|
extern int fp_one_operand PARAMS ((rtx));
|
||||||
|
extern int fp_int_operand PARAMS ((rtx));
|
||||||
|
extern rtx get_fpscr_rtx PARAMS ((void));
|
||||||
|
extern void emit_sf_insn PARAMS ((rtx));
|
||||||
|
extern void emit_df_insn PARAMS ((rtx));
|
||||||
|
extern void print_operand_address PARAMS ((FILE *, rtx));
|
||||||
|
extern void print_operand PARAMS ((FILE *, rtx, int));
|
||||||
|
extern int expand_block_move PARAMS ((rtx *));
|
||||||
|
extern int prepare_move_operands PARAMS ((rtx[], enum machine_mode mode));
|
||||||
|
extern void from_compare PARAMS ((rtx *, int));
|
||||||
|
extern int shift_insns_rtx PARAMS ((rtx));
|
||||||
|
extern int shiftcosts PARAMS ((rtx));
|
||||||
|
extern int andcosts PARAMS ((rtx));
|
||||||
|
extern int multcosts PARAMS ((rtx));
|
||||||
|
extern void gen_ashift PARAMS ((int, int, rtx));
|
||||||
|
extern void gen_ashift_hi PARAMS ((int, int, rtx));
|
||||||
|
extern void gen_shifty_op PARAMS ((int, rtx *));
|
||||||
|
extern void gen_shifty_hi_op PARAMS ((int, rtx *));
|
||||||
|
extern int expand_ashiftrt PARAMS ((rtx *));
|
||||||
|
extern int sh_dynamicalize_shift_p PARAMS ((rtx));
|
||||||
|
extern int shl_and_kind PARAMS ((rtx, rtx, int *));
|
||||||
|
extern int shl_and_length PARAMS ((rtx));
|
||||||
|
extern int shl_and_scr_length PARAMS ((rtx));
|
||||||
|
extern int gen_shl_and PARAMS ((rtx, rtx, rtx, rtx));
|
||||||
|
extern int shl_sext_kind PARAMS ((rtx, rtx, int *));
|
||||||
|
extern int shl_sext_length PARAMS ((rtx));
|
||||||
|
extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx));
|
||||||
|
extern int regs_used PARAMS ((rtx, int));
|
||||||
|
extern void fixup_addr_diff_vecs PARAMS ((rtx));
|
||||||
|
extern int get_dest_uid PARAMS ((rtx, int));
|
||||||
|
extern void final_prescan_insn PARAMS ((rtx, rtx *, int));
|
||||||
|
extern int system_reg_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int general_movsrc_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int general_movdst_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int arith_reg_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int fp_arith_reg_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int fp_extended_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int arith_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int arith_reg_or_0_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int logical_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int tertiary_reload_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int fpscr_operand PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int commutative_float_operator PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int noncommutative_float_operator PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int binary_float_operator PARAMS ((rtx, enum machine_mode));
|
||||||
|
extern int reg_unused_after PARAMS ((rtx, rtx));
|
||||||
|
extern void expand_sf_unop PARAMS ((rtx (*)(rtx, rtx, rtx), rtx *));
|
||||||
|
extern void expand_sf_binop PARAMS ((rtx (*)(rtx, rtx, rtx, rtx), rtx *));
|
||||||
|
extern void expand_df_unop PARAMS ((rtx (*)(rtx, rtx, rtx), rtx *));
|
||||||
|
extern void expand_df_binop PARAMS ((rtx (*)(rtx, rtx, rtx, rtx), rtx *));
|
||||||
|
extern void expand_fp_branch PARAMS ((rtx (*)(void), rtx (*)(void)));
|
||||||
|
#ifdef TREE_CODE
|
||||||
|
extern void sh_va_start PARAMS ((int, tree, rtx));
|
||||||
|
extern rtx sh_va_arg PARAMS ((tree, tree));
|
||||||
|
#endif /* TREE_CODE */
|
||||||
|
#endif /* RTX_CODE */
|
||||||
|
|
||||||
|
#ifdef TREE_CODE
|
||||||
|
extern void sh_pragma_insert_attributes PARAMS ((tree, tree *, tree *));
|
||||||
|
extern int sh_valid_machine_decl_attribute PARAMS ((tree, tree, tree, tree));
|
||||||
|
extern tree sh_build_va_list PARAMS ((void));
|
||||||
|
#endif /* TREE_CODE */
|
||||||
|
|
||||||
|
extern const char *output_jump_label_table PARAMS ((void));
|
||||||
|
extern int sh_handle_pragma PARAMS ((int (*)(void), void (*)(int), const char *));
|
||||||
|
extern struct rtx_def *get_fpscr_rtx PARAMS ((void));
|
||||||
|
extern void output_file_start PARAMS ((FILE *));
|
||||||
|
extern void sh_expand_prologue PARAMS ((void));
|
||||||
|
extern void sh_expand_epilogue PARAMS ((void));
|
||||||
|
extern void function_epilogue PARAMS ((FILE *, int));
|
||||||
|
extern int initial_elimination_offset PARAMS ((int, int));
|
||||||
|
extern void emit_fpscr_use PARAMS ((void));
|
||||||
|
extern void remove_dead_before_cse PARAMS ((void));
|
|
@ -22,6 +22,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
|
#include "insn-config.h"
|
||||||
#include "rtl.h"
|
#include "rtl.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "flags.h"
|
#include "flags.h"
|
||||||
|
@ -32,6 +33,9 @@ Boston, MA 02111-1307, USA. */
|
||||||
#include "hard-reg-set.h"
|
#include "hard-reg-set.h"
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
#include "insn-attr.h"
|
#include "insn-attr.h"
|
||||||
|
#include "toplev.h"
|
||||||
|
#include "recog.h"
|
||||||
|
#include "tm_p.h"
|
||||||
|
|
||||||
int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
|
int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
|
||||||
|
|
||||||
|
@ -130,11 +134,24 @@ enum reg_class reg_class_from_letter[] =
|
||||||
|
|
||||||
int assembler_dialect;
|
int assembler_dialect;
|
||||||
|
|
||||||
rtx get_fpscr_rtx ();
|
static void split_branches PARAMS ((rtx));
|
||||||
void emit_sf_insn ();
|
static int branch_dest PARAMS ((rtx));
|
||||||
void emit_df_insn ();
|
static void force_into PARAMS ((rtx, rtx));
|
||||||
|
static void print_slot PARAMS ((rtx));
|
||||||
static void split_branches PROTO ((rtx));
|
static rtx add_constant PARAMS ((rtx, enum machine_mode, rtx));
|
||||||
|
static void dump_table PARAMS ((rtx));
|
||||||
|
static int hi_const PARAMS ((rtx));
|
||||||
|
static int broken_move PARAMS ((rtx));
|
||||||
|
static int mova_p PARAMS ((rtx));
|
||||||
|
static rtx find_barrier PARAMS ((int, rtx, rtx));
|
||||||
|
static int noncall_uses_reg PARAMS ((rtx, rtx, rtx *));
|
||||||
|
static rtx gen_block_redirect PARAMS ((rtx, int, int));
|
||||||
|
static void output_stack_adjust PARAMS ((int, rtx, int));
|
||||||
|
static void push PARAMS ((int));
|
||||||
|
static void pop PARAMS ((int));
|
||||||
|
static void push_regs PARAMS ((int, int));
|
||||||
|
static int calc_live_regs PARAMS ((int *, int *));
|
||||||
|
static void mark_use PARAMS ((rtx, rtx *));
|
||||||
|
|
||||||
/* Print the operand address in x to the stream. */
|
/* Print the operand address in x to the stream. */
|
||||||
|
|
||||||
|
@ -270,6 +287,8 @@ print_operand (stream, x, code)
|
||||||
x = adj_offsettable_operand (x, 4);
|
x = adj_offsettable_operand (x, 4);
|
||||||
print_operand_address (stream, XEXP (x, 0));
|
print_operand_address (stream, XEXP (x, 0));
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
|
@ -279,6 +298,8 @@ print_operand (stream, x, code)
|
||||||
case MINUS: fputs ("sub", stream); break;
|
case MINUS: fputs ("sub", stream); break;
|
||||||
case MULT: fputs ("mul", stream); break;
|
case MULT: fputs ("mul", stream); break;
|
||||||
case DIV: fputs ("div", stream); break;
|
case DIV: fputs ("div", stream); break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -303,8 +324,6 @@ print_operand (stream, x, code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void force_into PROTO ((rtx, rtx));
|
|
||||||
|
|
||||||
/* Like force_operand, but guarantees that VALUE ends up in TARGET. */
|
/* Like force_operand, but guarantees that VALUE ends up in TARGET. */
|
||||||
static void
|
static void
|
||||||
force_into (value, target)
|
force_into (value, target)
|
||||||
|
@ -497,6 +516,8 @@ prepare_scc_operands (code)
|
||||||
case LEU:
|
case LEU:
|
||||||
code = GEU;
|
code = GEU;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (code != oldcode)
|
if (code != oldcode)
|
||||||
{
|
{
|
||||||
|
@ -513,7 +534,7 @@ prepare_scc_operands (code)
|
||||||
if ((code != EQ && code != NE
|
if ((code != EQ && code != NE
|
||||||
&& (sh_compare_op1 != const0_rtx
|
&& (sh_compare_op1 != const0_rtx
|
||||||
|| code == GTU || code == GEU || code == LTU || code == LEU))
|
|| code == GTU || code == GEU || code == LTU || code == LEU))
|
||||||
|| TARGET_SH3E && GET_MODE_CLASS (mode) == MODE_FLOAT)
|
|| (TARGET_SH3E && GET_MODE_CLASS (mode) == MODE_FLOAT))
|
||||||
sh_compare_op1 = force_reg (mode, sh_compare_op1);
|
sh_compare_op1 = force_reg (mode, sh_compare_op1);
|
||||||
|
|
||||||
if (TARGET_SH4 && GET_MODE_CLASS (mode) == MODE_FLOAT)
|
if (TARGET_SH4 && GET_MODE_CLASS (mode) == MODE_FLOAT)
|
||||||
|
@ -581,9 +602,9 @@ from_compare (operands, code)
|
||||||
Since the SH cannot move a DI or DF in one instruction, we have
|
Since the SH cannot move a DI or DF in one instruction, we have
|
||||||
to take care when we see overlapping source and dest registers. */
|
to take care when we see overlapping source and dest registers. */
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_movedouble (insn, operands, mode)
|
output_movedouble (insn, operands, mode)
|
||||||
rtx insn;
|
rtx insn ATTRIBUTE_UNUSED;
|
||||||
rtx operands[];
|
rtx operands[];
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
{
|
{
|
||||||
|
@ -668,13 +689,13 @@ print_slot (insn)
|
||||||
INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
|
INSN_DELETED_P (XVECEXP (insn, 0, 1)) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_far_jump (insn, op)
|
output_far_jump (insn, op)
|
||||||
rtx insn;
|
rtx insn;
|
||||||
rtx op;
|
rtx op;
|
||||||
{
|
{
|
||||||
struct { rtx lab, reg, op; } this;
|
struct { rtx lab, reg, op; } this;
|
||||||
char *jump;
|
const char *jump;
|
||||||
int far;
|
int far;
|
||||||
int offset = branch_dest (insn) - insn_addresses[INSN_UID (insn)];
|
int offset = branch_dest (insn) - insn_addresses[INSN_UID (insn)];
|
||||||
|
|
||||||
|
@ -729,7 +750,7 @@ static int lf = 100;
|
||||||
|
|
||||||
/* Output code for ordinary branches. */
|
/* Output code for ordinary branches. */
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_branch (logic, insn, operands)
|
output_branch (logic, insn, operands)
|
||||||
int logic;
|
int logic;
|
||||||
rtx insn;
|
rtx insn;
|
||||||
|
@ -781,15 +802,14 @@ output_branch (logic, insn, operands)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_branchy_insn (code, template, insn, operands)
|
output_branchy_insn (code, template, insn, operands)
|
||||||
char *template;
|
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
const char *template;
|
||||||
rtx insn;
|
rtx insn;
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
rtx next_insn = NEXT_INSN (insn);
|
rtx next_insn = NEXT_INSN (insn);
|
||||||
int label_nr;
|
|
||||||
|
|
||||||
if (next_insn && GET_CODE (next_insn) == JUMP_INSN && condjump_p (next_insn))
|
if (next_insn && GET_CODE (next_insn) == JUMP_INSN && condjump_p (next_insn))
|
||||||
{
|
{
|
||||||
|
@ -820,11 +840,11 @@ output_branchy_insn (code, template, insn, operands)
|
||||||
return template;
|
return template;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_ieee_ccmpeq (insn, operands)
|
output_ieee_ccmpeq (insn, operands)
|
||||||
rtx insn, operands;
|
rtx insn, *operands;
|
||||||
{
|
{
|
||||||
output_branchy_insn (NE, "bt\t%l9\\;fcmp/eq\t%1,%0", insn, operands);
|
return output_branchy_insn (NE, "bt\t%l9\\;fcmp/eq\t%1,%0", insn, operands);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output to FILE the start of the assembler file. */
|
/* Output to FILE the start of the assembler file. */
|
||||||
|
@ -833,8 +853,6 @@ void
|
||||||
output_file_start (file)
|
output_file_start (file)
|
||||||
FILE *file;
|
FILE *file;
|
||||||
{
|
{
|
||||||
register int pos;
|
|
||||||
|
|
||||||
output_file_directive (file, main_input_filename);
|
output_file_directive (file, main_input_filename);
|
||||||
|
|
||||||
/* Switch to the data section so that the coffsem symbol and the
|
/* Switch to the data section so that the coffsem symbol and the
|
||||||
|
@ -969,7 +987,7 @@ andcosts (x)
|
||||||
/* Return the cost of a multiply. */
|
/* Return the cost of a multiply. */
|
||||||
int
|
int
|
||||||
multcosts (x)
|
multcosts (x)
|
||||||
rtx x;
|
rtx x ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
if (TARGET_SH2)
|
if (TARGET_SH2)
|
||||||
{
|
{
|
||||||
|
@ -1071,7 +1089,7 @@ gen_ashift_hi (type, n, reg)
|
||||||
/* Output RTL to split a constant shift into its component SH constant
|
/* Output RTL to split a constant shift into its component SH constant
|
||||||
shift instructions. */
|
shift instructions. */
|
||||||
|
|
||||||
int
|
void
|
||||||
gen_shifty_op (code, operands)
|
gen_shifty_op (code, operands)
|
||||||
int code;
|
int code;
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
|
@ -1119,14 +1137,14 @@ gen_shifty_op (code, operands)
|
||||||
/* Same as above, but optimized for values where the topmost bits don't
|
/* Same as above, but optimized for values where the topmost bits don't
|
||||||
matter. */
|
matter. */
|
||||||
|
|
||||||
int
|
void
|
||||||
gen_shifty_hi_op (code, operands)
|
gen_shifty_hi_op (code, operands)
|
||||||
int code;
|
int code;
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
int value = INTVAL (operands[2]);
|
int value = INTVAL (operands[2]);
|
||||||
int max, i;
|
int max, i;
|
||||||
void (*gen_fun)();
|
void (*gen_fun) PARAMS ((int, int, rtx));
|
||||||
|
|
||||||
/* This operation is used by and_shl for SImode values with a few
|
/* This operation is used by and_shl for SImode values with a few
|
||||||
high bits known to be cleared. */
|
high bits known to be cleared. */
|
||||||
|
@ -1226,7 +1244,8 @@ expand_ashiftrt (operands)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sh_dynamicalize_shift_p (count)
|
int
|
||||||
|
sh_dynamicalize_shift_p (count)
|
||||||
rtx count;
|
rtx count;
|
||||||
{
|
{
|
||||||
return shift_insns[INTVAL (count)] > 1 + SH_DYNAMIC_SHIFT_COST;
|
return shift_insns[INTVAL (count)] > 1 + SH_DYNAMIC_SHIFT_COST;
|
||||||
|
@ -1293,7 +1312,7 @@ shl_and_kind (left_rtx, mask_rtx, attrp)
|
||||||
for (width = 8; width <= 16; width += 8)
|
for (width = 8; width <= 16; width += 8)
|
||||||
{
|
{
|
||||||
/* Can we zero-extend right away? */
|
/* Can we zero-extend right away? */
|
||||||
if (lsb2 == (HOST_WIDE_INT)1 << width)
|
if (lsb2 == (unsigned HOST_WIDE_INT)1 << width)
|
||||||
{
|
{
|
||||||
cost
|
cost
|
||||||
= 1 + ext_shift_insns[right] + ext_shift_insns[left + right];
|
= 1 + ext_shift_insns[right] + ext_shift_insns[left + right];
|
||||||
|
@ -1414,7 +1433,7 @@ gen_shl_and (dest, left_rtx, mask_rtx, source)
|
||||||
unsigned HOST_WIDE_INT mask;
|
unsigned HOST_WIDE_INT mask;
|
||||||
int kind = shl_and_kind (left_rtx, mask_rtx, attributes);
|
int kind = shl_and_kind (left_rtx, mask_rtx, attributes);
|
||||||
int right, total_shift;
|
int right, total_shift;
|
||||||
int (*shift_gen_fun) PROTO((int, rtx*)) = gen_shifty_hi_op;
|
void (*shift_gen_fun) PARAMS ((int, rtx*)) = gen_shifty_hi_op;
|
||||||
|
|
||||||
right = attributes[0];
|
right = attributes[0];
|
||||||
total_shift = INTVAL (left_rtx) + right;
|
total_shift = INTVAL (left_rtx) + right;
|
||||||
|
@ -1469,7 +1488,7 @@ gen_shl_and (dest, left_rtx, mask_rtx, source)
|
||||||
/* If the topmost bit that matters is set, set the topmost bits
|
/* If the topmost bit that matters is set, set the topmost bits
|
||||||
that don't matter. This way, we might be able to get a shorter
|
that don't matter. This way, we might be able to get a shorter
|
||||||
signed constant. */
|
signed constant. */
|
||||||
if (mask & ((HOST_WIDE_INT)1 << 31 - total_shift))
|
if (mask & ((HOST_WIDE_INT)1 << (31 - total_shift)))
|
||||||
mask |= (HOST_WIDE_INT)~0 << (31 - total_shift);
|
mask |= (HOST_WIDE_INT)~0 << (31 - total_shift);
|
||||||
case 2:
|
case 2:
|
||||||
/* Don't expand fine-grained when combining, because that will
|
/* Don't expand fine-grained when combining, because that will
|
||||||
|
@ -1853,9 +1872,9 @@ static int pool_size;
|
||||||
|
|
||||||
static rtx
|
static rtx
|
||||||
add_constant (x, mode, last_value)
|
add_constant (x, mode, last_value)
|
||||||
rtx last_value;
|
|
||||||
rtx x;
|
rtx x;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
rtx last_value;
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
rtx lab;
|
rtx lab;
|
||||||
|
@ -2173,26 +2192,27 @@ find_barrier (num_mova, mova, from)
|
||||||
{
|
{
|
||||||
if (new_align > si_align)
|
if (new_align > si_align)
|
||||||
{
|
{
|
||||||
si_limit -= count_si - 1 & new_align - si_align;
|
si_limit -= (count_si - 1) & (new_align - si_align);
|
||||||
si_align = new_align;
|
si_align = new_align;
|
||||||
}
|
}
|
||||||
count_si = count_si + new_align - 1 & -new_align;
|
count_si = (count_si + new_align - 1) & -new_align;
|
||||||
count_si += inc;
|
count_si += inc;
|
||||||
}
|
}
|
||||||
if (found_hi)
|
if (found_hi)
|
||||||
{
|
{
|
||||||
if (new_align > hi_align)
|
if (new_align > hi_align)
|
||||||
{
|
{
|
||||||
hi_limit -= count_hi - 1 & new_align - hi_align;
|
hi_limit -= (count_hi - 1) & (new_align - hi_align);
|
||||||
hi_align = new_align;
|
hi_align = new_align;
|
||||||
}
|
}
|
||||||
count_hi = count_hi + new_align - 1 & -new_align;
|
count_hi = (count_hi + new_align - 1) & -new_align;
|
||||||
count_hi += inc;
|
count_hi += inc;
|
||||||
}
|
}
|
||||||
from = NEXT_INSN (from);
|
from = NEXT_INSN (from);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_mova)
|
if (num_mova)
|
||||||
|
{
|
||||||
if (leading_mova)
|
if (leading_mova)
|
||||||
{
|
{
|
||||||
/* Try as we might, the leading mova is out of range. Change
|
/* Try as we might, the leading mova is out of range. Change
|
||||||
|
@ -2208,6 +2228,7 @@ find_barrier (num_mova, mova, from)
|
||||||
from = mova;
|
from = mova;
|
||||||
good_barrier = found_barrier = barrier_before_mova;
|
good_barrier = found_barrier = barrier_before_mova;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (found_barrier)
|
if (found_barrier)
|
||||||
{
|
{
|
||||||
|
@ -2421,6 +2442,8 @@ regs_used (x, is_dest)
|
||||||
case CALL:
|
case CALL:
|
||||||
used |= 0x00ff00f0;
|
used |= 0x00ff00f0;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt = GET_RTX_FORMAT (code);
|
fmt = GET_RTX_FORMAT (code);
|
||||||
|
@ -2489,7 +2512,7 @@ gen_block_redirect (jump, addr, need_block)
|
||||||
the delay slot. Therefore, find out which registers it uses, and
|
the delay slot. Therefore, find out which registers it uses, and
|
||||||
try to avoid using them. */
|
try to avoid using them. */
|
||||||
|
|
||||||
for (scan = jump; scan = PREV_INSN (scan); )
|
for (scan = jump; (scan = PREV_INSN (scan)); )
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
|
||||||
|
@ -2507,7 +2530,7 @@ gen_block_redirect (jump, addr, need_block)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (used = dead = 0, scan = JUMP_LABEL (jump); scan = NEXT_INSN (scan); )
|
for (used = dead = 0, scan = JUMP_LABEL (jump); (scan = NEXT_INSN (scan)); )
|
||||||
{
|
{
|
||||||
enum rtx_code code;
|
enum rtx_code code;
|
||||||
|
|
||||||
|
@ -2526,10 +2549,12 @@ gen_block_redirect (jump, addr, need_block)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (code == JUMP_INSN)
|
if (code == JUMP_INSN)
|
||||||
|
{
|
||||||
if (jump_left-- && simplejump_p (scan))
|
if (jump_left-- && simplejump_p (scan))
|
||||||
scan = JUMP_LABEL (scan);
|
scan = JUMP_LABEL (scan);
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Mask out the stack pointer again, in case it was
|
/* Mask out the stack pointer again, in case it was
|
||||||
|
@ -2599,6 +2624,7 @@ struct far_branch
|
||||||
int address;
|
int address;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void gen_far_branch PARAMS ((struct far_branch *));
|
||||||
enum mdep_reorg_phase_e mdep_reorg_phase;
|
enum mdep_reorg_phase_e mdep_reorg_phase;
|
||||||
void
|
void
|
||||||
gen_far_branch (bp)
|
gen_far_branch (bp)
|
||||||
|
@ -3068,7 +3094,6 @@ machine_dependent_reorg (first)
|
||||||
rtx *patp = &PATTERN (scan), pat = *patp;
|
rtx *patp = &PATTERN (scan), pat = *patp;
|
||||||
rtx src, dst;
|
rtx src, dst;
|
||||||
rtx lab;
|
rtx lab;
|
||||||
rtx newinsn;
|
|
||||||
rtx newsrc;
|
rtx newsrc;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
|
||||||
|
@ -3131,7 +3156,7 @@ machine_dependent_reorg (first)
|
||||||
last_float_move = scan;
|
last_float_move = scan;
|
||||||
last_float = src;
|
last_float = src;
|
||||||
newsrc = gen_rtx (MEM, mode,
|
newsrc = gen_rtx (MEM, mode,
|
||||||
((TARGET_SH4 && ! TARGET_FMOVD
|
(((TARGET_SH4 && ! TARGET_FMOVD)
|
||||||
|| REGNO (dst) == FPUL_REG)
|
|| REGNO (dst) == FPUL_REG)
|
||||||
? r0_inc_rtx
|
? r0_inc_rtx
|
||||||
: r0_rtx));
|
: r0_rtx));
|
||||||
|
@ -3257,9 +3282,7 @@ split_branches (first)
|
||||||
if (get_attr_length (insn) > 4)
|
if (get_attr_length (insn) > 4)
|
||||||
{
|
{
|
||||||
rtx src = SET_SRC (PATTERN (insn));
|
rtx src = SET_SRC (PATTERN (insn));
|
||||||
rtx cond = XEXP (src, 0);
|
|
||||||
rtx olabel = XEXP (XEXP (src, 1), 0);
|
rtx olabel = XEXP (XEXP (src, 1), 0);
|
||||||
rtx jump;
|
|
||||||
int addr = insn_addresses[INSN_UID (insn)];
|
int addr = insn_addresses[INSN_UID (insn)];
|
||||||
rtx label = 0;
|
rtx label = 0;
|
||||||
int dest_uid = get_dest_uid (olabel, max_uid);
|
int dest_uid = get_dest_uid (olabel, max_uid);
|
||||||
|
@ -3303,13 +3326,15 @@ split_branches (first)
|
||||||
bp->near_label = label;
|
bp->near_label = label;
|
||||||
}
|
}
|
||||||
else if (label && ! NEXT_INSN (label))
|
else if (label && ! NEXT_INSN (label))
|
||||||
|
{
|
||||||
if (addr + 2 - bp->address <= CONDJUMP_MAX)
|
if (addr + 2 - bp->address <= CONDJUMP_MAX)
|
||||||
bp->insert_place = insn;
|
bp->insert_place = insn;
|
||||||
else
|
else
|
||||||
gen_far_branch (bp);
|
gen_far_branch (bp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (! label
|
if (! label
|
||||||
|| NEXT_INSN (label) && bp->address - addr < CONDJUMP_MIN)
|
|| (NEXT_INSN (label) && bp->address - addr < CONDJUMP_MIN))
|
||||||
{
|
{
|
||||||
bp->near_label = label = gen_label_rtx ();
|
bp->near_label = label = gen_label_rtx ();
|
||||||
bp->insert_place = insn;
|
bp->insert_place = insn;
|
||||||
|
@ -3448,8 +3473,8 @@ split_branches (first)
|
||||||
void
|
void
|
||||||
final_prescan_insn (insn, opvec, noperands)
|
final_prescan_insn (insn, opvec, noperands)
|
||||||
rtx insn;
|
rtx insn;
|
||||||
rtx *opvec;
|
rtx *opvec ATTRIBUTE_UNUSED;
|
||||||
int noperands;
|
int noperands ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
if (TARGET_DUMPISIZE)
|
if (TARGET_DUMPISIZE)
|
||||||
fprintf (asm_out_file, "\n! at %04x\n", insn_addresses[INSN_UID (insn)]);
|
fprintf (asm_out_file, "\n! at %04x\n", insn_addresses[INSN_UID (insn)]);
|
||||||
|
@ -3484,7 +3509,7 @@ final_prescan_insn (insn, opvec, noperands)
|
||||||
/* Dump out any constants accumulated in the final pass. These will
|
/* Dump out any constants accumulated in the final pass. These will
|
||||||
only be labels. */
|
only be labels. */
|
||||||
|
|
||||||
char *
|
const char *
|
||||||
output_jump_label_table ()
|
output_jump_label_table ()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -3712,6 +3737,7 @@ calc_live_regs (count_ptr, live_regs_mask2)
|
||||||
live_regs_mask |= 1 << reg;
|
live_regs_mask |= 1 << reg;
|
||||||
count++;
|
count++;
|
||||||
if (TARGET_SH4 && TARGET_FMOVD && reg >= FIRST_FP_REG)
|
if (TARGET_SH4 && TARGET_FMOVD && reg >= FIRST_FP_REG)
|
||||||
|
{
|
||||||
if (reg <= LAST_FP_REG)
|
if (reg <= LAST_FP_REG)
|
||||||
{
|
{
|
||||||
if (! TARGET_FPU_SINGLE && ! regs_ever_live[reg ^ 1])
|
if (! TARGET_FPU_SINGLE && ! regs_ever_live[reg ^ 1])
|
||||||
|
@ -3729,6 +3755,7 @@ calc_live_regs (count_ptr, live_regs_mask2)
|
||||||
target_flags &= ~FPU_SINGLE_BIT;
|
target_flags &= ~FPU_SINGLE_BIT;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3868,8 +3895,8 @@ sh_expand_epilogue ()
|
||||||
|
|
||||||
void
|
void
|
||||||
function_epilogue (stream, size)
|
function_epilogue (stream, size)
|
||||||
FILE *stream;
|
FILE *stream ATTRIBUTE_UNUSED;
|
||||||
int size;
|
int size ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
trap_exit = pragma_interrupt = pragma_trapa = pragma_nosave_low_regs = 0;
|
trap_exit = pragma_interrupt = pragma_trapa = pragma_nosave_low_regs = 0;
|
||||||
sp_switch = NULL_RTX;
|
sp_switch = NULL_RTX;
|
||||||
|
@ -3878,7 +3905,6 @@ function_epilogue (stream, size)
|
||||||
rtx
|
rtx
|
||||||
sh_builtin_saveregs ()
|
sh_builtin_saveregs ()
|
||||||
{
|
{
|
||||||
tree fntype = TREE_TYPE (current_function_decl);
|
|
||||||
/* First unnamed integer register. */
|
/* First unnamed integer register. */
|
||||||
int first_intreg = current_function_args_info.arg_count[(int) SH_ARG_INT];
|
int first_intreg = current_function_args_info.arg_count[(int) SH_ARG_INT];
|
||||||
/* Number of integer registers we need to save. */
|
/* Number of integer registers we need to save. */
|
||||||
|
@ -3887,8 +3913,7 @@ sh_builtin_saveregs ()
|
||||||
int first_floatreg = current_function_args_info.arg_count[(int) SH_ARG_FLOAT];
|
int first_floatreg = current_function_args_info.arg_count[(int) SH_ARG_FLOAT];
|
||||||
/* Number of SFmode float regs to save. */
|
/* Number of SFmode float regs to save. */
|
||||||
int n_floatregs = MAX (0, NPARM_REGS (SFmode) - first_floatreg);
|
int n_floatregs = MAX (0, NPARM_REGS (SFmode) - first_floatreg);
|
||||||
int ptrsize = GET_MODE_SIZE (Pmode);
|
rtx regbuf, fpregs;
|
||||||
rtx valist, regbuf, fpregs;
|
|
||||||
int bufsize, regno, alias_set;
|
int bufsize, regno, alias_set;
|
||||||
|
|
||||||
/* Allocate block of memory for the regs. */
|
/* Allocate block of memory for the regs. */
|
||||||
|
@ -4088,7 +4113,7 @@ sh_va_arg (valist, type)
|
||||||
tree valist, type;
|
tree valist, type;
|
||||||
{
|
{
|
||||||
HOST_WIDE_INT size, rsize;
|
HOST_WIDE_INT size, rsize;
|
||||||
tree base, tmp, pptr_type_node;
|
tree tmp, pptr_type_node;
|
||||||
rtx addr_rtx, r;
|
rtx addr_rtx, r;
|
||||||
|
|
||||||
size = int_size_in_bytes (type);
|
size = int_size_in_bytes (type);
|
||||||
|
@ -4260,9 +4285,9 @@ initial_elimination_offset (from, to)
|
||||||
|
|
||||||
int
|
int
|
||||||
sh_handle_pragma (p_getc, p_ungetc, pname)
|
sh_handle_pragma (p_getc, p_ungetc, pname)
|
||||||
int (* p_getc) PROTO((void));
|
int (* p_getc) PARAMS ((void)) ATTRIBUTE_UNUSED;
|
||||||
void (* p_ungetc) PROTO((int));
|
void (* p_ungetc) PARAMS ((int)) ATTRIBUTE_UNUSED;
|
||||||
char * pname;
|
const char * pname;
|
||||||
{
|
{
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
|
@ -4282,10 +4307,8 @@ void
|
||||||
sh_pragma_insert_attributes (node, attributes, prefix)
|
sh_pragma_insert_attributes (node, attributes, prefix)
|
||||||
tree node;
|
tree node;
|
||||||
tree * attributes;
|
tree * attributes;
|
||||||
tree * prefix;
|
tree * prefix ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
tree a;
|
|
||||||
|
|
||||||
if (! pragma_interrupt
|
if (! pragma_interrupt
|
||||||
|| TREE_CODE (node) != FUNCTION_DECL)
|
|| TREE_CODE (node) != FUNCTION_DECL)
|
||||||
return;
|
return;
|
||||||
|
@ -4317,12 +4340,10 @@ sh_pragma_insert_attributes (node, attributes, prefix)
|
||||||
int
|
int
|
||||||
sh_valid_machine_decl_attribute (decl, attributes, attr, args)
|
sh_valid_machine_decl_attribute (decl, attributes, attr, args)
|
||||||
tree decl;
|
tree decl;
|
||||||
tree attributes;
|
tree attributes ATTRIBUTE_UNUSED;
|
||||||
tree attr;
|
tree attr;
|
||||||
tree args;
|
tree args;
|
||||||
{
|
{
|
||||||
int retval = 0;
|
|
||||||
|
|
||||||
if (TREE_CODE (decl) != FUNCTION_DECL)
|
if (TREE_CODE (decl) != FUNCTION_DECL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -4367,6 +4388,8 @@ sh_valid_machine_decl_attribute (decl, attributes, attr, args)
|
||||||
trap_exit = TREE_INT_CST_LOW (TREE_VALUE (args));
|
trap_exit = TREE_INT_CST_LOW (TREE_VALUE (args));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4378,7 +4401,7 @@ sh_valid_machine_decl_attribute (decl, attributes, attr, args)
|
||||||
int
|
int
|
||||||
system_reg_operand (op, mode)
|
system_reg_operand (op, mode)
|
||||||
rtx op;
|
rtx op;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
switch (REGNO (op))
|
switch (REGNO (op))
|
||||||
{
|
{
|
||||||
|
@ -4597,15 +4620,16 @@ fp_one_operand (op)
|
||||||
int
|
int
|
||||||
tertiary_reload_operand (op, mode)
|
tertiary_reload_operand (op, mode)
|
||||||
rtx op;
|
rtx op;
|
||||||
enum machine_mode mode;
|
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
enum rtx_code code = GET_CODE (op);
|
enum rtx_code code = GET_CODE (op);
|
||||||
return code == MEM || (TARGET_SH4 && code == CONST_DOUBLE);
|
return code == MEM || (TARGET_SH4 && code == CONST_DOUBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
fpscr_operand (op)
|
fpscr_operand (op, mode)
|
||||||
rtx op;
|
rtx op;
|
||||||
|
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
return (GET_CODE (op) == REG && REGNO (op) == FPSCR_REG
|
return (GET_CODE (op) == REG && REGNO (op) == FPSCR_REG
|
||||||
&& GET_MODE (op) == PSImode);
|
&& GET_MODE (op) == PSImode);
|
||||||
|
@ -4623,6 +4647,8 @@ commutative_float_operator (op, mode)
|
||||||
case PLUS:
|
case PLUS:
|
||||||
case MULT:
|
case MULT:
|
||||||
return 1;
|
return 1;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4639,6 +4665,8 @@ noncommutative_float_operator (op, mode)
|
||||||
case MINUS:
|
case MINUS:
|
||||||
case DIV:
|
case DIV:
|
||||||
return 1;
|
return 1;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4657,13 +4685,15 @@ binary_float_operator (op, mode)
|
||||||
case MULT:
|
case MULT:
|
||||||
case DIV:
|
case DIV:
|
||||||
return 1;
|
return 1;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the destination address of a branch. */
|
/* Return the destination address of a branch. */
|
||||||
|
|
||||||
int
|
static int
|
||||||
branch_dest (branch)
|
branch_dest (branch)
|
||||||
rtx branch;
|
rtx branch;
|
||||||
{
|
{
|
||||||
|
@ -4696,7 +4726,7 @@ reg_unused_after (reg, insn)
|
||||||
&& reg_overlap_mentioned_p (reg, SET_DEST (set)))
|
&& reg_overlap_mentioned_p (reg, SET_DEST (set)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
while (insn = NEXT_INSN (insn))
|
while ((insn = NEXT_INSN (insn)))
|
||||||
{
|
{
|
||||||
code = GET_CODE (insn);
|
code = GET_CODE (insn);
|
||||||
|
|
||||||
|
@ -4832,7 +4862,7 @@ emit_df_insn (pat)
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_sf_unop (fun, operands)
|
expand_sf_unop (fun, operands)
|
||||||
rtx (*fun)();
|
rtx (*fun) PARAMS ((rtx, rtx, rtx));
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
emit_sf_insn ((*fun) (operands[0], operands[1], get_fpscr_rtx ()));
|
emit_sf_insn ((*fun) (operands[0], operands[1], get_fpscr_rtx ()));
|
||||||
|
@ -4840,7 +4870,7 @@ expand_sf_unop (fun, operands)
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_sf_binop (fun, operands)
|
expand_sf_binop (fun, operands)
|
||||||
rtx (*fun)();
|
rtx (*fun) PARAMS ((rtx, rtx, rtx, rtx));
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
emit_sf_insn ((*fun) (operands[0], operands[1], operands[2],
|
emit_sf_insn ((*fun) (operands[0], operands[1], operands[2],
|
||||||
|
@ -4849,7 +4879,7 @@ expand_sf_binop (fun, operands)
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_df_unop (fun, operands)
|
expand_df_unop (fun, operands)
|
||||||
rtx (*fun)();
|
rtx (*fun) PARAMS ((rtx, rtx, rtx));
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
emit_df_insn ((*fun) (operands[0], operands[1], get_fpscr_rtx ()));
|
emit_df_insn ((*fun) (operands[0], operands[1], get_fpscr_rtx ()));
|
||||||
|
@ -4857,7 +4887,7 @@ expand_df_unop (fun, operands)
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_df_binop (fun, operands)
|
expand_df_binop (fun, operands)
|
||||||
rtx (*fun)();
|
rtx (*fun) PARAMS ((rtx, rtx, rtx, rtx));
|
||||||
rtx *operands;
|
rtx *operands;
|
||||||
{
|
{
|
||||||
emit_df_insn ((*fun) (operands[0], operands[1], operands[2],
|
emit_df_insn ((*fun) (operands[0], operands[1], operands[2],
|
||||||
|
@ -4866,7 +4896,7 @@ expand_df_binop (fun, operands)
|
||||||
|
|
||||||
void
|
void
|
||||||
expand_fp_branch (compare, branch)
|
expand_fp_branch (compare, branch)
|
||||||
rtx (*compare) (), (*branch) ();
|
rtx (*compare) PARAMS ((void)), (*branch) PARAMS ((void));
|
||||||
{
|
{
|
||||||
(GET_MODE (sh_compare_op0) == SFmode ? emit_sf_insn : emit_df_insn)
|
(GET_MODE (sh_compare_op0) == SFmode ? emit_sf_insn : emit_df_insn)
|
||||||
((*compare) ());
|
((*compare) ());
|
||||||
|
@ -4881,7 +4911,7 @@ expand_fp_branch (compare, branch)
|
||||||
/* This should best be called at about the time FINALIZE_PIC is called,
|
/* This should best be called at about the time FINALIZE_PIC is called,
|
||||||
but not dependent on flag_pic. Alas, there is no suitable hook there,
|
but not dependent on flag_pic. Alas, there is no suitable hook there,
|
||||||
so this gets called from HAVE_RETURN. */
|
so this gets called from HAVE_RETURN. */
|
||||||
int
|
void
|
||||||
emit_fpscr_use ()
|
emit_fpscr_use ()
|
||||||
{
|
{
|
||||||
static int fpscr_uses = 0;
|
static int fpscr_uses = 0;
|
||||||
|
@ -5006,7 +5036,7 @@ mark_use (x, reg_set_block)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
remove_dead_before_cse ()
|
remove_dead_before_cse ()
|
||||||
{
|
{
|
||||||
rtx *reg_set_block, last, last_call, insn, set;
|
rtx *reg_set_block, last, last_call, insn, set;
|
||||||
|
@ -5070,5 +5100,5 @@ remove_dead_before_cse ()
|
||||||
}
|
}
|
||||||
mark_use (PATTERN (insn), reg_set_block);
|
mark_use (PATTERN (insn), reg_set_block);
|
||||||
}
|
}
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -799,7 +799,7 @@ extern enum reg_class reg_class_from_letter[];
|
||||||
: R0_REGS) \
|
: R0_REGS) \
|
||||||
: (CLASS == FPSCR_REGS \
|
: (CLASS == FPSCR_REGS \
|
||||||
&& ((GET_CODE (X) == REG && REGNO (X) >= FIRST_PSEUDO_REGISTER) \
|
&& ((GET_CODE (X) == REG && REGNO (X) >= FIRST_PSEUDO_REGISTER) \
|
||||||
|| GET_CODE (X) == MEM && GET_CODE (XEXP ((X), 0)) == PLUS)) \
|
|| (GET_CODE (X) == MEM && GET_CODE (XEXP ((X), 0)) == PLUS)))\
|
||||||
? GENERAL_REGS \
|
? GENERAL_REGS \
|
||||||
: SECONDARY_OUTPUT_RELOAD_CLASS((CLASS),(MODE),(X)))
|
: SECONDARY_OUTPUT_RELOAD_CLASS((CLASS),(MODE),(X)))
|
||||||
|
|
||||||
|
@ -1011,8 +1011,8 @@ struct sh_args {
|
||||||
|
|
||||||
#define PASS_IN_REG_P(CUM, MODE, TYPE) \
|
#define PASS_IN_REG_P(CUM, MODE, TYPE) \
|
||||||
(((TYPE) == 0 \
|
(((TYPE) == 0 \
|
||||||
|| (! TREE_ADDRESSABLE ((tree)(TYPE))) \
|
|| ((! TREE_ADDRESSABLE ((tree)(TYPE))) \
|
||||||
&& (! TARGET_HITACHI || ! AGGREGATE_TYPE_P (TYPE))) \
|
&& (! TARGET_HITACHI || ! AGGREGATE_TYPE_P (TYPE)))) \
|
||||||
&& (TARGET_SH3E \
|
&& (TARGET_SH3E \
|
||||||
? ((MODE) == BLKmode \
|
? ((MODE) == BLKmode \
|
||||||
? (((CUM).arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD \
|
? (((CUM).arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD \
|
||||||
|
@ -1135,7 +1135,7 @@ extern int current_function_anonymous_args;
|
||||||
|
|
||||||
/* Alignment required for a trampoline in bits . */
|
/* Alignment required for a trampoline in bits . */
|
||||||
#define TRAMPOLINE_ALIGNMENT \
|
#define TRAMPOLINE_ALIGNMENT \
|
||||||
((CACHE_LOG < 3 || TARGET_SMALLCODE && ! TARGET_HARVARD) ? 32 : 64)
|
((CACHE_LOG < 3 || (TARGET_SMALLCODE && ! TARGET_HARVARD)) ? 32 : 64)
|
||||||
|
|
||||||
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
/* Emit RTL insns to initialize the variable parts of a trampoline.
|
||||||
FNADDR is an RTX for the address of the function's pure code.
|
FNADDR is an RTX for the address of the function's pure code.
|
||||||
|
@ -1166,7 +1166,6 @@ extern int current_function_anonymous_args;
|
||||||
: (rtx) 0)
|
: (rtx) 0)
|
||||||
|
|
||||||
/* Generate necessary RTL for __builtin_saveregs(). */
|
/* Generate necessary RTL for __builtin_saveregs(). */
|
||||||
extern struct rtx_def *sh_builtin_saveregs ();
|
|
||||||
#define EXPAND_BUILTIN_SAVEREGS() sh_builtin_saveregs ()
|
#define EXPAND_BUILTIN_SAVEREGS() sh_builtin_saveregs ()
|
||||||
|
|
||||||
/* Addressing modes, and classification of registers for them. */
|
/* Addressing modes, and classification of registers for them. */
|
||||||
|
@ -1344,7 +1343,7 @@ extern struct rtx_def *sh_builtin_saveregs ();
|
||||||
if (GET_MODE_SIZE (MODE) <= 8 && BASE_REGISTER_RTX_P (xop0)) \
|
if (GET_MODE_SIZE (MODE) <= 8 && BASE_REGISTER_RTX_P (xop0)) \
|
||||||
GO_IF_LEGITIMATE_INDEX ((MODE), xop1, LABEL); \
|
GO_IF_LEGITIMATE_INDEX ((MODE), xop1, LABEL); \
|
||||||
if (GET_MODE_SIZE (MODE) <= 4 \
|
if (GET_MODE_SIZE (MODE) <= 4 \
|
||||||
|| TARGET_SH4 && TARGET_FMOVD && MODE == DFmode) \
|
|| (TARGET_SH4 && TARGET_FMOVD && MODE == DFmode)) \
|
||||||
{ \
|
{ \
|
||||||
if (BASE_REGISTER_RTX_P (xop1) && INDEX_REGISTER_RTX_P (xop0))\
|
if (BASE_REGISTER_RTX_P (xop1) && INDEX_REGISTER_RTX_P (xop0))\
|
||||||
goto LABEL; \
|
goto LABEL; \
|
||||||
|
@ -1843,10 +1842,10 @@ dtors_section() \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ASM_OUTPUT_REG_PUSH(file, v) \
|
#define ASM_OUTPUT_REG_PUSH(file, v) \
|
||||||
fprintf ((file), "\tmov.l\tr%s,-@r15\n", (v));
|
fprintf ((file), "\tmov.l\tr%d,-@r15\n", (v));
|
||||||
|
|
||||||
#define ASM_OUTPUT_REG_POP(file, v) \
|
#define ASM_OUTPUT_REG_POP(file, v) \
|
||||||
fprintf ((file), "\tmov.l\t@r15+,r%s\n", (v));
|
fprintf ((file), "\tmov.l\t@r15+,r%d\n", (v));
|
||||||
|
|
||||||
/* The assembler's names for the registers. RFP need not always be used as
|
/* The assembler's names for the registers. RFP need not always be used as
|
||||||
the Real framepointer; it can also be used as a normal general register.
|
the Real framepointer; it can also be used as a normal general register.
|
||||||
|
@ -1918,7 +1917,7 @@ extern char fp_reg_names[][5];
|
||||||
|
|
||||||
/* Make an internal label into a string. */
|
/* Make an internal label into a string. */
|
||||||
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
|
#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM) \
|
||||||
sprintf ((STRING), "*%s%s%d", LOCAL_LABEL_PREFIX, (PREFIX), (NUM))
|
sprintf ((STRING), "*%s%s%ld", LOCAL_LABEL_PREFIX, (PREFIX), (long)(NUM))
|
||||||
|
|
||||||
/* Output an internal label definition. */
|
/* Output an internal label definition. */
|
||||||
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
|
#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \
|
||||||
|
@ -1945,6 +1944,8 @@ extern char fp_reg_names[][5];
|
||||||
case QImode: \
|
case QImode: \
|
||||||
asm_fprintf ((STREAM), "\t.byte\t%LL%d-%LL%d\n", (VALUE),(REL)); \
|
asm_fprintf ((STREAM), "\t.byte\t%LL%d-%LL%d\n", (VALUE),(REL)); \
|
||||||
break; \
|
break; \
|
||||||
|
default: \
|
||||||
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output an absolute table element. */
|
/* Output an absolute table element. */
|
||||||
|
@ -2062,7 +2063,6 @@ do { char dstr[30]; \
|
||||||
|
|
||||||
extern struct rtx_def *sh_compare_op0;
|
extern struct rtx_def *sh_compare_op0;
|
||||||
extern struct rtx_def *sh_compare_op1;
|
extern struct rtx_def *sh_compare_op1;
|
||||||
extern struct rtx_def *prepare_scc_operands();
|
|
||||||
|
|
||||||
/* Which processor to schedule for. The elements of the enumeration must
|
/* Which processor to schedule for. The elements of the enumeration must
|
||||||
match exactly the cpu attribute in the sh.md file. */
|
match exactly the cpu attribute in the sh.md file. */
|
||||||
|
@ -2082,17 +2082,6 @@ extern enum machine_mode sh_addr_diff_vec_mode;
|
||||||
|
|
||||||
extern int optimize; /* needed for gen_casesi. */
|
extern int optimize; /* needed for gen_casesi. */
|
||||||
|
|
||||||
/* Declare functions defined in sh.c and used in templates. */
|
|
||||||
|
|
||||||
extern char *output_branch();
|
|
||||||
extern char *output_ieee_ccmpeq();
|
|
||||||
extern char *output_branchy_insn();
|
|
||||||
extern char *output_shift();
|
|
||||||
extern char *output_movedouble();
|
|
||||||
extern char *output_movepcrel();
|
|
||||||
extern char *output_jump_label_table();
|
|
||||||
extern char *output_far_jump();
|
|
||||||
|
|
||||||
enum mdep_reorg_phase_e
|
enum mdep_reorg_phase_e
|
||||||
{
|
{
|
||||||
SH_BEFORE_MDEP_REORG,
|
SH_BEFORE_MDEP_REORG,
|
||||||
|
@ -2105,10 +2094,6 @@ enum mdep_reorg_phase_e
|
||||||
|
|
||||||
extern enum mdep_reorg_phase_e mdep_reorg_phase;
|
extern enum mdep_reorg_phase_e mdep_reorg_phase;
|
||||||
|
|
||||||
void machine_dependent_reorg ();
|
|
||||||
struct rtx_def *sfunc_uses_reg ();
|
|
||||||
int barrier_align ();
|
|
||||||
|
|
||||||
#define MACHINE_DEPENDENT_REORG(X) machine_dependent_reorg(X)
|
#define MACHINE_DEPENDENT_REORG(X) machine_dependent_reorg(X)
|
||||||
|
|
||||||
/* Generate calls to memcpy, memcmp and memset. */
|
/* Generate calls to memcpy, memcmp and memset. */
|
||||||
|
@ -2119,7 +2104,6 @@ int barrier_align ();
|
||||||
is a C expression whose value is 1 if the pragma was handled by the
|
is a C expression whose value is 1 if the pragma was handled by the
|
||||||
macro, zero otherwise. */
|
macro, zero otherwise. */
|
||||||
#define HANDLE_PRAGMA(GETC, UNGETC, NODE) sh_handle_pragma (GETC, UNGETC, NODE)
|
#define HANDLE_PRAGMA(GETC, UNGETC, NODE) sh_handle_pragma (GETC, UNGETC, NODE)
|
||||||
extern int sh_handle_pragma ();
|
|
||||||
|
|
||||||
/* Set when processing a function with pragma interrupt turned on. */
|
/* Set when processing a function with pragma interrupt turned on. */
|
||||||
|
|
||||||
|
@ -2132,18 +2116,15 @@ extern struct rtx_def *sp_switch;
|
||||||
/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
|
/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
|
||||||
is a valid machine specific attribute for DECL.
|
is a valid machine specific attribute for DECL.
|
||||||
The attributes in ATTRIBUTES have previously been assigned to DECL. */
|
The attributes in ATTRIBUTES have previously been assigned to DECL. */
|
||||||
extern int sh_valid_machine_decl_attribute ();
|
|
||||||
#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
|
#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
|
||||||
sh_valid_machine_decl_attribute (DECL, ATTRIBUTES, IDENTIFIER, ARGS)
|
sh_valid_machine_decl_attribute (DECL, ATTRIBUTES, IDENTIFIER, ARGS)
|
||||||
|
|
||||||
extern void sh_pragma_insert_attributes ();
|
|
||||||
#define PRAGMA_INSERT_ATTRIBUTES(node, pattr, prefix_attr) \
|
#define PRAGMA_INSERT_ATTRIBUTES(node, pattr, prefix_attr) \
|
||||||
sh_pragma_insert_attributes (node, pattr, prefix_attr)
|
sh_pragma_insert_attributes (node, pattr, prefix_attr)
|
||||||
|
|
||||||
extern int sh_flag_remove_dead_before_cse;
|
extern int sh_flag_remove_dead_before_cse;
|
||||||
extern int rtx_equal_function_value_matters;
|
extern int rtx_equal_function_value_matters;
|
||||||
extern struct rtx_def *fpscr_rtx;
|
extern struct rtx_def *fpscr_rtx;
|
||||||
extern struct rtx_def *get_fpscr_rtx ();
|
|
||||||
|
|
||||||
|
|
||||||
/* Instructions with unfilled delay slots take up an extra two bytes for
|
/* Instructions with unfilled delay slots take up an extra two bytes for
|
||||||
|
|
|
@ -2365,8 +2365,8 @@
|
||||||
(match_operand:DF 1 "general_movsrc_operand" "r,FQ,m,r"))]
|
(match_operand:DF 1 "general_movsrc_operand" "r,FQ,m,r"))]
|
||||||
"(! TARGET_SH4 || reload_completed
|
"(! TARGET_SH4 || reload_completed
|
||||||
/* ??? We provide some insn so that direct_{load,store}[DFmode] get set */
|
/* ??? We provide some insn so that direct_{load,store}[DFmode] get set */
|
||||||
|| GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 3
|
|| (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 3)
|
||||||
|| GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 3)
|
|| (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 3))
|
||||||
&& (arith_reg_operand (operands[0], DFmode)
|
&& (arith_reg_operand (operands[0], DFmode)
|
||||||
|| arith_reg_operand (operands[1], DFmode))"
|
|| arith_reg_operand (operands[1], DFmode))"
|
||||||
"* return output_movedouble (insn, operands, DFmode);"
|
"* return output_movedouble (insn, operands, DFmode);"
|
||||||
|
@ -2821,8 +2821,8 @@
|
||||||
"
|
"
|
||||||
(! TARGET_SH3E
|
(! TARGET_SH3E
|
||||||
/* ??? We provide some insn so that direct_{load,store}[SFmode] get set */
|
/* ??? We provide some insn so that direct_{load,store}[SFmode] get set */
|
||||||
|| GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 3
|
|| (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == 3)
|
||||||
|| GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 3)
|
|| (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 3))
|
||||||
&& (arith_reg_operand (operands[0], SFmode)
|
&& (arith_reg_operand (operands[0], SFmode)
|
||||||
|| arith_reg_operand (operands[1], SFmode))"
|
|| arith_reg_operand (operands[1], SFmode))"
|
||||||
"@
|
"@
|
||||||
|
@ -3467,7 +3467,6 @@
|
||||||
{
|
{
|
||||||
if (TARGET_IEEE)
|
if (TARGET_IEEE)
|
||||||
{
|
{
|
||||||
rtx t_reg = gen_rtx_REG (SImode, T_REG);
|
|
||||||
rtx lab = gen_label_rtx ();
|
rtx lab = gen_label_rtx ();
|
||||||
prepare_scc_operands (EQ);
|
prepare_scc_operands (EQ);
|
||||||
emit_jump_insn (gen_branch_true (lab));
|
emit_jump_insn (gen_branch_true (lab));
|
||||||
|
|
Loading…
Reference in New Issue