* 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
+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.
--- /dev/null
+/* 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 *));
/* 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.
#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] =
{
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
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);
/* 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;
{
return "movd %1,%0";
}
-char *
+const char *
output_move_double (operands)
rtx *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;
{
int words = bytes >> 2;
if (words)
+ {
if (words < 3 || flag_unroll_loops)
{
int offset = 0;
emit_insn(gen_movstrsi2(dest, src, GEN_INT(words)));
}
+ }
move_tail(operands, bytes & 3, bytes & ~3);
return;
}
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.
*/
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;
}
int
ns32k_valid_type_attribute_p (type, attributes, identifier, args)
tree type;
- tree attributes;
+ tree attributes ATTRIBUTE_UNUSED;
tree identifier;
tree args;
{
int
ns32k_comp_type_attributes (type1, type2)
- tree type1;
- tree type2;
+ tree type1 ATTRIBUTE_UNUSED;
+ tree type2 ATTRIBUTE_UNUSED;
{
return 1;
}
int
ns32k_return_pops_args (fundecl, funtype, size)
- tree fundecl;
+ tree fundecl ATTRIBUTE_UNUSED;
tree funtype;
int size;
{
print_operand (file, x, code)
FILE *file;
rtx x;
- char code;
+ int code;
{
if (code == '$')
PUT_IMMEDIATE_PREFIX (file);
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)
/* 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)
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];
/* 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.
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:
/* 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))) \
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 (); \
}
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. */
#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 */
/*
"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\";
}")
"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\";
}")