190075Sobrien/* Definitions of target machine for GNU compiler, for ARM with a.out
2169689Skan   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2004
390075Sobrien   Free Software Foundation, Inc.
490075Sobrien   Contributed by Richard Earnshaw (rearnsha@armltd.co.uk).
590075Sobrien
6132718Skan   This file is part of GCC.
790075Sobrien
8132718Skan   GCC is free software; you can redistribute it and/or modify it
9132718Skan   under the terms of the GNU General Public License as published
10132718Skan   by the Free Software Foundation; either version 2, or (at your
11132718Skan   option) any later version.
1290075Sobrien
13132718Skan   GCC is distributed in the hope that it will be useful, but WITHOUT
14132718Skan   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15132718Skan   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16132718Skan   License for more details.
1790075Sobrien
18132718Skan   You should have received a copy of the GNU General Public License
19132718Skan   along with GCC; see the file COPYING.  If not, write to
20169689Skan   the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21169689Skan   Boston, MA 02110-1301, USA.  */
2290075Sobrien
2390075Sobrien#ifndef ASM_APP_ON
2490075Sobrien#define ASM_APP_ON  		""
2590075Sobrien#endif
2690075Sobrien#ifndef ASM_APP_OFF
2790075Sobrien#define ASM_APP_OFF  		""
2890075Sobrien#endif
2990075Sobrien
3090075Sobrien/* Switch to the text or data segment.  */
3190075Sobrien#define TEXT_SECTION_ASM_OP  	"\t.text"
3290075Sobrien#define DATA_SECTION_ASM_OP  	"\t.data"
3390075Sobrien#define BSS_SECTION_ASM_OP   	"\t.bss"
3490075Sobrien
3590075Sobrien/* Note: If USER_LABEL_PREFIX or LOCAL_LABEL_PREFIX are changed,
3690075Sobrien   make sure that this change is reflected in the function
37132718Skan   coff_arm_is_local_label_name() in bfd/coff-arm.c.  */
3890075Sobrien#ifndef REGISTER_PREFIX
3990075Sobrien#define REGISTER_PREFIX 	""
4090075Sobrien#endif
4190075Sobrien
4290075Sobrien#ifndef USER_LABEL_PREFIX
4390075Sobrien#define USER_LABEL_PREFIX 	"_"
4490075Sobrien#endif
4590075Sobrien
4690075Sobrien#ifndef LOCAL_LABEL_PREFIX
4790075Sobrien#define LOCAL_LABEL_PREFIX 	""
4890075Sobrien#endif
4990075Sobrien
5090075Sobrien/* The assembler's names for the registers.  */
5190075Sobrien#ifndef REGISTER_NAMES
52169689Skan#define REGISTER_NAMES				   \
5390075Sobrien{				                   \
5490075Sobrien  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",  \
5590075Sobrien  "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc",  \
5690075Sobrien  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",  \
57132718Skan  "cc", "sfp", "afp",		   		   \
58132718Skan  "mv0",   "mv1",   "mv2",   "mv3",		   \
59132718Skan  "mv4",   "mv5",   "mv6",   "mv7",		   \
60132718Skan  "mv8",   "mv9",   "mv10",  "mv11",		   \
61132718Skan  "mv12",  "mv13",  "mv14",  "mv15",		   \
62132718Skan  "wcgr0", "wcgr1", "wcgr2", "wcgr3",		   \
63132718Skan  "wr0",   "wr1",   "wr2",   "wr3",		   \
64132718Skan  "wr4",   "wr5",   "wr6",   "wr7",		   \
65132718Skan  "wr8",   "wr9",   "wr10",  "wr11",		   \
66169689Skan  "wr12",  "wr13",  "wr14",  "wr15",		   \
67169689Skan  "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",  \
68169689Skan  "s8",  "s9",  "s10", "s11", "s12", "s13", "s14", "s15", \
69169689Skan  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", \
70169689Skan  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", \
71169689Skan  "vfpcc"					   \
7290075Sobrien}
7390075Sobrien#endif
7490075Sobrien
7590075Sobrien#ifndef ADDITIONAL_REGISTER_NAMES
7690075Sobrien#define ADDITIONAL_REGISTER_NAMES		\
7790075Sobrien{						\
7890075Sobrien  {"a1", 0},					\
7990075Sobrien  {"a2", 1},					\
8090075Sobrien  {"a3", 2},					\
8190075Sobrien  {"a4", 3},					\
8290075Sobrien  {"v1", 4},					\
8390075Sobrien  {"v2", 5},					\
8490075Sobrien  {"v3", 6},					\
8590075Sobrien  {"v4", 7},					\
8690075Sobrien  {"v5", 8},					\
8790075Sobrien  {"v6", 9},					\
8890075Sobrien  {"rfp", 9}, /* Gcc used to call it this */	\
8990075Sobrien  {"sb", 9},					\
9090075Sobrien  {"v7", 10},					\
9190075Sobrien  {"r10", 10},	/* sl */			\
9290075Sobrien  {"r11", 11},	/* fp */			\
9390075Sobrien  {"r12", 12},	/* ip */			\
9490075Sobrien  {"r13", 13},	/* sp */			\
9590075Sobrien  {"r14", 14},	/* lr */			\
96132718Skan  {"r15", 15},	/* pc */			\
97132718Skan  {"mvf0", 27},					\
98132718Skan  {"mvf1", 28},					\
99132718Skan  {"mvf2", 29},					\
100132718Skan  {"mvf3", 30},					\
101132718Skan  {"mvf4", 31},					\
102132718Skan  {"mvf5", 32},					\
103132718Skan  {"mvf6", 33},					\
104132718Skan  {"mvf7", 34},					\
105132718Skan  {"mvf8", 35},					\
106132718Skan  {"mvf9", 36},					\
107132718Skan  {"mvf10", 37},				\
108132718Skan  {"mvf11", 38},				\
109132718Skan  {"mvf12", 39},				\
110132718Skan  {"mvf13", 40},				\
111132718Skan  {"mvf14", 41},				\
112132718Skan  {"mvf15", 42},				\
113132718Skan  {"mvd0", 27},					\
114132718Skan  {"mvd1", 28},					\
115132718Skan  {"mvd2", 29},					\
116132718Skan  {"mvd3", 30},					\
117132718Skan  {"mvd4", 31},					\
118132718Skan  {"mvd5", 32},					\
119132718Skan  {"mvd6", 33},					\
120132718Skan  {"mvd7", 34},					\
121132718Skan  {"mvd8", 35},					\
122132718Skan  {"mvd9", 36},					\
123132718Skan  {"mvd10", 37},				\
124132718Skan  {"mvd11", 38},				\
125132718Skan  {"mvd12", 39},				\
126132718Skan  {"mvd13", 40},				\
127132718Skan  {"mvd14", 41},				\
128132718Skan  {"mvd15", 42},				\
129132718Skan  {"mvfx0", 27},				\
130132718Skan  {"mvfx1", 28},				\
131132718Skan  {"mvfx2", 29},				\
132132718Skan  {"mvfx3", 30},				\
133132718Skan  {"mvfx4", 31},				\
134132718Skan  {"mvfx5", 32},				\
135132718Skan  {"mvfx6", 33},				\
136132718Skan  {"mvfx7", 34},				\
137132718Skan  {"mvfx8", 35},				\
138132718Skan  {"mvfx9", 36},				\
139132718Skan  {"mvfx10", 37},				\
140132718Skan  {"mvfx11", 38},				\
141132718Skan  {"mvfx12", 39},				\
142132718Skan  {"mvfx13", 40},				\
143132718Skan  {"mvfx14", 41},				\
144132718Skan  {"mvfx15", 42},				\
145132718Skan  {"mvdx0", 27},				\
146132718Skan  {"mvdx1", 28},				\
147132718Skan  {"mvdx2", 29},				\
148132718Skan  {"mvdx3", 30},				\
149132718Skan  {"mvdx4", 31},				\
150132718Skan  {"mvdx5", 32},				\
151132718Skan  {"mvdx6", 33},				\
152132718Skan  {"mvdx7", 34},				\
153132718Skan  {"mvdx8", 35},				\
154132718Skan  {"mvdx9", 36},				\
155132718Skan  {"mvdx10", 37},				\
156132718Skan  {"mvdx11", 38},				\
157132718Skan  {"mvdx12", 39},				\
158132718Skan  {"mvdx13", 40},				\
159132718Skan  {"mvdx14", 41},				\
160169689Skan  {"mvdx15", 42},				\
161169689Skan  {"d0", 63},					\
162169689Skan  {"d1", 65},					\
163169689Skan  {"d2", 67},					\
164169689Skan  {"d3", 69},					\
165169689Skan  {"d4", 71},					\
166169689Skan  {"d5", 73},					\
167169689Skan  {"d6", 75},					\
168169689Skan  {"d7", 77},					\
169169689Skan  {"d8", 79},					\
170169689Skan  {"d9", 81},					\
171169689Skan  {"d10", 83},					\
172169689Skan  {"d11", 85},					\
173169689Skan  {"d12", 87},					\
174169689Skan  {"d13", 89},					\
175169689Skan  {"d14", 91},					\
176169689Skan  {"d15", 93},					\
17790075Sobrien}
17890075Sobrien#endif
17990075Sobrien
180132718Skan/* Arm Assembler barfs on dollars.  */
18190075Sobrien#define DOLLARS_IN_IDENTIFIERS 0
18290075Sobrien
18390075Sobrien#ifndef NO_DOLLAR_IN_LABEL
18490075Sobrien#define NO_DOLLAR_IN_LABEL 1
18590075Sobrien#endif
18690075Sobrien
18790075Sobrien/* Generate DBX debugging information.  riscix.h will undefine this because
188132718Skan   the native assembler does not support stabs.  */
189117395Skan#define DBX_DEBUGGING_INFO 1
19090075Sobrien
19190075Sobrien/* Acorn dbx moans about continuation chars, so don't use any.  */
19290075Sobrien#ifndef DBX_CONTIN_LENGTH
19390075Sobrien#define DBX_CONTIN_LENGTH  0
19490075Sobrien#endif
19590075Sobrien
19690075Sobrien/* Output a function label definition.  */
19790075Sobrien#ifndef ASM_DECLARE_FUNCTION_NAME
19890075Sobrien#define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)	\
19990075Sobrien  do							\
20090075Sobrien    {							\
20190075Sobrien      ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL);   \
20290075Sobrien      ASM_OUTPUT_LABEL (STREAM, NAME);			\
20390075Sobrien    }							\
20490075Sobrien  while (0)
20590075Sobrien#endif
20690075Sobrien
207117395Skan/* Globalizing directive for a label.  */
208117395Skan#define GLOBAL_ASM_OP "\t.global\t"
20990075Sobrien
21090075Sobrien/* Make an internal label into a string.  */
21190075Sobrien#ifndef ASM_GENERATE_INTERNAL_LABEL
21290075Sobrien#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)  \
21390075Sobrien  sprintf (STRING, "*%s%s%u", LOCAL_LABEL_PREFIX, PREFIX, (unsigned int)(NUM))
21490075Sobrien#endif
21590075Sobrien
21690075Sobrien/* Output an element of a dispatch table.  */
21790075Sobrien#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)  \
21890075Sobrien  asm_fprintf (STREAM, "\t.word\t%LL%d\n", VALUE)
21990075Sobrien
22096263Sobrien#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL)		\
22196263Sobrien  do									\
22296263Sobrien    {									\
22396263Sobrien      if (TARGET_ARM)							\
22496263Sobrien	asm_fprintf (STREAM, "\tb\t%LL%d\n", VALUE);			\
22596263Sobrien      else								\
22696263Sobrien	asm_fprintf (STREAM, "\t.word\t%LL%d-%LL%d\n", VALUE, REL);	\
22796263Sobrien    }									\
22896263Sobrien  while (0)
22990075Sobrien
23096263Sobrien
23190075Sobrien#undef  ASM_OUTPUT_ASCII
23290075Sobrien#define ASM_OUTPUT_ASCII(STREAM, PTR, LEN)  \
233132718Skan  output_ascii_pseudo_op (STREAM, (const unsigned char *) (PTR), LEN)
23490075Sobrien
23590075Sobrien/* Output a gap.  In fact we fill it with nulls.  */
23690075Sobrien#undef  ASM_OUTPUT_SKIP
23790075Sobrien#define ASM_OUTPUT_SKIP(STREAM, NBYTES) 	\
238132718Skan  fprintf (STREAM, "\t.space\t%d\n", (int) (NBYTES))
23990075Sobrien
24090075Sobrien/* Align output to a power of two.  Horrible /bin/as.  */
24190075Sobrien#ifndef ASM_OUTPUT_ALIGN
24290075Sobrien#define ASM_OUTPUT_ALIGN(STREAM, POWER)			\
24390075Sobrien  do							\
24490075Sobrien    {							\
24590075Sobrien      register int amount = 1 << (POWER);		\
24690075Sobrien							\
24790075Sobrien      if (amount == 2)					\
24890075Sobrien	fprintf (STREAM, "\t.even\n");			\
24990075Sobrien      else if (amount != 1)				\
25090075Sobrien	fprintf (STREAM, "\t.align\t%d\n", amount - 4);	\
25190075Sobrien    }							\
25290075Sobrien  while (0)
25390075Sobrien#endif
25490075Sobrien
255132718Skan/* Output a common block.  */
25690075Sobrien#ifndef ASM_OUTPUT_COMMON
25790075Sobrien#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)	\
25890075Sobrien  do							\
25990075Sobrien    {							\
26090075Sobrien      fprintf (STREAM, "\t.comm\t");			\
26190075Sobrien      assemble_name (STREAM, NAME);			\
26290075Sobrien      asm_fprintf (STREAM, ", %d\t%@ %d\n", 		\
263132718Skan	           (int)(ROUNDED), (int)(SIZE));	\
26490075Sobrien    }							\
26590075Sobrien  while (0)
26690075Sobrien#endif
26790075Sobrien
26890075Sobrien/* Output a local common block.  /bin/as can't do this, so hack a
26990075Sobrien   `.space' into the bss segment.  Note that this is *bad* practice,
27090075Sobrien   which is guaranteed NOT to work since it doesn't define STATIC
27190075Sobrien   COMMON space but merely STATIC BSS space.  */
27290075Sobrien#ifndef ASM_OUTPUT_ALIGNED_LOCAL
27390075Sobrien#define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN)		\
27490075Sobrien  do									\
27590075Sobrien    {									\
276169689Skan      switch_to_section (bss_section);					\
27790075Sobrien      ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT));	\
27890075Sobrien      ASM_OUTPUT_LABEL (STREAM, NAME);					\
279132718Skan      fprintf (STREAM, "\t.space\t%d\n", (int)(SIZE));			\
28090075Sobrien    }									\
28190075Sobrien  while (0)
28290075Sobrien#endif
28390075Sobrien
28490075Sobrien/* Output a zero-initialized block.  */
28590075Sobrien#ifndef ASM_OUTPUT_ALIGNED_BSS
28690075Sobrien#define ASM_OUTPUT_ALIGNED_BSS(STREAM, DECL, NAME, SIZE, ALIGN) \
28790075Sobrien  asm_output_aligned_bss (STREAM, DECL, NAME, SIZE, ALIGN)
28890075Sobrien#endif
28990075Sobrien
29090075Sobrien/* Output a #ident directive.  */
29190075Sobrien#ifndef ASM_OUTPUT_IDENT
29290075Sobrien#define ASM_OUTPUT_IDENT(STREAM,STRING)  \
29390075Sobrien  asm_fprintf (STREAM, "%@ - - - ident %s\n", STRING)
29490075Sobrien#endif
29590075Sobrien
29690075Sobrien#ifndef ASM_COMMENT_START
29790075Sobrien#define ASM_COMMENT_START 	"@"
29890075Sobrien#endif
29990075Sobrien
30090075Sobrien/* This works for GAS and some other assemblers.  */
30190075Sobrien#define SET_ASM_OP		"\t.set\t"
302