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