Merge new ia32 backend from the branch!

From-SVN: r29044
This commit is contained in:
Richard Henderson 1999-09-01 21:20:21 -07:00 committed by Richard Henderson
parent a41cb705f6
commit e075ae69f9
11 changed files with 11190 additions and 11576 deletions

View File

@ -1,3 +1,18 @@
Wed Sep 1 21:13:48 1999 Richard Henderson <rth@cygnus.com>
Merge new ia32 backend from the branch!
* i386.h, i386.c, i386.md, reg-stack.c, i386/unix.h: Many changes.
See ChangeLog.P2 on new_ia32_branch for details.
* rtl.h (stack_regs_mentioned_p): Delete prototype.
* i386/cygwin.h (SUBTARGET_PROLOGUE): No more do_rtl.
* i386/win32.h (SUBTARGET_PROLOGUE): Likewise.
* i386/gas.h (ASM_FILE_START): Define.
* i386/winnt.c (i386_pe_valid_decl_attribute_p): Update
for name change of ix86_valid_decl_attribute_p.
(i386_pe_valid_type_attribute_p): Similarly.
Wed Sep 1 18:21:23 1999 Richard Henderson <rth@cygnus.com>
* emit-rtl.c (init_emit_once): Don't use GET_MODE_WIDER_MODE

View File

@ -482,13 +482,10 @@ do { \
&& strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),\
"main") == 0) \
{ \
rtx xops[1]; \
xops[0] = gen_rtx_MEM (FUNCTION_MODE, \
gen_rtx (SYMBOL_REF, Pmode, "_monstartup")); \
if (do_rtl) \
emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
else \
output_asm_insn (AS1 (call,%P1), xops); \
emit_call_insn (gen_rtx (CALL, VOIDmode, \
gen_rtx_MEM (FUNCTION_MODE, \
gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \
const0_rtx)); \
}
/* External function declarations. */

View File

@ -160,3 +160,14 @@ Boston, MA 02111-1307, USA. */
fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
#endif /* NO_UNDERSCORES */
/* Output at beginning of assembler file. */
/* The .file command should always begin the output. */
#undef ASM_FILE_START
#define ASM_FILE_START(FILE) \
do { \
if (target_flags & MASK_INTEL_SYNTAX) \
fputs ("\t.intel_syntax\n", FILE); \
output_file_directive (FILE, main_input_filename); \
fputs ("\t.version\t\"01.01\"\n", FILE); \
} while (0)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -22,79 +22,13 @@ Boston, MA 02111-1307, USA. */
that are the same for all the i386 Unix systems
(though they may differ in non-Unix systems). */
/* Define some concatenation macros to concatenate an opcode
and one, two or three operands. In other assembler syntaxes
they may alter the order of ther operands. */
/* Note that the other files fail to use these
in some of the places where they should. */
#if defined(__STDC__) || defined(ALMOST_STDC)
#define AS2(a,b,c) #a " " #b "," #c
#define AS2C(b,c) " " #b "," #c
#define AS3(a,b,c,d) #a " " #b "," #c "," #d
#define AS1(a,b) #a " " #b
#else
#define AS1(a,b) "a b"
#define AS2(a,b,c) "a b,c"
#define AS2C(b,c) " b,c"
#define AS3(a,b,c,d) "a b,c,d"
#endif
#define DEFAULT_ASSEMBLER_DIALECT 0
/* Define macro used to output shift-double opcodes when the shift
count is in %cl. Some assemblers require %cl as an argument;
some don't. This macro controls what to do: by default, don't
print %cl. */
#define SHIFT_DOUBLE_OMITS_COUNT 1
#define AS3_SHIFT_DOUBLE(a,b,c,d) \
(SHIFT_DOUBLE_OMITS_COUNT ? AS2 (a,c,d) : AS3 (a,b,c,d))
/* Output the size-letter for an opcode.
CODE is the letter used in an operand spec (L, B, W, S or Q).
CH is the corresponding lower case letter
(except if CODE is `Q' then CH is `l', unless GAS_MNEMONICS). */
#define PUT_OP_SIZE(CODE,CH,FILE) putc (CH,(FILE))
/* Opcode suffix for fullword insn. */
#define L_SIZE "l"
/* Prefix for register names in this syntax. */
#define RP "%"
/* Prefix for immediate operands in this syntax. */
#define IP "$"
/* Indirect call instructions should use `*'. */
#define USE_STAR 1
/* Prefix for a memory-operand X. */
#define PRINT_PTR(X, FILE)
/* Delimiters that surround base reg and index reg. */
#define ADDR_BEG(FILE) putc('(', (FILE))
#define ADDR_END(FILE) putc(')', (FILE))
/* Print an index register (whose rtx is IREG). */
#define PRINT_IREG(FILE,IREG) \
do \
{ fputs (",", (FILE)); PRINT_REG ((IREG), 0, (FILE)); } \
while (0)
/* Print an index scale factor SCALE. */
#define PRINT_SCALE(FILE,SCALE) \
if ((SCALE) != 1) fprintf ((FILE), ",%d", (SCALE))
/* Print a base/index combination.
BREG is the base reg rtx, IREG is the index reg rtx,
and SCALE is the index scale factor (an integer). */
#define PRINT_B_I_S(BREG,IREG,SCALE,FILE) \
{ ADDR_BEG (FILE); \
if (BREG) PRINT_REG ((BREG), 0, (FILE)); \
if ((IREG) != 0) \
{ PRINT_IREG ((FILE), (IREG)); \
PRINT_SCALE ((FILE), (SCALE)); } \
ADDR_END (FILE); }
/* Define the syntax of pseudo-ops, labels and comments. */
@ -148,43 +82,48 @@ Boston, MA 02111-1307, USA. */
/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
Used for C++ multiple inheritance. */
#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
do { \
tree parm; \
\
if (i386_regparm > 0) \
parm = TYPE_ARG_TYPES (TREE_TYPE (function)); \
else \
parm = NULL_TREE; \
for (; parm; parm = TREE_CHAIN (parm)) \
if (TREE_VALUE (parm) == void_type_node) \
break; \
fprintf (FILE, "\taddl $%d,%s\n", DELTA, \
parm ? "%eax" \
: aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION))) ? "8(%esp)" \
: "4(%esp)"); \
\
if (flag_pic) \
{ \
rtx xops[2]; \
xops[0] = pic_offset_table_rtx; \
xops[1] = (rtx) gen_label_rtx (); \
\
if (i386_regparm > 2) \
abort (); \
output_asm_insn ("push%L0 %0", xops); \
output_asm_insn (AS1 (call,%P1), xops); \
ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", CODE_LABEL_NUMBER (xops[1])); \
output_asm_insn (AS1 (pop%L0,%0), xops); \
output_asm_insn ("addl $%__GLOBAL_OFFSET_TABLE_+[.-%P1],%0", xops); \
fprintf (FILE, "\tmovl "); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
fprintf (FILE, "@GOT(%%ebx),%%ecx\n\tpopl %%ebx\n\tjmp *%%ecx\n"); \
} \
else \
{ \
fprintf (FILE, "\tjmp "); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
fprintf (FILE, "\n"); \
} \
#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
do { \
tree parm; \
rtx xops[2]; \
\
if (ix86_regparm > 0) \
parm = TYPE_ARG_TYPES (TREE_TYPE (function)); \
else \
parm = NULL_TREE; \
for (; parm; parm = TREE_CHAIN (parm)) \
if (TREE_VALUE (parm) == void_type_node) \
break; \
\
xops[0] = GEN_INT (DELTA); \
if (parm) \
xops[1] = gen_rtx_REG (SImode, 0); \
else if (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION)))) \
xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8)); \
else \
xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4)); \
output_asm_insn ("add{l} {%0, %1|%1, %0}", xops); \
\
if (flag_pic) \
{ \
xops[0] = pic_offset_table_rtx; \
xops[1] = gen_label_rtx (); \
\
if (ix86_regparm > 2) \
abort (); \
output_asm_insn ("push{l}\t%0", xops); \
output_asm_insn ("call\t%P1", xops); \
ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", CODE_LABEL_NUMBER (xops[1])); \
output_asm_insn ("pop{l}\t%0", xops); \
output_asm_insn ("add{l}\t$_GLOBAL_OFFSET_TABLE_+[.-%P1], %0", xops); \
fprintf (FILE, "\tmovl "); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
fprintf (FILE, "@GOT(%%ebx),%%ecx\n\tpopl %%ebx\n\tjmp *%%ecx\n"); \
} \
else \
{ \
fprintf (FILE, "\tjmp "); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
fprintf (FILE, "\n"); \
} \
} while (0)

View File

@ -274,8 +274,5 @@ do { \
rtx xops[1]; \
xops[0] = gen_rtx_MEM (FUNCTION_MODE, \
gen_rtx (SYMBOL_REF, Pmode, "_monstartup")); \
if (do_rtl) \
emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
else \
output_asm_insn (AS1 (call,%P1), xops); \
emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
}

View File

@ -58,7 +58,7 @@ i386_pe_valid_decl_attribute_p (decl, attributes, attr, args)
return 1;
}
return i386_valid_decl_attribute_p (decl, attributes, attr, args);
return ix86_valid_decl_attribute_p (decl, attributes, attr, args);
}
/* Return nonzero if ATTR is a valid attribute for TYPE.
@ -81,7 +81,7 @@ i386_pe_valid_type_attribute_p (type, attributes, attr, args)
return 1;
}
return i386_valid_type_attribute_p (type, attributes, attr, args);
return ix86_valid_type_attribute_p (type, attributes, attr, args);
}
/* Merge attributes in decls OLD and NEW.

File diff suppressed because it is too large Load Diff

View File

@ -1568,7 +1568,6 @@ extern void output_func_start_profiler PROTO ((void));
#ifdef BUFSIZ
extern void reg_to_stack PROTO ((rtx, FILE *));
#endif
extern int stack_regs_mentioned_p PROTO ((rtx));
/* In fold-const.c */
extern int add_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,