Commit e075ae69 by Richard Henderson Committed by Richard Henderson

Merge new ia32 backend from the branch!

From-SVN: r29044
parent a41cb705
No preview for this file type
...@@ -482,13 +482,10 @@ do { \ ...@@ -482,13 +482,10 @@ do { \
&& strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),\ && strcmp (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)),\
"main") == 0) \ "main") == 0) \
{ \ { \
rtx xops[1]; \ emit_call_insn (gen_rtx (CALL, VOIDmode, \
xops[0] = gen_rtx_MEM (FUNCTION_MODE, \ gen_rtx_MEM (FUNCTION_MODE, \
gen_rtx (SYMBOL_REF, Pmode, "_monstartup")); \ gen_rtx_SYMBOL_REF (Pmode, "_monstartup")), \
if (do_rtl) \ const0_rtx)); \
emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
else \
output_asm_insn (AS1 (call,%P1), xops); \
} }
/* External function declarations. */ /* External function declarations. */
......
...@@ -160,3 +160,14 @@ Boston, MA 02111-1307, USA. */ ...@@ -160,3 +160,14 @@ Boston, MA 02111-1307, USA. */
fprintf (FILE, ".%s%d:\n", PREFIX, NUM) fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
#endif /* NO_UNDERSCORES */ #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)
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -22,79 +22,13 @@ Boston, MA 02111-1307, USA. */ ...@@ -22,79 +22,13 @@ Boston, MA 02111-1307, USA. */
that are the same for all the i386 Unix systems that are the same for all the i386 Unix systems
(though they may differ in non-Unix systems). */ (though they may differ in non-Unix systems). */
/* Define some concatenation macros to concatenate an opcode #define DEFAULT_ASSEMBLER_DIALECT 0
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 macro used to output shift-double opcodes when the shift /* Define macro used to output shift-double opcodes when the shift
count is in %cl. Some assemblers require %cl as an argument; count is in %cl. Some assemblers require %cl as an argument;
some don't. This macro controls what to do: by default, don't some don't. This macro controls what to do: by default, don't
print %cl. */ print %cl. */
#define SHIFT_DOUBLE_OMITS_COUNT 1 #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. */ /* Define the syntax of pseudo-ops, labels and comments. */
...@@ -148,43 +82,48 @@ Boston, MA 02111-1307, USA. */ ...@@ -148,43 +82,48 @@ Boston, MA 02111-1307, USA. */
/* Output code to add DELTA to the first argument, and then jump to FUNCTION. /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
Used for C++ multiple inheritance. */ Used for C++ multiple inheritance. */
#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \ #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
do { \ do { \
tree parm; \ tree parm; \
\ rtx xops[2]; \
if (i386_regparm > 0) \ \
parm = TYPE_ARG_TYPES (TREE_TYPE (function)); \ if (ix86_regparm > 0) \
else \ parm = TYPE_ARG_TYPES (TREE_TYPE (function)); \
parm = NULL_TREE; \ else \
for (; parm; parm = TREE_CHAIN (parm)) \ parm = NULL_TREE; \
if (TREE_VALUE (parm) == void_type_node) \ for (; parm; parm = TREE_CHAIN (parm)) \
break; \ if (TREE_VALUE (parm) == void_type_node) \
fprintf (FILE, "\taddl $%d,%s\n", DELTA, \ break; \
parm ? "%eax" \ \
: aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION))) ? "8(%esp)" \ xops[0] = GEN_INT (DELTA); \
: "4(%esp)"); \ if (parm) \
\ xops[1] = gen_rtx_REG (SImode, 0); \
if (flag_pic) \ else if (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION)))) \
{ \ xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 8)); \
rtx xops[2]; \ else \
xops[0] = pic_offset_table_rtx; \ xops[1] = gen_rtx_MEM (SImode, plus_constant (stack_pointer_rtx, 4)); \
xops[1] = (rtx) gen_label_rtx (); \ output_asm_insn ("add{l} {%0, %1|%1, %0}", xops); \
\ \
if (i386_regparm > 2) \ if (flag_pic) \
abort (); \ { \
output_asm_insn ("push%L0 %0", xops); \ xops[0] = pic_offset_table_rtx; \
output_asm_insn (AS1 (call,%P1), xops); \ xops[1] = gen_label_rtx (); \
ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", CODE_LABEL_NUMBER (xops[1])); \ \
output_asm_insn (AS1 (pop%L0,%0), xops); \ if (ix86_regparm > 2) \
output_asm_insn ("addl $%__GLOBAL_OFFSET_TABLE_+[.-%P1],%0", xops); \ abort (); \
fprintf (FILE, "\tmovl "); \ output_asm_insn ("push{l}\t%0", xops); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \ output_asm_insn ("call\t%P1", xops); \
fprintf (FILE, "@GOT(%%ebx),%%ecx\n\tpopl %%ebx\n\tjmp *%%ecx\n"); \ ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", CODE_LABEL_NUMBER (xops[1])); \
} \ output_asm_insn ("pop{l}\t%0", xops); \
else \ output_asm_insn ("add{l}\t$_GLOBAL_OFFSET_TABLE_+[.-%P1], %0", xops); \
{ \ fprintf (FILE, "\tmovl "); \
fprintf (FILE, "\tjmp "); \ assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \ fprintf (FILE, "@GOT(%%ebx),%%ecx\n\tpopl %%ebx\n\tjmp *%%ecx\n"); \
fprintf (FILE, "\n"); \ } \
} \ else \
{ \
fprintf (FILE, "\tjmp "); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0)); \
fprintf (FILE, "\n"); \
} \
} while (0) } while (0)
...@@ -274,8 +274,5 @@ do { \ ...@@ -274,8 +274,5 @@ do { \
rtx xops[1]; \ rtx xops[1]; \
xops[0] = gen_rtx_MEM (FUNCTION_MODE, \ xops[0] = gen_rtx_MEM (FUNCTION_MODE, \
gen_rtx (SYMBOL_REF, Pmode, "_monstartup")); \ gen_rtx (SYMBOL_REF, Pmode, "_monstartup")); \
if (do_rtl) \ emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
emit_call_insn (gen_rtx (CALL, VOIDmode, xops[0], const0_rtx)); \
else \
output_asm_insn (AS1 (call,%P1), xops); \
} }
...@@ -58,7 +58,7 @@ i386_pe_valid_decl_attribute_p (decl, attributes, attr, args) ...@@ -58,7 +58,7 @@ i386_pe_valid_decl_attribute_p (decl, attributes, attr, args)
return 1; 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. /* Return nonzero if ATTR is a valid attribute for TYPE.
...@@ -81,7 +81,7 @@ i386_pe_valid_type_attribute_p (type, attributes, attr, args) ...@@ -81,7 +81,7 @@ i386_pe_valid_type_attribute_p (type, attributes, attr, args)
return 1; 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. /* Merge attributes in decls OLD and NEW.
......
...@@ -1568,7 +1568,6 @@ extern void output_func_start_profiler PROTO ((void)); ...@@ -1568,7 +1568,6 @@ extern void output_func_start_profiler PROTO ((void));
#ifdef BUFSIZ #ifdef BUFSIZ
extern void reg_to_stack PROTO ((rtx, FILE *)); extern void reg_to_stack PROTO ((rtx, FILE *));
#endif #endif
extern int stack_regs_mentioned_p PROTO ((rtx));
/* In fold-const.c */ /* In fold-const.c */
extern int add_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, extern int add_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment