Commit | Line | Data |
---|---|---|
e9f53129 AM |
1 | /* spu.h -- Assembler for spu |
2 | ||
66a4ad42 | 3 | Copyright 2006, 2007 Free Software Foundation, Inc. |
e9f53129 AM |
4 | |
5 | This file is part of GAS, the GNU Assembler. | |
6 | ||
7 | GAS is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2, or (at your option) | |
10 | any later version. | |
11 | ||
12 | GAS is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GAS; see the file COPYING. If not, write to the Free | |
19 | Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | |
20 | 02110-1301, USA. */ | |
21 | ||
22 | #define TC_SPU | |
23 | ||
840edabd AM |
24 | #include "opcode/spu.h" |
25 | ||
e9f53129 AM |
26 | #ifdef OBJ_ELF |
27 | #define TARGET_FORMAT "elf32-spu" | |
28 | #define TARGET_ARCH bfd_arch_spu | |
29 | #define TARGET_NAME "elf32-spu" | |
30 | #endif | |
31 | ||
32 | #define TARGET_BYTES_BIG_ENDIAN 1 | |
33 | ||
34 | #ifndef TARGET_NAME | |
35 | #define TARGET_NAME "coff-spu" | |
36 | #endif | |
37 | ||
38 | #ifndef TARGET_ARCH | |
39 | #define TARGET_ARCH bfd_arch_spu | |
40 | #endif | |
41 | ||
42 | #define COFF_MAGIC SPU_MAGIC | |
43 | #define BFD_ARCH bfd_arch_spu | |
44 | ||
45 | #define NEED_FX_R_TYPE | |
46 | #define TC_KEEP_FX_OFFSET | |
47 | /* #define TC_CONS_RELOC RELOC_32 */ | |
48 | ||
840edabd AM |
49 | struct tc_fix_info { |
50 | unsigned short arg_format; | |
51 | unsigned short insn_tag; | |
52 | }; | |
53 | ||
54 | /* fixS will have a member named tc_fix_data of this type. */ | |
55 | #define TC_FIX_TYPE struct tc_fix_info | |
56 | #define TC_INIT_FIX_DATA(FIXP) \ | |
57 | do \ | |
58 | { \ | |
59 | (FIXP)->tc_fix_data.arg_format = 0; \ | |
60 | (FIXP)->tc_fix_data.insn_tag = 0; \ | |
61 | } \ | |
62 | while (0) | |
e9f53129 AM |
63 | |
64 | /* Don't reduce function symbols to section symbols. */ | |
65 | #define tc_fix_adjustable(FIXP) (!S_IS_FUNCTION ((FIXP)->fx_addsy)) | |
66 | ||
840edabd AM |
67 | /* Keep relocs on calls. Branches to function symbols are tail or |
68 | sibling calls. */ | |
69 | #define TC_FORCE_RELOCATION(FIXP) \ | |
70 | ((FIXP)->tc_fix_data.insn_tag == M_BRSL \ | |
71 | || (FIXP)->tc_fix_data.insn_tag == M_BRASL \ | |
72 | || (((FIXP)->tc_fix_data.insn_tag == M_BR \ | |
73 | || (FIXP)->tc_fix_data.insn_tag == M_BRA) \ | |
74 | && (FIXP)->fx_addsy != NULL \ | |
75 | && S_IS_FUNCTION ((FIXP)->fx_addsy)) \ | |
76 | || generic_force_reloc (FIXP)) | |
77 | ||
e9f53129 AM |
78 | /* Values passed to md_apply_fix don't include symbol values. */ |
79 | #define MD_APPLY_SYM_VALUE(FIX) 0 | |
80 | ||
e9f53129 AM |
81 | /* The spu uses pseudo-ops with no leading period. */ |
82 | #define NO_PSEUDO_DOT 1 | |
83 | ||
84 | /* Don't warn on word overflow; it happens on %hi relocs. */ | |
85 | #undef WARN_SIGNED_OVERFLOW_WORD | |
86 | ||
87 | #ifdef OBJ_ELF | |
88 | #define DIFF_EXPR_OK | |
89 | #endif | |
90 | ||
91 | #define WORKING_DOT_WORD | |
92 | ||
93 | #define md_number_to_chars number_to_chars_bigendian | |
94 | ||
95 | #define md_convert_frag(b,s,f) {as_fatal (_("spu convert_frag\n"));} | |
96 | ||
97 | /* We don't need to do anything special for undefined symbols. */ | |
98 | #define md_undefined_symbol(s) 0 | |
99 | ||
100 | /* We have no special operand handling. */ | |
101 | #define md_operand(e) | |
102 | ||
103 | /* Fill in rs_align_code fragments. */ | |
104 | extern void spu_handle_align PARAMS ((fragS *)); | |
105 | #define HANDLE_ALIGN(frag) spu_handle_align (frag) | |
106 | ||
107 | #define MAX_MEM_FOR_RS_ALIGN_CODE (7 + 8) | |
108 | ||
109 | #ifdef SPUCOFF | |
110 | ||
111 | /* Whether a reloc should be output. */ | |
112 | #define TC_COUNT_RELOC(fixp) ((fixp)->fx_addsy != NULL || (fixp)->fx_subsy != NULL) | |
113 | ||
114 | /* Get the BFD reloc type to use for a gas fixS structure. */ | |
115 | #define TC_COFF_FIX2RTYPE(fixp) tc_coff_fix2rtype (fixp) | |
116 | ||
117 | /* No special hook needed for symbols. */ | |
118 | #define tc_coff_symbol_emit_hook(s) | |
119 | ||
120 | /* Align sections to a four byte boundary. */ | |
121 | #ifndef max | |
122 | #define max(a,b) (((a) > (b)) ? (a) : (b)) | |
123 | #endif | |
124 | #define SUB_SEGMENT_ALIGN(SEG) max (section_alignment[(int) (SEG)], 4) | |
125 | ||
126 | #endif /* SPUCOFF */ |