ns32k-protos.h: New file.

* ns32k-protos.h: New file.

        * ns32k.c: Fix compile time warnings.

        * ns32k.h: Move prototypes to ns32k-protos.h.  Fix compile time
        warnings.

        * ns32k.md: Likewise.

From-SVN: r31494
This commit is contained in:
Kaveh R. Ghazi 2000-01-18 23:06:06 +00:00 committed by Kaveh Ghazi
parent 2fd58acb35
commit fabf04b6e0
5 changed files with 104 additions and 71 deletions

View File

@ -1,3 +1,14 @@
2000-01-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* ns32k-protos.h: New file.
* ns32k.c: Fix compile time warnings.
* ns32k.h: Move prototypes to ns32k-protos.h. Fix compile time
warnings.
* ns32k.md: Likewise.
2000-01-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* vax-protos.h: New file.

View File

@ -0,0 +1,49 @@
/* Definitions of target machine for GNU compiler. NS32000 version.
Copyright (C) 2000 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@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. */
/* Prototypes for functions in ns32k.c */
#ifdef RTX_CODE
extern int calc_address_cost PARAMS ((rtx));
extern enum reg_class secondary_reload_class PARAMS ((enum reg_class,
enum machine_mode, rtx));
extern int reg_or_mem_operand PARAMS ((rtx, enum machine_mode));
extern void split_di PARAMS ((rtx[], int, rtx[], rtx[]));
extern void expand_block_move PARAMS ((rtx[]));
extern int global_symbolic_reference_mentioned_p PARAMS ((rtx, int));
extern void print_operand PARAMS ((FILE *, rtx, int));
extern void print_operand_address PARAMS ((FILE *, rtx));
extern const char *output_move_double PARAMS ((rtx *));
extern const char *output_shift_insn PARAMS ((rtx *));
extern int symbolic_reference_mentioned_p PARAMS ((rtx));
#endif /* RTX_CODE */
#ifdef TREE_CODE
extern int ns32k_comp_type_attributes PARAMS ((tree, tree));
extern int ns32k_return_pops_args PARAMS ((tree, tree, int));
extern int ns32k_valid_decl_attribute_p PARAMS ((tree, tree, tree, tree));
extern int ns32k_valid_type_attribute_p PARAMS ((tree, tree, tree, tree));
#endif /* TREE_CODE */
extern int hard_regno_mode_ok PARAMS ((int, enum machine_mode));
extern int register_move_cost PARAMS ((enum reg_class, enum reg_class));
extern const char *output_move_dconst PARAMS ((int, const char *));

View File

@ -1,5 +1,5 @@
/* Subroutines for assembler code output on the NS32000.
Copyright (C) 1988, 94, 95, 96, 97, 98, 1999 Free Software Foundation, Inc.
Copyright (C) 1988, 94-99, 2000 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -33,16 +33,18 @@ Boston, MA 02111-1307, USA. */
#include "function.h"
#include "expr.h"
#include "flags.h"
#include "recog.h"
#include "tm_p.h"
#ifdef OSF_OS
int ns32k_num_files = 0;
#endif
/* This duplicates reg_class_contens in reg_class.c, but maybe that isn't
/* This duplicates reg_class_contents in reg_class.c, but maybe that isn't
initialized in time. Also this is more convenient as an array of ints.
We know that HARD_REG_SET fits in an unsigned int */
unsigned int ns32k_reg_class_contents[N_REG_CLASSES] = REG_CLASS_CONTENTS;
unsigned int ns32k_reg_class_contents[N_REG_CLASSES][1] = REG_CLASS_CONTENTS;
enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] =
{
@ -55,15 +57,11 @@ enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] =
FRAME_POINTER_REG, STACK_POINTER_REG
};
char *ns32k_out_reg_names[] = OUTPUT_REGISTER_NAMES;
void
trace (s, s1, s2)
char *s, *s1, *s2;
{
fprintf (stderr, s, s1, s2);
}
const char *const ns32k_out_reg_names[] = OUTPUT_REGISTER_NAMES;
static rtx gen_indexed_expr PARAMS ((rtx, rtx, rtx));
static const char *singlemove_string PARAMS ((rtx *));
static void move_tail PARAMS ((rtx[], int, int));
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. */
int
@ -179,7 +177,7 @@ calc_address_cost (operand)
enum reg_class
secondary_reload_class (class, mode, in)
enum reg_class class;
enum machine_mode mode;
enum machine_mode mode ATTRIBUTE_UNUSED;
rtx in;
{
int regno = true_regnum (in);
@ -265,7 +263,7 @@ split_di (operands, num, lo_half, hi_half)
/* Return the best assembler insn template
for moving operands[1] into operands[0] as a fullword. */
static char *
static const char *
singlemove_string (operands)
rtx *operands;
{
@ -276,7 +274,7 @@ singlemove_string (operands)
return "movd %1,%0";
}
char *
const char *
output_move_double (operands)
rtx *operands;
{
@ -454,7 +452,6 @@ expand_block_move (operands)
rtx src_reg = gen_rtx(REG, Pmode, 1);
rtx dest_reg = gen_rtx(REG, Pmode, 2);
rtx count_reg = gen_rtx(REG, SImode, 0);
rtx insn;
if (constp && bytes <= 0)
return;
@ -463,6 +460,7 @@ expand_block_move (operands)
{
int words = bytes >> 2;
if (words)
{
if (words < 3 || flag_unroll_loops)
{
int offset = 0;
@ -488,6 +486,7 @@ expand_block_move (operands)
emit_insn(gen_movstrsi2(dest, src, GEN_INT(words)));
}
}
move_tail(operands, bytes & 3, bytes & ~3);
return;
}
@ -504,8 +503,6 @@ expand_block_move (operands)
if (constp && (align == UNITS_PER_WORD || bytes < MAX_UNALIGNED_COPY))
{
rtx bytes_reg;
/* constant no of bytes and aligned or small enough copy to not bother
* aligning. Emit insns to copy by words.
*/
@ -640,10 +637,10 @@ symbolic_reference_mentioned_p (op)
int
ns32k_valid_decl_attribute_p (decl, attributes, identifier, args)
tree decl;
tree attributes;
tree identifier;
tree args;
tree decl ATTRIBUTE_UNUSED;
tree attributes ATTRIBUTE_UNUSED;
tree identifier ATTRIBUTE_UNUSED;
tree args ATTRIBUTE_UNUSED;
{
return 0;
}
@ -655,7 +652,7 @@ ns32k_valid_decl_attribute_p (decl, attributes, identifier, args)
int
ns32k_valid_type_attribute_p (type, attributes, identifier, args)
tree type;
tree attributes;
tree attributes ATTRIBUTE_UNUSED;
tree identifier;
tree args;
{
@ -682,8 +679,8 @@ ns32k_valid_type_attribute_p (type, attributes, identifier, args)
int
ns32k_comp_type_attributes (type1, type2)
tree type1;
tree type2;
tree type1 ATTRIBUTE_UNUSED;
tree type2 ATTRIBUTE_UNUSED;
{
return 1;
}
@ -708,7 +705,7 @@ ns32k_comp_type_attributes (type1, type2)
int
ns32k_return_pops_args (fundecl, funtype, size)
tree fundecl;
tree fundecl ATTRIBUTE_UNUSED;
tree funtype;
int size;
{
@ -744,7 +741,7 @@ void
print_operand (file, x, code)
FILE *file;
rtx x;
char code;
int code;
{
if (code == '$')
PUT_IMMEDIATE_PREFIX (file);
@ -754,7 +751,6 @@ print_operand (file, x, code)
fprintf (file, "%s", ns32k_out_reg_names[REGNO (x)]);
else if (GET_CODE (x) == MEM)
{
rtx tmp = XEXP (x, 0);
output_address (XEXP (x, 0));
}
else if (GET_CODE (x) == CONST_DOUBLE && GET_MODE (x) != VOIDmode)
@ -1124,13 +1120,14 @@ print_operand_address (file, addr)
/* National 32032 shifting is so bad that we can get
better performance in many common cases by using other
techniques. */
char *
const char *
output_shift_insn (operands)
rtx *operands;
{
if (GET_CODE (operands[2]) == CONST_INT
&& INTVAL (operands[2]) > 0
&& INTVAL (operands[2]) <= 3)
{
if (GET_CODE (operands[0]) == REG)
{
if (GET_CODE (operands[1]) == REG)
@ -1169,13 +1166,14 @@ output_shift_insn (operands)
return "addd %0,%0";
}
else return "ashd %2,%0";
}
return "ashd %2,%0";
}
char *
const char *
output_move_dconst (n, s)
int n;
char *s;
const char *s;
{
static char r[32];

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. NS32000 version.
Copyright (C) 1988, 93, 94-98, 1999 Free Software Foundation, Inc.
Copyright (C) 1988, 93, 94-99, 2000 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC.
@ -408,12 +408,12 @@ enum reg_class
This is an initializer for a vector of HARD_REG_SET
of length N_REG_CLASSES. */
#define REG_CLASS_CONTENTS {0, 0x00ff, 0x100, 0x300, 0xff00, \
0xffff00, 0xffffff, 0x1000000, 0x2000000, \
0x30000ff, 0x3ffffff }
#define REG_CLASS_CONTENTS {{0}, {0x00ff}, {0x100}, {0x300}, {0xff00}, \
{0xffff00}, {0xffffff}, {0x1000000}, {0x2000000}, \
{0x30000ff}, {0x3ffffff} }
#define SUBSET_P(CLASS1, CLASS2) \
((ns32k_reg_class_contents[CLASS1] & ~ns32k_reg_class_contents[CLASS2]) \
((ns32k_reg_class_contents[CLASS1][0] & ~ns32k_reg_class_contents[CLASS2][0]) \
== 0)
/* The same information, inverted:
@ -1145,8 +1145,7 @@ __transfer_from_trampoline () \
/* Go to ADDR if X is a valid address not using indexing.
(This much is the easy part.) */
#define GO_IF_NONINDEXED_ADDRESS(X, ADDR) \
{ register rtx xfoob = (X); \
if (INDIRECTABLE_1_ADDRESS_P (X)) goto ADDR; \
{ if (INDIRECTABLE_1_ADDRESS_P (X)) goto ADDR; \
if (INDIRECTABLE_2_ADDRESS_P (X)) goto ADDR; \
if (GET_CODE (X) == PLUS) \
if (CONSTANT_ADDRESS_NO_LABEL_P (XEXP (X, 1))) \
@ -1211,7 +1210,9 @@ __transfer_from_trampoline () \
else if (INDEX_TERM_P (xfooy, MODE)) \
goto ADDR; \
else if (GET_CODE (xfooy) == PRE_DEC) \
if (REGNO (XEXP (xfooy, 0)) == STACK_POINTER_REGNUM) goto ADDR; \
{ \
if (REGNO (XEXP (xfooy, 0)) == STACK_POINTER_REGNUM) goto ADDR; \
} \
else abort (); \
}
@ -1594,7 +1595,7 @@ do { \
This is suitable for output with `assemble_name'. */
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
sprintf (LABEL, "*%s%d", PREFIX, NUM)
sprintf (LABEL, "*%s%ld", PREFIX, (long) NUM)
/* This is how to align the code that follows an unconditional branch. */
@ -1676,38 +1677,8 @@ do { \
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address(FILE, ADDR)
/* Prototypes for functions in ns32k.c */
/* Prototypes would be nice, but for now it causes too many problems.
This file gets included in places where the types (such as "rtx"
and enum machine_mode) are not defined. */
#define NS32K_PROTO(ARGS) ()
int hard_regno_mode_ok NS32K_PROTO((int regno, enum machine_mode mode));
int register_move_cost NS32K_PROTO((enum reg_class CLASS1, enum reg_class CLASS2));
int calc_address_cost NS32K_PROTO((rtx operand));
enum reg_class secondary_reload_class NS32K_PROTO((enum reg_class class,
enum machine_mode mode, rtx in));
int reg_or_mem_operand NS32K_PROTO((register rtx op, enum machine_mode mode));
void split_di NS32K_PROTO((rtx operands[], int num, rtx lo_half[], hi_half[]));
void expand_block_move NS32K_PROTO((rtx operands[]));
int global_symbolic_reference_mentioned_p NS32K_PROTO((rtx op, int f));
int ns32k_comp_type_attributes NS32K_PROTO((tree type1, tree type2));
int ns32k_return_pops_args NS32K_PROTO((tree fundecl, tree funtype, int size));
int ns32k_valid_decl_attribute_p NS32K_PROTO((tree decl, tree attributes,
tree identifier, tree args));
int ns32k_valid_type_attribute_p NS32K_PROTO((tree decl, tree attributes,
tree identifier, tree args));
void print_operand NS32K_PROTO((FILE *file, rtx x, char code));
void print_operand_address NS32K_PROTO((register FILE *file, register rtx addr));
char *output_move_dconst NS32K_PROTO((int n, char *s));
char *output_move_double NS32K_PROTO((rtx *operands));
char *output_shift_insn NS32K_PROTO((rtx *operands));
extern unsigned int ns32k_reg_class_contents[N_REG_CLASSES];
extern char *ns32k_out_reg_names[];
extern unsigned int ns32k_reg_class_contents[N_REG_CLASSES][1];
extern const char *const ns32k_out_reg_names[];
extern enum reg_class regclass_map[]; /* smalled class containing REGNO */
/*

View File

@ -2245,12 +2245,14 @@
"TARGET_BITFIELD"
"*
{ if (GET_CODE (operands[2]) == CONST_INT)
{
if (INTVAL (operands[1]) <= 8)
return \"inssb %3,%0,%2,%1\";
else if (INTVAL (operands[1]) <= 16)
return \"inssw %3,%0,%2,%1\";
else
return \"inssd %3,%0,%2,%1\";
}
return \"insd %2,%3,%0,%1\";
}")
@ -2262,12 +2264,14 @@
"TARGET_BITFIELD"
"*
{ if (GET_CODE (operands[2]) == CONST_INT)
{
if (INTVAL (operands[1]) <= 8)
return \"inssb %3,%0,%2,%1\";
else if (INTVAL (operands[1]) <= 16)
return \"inssw %3,%0,%2,%1\";
else
return \"inssd %3,%0,%2,%1\";
}
return \"insd %2,%3,%0,%1\";
}")