Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /* Definitions for BSD assembler syntax for Intel 386 |
2 | (actually AT&T syntax for insns and operands, | |
3 | adapted to BSD conventions for symbol names and debugging.) | |
4 | Copyright (C) 1988 Free Software Foundation, Inc. | |
5 | ||
6 | This file is part of GNU CC. | |
7 | ||
8 | GNU CC is free software; you can redistribute it and/or modify | |
9 | it under the terms of the GNU General Public License as published by | |
10 | the Free Software Foundation; either version 1, or (at your option) | |
11 | any later version. | |
12 | ||
13 | GNU CC is distributed in the hope that it will be useful, | |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
19 | along with GNU CC; see the file COPYING. If not, write to | |
20 | the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
21 | ||
22 | /* Use the Sequent Symmetry assembler syntax. */ | |
23 | ||
24 | #define TARGET_VERSION fprintf (stderr, " (80386, BSD syntax)"); | |
25 | ||
26 | /* Define some concatenation macros to concatenate an opcode | |
27 | and one, two or three operands. In other assembler syntaxes | |
28 | they may alter the order of ther operands. */ | |
29 | ||
30 | #ifdef __STDC__ | |
31 | #define AS2(a,b,c) #a " " #b "," #c | |
32 | #define AS3(a,b,c,d) #a " " #b "," #c "," #d | |
33 | #define AS1(a,b) #a " " #b | |
34 | #else | |
35 | #define AS1(a,b) "a b" | |
36 | #define AS2(a,b,c) "a b,c" | |
37 | #define AS3(a,b,c,d) "a b,c,d" | |
38 | #endif | |
39 | ||
40 | /* Output the size-letter for an opcode. | |
41 | CODE is the letter used in an operand spec (L, B, W, S or Q). | |
42 | CH is the corresponding lower case letter | |
43 | (except if CODE is L then CH is `l'). */ | |
44 | #define PUT_OP_SIZE(CODE,CH,FILE) putc (CH,(FILE)) | |
45 | ||
46 | /* Opcode suffix for fullword insn. */ | |
47 | #define L_SIZE "l" | |
48 | ||
49 | /* Prefix for register names in this syntax. */ | |
50 | #define RP "%" | |
51 | ||
52 | /* Prefix for immediate operands in this syntax. */ | |
53 | #define IP "$" | |
54 | ||
55 | /* Prefix for internally generated assembler labels. */ | |
56 | #define LPREFIX "L" | |
57 | ||
58 | /* Output the prefix for an immediate operand, or for an offset operand. */ | |
59 | #define PRINT_IMMED_PREFIX(FILE) fputs ("$", (FILE)) | |
60 | #define PRINT_OFFSET_PREFIX(FILE) fputs ("$", (FILE)) | |
61 | ||
62 | /* Indirect call instructions should use `*'. */ | |
63 | #define USE_STAR 1 | |
64 | ||
65 | /* Prefix for a memory-operand X. */ | |
66 | #define PRINT_PTR(X, FILE) | |
67 | ||
68 | /* Delimiters that surround base reg and index reg. */ | |
69 | #define ADDR_BEG(FILE) putc('(', (FILE)) | |
70 | #define ADDR_END(FILE) putc(')', (FILE)) | |
71 | ||
72 | /* Print an index register (whose rtx is IREG). */ | |
73 | #define PRINT_IREG(FILE,IREG) \ | |
74 | do \ | |
75 | { fputs (",", (FILE)); PRINT_REG ((IREG), 0, (FILE)); } \ | |
76 | while (0) | |
77 | ||
78 | /* Print an index scale factor SCALE. */ | |
79 | #define PRINT_SCALE(FILE,SCALE) \ | |
80 | if ((SCALE) != 1) fprintf ((FILE), ",%d", (SCALE)) | |
81 | ||
82 | /* Print a base/index combination. | |
83 | BREG is the base reg rtx, IREG is the index reg rtx, | |
84 | and SCALE is the index scale factor (an integer). */ | |
85 | ||
86 | #define PRINT_B_I_S(BREG,IREG,SCALE,FILE) \ | |
87 | { ADDR_BEG (FILE); \ | |
88 | if (BREG) PRINT_REG ((BREG), 0, (FILE)); \ | |
89 | if ((IREG) != 0) \ | |
90 | { PRINT_IREG ((FILE), (IREG)); \ | |
91 | PRINT_SCALE ((FILE), (SCALE)); } \ | |
92 | ADDR_END (FILE); } | |
93 | \f | |
94 | /* Define the syntax of pseudo-ops, labels and comments. */ | |
95 | ||
96 | /* Assembler pseudos to introduce constants of various size. */ | |
97 | ||
98 | #define ASM_BYTE "\t.byte " | |
99 | #define ASM_SHORT "\t.word " | |
100 | #define ASM_LONG "\t.long " | |
101 | #define ASM_DOUBLE "\t.double " | |
102 | ||
103 | /* String containing the assembler's comment-starter. */ | |
104 | ||
105 | #define COMMENT_BEGIN "/" | |
106 | ||
107 | /* Output at beginning of assembler file. | |
108 | ??? I am skeptical of this -- RMS. */ | |
109 | ||
110 | #define ASM_FILE_START(FILE) \ | |
111 | fprintf (FILE, "\t.file\t\"%s\"\n", dump_base_name); | |
112 | ||
113 | /* This was suggested, but it shouldn't be right for DBX output. -- RMS | |
114 | #define ASM_OUTPUT_SOURCE_FILENAME(FILE, NAME) */ | |
115 | ||
116 | /* Output to assembler file text saying following lines | |
117 | may contain character constants, extra white space, comments, etc. */ | |
118 | ||
119 | #define ASM_APP_ON "/APP\n" | |
120 | ||
121 | /* Output to assembler file text saying following lines | |
122 | no longer contain unusual constructs. */ | |
123 | ||
124 | #define ASM_APP_OFF "/NO_APP\n" | |
125 | \f | |
126 | /* Define the syntax of labels and symbol definitions/declarations. */ | |
127 | ||
128 | /* This is how to output an assembler line | |
129 | that says to advance the location counter by SIZE bytes. */ | |
130 | ||
131 | #define ASM_OUTPUT_SKIP(FILE,SIZE) \ | |
132 | fprintf (FILE, "\t.space %u\n", (SIZE)) | |
133 | ||
134 | /* Output before read-only data. */ | |
135 | ||
136 | #define TEXT_SECTION_ASM_OP ".text" | |
137 | ||
138 | /* Output before writable data. */ | |
139 | ||
140 | #define DATA_SECTION_ASM_OP ".data" | |
141 | \f | |
142 | /* Define the syntax of labels and symbol definitions/declarations. */ | |
143 | ||
144 | /* This says how to output an assembler line | |
145 | to define a global common symbol. */ | |
146 | ||
147 | #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ | |
148 | ( fputs (".comm ", (FILE)), \ | |
149 | assemble_name ((FILE), (NAME)), \ | |
150 | fprintf ((FILE), ",%u\n", (SIZE))) | |
151 | ||
152 | /* This says how to output an assembler line | |
153 | to define a local common symbol. */ | |
154 | ||
155 | #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ | |
156 | ( fputs (".lcomm ", (FILE)), \ | |
157 | assemble_name ((FILE), (NAME)), \ | |
158 | fprintf ((FILE), ",%u\n", (SIZE))) | |
159 | ||
160 | /* This is how to output an assembler line | |
161 | that says to advance the location counter | |
162 | to a multiple of 2**LOG bytes. */ | |
163 | ||
164 | #define ASM_OUTPUT_ALIGN(FILE,LOG) \ | |
165 | if ((LOG)!=0) fprintf ((FILE), "\t.align %d\n", (LOG)) | |
166 | ||
167 | /* This is how to store into the string BUF | |
168 | the symbol_ref name of an internal numbered label where | |
169 | PREFIX is the class of label and NUM is the number within the class. | |
170 | This is suitable for output with `assemble_name'. */ | |
171 | ||
172 | #define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER) \ | |
173 | sprintf ((BUF), "*%s%d", (PREFIX), (NUMBER)) | |
174 | ||
175 | /* This is how to output an internal numbered label where | |
176 | PREFIX is the class of label and NUM is the number within the class. */ | |
177 | ||
178 | #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ | |
179 | fprintf (FILE, "%s%d:\n", PREFIX, NUM) | |
180 | ||
181 | /* This is how to output a reference to a user-level label named NAME. */ | |
182 | ||
183 | #define ASM_OUTPUT_LABELREF(FILE,NAME) \ | |
184 | fprintf (FILE, "_%s", NAME) | |
185 | ||
186 | /* Sequent has some changes in the format of DBX symbols. */ | |
187 | #define DBX_NO_XREFS 1 | |
188 | ||
189 | /* Don't split DBX symbols into continuations. */ | |
190 | #define DBX_CONTIN_LENGTH 0 | |
191 | ||
192 | /* This is how to output a command to make the user-level label named NAME | |
193 | defined for reference from other files. */ | |
194 | ||
195 | #define ASM_GLOBALIZE_LABEL(FILE,NAME) \ | |
196 | (fputs (".globl ", FILE), assemble_name (FILE, NAME), fputs ("\n", FILE)) | |
197 | ||
198 | /* This is how to output an assembler line defining a `double' constant. */ | |
199 | ||
200 | #undef ASM_OUTPUT_DOUBLE | |
201 | #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \ | |
202 | fprintf (FILE, "\t.double 0d%.20e\n", (VALUE)) |