tc-vax.c revision 1.5 1 1.1 christos /* tc-vax.c - vax-specific -
2 1.5 christos Copyright (C) 1987-2016 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GAS, the GNU Assembler.
5 1.1 christos
6 1.1 christos GAS is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3, or (at your option)
9 1.1 christos any later version.
10 1.1 christos
11 1.1 christos GAS is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with GAS; see the file COPYING. If not, write to the Free
18 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 1.1 christos 02110-1301, USA. */
20 1.1 christos
21 1.1 christos #include "as.h"
22 1.1 christos
23 1.1 christos #include "vax-inst.h"
24 1.1 christos #include "obstack.h" /* For FRAG_APPEND_1_CHAR macro in "frags.h" */
25 1.1 christos #include "dw2gencfi.h"
26 1.1 christos #include "subsegs.h"
27 1.1 christos #include "safe-ctype.h"
28 1.1 christos
29 1.1 christos #ifdef OBJ_ELF
30 1.1 christos #include "elf/vax.h"
31 1.1 christos #endif
32 1.1 christos
33 1.1 christos /* These chars start a comment anywhere in a source file (except inside
34 1.1 christos another comment */
35 1.1 christos const char comment_chars[] = "#";
36 1.1 christos
37 1.1 christos /* These chars only start a comment at the beginning of a line. */
38 1.1 christos /* Note that for the VAX the are the same as comment_chars above. */
39 1.1 christos const char line_comment_chars[] = "#";
40 1.1 christos
41 1.1 christos const char line_separator_chars[] = ";";
42 1.1 christos
43 1.1 christos /* Chars that can be used to separate mant from exp in floating point nums. */
44 1.1 christos const char EXP_CHARS[] = "eE";
45 1.1 christos
46 1.1 christos /* Chars that mean this number is a floating point constant
47 1.1 christos as in 0f123.456
48 1.1 christos or 0H1.234E-12 (see exp chars above). */
49 1.1 christos const char FLT_CHARS[] = "dDfFgGhH";
50 1.1 christos
51 1.1 christos /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
52 1.1 christos changed in read.c . Ideally it shouldn't have to know about it at all,
53 1.1 christos but nothing is ideal around here. */
54 1.1 christos
55 1.1 christos /* Hold details of an operand expression. */
56 1.1 christos static expressionS exp_of_operand[VIT_MAX_OPERANDS];
57 1.1 christos static segT seg_of_operand[VIT_MAX_OPERANDS];
58 1.1 christos
59 1.1 christos /* A vax instruction after decoding. */
60 1.1 christos static struct vit v;
61 1.1 christos
62 1.1 christos /* Hold details of big operands. */
63 1.1 christos LITTLENUM_TYPE big_operand_bits[VIT_MAX_OPERANDS][SIZE_OF_LARGE_NUMBER];
64 1.1 christos FLONUM_TYPE float_operand[VIT_MAX_OPERANDS];
65 1.1 christos /* Above is made to point into big_operand_bits by md_begin(). */
66 1.1 christos
67 1.1 christos #ifdef OBJ_ELF
68 1.1 christos #define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
69 1.1 christos #define PROCEDURE_LINKAGE_TABLE_NAME "_PROCEDURE_LINKAGE_TABLE_"
70 1.1 christos symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_". */
71 1.1 christos symbolS *PLT_symbol; /* Pre-defined "_PROCEDURE_LINKAGE_TABLE_". */
72 1.1 christos #endif
73 1.1 christos
74 1.1 christos int flag_hash_long_names; /* -+ */
75 1.1 christos int flag_one; /* -1 */
76 1.1 christos int flag_show_after_trunc; /* -H */
77 1.1 christos int flag_no_hash_mixed_case; /* -h NUM */
78 1.1 christos #ifdef OBJ_ELF
79 1.1 christos int flag_want_pic; /* -k */
80 1.1 christos #endif
81 1.1 christos
82 1.1 christos /* For VAX, relative addresses of "just the right length" are easy.
84 1.1 christos The branch displacement is always the last operand, even in
85 1.1 christos synthetic instructions.
86 1.1 christos For VAX, we encode the relax_substateTs (in e.g. fr_substate) as:
87 1.1 christos
88 1.1 christos 4 3 2 1 0 bit number
89 1.1 christos ---/ /--+-------+-------+-------+-------+-------+
90 1.1 christos | what state ? | how long ? |
91 1.1 christos ---/ /--+-------+-------+-------+-------+-------+
92 1.1 christos
93 1.1 christos The "how long" bits are 00=byte, 01=word, 10=long.
94 1.1 christos This is a Un*x convention.
95 1.1 christos Not all lengths are legit for a given value of (what state).
96 1.1 christos The "how long" refers merely to the displacement length.
97 1.1 christos The address usually has some constant bytes in it as well.
98 1.1 christos
99 1.1 christos groups for VAX address relaxing.
100 1.1 christos
101 1.1 christos 1. "foo" pc-relative.
102 1.1 christos length of byte, word, long
103 1.1 christos
104 1.1 christos 2a. J<cond> where <cond> is a simple flag test.
105 1.1 christos length of byte, word, long.
106 1.1 christos VAX opcodes are: (Hex)
107 1.1 christos bneq/bnequ 12
108 1.1 christos beql/beqlu 13
109 1.1 christos bgtr 14
110 1.1 christos bleq 15
111 1.1 christos bgeq 18
112 1.1 christos blss 19
113 1.1 christos bgtru 1a
114 1.1 christos blequ 1b
115 1.1 christos bvc 1c
116 1.1 christos bvs 1d
117 1.1 christos bgequ/bcc 1e
118 1.1 christos blssu/bcs 1f
119 1.1 christos Always, you complement 0th bit to reverse condition.
120 1.1 christos Always, 1-byte opcode, then 1-byte displacement.
121 1.1 christos
122 1.1 christos 2b. J<cond> where cond tests a memory bit.
123 1.1 christos length of byte, word, long.
124 1.1 christos Vax opcodes are: (Hex)
125 1.1 christos bbs e0
126 1.1 christos bbc e1
127 1.1 christos bbss e2
128 1.1 christos bbcs e3
129 1.1 christos bbsc e4
130 1.1 christos bbcc e5
131 1.1 christos Always, you complement 0th bit to reverse condition.
132 1.1 christos Always, 1-byte opcde, longword-address, byte-address, 1-byte-displacement
133 1.1 christos
134 1.1 christos 2c. J<cond> where cond tests low-order memory bit
135 1.1 christos length of byte,word,long.
136 1.1 christos Vax opcodes are: (Hex)
137 1.1 christos blbs e8
138 1.1 christos blbc e9
139 1.1 christos Always, you complement 0th bit to reverse condition.
140 1.1 christos Always, 1-byte opcode, longword-address, 1-byte displacement.
141 1.1 christos
142 1.1 christos 3. Jbs/Jbr.
143 1.1 christos length of byte,word,long.
144 1.1 christos Vax opcodes are: (Hex)
145 1.1 christos bsbb 10
146 1.1 christos brb 11
147 1.1 christos These are like (2) but there is no condition to reverse.
148 1.1 christos Always, 1 byte opcode, then displacement/absolute.
149 1.1 christos
150 1.1 christos 4a. JacbX
151 1.1 christos length of word, long.
152 1.1 christos Vax opcodes are: (Hex)
153 1.1 christos acbw 3d
154 1.1 christos acbf 4f
155 1.1 christos acbd 6f
156 1.1 christos abcb 9d
157 1.1 christos acbl f1
158 1.1 christos acbg 4ffd
159 1.1 christos acbh 6ffd
160 1.1 christos Always, we cannot reverse the sense of the branch; we have a word
161 1.1 christos displacement.
162 1.1 christos The double-byte op-codes don't hurt: we never want to modify the
163 1.1 christos opcode, so we don't care how many bytes are between the opcode and
164 1.1 christos the operand.
165 1.1 christos
166 1.1 christos 4b. JXobXXX
167 1.1 christos length of long, long, byte.
168 1.1 christos Vax opcodes are: (Hex)
169 1.1 christos aoblss f2
170 1.1 christos aobleq f3
171 1.1 christos sobgeq f4
172 1.1 christos sobgtr f5
173 1.1 christos Always, we cannot reverse the sense of the branch; we have a byte
174 1.1 christos displacement.
175 1.1 christos
176 1.1 christos The only time we need to modify the opcode is for class 2 instructions.
177 1.1 christos After relax() we may complement the lowest order bit of such instruction
178 1.1 christos to reverse sense of branch.
179 1.1 christos
180 1.1 christos For class 2 instructions, we store context of "where is the opcode literal".
181 1.1 christos We can change an opcode's lowest order bit without breaking anything else.
182 1.1 christos
183 1.1 christos We sometimes store context in the operand literal. This way we can figure out
184 1.1 christos after relax() what the original addressing mode was. */
185 1.1 christos
186 1.1 christos /* These displacements are relative to the start address of the
188 1.1 christos displacement. The first letter is Byte, Word. 2nd letter is
189 1.1 christos Forward, Backward. */
190 1.1 christos #define BF (1+ 127)
191 1.1 christos #define BB (1+-128)
192 1.1 christos #define WF (2+ 32767)
193 1.1 christos #define WB (2+-32768)
194 1.1 christos /* Dont need LF, LB because they always reach. [They are coded as 0.] */
195 1.1 christos
196 1.1 christos #define C(a,b) ENCODE_RELAX(a,b)
197 1.1 christos /* This macro has no side-effects. */
198 1.1 christos #define ENCODE_RELAX(what,length) (((what) << 2) + (length))
199 1.1 christos #define RELAX_STATE(s) ((s) >> 2)
200 1.1 christos #define RELAX_LENGTH(s) ((s) & 3)
201 1.1 christos
202 1.1 christos const relax_typeS md_relax_table[] =
203 1.1 christos {
204 1.1 christos {1, 1, 0, 0}, /* error sentinel 0,0 */
205 1.1 christos {1, 1, 0, 0}, /* unused 0,1 */
206 1.1 christos {1, 1, 0, 0}, /* unused 0,2 */
207 1.1 christos {1, 1, 0, 0}, /* unused 0,3 */
208 1.1 christos
209 1.1 christos {BF + 1, BB + 1, 2, C (1, 1)},/* B^"foo" 1,0 */
210 1.1 christos {WF + 1, WB + 1, 3, C (1, 2)},/* W^"foo" 1,1 */
211 1.1 christos {0, 0, 5, 0}, /* L^"foo" 1,2 */
212 1.1 christos {1, 1, 0, 0}, /* unused 1,3 */
213 1.1 christos
214 1.1 christos {BF, BB, 1, C (2, 1)}, /* b<cond> B^"foo" 2,0 */
215 1.1 christos {WF + 2, WB + 2, 4, C (2, 2)},/* br.+? brw X 2,1 */
216 1.1 christos {0, 0, 7, 0}, /* br.+? jmp X 2,2 */
217 1.1 christos {1, 1, 0, 0}, /* unused 2,3 */
218 1.1 christos
219 1.1 christos {BF, BB, 1, C (3, 1)}, /* brb B^foo 3,0 */
220 1.1 christos {WF, WB, 2, C (3, 2)}, /* brw W^foo 3,1 */
221 1.1 christos {0, 0, 5, 0}, /* Jmp L^foo 3,2 */
222 1.1 christos {1, 1, 0, 0}, /* unused 3,3 */
223 1.1 christos
224 1.1 christos {1, 1, 0, 0}, /* unused 4,0 */
225 1.1 christos {WF, WB, 2, C (4, 2)}, /* acb_ ^Wfoo 4,1 */
226 1.1 christos {0, 0, 10, 0}, /* acb_,br,jmp L^foo4,2 */
227 1.1 christos {1, 1, 0, 0}, /* unused 4,3 */
228 1.1 christos
229 1.1 christos {BF, BB, 1, C (5, 1)}, /* Xob___,,foo 5,0 */
230 1.1 christos {WF + 4, WB + 4, 6, C (5, 2)},/* Xob.+2,brb.+3,brw5,1 */
231 1.1 christos {0, 0, 9, 0}, /* Xob.+2,brb.+6,jmp5,2 */
232 1.1 christos {1, 1, 0, 0}, /* unused 5,3 */
233 1.1 christos };
234 1.1 christos
235 1.1 christos #undef C
236 1.1 christos #undef BF
237 1.1 christos #undef BB
238 1.1 christos #undef WF
239 1.1 christos #undef WB
240 1.5 christos
241 1.1 christos void float_cons (int);
242 1.1 christos int flonum_gen2vax (int, FLONUM_TYPE *, LITTLENUM_TYPE *);
243 1.1 christos
244 1.1 christos const pseudo_typeS md_pseudo_table[] =
245 1.1 christos {
246 1.1 christos {"dfloat", float_cons, 'd'},
247 1.1 christos {"ffloat", float_cons, 'f'},
248 1.1 christos {"gfloat", float_cons, 'g'},
249 1.1 christos {"hfloat", float_cons, 'h'},
250 1.1 christos {"d_floating", float_cons, 'd'},
251 1.1 christos {"f_floating", float_cons, 'f'},
252 1.1 christos {"g_floating", float_cons, 'g'},
253 1.1 christos {"h_floating", float_cons, 'h'},
254 1.1 christos {NULL, NULL, 0},
255 1.1 christos };
256 1.1 christos
257 1.1 christos #define STATE_PC_RELATIVE (1)
258 1.1 christos #define STATE_CONDITIONAL_BRANCH (2)
259 1.1 christos #define STATE_ALWAYS_BRANCH (3) /* includes BSB... */
260 1.1 christos #define STATE_COMPLEX_BRANCH (4)
261 1.1 christos #define STATE_COMPLEX_HOP (5)
262 1.1 christos
263 1.1 christos #define STATE_BYTE (0)
264 1.1 christos #define STATE_WORD (1)
265 1.1 christos #define STATE_LONG (2)
266 1.1 christos #define STATE_UNDF (3) /* Symbol undefined in pass1. */
267 1.1 christos
268 1.1 christos #define min(a, b) ((a) < (b) ? (a) : (b))
269 1.1 christos
270 1.1 christos void
272 1.1 christos md_number_to_chars (char con[], valueT value, int nbytes)
273 1.1 christos {
274 1.1 christos number_to_chars_littleendian (con, value, nbytes);
275 1.1 christos }
276 1.1 christos
277 1.1 christos /* Fix up some data or instructions after we find out the value of a symbol
278 1.1 christos that they reference. */
279 1.1 christos
280 1.1 christos void /* Knows about order of bytes in address. */
281 1.1 christos md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
282 1.3 christos {
283 1.3 christos valueT value = * valueP;
284 1.3 christos
285 1.3 christos if (fixP->fx_subsy != (symbolS *) NULL)
286 1.3 christos as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
287 1.3 christos
288 1.3 christos if (fixP->fx_addsy == NULL)
289 1.1 christos fixP->fx_done = 1;
290 1.1 christos
291 1.3 christos if (fixP->fx_done)
292 1.3 christos number_to_chars_littleendian (fixP->fx_where + fixP->fx_frag->fr_literal,
293 1.3 christos value, fixP->fx_size);
294 1.3 christos else
295 1.3 christos /* Initialise the part of an instruction frag covered by the
296 1.3 christos relocation. (Many occurrences of frag_more followed by fix_new
297 1.1 christos lack any init of the frag.) Since VAX uses RELA relocs the
298 1.1 christos value we write into this field doesn't really matter. */
299 1.1 christos memset (fixP->fx_where + fixP->fx_frag->fr_literal, 0, fixP->fx_size);
300 1.1 christos }
301 1.1 christos
302 1.1 christos /* Convert a number from VAX byte order (little endian)
303 1.1 christos into host byte order.
304 1.1 christos con is the buffer to convert,
305 1.1 christos nbytes is the length of the given buffer. */
306 1.1 christos static long
307 1.1 christos md_chars_to_number (unsigned char con[], int nbytes)
308 1.1 christos {
309 1.1 christos long retval;
310 1.1 christos
311 1.1 christos for (retval = 0, con += nbytes - 1; nbytes--; con--)
312 1.1 christos {
313 1.1 christos retval <<= BITS_PER_CHAR;
314 1.1 christos retval |= *con;
315 1.1 christos }
316 1.1 christos return retval;
317 1.1 christos }
318 1.1 christos
319 1.1 christos /* Copy a bignum from in to out.
320 1.1 christos If the output is shorter than the input, copy lower-order
321 1.1 christos littlenums. Return 0 or the number of significant littlenums
322 1.1 christos dropped. Assumes littlenum arrays are densely packed: no unused
323 1.1 christos chars between the littlenums. Uses memcpy() to move littlenums, and
324 1.1 christos wants to know length (in chars) of the input bignum. */
325 1.1 christos
326 1.1 christos static int
327 1.1 christos bignum_copy (LITTLENUM_TYPE *in,
328 1.1 christos int in_length, /* in sizeof(littlenum)s */
329 1.1 christos LITTLENUM_TYPE *out,
330 1.1 christos int out_length /* in sizeof(littlenum)s */)
331 1.1 christos {
332 1.1 christos int significant_littlenums_dropped;
333 1.1 christos
334 1.1 christos if (out_length < in_length)
335 1.1 christos {
336 1.1 christos LITTLENUM_TYPE *p; /* -> most significant (non-zero) input
337 1.1 christos littlenum. */
338 1.1 christos
339 1.1 christos memcpy ((void *) out, (void *) in,
340 1.1 christos (unsigned int) out_length << LITTLENUM_SHIFT);
341 1.1 christos for (p = in + in_length - 1; p >= in; --p)
342 1.1 christos {
343 1.1 christos if (*p)
344 1.1 christos break;
345 1.1 christos }
346 1.1 christos significant_littlenums_dropped = p - in - in_length + 1;
347 1.1 christos
348 1.1 christos if (significant_littlenums_dropped < 0)
349 1.1 christos significant_littlenums_dropped = 0;
350 1.1 christos }
351 1.1 christos else
352 1.1 christos {
353 1.1 christos memcpy ((char *) out, (char *) in,
354 1.1 christos (unsigned int) in_length << LITTLENUM_SHIFT);
355 1.1 christos
356 1.1 christos if (out_length > in_length)
357 1.1 christos memset ((char *) (out + in_length), '\0',
358 1.1 christos (unsigned int) (out_length - in_length) << LITTLENUM_SHIFT);
359 1.1 christos
360 1.1 christos significant_littlenums_dropped = 0;
361 1.1 christos }
362 1.1 christos
363 1.1 christos return significant_littlenums_dropped;
364 1.1 christos }
365 1.1 christos
366 1.1 christos /* md_estimate_size_before_relax(), called just before relax().
368 1.1 christos Any symbol that is now undefined will not become defined.
369 1.1 christos Return the correct fr_subtype in the frag and the growth beyond
370 1.1 christos fr_fix. */
371 1.1 christos int
372 1.1 christos md_estimate_size_before_relax (fragS *fragP, segT segment)
373 1.1 christos {
374 1.1 christos if (RELAX_LENGTH (fragP->fr_subtype) == STATE_UNDF)
375 1.1 christos {
376 1.1 christos if (S_GET_SEGMENT (fragP->fr_symbol) != segment
377 1.1 christos #ifdef OBJ_ELF
378 1.1 christos || S_IS_WEAK (fragP->fr_symbol)
379 1.1 christos || S_IS_EXTERNAL (fragP->fr_symbol)
380 1.1 christos #endif
381 1.1 christos )
382 1.1 christos {
383 1.1 christos /* Non-relaxable cases. */
384 1.1 christos int reloc_type = NO_RELOC;
385 1.1 christos char *p;
386 1.1 christos int old_fr_fix;
387 1.1 christos
388 1.1 christos old_fr_fix = fragP->fr_fix;
389 1.1 christos p = fragP->fr_literal + old_fr_fix;
390 1.1 christos #ifdef OBJ_ELF
391 1.1 christos /* If this is to an undefined symbol, then if it's an indirect
392 1.1 christos reference indicate that is can mutated into a GLOB_DAT or
393 1.1 christos JUMP_SLOT by the loader. We restrict ourselves to no offset
394 1.1 christos due to a limitation in the NetBSD linker. */
395 1.1 christos
396 1.1 christos if (GOT_symbol == NULL)
397 1.1 christos GOT_symbol = symbol_find (GLOBAL_OFFSET_TABLE_NAME);
398 1.1 christos if (PLT_symbol == NULL)
399 1.1 christos PLT_symbol = symbol_find (PROCEDURE_LINKAGE_TABLE_NAME);
400 1.1 christos if ((GOT_symbol == NULL || fragP->fr_symbol != GOT_symbol)
401 1.1 christos && (PLT_symbol == NULL || fragP->fr_symbol != PLT_symbol)
402 1.1 christos && fragP->fr_symbol != NULL
403 1.1 christos && flag_want_pic
404 1.1 christos #ifdef OBJ_ELF
405 1.1 christos && ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol)) != STV_HIDDEN
406 1.1 christos #endif
407 1.1 christos && (!S_IS_DEFINED (fragP->fr_symbol)
408 1.1 christos || S_IS_WEAK (fragP->fr_symbol)
409 1.1 christos || S_IS_EXTERNAL (fragP->fr_symbol)))
410 1.1 christos {
411 1.1 christos /* Indirect references cannot go through the GOT or PLT,
412 1.1 christos let's hope they'll become local in the final link. */
413 1.1 christos if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragP->fr_symbol))
414 1.1 christos != STV_DEFAULT)
415 1.1 christos || (p[0] & 0x10))
416 1.1 christos reloc_type = BFD_RELOC_32_PCREL;
417 1.1 christos else if (((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLS
418 1.1 christos || ((unsigned char *) fragP->fr_opcode)[0] == VAX_CALLG
419 1.1 christos || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JSB
420 1.1 christos || ((unsigned char *) fragP->fr_opcode)[0] == VAX_JMP
421 1.1 christos || S_IS_FUNCTION (fragP->fr_symbol))
422 1.1 christos reloc_type = BFD_RELOC_32_PLT_PCREL;
423 1.1 christos else
424 1.1 christos reloc_type = BFD_RELOC_32_GOT_PCREL;
425 1.1 christos }
426 1.1 christos #endif
427 1.1 christos switch (RELAX_STATE (fragP->fr_subtype))
428 1.1 christos {
429 1.1 christos case STATE_PC_RELATIVE:
430 1.1 christos p[0] |= VAX_PC_RELATIVE_MODE; /* Preserve @ bit. */
431 1.1 christos fragP->fr_fix += 1 + 4;
432 1.1 christos fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
433 1.1 christos fragP->fr_offset, 1, reloc_type);
434 1.1 christos break;
435 1.1 christos
436 1.1 christos case STATE_CONDITIONAL_BRANCH:
437 1.1 christos *fragP->fr_opcode ^= 1; /* Reverse sense of branch. */
438 1.1 christos p[0] = 6;
439 1.1 christos p[1] = VAX_JMP;
440 1.1 christos p[2] = VAX_PC_RELATIVE_MODE; /* ...(PC) */
441 1.1 christos fragP->fr_fix += 1 + 1 + 1 + 4;
442 1.1 christos fix_new (fragP, old_fr_fix + 3, 4, fragP->fr_symbol,
443 1.1 christos fragP->fr_offset, 1, NO_RELOC);
444 1.1 christos break;
445 1.1 christos
446 1.1 christos case STATE_COMPLEX_BRANCH:
447 1.1 christos p[0] = 2;
448 1.1 christos p[1] = 0;
449 1.1 christos p[2] = VAX_BRB;
450 1.1 christos p[3] = 6;
451 1.1 christos p[4] = VAX_JMP;
452 1.1 christos p[5] = VAX_PC_RELATIVE_MODE; /* ...(pc) */
453 1.1 christos fragP->fr_fix += 2 + 2 + 1 + 1 + 4;
454 1.1 christos fix_new (fragP, old_fr_fix + 6, 4, fragP->fr_symbol,
455 1.1 christos fragP->fr_offset, 1, NO_RELOC);
456 1.1 christos break;
457 1.1 christos
458 1.1 christos case STATE_COMPLEX_HOP:
459 1.1 christos p[0] = 2;
460 1.1 christos p[1] = VAX_BRB;
461 1.1 christos p[2] = 6;
462 1.1 christos p[3] = VAX_JMP;
463 1.1 christos p[4] = VAX_PC_RELATIVE_MODE; /* ...(pc) */
464 1.1 christos fragP->fr_fix += 1 + 2 + 1 + 1 + 4;
465 1.1 christos fix_new (fragP, old_fr_fix + 5, 4, fragP->fr_symbol,
466 1.1 christos fragP->fr_offset, 1, NO_RELOC);
467 1.1 christos break;
468 1.1 christos
469 1.1 christos case STATE_ALWAYS_BRANCH:
470 1.1 christos *fragP->fr_opcode += VAX_WIDEN_LONG;
471 1.1 christos p[0] = VAX_PC_RELATIVE_MODE; /* ...(PC) */
472 1.1 christos fragP->fr_fix += 1 + 4;
473 1.1 christos fix_new (fragP, old_fr_fix + 1, 4, fragP->fr_symbol,
474 1.1 christos fragP->fr_offset, 1, NO_RELOC);
475 1.1 christos break;
476 1.1 christos
477 1.1 christos default:
478 1.1 christos abort ();
479 1.1 christos }
480 1.1 christos frag_wane (fragP);
481 1.1 christos
482 1.1 christos /* Return the growth in the fixed part of the frag. */
483 1.1 christos return fragP->fr_fix - old_fr_fix;
484 1.1 christos }
485 1.1 christos
486 1.1 christos /* Relaxable cases. Set up the initial guess for the variable
487 1.1 christos part of the frag. */
488 1.1 christos switch (RELAX_STATE (fragP->fr_subtype))
489 1.1 christos {
490 1.1 christos case STATE_PC_RELATIVE:
491 1.1 christos fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
492 1.1 christos break;
493 1.1 christos case STATE_CONDITIONAL_BRANCH:
494 1.1 christos fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE);
495 1.1 christos break;
496 1.1 christos case STATE_COMPLEX_BRANCH:
497 1.1 christos fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD);
498 1.1 christos break;
499 1.1 christos case STATE_COMPLEX_HOP:
500 1.1 christos fragP->fr_subtype = ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE);
501 1.1 christos break;
502 1.1 christos case STATE_ALWAYS_BRANCH:
503 1.1 christos fragP->fr_subtype = ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE);
504 1.1 christos break;
505 1.1 christos }
506 1.1 christos }
507 1.1 christos
508 1.1 christos if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
509 1.1 christos abort ();
510 1.1 christos
511 1.1 christos /* Return the size of the variable part of the frag. */
512 1.1 christos return md_relax_table[fragP->fr_subtype].rlx_length;
513 1.1 christos }
514 1.1 christos
515 1.1 christos /* Called after relax() is finished.
517 1.1 christos In: Address of frag.
518 1.1 christos fr_type == rs_machine_dependent.
519 1.1 christos fr_subtype is what the address relaxed to.
520 1.1 christos
521 1.1 christos Out: Any fixSs and constants are set up.
522 1.1 christos Caller will turn frag into a ".space 0". */
523 1.1 christos void
524 1.1 christos md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
525 1.1 christos segT seg ATTRIBUTE_UNUSED,
526 1.1 christos fragS *fragP)
527 1.1 christos {
528 1.1 christos char *addressP; /* -> _var to change. */
529 1.1 christos char *opcodeP; /* -> opcode char(s) to change. */
530 1.1 christos short int extension = 0; /* Size of relaxed address. */
531 1.1 christos /* Added to fr_fix: incl. ALL var chars. */
532 1.1 christos symbolS *symbolP;
533 1.1 christos long where;
534 1.1 christos
535 1.1 christos know (fragP->fr_type == rs_machine_dependent);
536 1.1 christos where = fragP->fr_fix;
537 1.1 christos addressP = fragP->fr_literal + where;
538 1.1 christos opcodeP = fragP->fr_opcode;
539 1.1 christos symbolP = fragP->fr_symbol;
540 1.1 christos know (symbolP);
541 1.1 christos
542 1.1 christos switch (fragP->fr_subtype)
543 1.1 christos {
544 1.1 christos case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
545 1.1 christos know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
546 1.1 christos addressP[0] |= 0xAF; /* Byte displacement. */
547 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
548 1.1 christos fragP->fr_offset, 1, NO_RELOC);
549 1.1 christos extension = 2;
550 1.1 christos break;
551 1.1 christos
552 1.1 christos case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
553 1.1 christos know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
554 1.1 christos addressP[0] |= 0xCF; /* Word displacement. */
555 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
556 1.1 christos fragP->fr_offset, 1, NO_RELOC);
557 1.1 christos extension = 3;
558 1.1 christos break;
559 1.1 christos
560 1.1 christos case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_LONG):
561 1.1 christos know (*addressP == 0 || *addressP == 0x10); /* '@' bit. */
562 1.1 christos addressP[0] |= 0xEF; /* Long word displacement. */
563 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
564 1.1 christos fragP->fr_offset, 1, NO_RELOC);
565 1.1 christos extension = 5;
566 1.1 christos break;
567 1.1 christos
568 1.1 christos case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
569 1.1 christos fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
570 1.1 christos fragP->fr_offset, 1, NO_RELOC);
571 1.1 christos extension = 1;
572 1.1 christos break;
573 1.1 christos
574 1.1 christos case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
575 1.1 christos opcodeP[0] ^= 1; /* Reverse sense of test. */
576 1.1 christos addressP[0] = 3;
577 1.1 christos addressP[1] = VAX_BRW;
578 1.1 christos fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
579 1.1 christos fragP->fr_offset, 1, NO_RELOC);
580 1.1 christos extension = 4;
581 1.1 christos break;
582 1.1 christos
583 1.1 christos case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_LONG):
584 1.1 christos opcodeP[0] ^= 1; /* Reverse sense of test. */
585 1.1 christos addressP[0] = 6;
586 1.1 christos addressP[1] = VAX_JMP;
587 1.1 christos addressP[2] = VAX_PC_RELATIVE_MODE;
588 1.1 christos fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
589 1.1 christos fragP->fr_offset, 1, NO_RELOC);
590 1.1 christos extension = 7;
591 1.1 christos break;
592 1.1 christos
593 1.1 christos case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_BYTE):
594 1.1 christos fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
595 1.1 christos fragP->fr_offset, 1, NO_RELOC);
596 1.1 christos extension = 1;
597 1.1 christos break;
598 1.1 christos
599 1.1 christos case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_WORD):
600 1.1 christos opcodeP[0] += VAX_WIDEN_WORD; /* brb -> brw, bsbb -> bsbw */
601 1.1 christos fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
602 1.1 christos 1, NO_RELOC);
603 1.1 christos extension = 2;
604 1.1 christos break;
605 1.1 christos
606 1.1 christos case ENCODE_RELAX (STATE_ALWAYS_BRANCH, STATE_LONG):
607 1.1 christos opcodeP[0] += VAX_WIDEN_LONG; /* brb -> jmp, bsbb -> jsb */
608 1.1 christos addressP[0] = VAX_PC_RELATIVE_MODE;
609 1.1 christos fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
610 1.1 christos fragP->fr_offset, 1, NO_RELOC);
611 1.1 christos extension = 5;
612 1.1 christos break;
613 1.1 christos
614 1.1 christos case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_WORD):
615 1.1 christos fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
616 1.1 christos fragP->fr_offset, 1, NO_RELOC);
617 1.1 christos extension = 2;
618 1.1 christos break;
619 1.1 christos
620 1.1 christos case ENCODE_RELAX (STATE_COMPLEX_BRANCH, STATE_LONG):
621 1.1 christos addressP[0] = 2;
622 1.1 christos addressP[1] = 0;
623 1.1 christos addressP[2] = VAX_BRB;
624 1.1 christos addressP[3] = 6;
625 1.1 christos addressP[4] = VAX_JMP;
626 1.1 christos addressP[5] = VAX_PC_RELATIVE_MODE;
627 1.1 christos fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
628 1.1 christos fragP->fr_offset, 1, NO_RELOC);
629 1.1 christos extension = 10;
630 1.1 christos break;
631 1.1 christos
632 1.1 christos case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_BYTE):
633 1.1 christos fix_new (fragP, fragP->fr_fix, 1, fragP->fr_symbol,
634 1.1 christos fragP->fr_offset, 1, NO_RELOC);
635 1.1 christos extension = 1;
636 1.1 christos break;
637 1.1 christos
638 1.1 christos case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_WORD):
639 1.1 christos addressP[0] = 2;
640 1.1 christos addressP[1] = VAX_BRB;
641 1.1 christos addressP[2] = 3;
642 1.1 christos addressP[3] = VAX_BRW;
643 1.1 christos fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
644 1.1 christos fragP->fr_offset, 1, NO_RELOC);
645 1.1 christos extension = 6;
646 1.1 christos break;
647 1.1 christos
648 1.1 christos case ENCODE_RELAX (STATE_COMPLEX_HOP, STATE_LONG):
649 1.1 christos addressP[0] = 2;
650 1.1 christos addressP[1] = VAX_BRB;
651 1.1 christos addressP[2] = 6;
652 1.1 christos addressP[3] = VAX_JMP;
653 1.1 christos addressP[4] = VAX_PC_RELATIVE_MODE;
654 1.1 christos fix_new (fragP, fragP->fr_fix + 5, 4, fragP->fr_symbol,
655 1.1 christos fragP->fr_offset, 1, NO_RELOC);
656 1.1 christos extension = 9;
657 1.1 christos break;
658 1.1 christos
659 1.1 christos default:
660 1.1 christos BAD_CASE (fragP->fr_subtype);
661 1.1 christos break;
662 1.1 christos }
663 1.1 christos fragP->fr_fix += extension;
664 1.1 christos }
665 1.1 christos
666 1.1 christos /* Translate internal format of relocation info into target format.
667 1.1 christos
668 1.1 christos On vax: first 4 bytes are normal unsigned long, next three bytes
669 1.1 christos are symbolnum, least sig. byte first. Last byte is broken up with
670 1.1 christos the upper nibble as nuthin, bit 3 as extern, bits 2 & 1 as length, and
671 1.1 christos bit 0 as pcrel. */
672 1.1 christos #ifdef comment
673 1.1 christos void
674 1.1 christos md_ri_to_chars (char *the_bytes, struct reloc_info_generic ri)
675 1.1 christos {
676 1.1 christos /* This is easy. */
677 1.1 christos md_number_to_chars (the_bytes, ri.r_address, sizeof (ri.r_address));
678 1.1 christos /* Now the fun stuff. */
679 1.1 christos the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff;
680 1.1 christos the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff;
681 1.1 christos the_bytes[4] = ri.r_symbolnum & 0x0ff;
682 1.1 christos the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06)
683 1.1 christos | ((ri.r_pcrel << 0) & 0x01)) & 0x0F;
684 1.1 christos }
685 1.1 christos
686 1.1 christos #endif /* comment */
687 1.1 christos
688 1.1 christos /* BUGS, GRIPES, APOLOGIA, etc.
689 1.1 christos
690 1.1 christos The opcode table 'votstrs' needs to be sorted on opcode frequency.
691 1.1 christos That is, AFTER we hash it with hash_...(), we want most-used opcodes
692 1.1 christos to come out of the hash table faster.
693 1.1 christos
694 1.1 christos I am sorry to inflict yet another VAX assembler on the world, but
695 1.1 christos RMS says we must do everything from scratch, to prevent pin-heads
696 1.1 christos restricting this software.
697 1.1 christos
698 1.1 christos This is a vaguely modular set of routines in C to parse VAX
699 1.1 christos assembly code using DEC mnemonics. It is NOT un*x specific.
700 1.1 christos
701 1.1 christos The idea here is that the assembler has taken care of all:
702 1.1 christos labels
703 1.1 christos macros
704 1.1 christos listing
705 1.1 christos pseudo-ops
706 1.1 christos line continuation
707 1.1 christos comments
708 1.1 christos condensing any whitespace down to exactly one space
709 1.1 christos and all we have to do is parse 1 line into a vax instruction
710 1.1 christos partially formed. We will accept a line, and deliver:
711 1.1 christos an error message (hopefully empty)
712 1.1 christos a skeleton VAX instruction (tree structure)
713 1.1 christos textual pointers to all the operand expressions
714 1.1 christos a warning message that notes a silly operand (hopefully empty)
715 1.1 christos
716 1.1 christos E D I T H I S T O R Y
717 1.1 christos
718 1.1 christos 17may86 Dean Elsner. Bug if line ends immediately after opcode.
719 1.1 christos 30apr86 Dean Elsner. New vip_op() uses arg block so change call.
720 1.1 christos 6jan86 Dean Elsner. Crock vip_begin() to call vip_op_defaults().
721 1.1 christos 2jan86 Dean Elsner. Invent synthetic opcodes.
722 1.1 christos Widen vax_opcodeT to 32 bits. Use a bit for VIT_OPCODE_SYNTHETIC,
723 1.1 christos which means this is not a real opcode, it is like a macro; it will
724 1.1 christos be relax()ed into 1 or more instructions.
725 1.1 christos Use another bit for VIT_OPCODE_SPECIAL if the op-code is not optimised
726 1.1 christos like a regular branch instruction. Option added to vip_begin():
727 1.1 christos exclude synthetic opcodes. Invent synthetic_votstrs[].
728 1.1 christos 31dec85 Dean Elsner. Invent vit_opcode_nbytes.
729 1.1 christos Also make vit_opcode into a char[]. We now have n-byte vax opcodes,
730 1.1 christos so caller's don't have to know the difference between a 1-byte & a
731 1.1 christos 2-byte op-code. Still need vax_opcodeT concept, so we know how
732 1.1 christos big an object must be to hold an op.code.
733 1.1 christos 30dec85 Dean Elsner. Widen typedef vax_opcodeT in "vax-inst.h"
734 1.1 christos because vax opcodes may be 16 bits. Our crufty C compiler was
735 1.1 christos happily initialising 8-bit vot_codes with 16-bit numbers!
736 1.1 christos (Wouldn't the 'phone company like to compress data so easily!)
737 1.1 christos 29dec85 Dean Elsner. New static table vax_operand_width_size[].
738 1.1 christos Invented so we know hw many bytes a "I^#42" needs in its immediate
739 1.1 christos operand. Revised struct vop in "vax-inst.h": explicitly include
740 1.1 christos byte length of each operand, and it's letter-code datum type.
741 1.1 christos 17nov85 Dean Elsner. Name Change.
742 1.1 christos Due to ar(1) truncating names, we learned the hard way that
743 1.1 christos "vax-inst-parse.c" -> "vax-inst-parse." dropping the "o" off
744 1.1 christos the archived object name. SO... we shortened the name of this
745 1.1 christos source file, and changed the makefile. */
746 1.1 christos
747 1.1 christos /* Handle of the OPCODE hash table. */
748 1.1 christos static struct hash_control *op_hash;
749 1.1 christos
750 1.1 christos /* In: 1 character, from "bdfghloqpw" being the data-type of an operand
751 1.1 christos of a vax instruction.
752 1.1 christos
753 1.1 christos Out: the length of an operand of that type, in bytes.
754 1.1 christos Special branch operands types "-?!" have length 0. */
755 1.1 christos
756 1.1 christos static const short int vax_operand_width_size[256] =
757 1.1 christos {
758 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
759 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
760 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
761 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
762 1.1 christos 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */
763 1.1 christos 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */
764 1.1 christos 0, 0, 1, 0, 8, 0, 4, 8, 16, 0, 0, 0, 4, 0, 0,16, /* ..b.d.fgh...l..o */
765 1.1 christos 0, 8, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* .q.....w........ */
766 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
767 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
768 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
769 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
770 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
771 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
772 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
773 1.1 christos 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
774 1.1 christos };
775 1.1 christos
776 1.1 christos /* This perversion encodes all the vax opcodes as a bunch of strings.
778 1.1 christos RMS says we should build our hash-table at run-time. Hmm.
779 1.1 christos Please would someone arrange these in decreasing frequency of opcode?
780 1.1 christos Because of the way hash_...() works, the most frequently used opcode
781 1.1 christos should be textually first and so on.
782 1.1 christos
783 1.1 christos Input for this table was 'vax.opcodes', awk(1)ed by 'vax.opcodes.c.awk' .
784 1.1 christos So change 'vax.opcodes', then re-generate this table. */
785 1.1 christos
786 1.1 christos #include "opcode/vax.h"
787 1.1 christos
788 1.1 christos /* This is a table of optional op-codes. All of them represent
790 1.3 christos 'synthetic' instructions that seem popular.
791 1.1 christos
792 1.1 christos Here we make some pseudo op-codes. Every code has a bit set to say
793 1.1 christos it is synthetic. This lets you catch them if you want to
794 1.3 christos ban these opcodes. They are mnemonics for "elastic" instructions
795 1.1 christos that are supposed to assemble into the fewest bytes needed to do a
796 1.1 christos branch, or to do a conditional branch, or whatever.
797 1.1 christos
798 1.1 christos The opcode is in the usual place [low-order n*8 bits]. This means
799 1.1 christos that if you mask off the bucky bits, the usual rules apply about
800 1.1 christos how long the opcode is.
801 1.1 christos
802 1.3 christos All VAX branch displacements come at the end of the instruction.
803 1.1 christos For simple branches (1-byte opcode + 1-byte displacement) the last
804 1.1 christos operand is coded 'b?' where the "data type" '?' is a clue that we
805 1.3 christos may reverse the sense of the branch (complement lowest order bit)
806 1.1 christos and branch around a jump. This is by far the most common case.
807 1.1 christos That is why the VIT_OPCODE_SYNTHETIC bit is set: it says this is
808 1.1 christos a 0-byte op-code followed by 2 or more bytes of operand address.
809 1.3 christos
810 1.1 christos If the op-code has VIT_OPCODE_SPECIAL set, then we have a more unusual
811 1.1 christos case.
812 1.1 christos
813 1.1 christos For JBSB & JBR the treatment is the similar, except (1) we have a 'bw'
814 1.1 christos option before (2) we can directly JSB/JMP because there is no condition.
815 1.1 christos These operands have 'b-' as their access/data type.
816 1.1 christos
817 1.1 christos That leaves a bunch of random opcodes: JACBx, JxOBxxx. In these
818 1.1 christos cases, we do the same idea. JACBxxx are all marked with a 'b!'
819 1.1 christos JAOBxxx & JSOBxxx are marked with a 'b:'. */
820 1.1 christos #if (VIT_OPCODE_SYNTHETIC != 0x80000000)
821 1.1 christos #error "You have just broken the encoding below, which assumes the sign bit means 'I am an imaginary instruction'."
822 1.1 christos #endif
823 1.1 christos
824 1.1 christos #if (VIT_OPCODE_SPECIAL != 0x40000000)
825 1.1 christos #error "You have just broken the encoding below, which assumes the 0x40 M bit means 'I am not to be "optimised" the way normal branches are'."
826 1.1 christos #endif
827 1.1 christos
828 1.1 christos static const struct vot
829 1.1 christos synthetic_votstrs[] =
830 1.1 christos {
831 1.1 christos {"jbsb", {"b-", 0xC0000010}}, /* BSD 4.2 */
832 1.1 christos /* jsb used already */
833 1.1 christos {"jbr", {"b-", 0xC0000011}}, /* BSD 4.2 */
834 1.1 christos {"jr", {"b-", 0xC0000011}}, /* consistent */
835 1.1 christos {"jneq", {"b?", 0x80000012}},
836 1.1 christos {"jnequ", {"b?", 0x80000012}},
837 1.1 christos {"jeql", {"b?", 0x80000013}},
838 1.1 christos {"jeqlu", {"b?", 0x80000013}},
839 1.1 christos {"jgtr", {"b?", 0x80000014}},
840 1.1 christos {"jleq", {"b?", 0x80000015}},
841 1.1 christos /* un-used opcodes here */
842 1.1 christos {"jgeq", {"b?", 0x80000018}},
843 1.1 christos {"jlss", {"b?", 0x80000019}},
844 1.1 christos {"jgtru", {"b?", 0x8000001a}},
845 1.1 christos {"jlequ", {"b?", 0x8000001b}},
846 1.1 christos {"jvc", {"b?", 0x8000001c}},
847 1.1 christos {"jvs", {"b?", 0x8000001d}},
848 1.1 christos {"jgequ", {"b?", 0x8000001e}},
849 1.1 christos {"jcc", {"b?", 0x8000001e}},
850 1.1 christos {"jlssu", {"b?", 0x8000001f}},
851 1.1 christos {"jcs", {"b?", 0x8000001f}},
852 1.1 christos
853 1.1 christos {"jacbw", {"rwrwmwb!", 0xC000003d}},
854 1.1 christos {"jacbf", {"rfrfmfb!", 0xC000004f}},
855 1.1 christos {"jacbd", {"rdrdmdb!", 0xC000006f}},
856 1.1 christos {"jacbb", {"rbrbmbb!", 0xC000009d}},
857 1.1 christos {"jacbl", {"rlrlmlb!", 0xC00000f1}},
858 1.1 christos {"jacbg", {"rgrgmgb!", 0xC0004ffd}},
859 1.1 christos {"jacbh", {"rhrhmhb!", 0xC0006ffd}},
860 1.1 christos
861 1.1 christos {"jbs", {"rlvbb?", 0x800000e0}},
862 1.1 christos {"jbc", {"rlvbb?", 0x800000e1}},
863 1.1 christos {"jbss", {"rlvbb?", 0x800000e2}},
864 1.1 christos {"jbcs", {"rlvbb?", 0x800000e3}},
865 1.1 christos {"jbsc", {"rlvbb?", 0x800000e4}},
866 1.1 christos {"jbcc", {"rlvbb?", 0x800000e5}},
867 1.1 christos {"jbssi", {"rlvbb?", 0x800000e6}},
868 1.1 christos {"jbcci", {"rlvbb?", 0x800000e7}},
869 1.1 christos {"jlbs", {"rlb?", 0x800000e8}},
870 1.1 christos {"jlbc", {"rlb?", 0x800000e9}},
871 1.1 christos
872 1.1 christos {"jaoblss", {"rlmlb:", 0xC00000f2}},
873 1.1 christos {"jaobleq", {"rlmlb:", 0xC00000f3}},
874 1.1 christos {"jsobgeq", {"mlb:", 0xC00000f4}},
875 1.1 christos {"jsobgtr", {"mlb:", 0xC00000f5}},
876 1.1 christos
877 1.1 christos /* CASEx has no branch addresses in our conception of it. */
878 1.1 christos /* You should use ".word ..." statements after the "case ...". */
879 1.1 christos
880 1.1 christos {"", {"", 0}} /* Empty is end sentinel. */
881 1.1 christos };
882 1.1 christos
883 1.1 christos /* Because this module is useful for both VMS and UN*X style assemblers
885 1.1 christos and because of the variety of UN*X assemblers we must recognise
886 1.1 christos the different conventions for assembler operand notation. For example
887 1.1 christos VMS says "#42" for immediate mode, while most UN*X say "$42".
888 1.1 christos We permit arbitrary sets of (single) characters to represent the
889 1.1 christos 3 concepts that DEC writes '#', '@', '^'. */
890 1.1 christos
891 1.1 christos /* Character tests. */
892 1.1 christos #define VIP_IMMEDIATE 01 /* Character is like DEC # */
893 1.1 christos #define VIP_INDIRECT 02 /* Char is like DEC @ */
894 1.1 christos #define VIP_DISPLEN 04 /* Char is like DEC ^ */
895 1.1 christos
896 1.1 christos #define IMMEDIATEP(c) (vip_metacharacters [(c) & 0xff] & VIP_IMMEDIATE)
897 1.1 christos #define INDIRECTP(c) (vip_metacharacters [(c) & 0xff] & VIP_INDIRECT)
898 1.1 christos #define DISPLENP(c) (vip_metacharacters [(c) & 0xff] & VIP_DISPLEN)
899 1.1 christos
900 1.1 christos /* We assume 8 bits per byte. Use vip_op_defaults() to set these up BEFORE we
901 1.1 christos are ever called. */
902 1.1 christos
903 1.1 christos #if defined(CONST_TABLE)
904 1.1 christos #define _ 0,
905 1.1 christos #define I VIP_IMMEDIATE,
906 1.1 christos #define S VIP_INDIRECT,
907 1.1 christos #define D VIP_DISPLEN,
908 1.1 christos static const char
909 1.1 christos vip_metacharacters[256] =
910 1.1 christos {
911 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^@ ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O*/
912 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /* ^P ^Q ^R ^S ^T ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ */
913 1.1 christos _ _ _ _ I _ _ _ _ _ S _ _ _ _ _ /* sp ! " # $ % & ' ( ) * + , - . / */
914 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*0 1 2 3 4 5 6 7 8 9 : ; < = > ?*/
915 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*@ A B C D E F G H I J K L M N O*/
916 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*P Q R S T U V W X Y Z [ \ ] ^ _*/
917 1.1 christos D _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*` a b c d e f g h i j k l m n o*/
918 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /*p q r s t u v w x y z { | } ~ ^?*/
919 1.1 christos
920 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
921 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
922 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
923 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
924 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
925 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
926 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
927 1.1 christos _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
928 1.1 christos };
929 1.1 christos #undef _
930 1.1 christos #undef I
931 1.1 christos #undef S
932 1.1 christos #undef D
933 1.1 christos
934 1.1 christos #else
935 1.1 christos
936 1.1 christos static char vip_metacharacters[256];
937 1.1 christos
938 1.1 christos static void
939 1.1 christos vip_op_1 (int bit, const char *syms)
940 1.1 christos {
941 1.1 christos unsigned char t;
942 1.1 christos
943 1.1 christos while ((t = *syms++) != 0)
944 1.1 christos vip_metacharacters[t] |= bit;
945 1.1 christos }
946 1.1 christos
947 1.1 christos /* Can be called any time. More arguments may appear in future. */
948 1.1 christos static void
949 1.1 christos vip_op_defaults (const char *immediate, const char *indirect, const char *displen)
950 1.1 christos {
951 1.1 christos vip_op_1 (VIP_IMMEDIATE, immediate);
952 1.1 christos vip_op_1 (VIP_INDIRECT, indirect);
953 1.1 christos vip_op_1 (VIP_DISPLEN, displen);
954 1.1 christos }
955 1.1 christos
956 1.1 christos #endif
957 1.1 christos
958 1.1 christos /* Call me once before you decode any lines.
959 1.1 christos I decode votstrs into a hash table at op_hash (which I create).
960 1.1 christos I return an error text or null.
961 1.1 christos If you want, I will include the 'synthetic' jXXX instructions in the
962 1.1 christos instruction table.
963 1.1 christos You must nominate metacharacters for eg DEC's "#", "@", "^". */
964 1.1 christos
965 1.1 christos static const char *
966 1.1 christos vip_begin (int synthetic_too, /* 1 means include jXXX op-codes. */
967 1.1 christos const char *immediate,
968 1.1 christos const char *indirect,
969 1.1 christos const char *displen)
970 1.1 christos {
971 1.1 christos const struct vot *vP; /* scan votstrs */
972 1.1 christos const char *retval = 0; /* error text */
973 1.1 christos
974 1.1 christos op_hash = hash_new ();
975 1.1 christos
976 1.1 christos for (vP = votstrs; *vP->vot_name && !retval; vP++)
977 1.1 christos retval = hash_insert (op_hash, vP->vot_name, (void *) &vP->vot_detail);
978 1.1 christos
979 1.1 christos if (synthetic_too)
980 1.1 christos for (vP = synthetic_votstrs; *vP->vot_name && !retval; vP++)
981 1.1 christos retval = hash_insert (op_hash, vP->vot_name, (void *) &vP->vot_detail);
982 1.1 christos
983 1.1 christos #ifndef CONST_TABLE
984 1.3 christos vip_op_defaults (immediate, indirect, displen);
985 1.1 christos #endif
986 1.1 christos
987 1.3 christos return retval;
988 1.1 christos }
989 1.3 christos
990 1.1 christos /* Take 3 char.s, the last of which may be `\0` (non-existent)
991 1.3 christos and return the VAX register number that they represent.
992 1.1 christos
993 1.1 christos Return -1 if they don't form a register name. Good names return
994 1.1 christos a number from 0:15 inclusive.
995 1.1 christos
996 1.1 christos Case is not important in a name.
997 1.1 christos
998 1.1 christos Register names understood are:
999 1.1 christos
1000 1.1 christos R0
1001 1.1 christos R1
1002 1.1 christos R2
1003 1.1 christos R3
1004 1.1 christos R4
1005 1.1 christos R5
1006 1.1 christos R6
1007 1.1 christos R7
1008 1.1 christos R8
1009 1.1 christos R9
1010 1.1 christos R10
1011 1.1 christos R11
1012 1.1 christos R12 AP
1013 1.1 christos R13 FP
1014 1.1 christos R14 SP
1015 1.1 christos R15 PC */
1016 1.1 christos
1017 1.1 christos #define AP 12
1018 1.1 christos #define FP 13
1019 1.1 christos #define SP 14
1020 1.1 christos #define PC 15
1021 1.1 christos
1022 1.1 christos /* Returns the register number of something like '%r15' or 'ap', supplied
1023 1.1 christos in four single chars. Returns -1 if the register isn't recognized,
1024 1.1 christos 0..15 otherwise. */
1025 1.1 christos static int
1026 1.1 christos vax_reg_parse (char c1, char c2, char c3, char c4)
1027 1.1 christos {
1028 1.1 christos int retval = -1;
1029 1.1 christos
1030 1.1 christos #ifdef OBJ_ELF
1031 1.1 christos if (c1 != '%') /* Register prefixes are mandatory for ELF. */
1032 1.1 christos return retval;
1033 1.1 christos c1 = c2;
1034 1.1 christos c2 = c3;
1035 1.1 christos c3 = c4;
1036 1.1 christos #endif
1037 1.1 christos #ifdef OBJ_VMS
1038 1.1 christos if (c4 != 0) /* Register prefixes are not allowed under VMS. */
1039 1.1 christos return retval;
1040 1.1 christos #endif
1041 1.1 christos #ifdef OBJ_AOUT
1042 1.1 christos if (c1 == '%') /* Register prefixes are optional under a.out. */
1043 1.1 christos {
1044 1.1 christos c1 = c2;
1045 1.1 christos c2 = c3;
1046 1.1 christos c3 = c4;
1047 1.1 christos }
1048 1.1 christos else if (c3 && c4) /* Can't be 4 characters long. */
1049 1.1 christos return retval;
1050 1.1 christos #endif
1051 1.1 christos
1052 1.1 christos c1 = TOLOWER (c1);
1053 1.1 christos c2 = TOLOWER (c2);
1054 1.1 christos if (ISDIGIT (c2) && c1 == 'r')
1055 1.1 christos {
1056 1.1 christos retval = c2 - '0';
1057 1.1 christos if (ISDIGIT (c3))
1058 1.1 christos {
1059 1.1 christos retval = retval * 10 + c3 - '0';
1060 1.1 christos retval = (retval > 15) ? -1 : retval;
1061 1.1 christos /* clamp the register value to 1 hex digit */
1062 1.1 christos }
1063 1.1 christos else if (c3)
1064 1.1 christos retval = -1; /* c3 must be '\0' or a digit. */
1065 1.1 christos }
1066 1.1 christos else if (c3) /* There are no three letter regs. */
1067 1.1 christos retval = -1;
1068 1.1 christos else if (c2 == 'p')
1069 1.1 christos {
1070 1.1 christos switch (c1)
1071 1.1 christos {
1072 1.1 christos case 's':
1073 1.1 christos retval = SP;
1074 1.1 christos break;
1075 1.1 christos case 'f':
1076 1.1 christos retval = FP;
1077 1.1 christos break;
1078 1.1 christos case 'a':
1079 1.1 christos retval = AP;
1080 1.1 christos break;
1081 1.1 christos default:
1082 1.1 christos retval = -1;
1083 1.1 christos }
1084 1.1 christos }
1085 1.1 christos else if (c1 == 'p' && c2 == 'c')
1086 1.1 christos retval = PC;
1087 1.1 christos else
1088 1.1 christos retval = -1;
1089 1.1 christos return retval;
1090 1.1 christos }
1091 1.1 christos
1092 1.1 christos #ifdef OBJ_AOUT
1093 1.1 christos #ifndef BFD_ASSEMBLER
1094 1.1 christos void
1095 1.1 christos tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
1096 1.1 christos char *where;
1097 1.1 christos fixS *fixP;
1098 1.1 christos relax_addressT segment_address_in_file;
1099 1.1 christos {
1100 1.1 christos /*
1101 1.1 christos * In: length of relocation (or of address) in chars: 1, 2 or 4.
1102 1.1 christos * Out: GNU LD relocation length code: 0, 1, or 2.
1103 1.1 christos */
1104 1.1 christos
1105 1.1 christos static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
1106 1.1 christos int r_symbolnum;
1107 1.1 christos int r_flags;
1108 1.1 christos
1109 1.1 christos know (fixP->fx_addsy != NULL);
1110 1.1 christos
1111 1.1 christos md_number_to_chars (where,
1112 1.1 christos fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
1113 1.1 christos 4);
1114 1.1 christos
1115 1.1 christos r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
1116 1.1 christos ? S_GET_TYPE (fixP->fx_addsy)
1117 1.1 christos : fixP->fx_addsy->sy_number);
1118 1.1 christos r_flags = (fixP->fx_pcrel ? 1 : 0)
1119 1.1 christos | (!S_IS_DEFINED (fixP->fx_addsy) ? 8 : 0) /* extern */
1120 1.1 christos | ((nbytes_r_length[fixP->fx_size] & 3) << 1);
1121 1.1 christos
1122 1.1 christos #if 0
1123 1.1 christos r_flags |= ((!S_IS_DEFINED(fixP->fx_addsy)
1124 1.1 christos && fixP->fx_pcrel
1125 1.1 christos && fixP->fx_addsy != GOT_symbol
1126 1.1 christos && fixP->fx_addsy != PLT_symbol
1127 1.1 christos && flags_want_pic) ? 0x10 : 0);
1128 1.1 christos #endif
1129 1.1 christos
1130 1.1 christos switch (fixP->fx_r_type) {
1131 1.1 christos case NO_RELOC:
1132 1.1 christos break;
1133 1.1 christos case NO_RELOC2:
1134 1.1 christos if (r_flags & 8)
1135 1.1 christos r_flags |= 0x80; /* setting the copy bit */
1136 1.1 christos /* says we can convert */
1137 1.1 christos /* to gotslot if needed */
1138 1.1 christos break;
1139 1.1 christos case RELOC_32:
1140 1.1 christos if (flag_want_pic && S_IS_EXTERNAL(fixP->fx_addsy)) {
1141 1.1 christos r_symbolnum = fixP->fx_addsy->sy_number;
1142 1.1 christos r_flags |= 8; /* set extern bit */
1143 1.1 christos }
1144 1.1 christos break;
1145 1.1 christos case RELOC_JMP_SLOT:
1146 1.1 christos if (flag_want_pic) {
1147 1.1 christos r_flags |= 0x20; /* set jmptable */
1148 1.1 christos r_flags &= ~0x08; /* clear extern bit */
1149 1.1 christos }
1150 1.1 christos break;
1151 1.1 christos case RELOC_JMP_TBL:
1152 1.1 christos if (flag_want_pic) {
1153 1.1 christos r_flags |= 0x20; /* set jmptable */
1154 1.1 christos r_flags |= 0x08; /* set extern bit */
1155 1.1 christos }
1156 1.1 christos break;
1157 1.1 christos case RELOC_GLOB_DAT:
1158 1.1 christos if (flag_want_pic) {
1159 1.1 christos r_flags |= 0x10; /* set baserel bit */
1160 1.1 christos r_symbolnum = fixP->fx_addsy->sy_number;
1161 1.1 christos if (S_IS_EXTERNAL(fixP->fx_addsy))
1162 1.1 christos r_flags |= 8; /* set extern bit */
1163 1.1 christos }
1164 1.1 christos break;
1165 1.1 christos }
1166 1.1 christos
1167 1.1 christos where[4] = (r_symbolnum >> 0) & 0xff;
1168 1.1 christos where[5] = (r_symbolnum >> 8) & 0xff;
1169 1.1 christos where[6] = (r_symbolnum >> 16) & 0xff;
1170 1.1 christos where[7] = r_flags;
1171 1.1 christos }
1172 1.1 christos #endif /* !BFD_ASSEMBLER */
1173 1.1 christos #endif /* OBJ_AOUT */
1174 1.1 christos
1175 1.1 christos /*
1176 1.1 christos * BUGS, GRIPES, APOLOGIA, etc.
1177 1.1 christos *
1178 1.1 christos * The opcode table 'votstrs' needs to be sorted on opcode frequency.
1179 1.1 christos * That is, AFTER we hash it with hash_...(), we want most-used opcodes
1180 1.1 christos * to come out of the hash table faster.
1181 1.1 christos *
1182 1.1 christos * I am sorry to inflict yet another VAX assembler on the world, but
1183 1.1 christos * RMS says we must do everything from scratch, to prevent pin-heads
1184 1.1 christos * restricting this software.
1185 1.1 christos */
1186 1.1 christos
1187 1.1 christos /*
1188 1.1 christos * This is a vaguely modular set of routines in C to parse VAX
1189 1.1 christos * assembly code using DEC mnemonics. It is NOT un*x specific.
1190 1.1 christos *
1191 1.1 christos * The idea here is that the assembler has taken care of all:
1192 1.1 christos * labels
1193 1.1 christos * macros
1194 1.1 christos * listing
1195 1.1 christos * pseudo-ops
1196 1.1 christos * line continuation
1197 1.1 christos * comments
1198 1.1 christos * condensing any whitespace down to exactly one space
1199 1.1 christos * and all we have to do is parse 1 line into a vax instruction
1200 1.1 christos * partially formed. We will accept a line, and deliver:
1201 1.1 christos * an error message (hopefully empty)
1202 1.1 christos * a skeleton VAX instruction (tree structure)
1203 1.1 christos * textual pointers to all the operand expressions
1204 1.1 christos * a warning message that notes a silly operand (hopefully empty)
1205 1.1 christos */
1206 1.1 christos
1207 1.1 christos /*
1209 1.1 christos * E D I T H I S T O R Y
1210 1.1 christos *
1211 1.1 christos * 17may86 Dean Elsner. Bug if line ends immediately after opcode.
1212 1.1 christos * 30apr86 Dean Elsner. New vip_op() uses arg block so change call.
1213 1.1 christos * 6jan86 Dean Elsner. Crock vip_begin() to call vip_op_defaults().
1214 1.1 christos * 2jan86 Dean Elsner. Invent synthetic opcodes.
1215 1.1 christos * Widen vax_opcodeT to 32 bits. Use a bit for VIT_OPCODE_SYNTHETIC,
1216 1.1 christos * which means this is not a real opcode, it is like a macro; it will
1217 1.1 christos * be relax()ed into 1 or more instructions.
1218 1.1 christos * Use another bit for VIT_OPCODE_SPECIAL if the op-code is not optimised
1219 1.1 christos * like a regular branch instruction. Option added to vip_begin():
1220 1.1 christos * exclude synthetic opcodes. Invent synthetic_votstrs[].
1221 1.1 christos * 31dec85 Dean Elsner. Invent vit_opcode_nbytes.
1222 1.1 christos * Also make vit_opcode into a char[]. We now have n-byte vax opcodes,
1223 1.1 christos * so caller's don't have to know the difference between a 1-byte & a
1224 1.1 christos * 2-byte op-code. Still need vax_opcodeT concept, so we know how
1225 1.1 christos * big an object must be to hold an op.code.
1226 1.1 christos * 30dec85 Dean Elsner. Widen typedef vax_opcodeT in "vax-inst.h"
1227 1.1 christos * because vax opcodes may be 16 bits. Our crufty C compiler was
1228 1.1 christos * happily initialising 8-bit vot_codes with 16-bit numbers!
1229 1.1 christos * (Wouldn't the 'phone company like to compress data so easily!)
1230 1.1 christos * 29dec85 Dean Elsner. New static table vax_operand_width_size[].
1231 1.1 christos * Invented so we know hw many bytes a "I^#42" needs in its immediate
1232 1.1 christos * operand. Revised struct vop in "vax-inst.h": explicitly include
1233 1.1 christos * byte length of each operand, and it's letter-code datum type.
1234 1.1 christos * 17nov85 Dean Elsner. Name Change.
1235 1.1 christos * Due to ar(1) truncating names, we learned the hard way that
1236 1.3 christos * "vax-inst-parse.c" -> "vax-inst-parse." dropping the "o" off
1237 1.1 christos * the archived object name. SO... we shortened the name of this
1238 1.1 christos * source file, and changed the makefile.
1239 1.1 christos */
1240 1.1 christos
1241 1.1 christos /* Parse a vax operand in DEC assembler notation.
1242 1.1 christos For speed, expect a string of whitespace to be reduced to a single ' '.
1243 1.3 christos This is the case for GNU AS, and is easy for other DEC-compatible
1244 1.1 christos assemblers.
1245 1.1 christos
1246 1.1 christos Knowledge about DEC VAX assembler operand notation lives here.
1247 1.1 christos This doesn't even know what a register name is, except it believes
1248 1.1 christos all register names are 2 or 3 characters, and lets vax_reg_parse() say
1249 1.3 christos what number each name represents.
1250 1.1 christos It does, however, know that PC, SP etc are special registers so it can
1251 1.1 christos detect addressing modes that are silly for those registers.
1252 1.1 christos
1253 1.1 christos Where possible, it delivers 1 fatal or 1 warning message if the operand
1254 1.1 christos is suspect. Exactly what we test for is still evolving.
1255 1.1 christos
1256 1.1 christos ---
1257 1.3 christos Arg block.
1258 1.1 christos
1259 1.1 christos There were a number of 'mismatched argument type' bugs to vip_op.
1260 1.1 christos The most general solution is to typedef each (of many) arguments.
1261 1.1 christos We used instead a typedef'd argument block. This is less modular
1262 1.1 christos than using separate return pointers for each result, but runs faster
1263 1.1 christos on most engines, and seems to keep programmers happy. It will have
1264 1.1 christos to be done properly if we ever want to use vip_op as a general-purpose
1265 1.1 christos module (it was designed to be).
1266 1.1 christos
1267 1.1 christos G^
1268 1.3 christos
1269 1.1 christos Doesn't support DEC "G^" format operands. These always take 5 bytes
1270 1.1 christos to express, and code as modes 8F or 9F. Reason: "G^" deprives you of
1271 1.1 christos optimising to (say) a "B^" if you are lucky in the way you link.
1272 1.3 christos When someone builds a linker smart enough to convert "G^" to "B^", "W^"
1273 1.3 christos whenever possible, then we should implement it.
1274 1.1 christos If there is some other use for "G^", feel free to code it in!
1275 1.3 christos
1276 1.1 christos speed
1277 1.1 christos
1278 1.1 christos If I nested if()s more, I could avoid testing (*err) which would save
1279 1.1 christos time, space and page faults. I didn't nest all those if()s for clarity
1280 1.1 christos and because I think the mode testing can be re-arranged 1st to test the
1281 1.1 christos commoner constructs 1st. Does anybody have statistics on this?
1282 1.1 christos
1283 1.1 christos error messages
1284 1.3 christos
1285 1.1 christos In future, we should be able to 'compose' error messages in a scratch area
1286 1.3 christos and give the user MUCH more informative error messages. Although this takes
1287 1.1 christos a little more code at run-time, it will make this module much more self-
1288 1.1 christos documenting. As an example of what sucks now: most error messages have
1289 1.3 christos hardwired into them the DEC VAX metacharacters "#^@" which are nothing like
1290 1.1 christos the Un*x characters "$`*", that most users will expect from this AS.
1291 1.3 christos
1292 1.1 christos ----
1293 1.1 christos
1294 1.1 christos The input is a string, ending with '\0'.
1295 1.3 christos
1296 1.1 christos We also require a 'hint' of what kind of operand is expected: so
1297 1.1 christos we can remind caller not to write into literals for instance.
1298 1.1 christos
1299 1.1 christos The output is a skeletal instruction.
1300 1.1 christos
1301 1.1 christos The algorithm has two parts.
1302 1.1 christos 1. extract the syntactic features (parse off all the @^#-()+[] mode crud);
1303 1.1 christos 2. express the @^#-()+[] as some parameters suited to further analysis.
1304 1.1 christos
1305 1.1 christos 2nd step is where we detect the googles of possible invalid combinations
1306 1.1 christos a human (or compiler) might write. Note that if we do a half-way
1307 1.1 christos decent assembler, we don't know how long to make (eg) displacement
1308 1.1 christos fields when we first meet them (because they may not have defined values).
1309 1.1 christos So we must wait until we know how many bits are needed for each address,
1310 1.1 christos then we can know both length and opcodes of instructions.
1311 1.1 christos For reason(s) above, we will pass to our caller a 'broken' instruction
1312 1.3 christos of these major components, from which our caller can generate instructions:
1313 1.1 christos - displacement length I^ S^ L^ B^ W^ unspecified
1314 1.1 christos - mode (many)
1315 1.1 christos - register R0-R15 or absent
1316 1.1 christos - index register R0-R15 or absent
1317 1.1 christos - expression text what we don't parse
1318 1.1 christos - error text(s) why we couldn't understand the operand
1319 1.3 christos
1320 1.1 christos ----
1321 1.1 christos
1322 1.3 christos To decode output of this, test errtxt. If errtxt[0] == '\0', then
1323 1.1 christos we had no errors that prevented parsing. Also, if we ever report
1324 1.3 christos an internal bug, errtxt[0] is set non-zero. So one test tells you
1325 1.1 christos if the other outputs are to be taken seriously.
1326 1.1 christos
1327 1.1 christos ----
1328 1.1 christos
1329 1.1 christos Dec defines the semantics of address modes (and values)
1330 1.1 christos by a two-letter code, explained here.
1331 1.1 christos
1332 1.3 christos letter 1: access type
1333 1.1 christos
1334 1.3 christos a address calculation - no data access, registers forbidden
1335 1.1 christos b branch displacement
1336 1.1 christos m read - let go of bus - write back "modify"
1337 1.1 christos r read
1338 1.1 christos v bit field address: like 'a' but registers are OK
1339 1.1 christos w write
1340 1.1 christos space no operator (eg ".long foo") [our convention]
1341 1.1 christos
1342 1.1 christos letter 2: data type (i.e. width, alignment)
1343 1.1 christos
1344 1.1 christos b byte
1345 1.1 christos d double precision floating point (D format)
1346 1.1 christos f single precision floating point (F format)
1347 1.3 christos g G format floating
1348 1.1 christos h H format floating
1349 1.1 christos l longword
1350 1.1 christos o octaword
1351 1.3 christos q quadword
1352 1.1 christos w word
1353 1.1 christos ? simple synthetic branch operand
1354 1.1 christos - unconditional synthetic JSB/JSR operand
1355 1.1 christos ! complex synthetic branch operand
1356 1.1 christos
1357 1.1 christos The '-?!' letter 2's are not for external consumption. They are used
1358 1.1 christos for various assemblers. Generally, all unknown widths are assumed 0.
1359 1.1 christos We don't limit your choice of width character.
1360 1.3 christos
1361 1.1 christos DEC operands are hard work to parse. For example, '@' as the first
1362 1.3 christos character means indirect (deferred) mode but elsewhere it is a shift
1363 1.1 christos operator.
1364 1.1 christos The long-winded explanation of how this is supposed to work is
1365 1.1 christos cancelled. Read a DEC vax manual.
1366 1.1 christos We try hard not to parse anything that MIGHT be part of the expression
1367 1.1 christos buried in that syntax. For example if we see @...(Rn) we don't check
1368 1.1 christos for '-' before the '(' because mode @-(Rn) does not exist.
1369 1.1 christos
1370 1.1 christos After parsing we have:
1371 1.1 christos
1372 1.1 christos at 1 if leading '@' (or Un*x '*')
1373 1.3 christos len takes one value from " bilsw". eg B^ -> 'b'.
1374 1.1 christos hash 1 if leading '#' (or Un*x '$')
1375 1.1 christos expr_begin, expr_end the expression we did not parse
1376 1.1 christos even though we don't interpret it, we make use
1377 1.1 christos of its presence or absence.
1378 1.1 christos sign -1: -(Rn) 0: absent +1: (Rn)+
1379 1.1 christos paren 1 if () are around register
1380 1.1 christos reg major register number 0:15 -1 means absent
1381 1.1 christos ndx index register number 0:15 -1 means absent
1382 1.1 christos
1383 1.1 christos Again, I dare not explain it: just trace ALL the code!
1384 1.1 christos
1385 1.1 christos Summary of vip_op outputs.
1386 1.1 christos
1387 1.1 christos mode reg len ndx
1388 1.1 christos (Rn) => @Rn
1389 1.1 christos {@}Rn 5+@ n ' ' optional
1390 1.1 christos branch operand 0 -1 ' ' -1
1391 1.1 christos S^#foo 0 -1 's' -1
1392 1.1 christos -(Rn) 7 n ' ' optional
1393 1.1 christos {@}(Rn)+ 8+@ n ' ' optional
1394 1.1 christos {@}#foo, no S^ 8+@ PC " i" optional
1395 1.1 christos {@}{q^}{(Rn)} 10+@+q option " bwl" optional */
1396 1.1 christos
1397 1.1 christos /* Dissect user-input 'optext' (which is something like "@B^foo@bar(AP)[FP]:")
1398 1.1 christos using the vop in vopP. vopP's vop_access and vop_width. We fill _ndx, _reg,
1399 1.1 christos _mode, _short, _warn, _error, _expr_begin, _expr_end and _nbytes. */
1400 1.1 christos
1401 1.1 christos static void
1402 1.1 christos vip_op (char *optext, struct vop *vopP)
1403 1.1 christos {
1404 1.1 christos /* Track operand text forward. */
1405 1.1 christos char *p;
1406 1.1 christos /* Track operand text backward. */
1407 1.1 christos char *q;
1408 1.1 christos /* 1 if leading '@' ('*') seen. */
1409 1.1 christos int at;
1410 1.1 christos /* one of " bilsw" */
1411 1.1 christos char len;
1412 1.1 christos /* 1 if leading '#' ('$') seen. */
1413 1.1 christos int hash;
1414 1.1 christos /* -1, 0 or +1. */
1415 1.1 christos int sign = 0;
1416 1.1 christos /* 1 if () surround register. */
1417 1.1 christos int paren = 0;
1418 1.1 christos /* Register number, -1:absent. */
1419 1.1 christos int reg = 0;
1420 1.1 christos /* Index register number -1:absent. */
1421 1.1 christos int ndx = 0;
1422 1.1 christos /* Report illegal operand, ""==OK. */
1423 1.1 christos /* " " is a FAKE error: means we won. */
1424 1.1 christos /* ANY err that begins with ' ' is a fake. */
1425 1.1 christos /* " " is converted to "" before return. */
1426 1.1 christos const char *err;
1427 1.1 christos /* Warn about weird modes pf address. */
1428 1.1 christos const char *wrn;
1429 1.1 christos /* Preserve q in case we backup. */
1430 1.1 christos char *oldq = NULL;
1431 1.1 christos /* Build up 4-bit operand mode here. */
1432 1.1 christos /* Note: index mode is in ndx, this is. */
1433 1.1 christos /* The major mode of operand address. */
1434 1.1 christos int mode = 0;
1435 1.1 christos /* Notice how we move wrong-arg-type bugs INSIDE this module: if we
1436 1.1 christos get the types wrong below, we lose at compile time rather than at
1437 1.1 christos lint or run time. */
1438 1.1 christos char access_mode; /* vop_access. */
1439 1.1 christos
1440 1.1 christos access_mode = vopP->vop_access;
1441 1.1 christos /* None of our code bugs (yet), no user text errors, no warnings
1442 1.1 christos even. */
1443 1.1 christos err = wrn = 0;
1444 1.1 christos
1445 1.1 christos p = optext;
1446 1.1 christos
1447 1.1 christos if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1448 1.1 christos p++; /* skip over whitespace */
1449 1.1 christos
1450 1.1 christos if ((at = INDIRECTP (*p)) != 0)
1451 1.1 christos { /* 1 if *p=='@'(or '*' for Un*x) */
1452 1.1 christos p++; /* at is determined */
1453 1.1 christos if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1454 1.1 christos p++; /* skip over whitespace */
1455 1.1 christos }
1456 1.1 christos
1457 1.1 christos /* This code is subtle. It tries to detect all legal (letter)'^'
1458 1.1 christos but it doesn't waste time explicitly testing for premature '\0' because
1459 1.1 christos this case is rejected as a mismatch against either (letter) or '^'. */
1460 1.1 christos {
1461 1.1 christos char c;
1462 1.1 christos
1463 1.1 christos c = *p;
1464 1.1 christos c = TOLOWER (c);
1465 1.1 christos if (DISPLENP (p[1]) && strchr ("bilws", len = c))
1466 1.1 christos p += 2; /* Skip (letter) '^'. */
1467 1.1 christos else /* No (letter) '^' seen. */
1468 1.1 christos len = ' '; /* Len is determined. */
1469 1.1 christos }
1470 1.1 christos
1471 1.3 christos if (*p == ' ') /* Expect all whitespace reduced to ' '. */
1472 1.1 christos p++;
1473 1.1 christos
1474 1.1 christos if ((hash = IMMEDIATEP (*p)) != 0) /* 1 if *p=='#' ('$' for Un*x) */
1475 1.1 christos p++; /* Hash is determined. */
1476 1.1 christos
1477 1.1 christos /* p points to what may be the beginning of an expression.
1478 1.1 christos We have peeled off the front all that is peelable.
1479 1.1 christos We know at, len, hash.
1480 1.1 christos
1481 1.1 christos Lets point q at the end of the text and parse that (backwards). */
1482 1.1 christos
1483 1.1 christos for (q = p; *q; q++)
1484 1.1 christos ;
1485 1.1 christos q--; /* Now q points at last char of text. */
1486 1.1 christos
1487 1.1 christos if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1488 1.1 christos q--;
1489 1.1 christos
1490 1.1 christos /* Reverse over whitespace, but don't. */
1491 1.1 christos /* Run back over *p. */
1492 1.1 christos
1493 1.1 christos /* As a matter of policy here, we look for [Rn], although both Rn and S^#
1494 1.1 christos forbid [Rn]. This is because it is easy, and because only a sick
1495 1.1 christos cyborg would have [...] trailing an expression in a VAX-like assembler.
1496 1.1 christos A meticulous parser would first check for Rn followed by '(' or '['
1497 1.1 christos and not parse a trailing ']' if it found another. We just ban expressions
1498 1.1 christos ending in ']'. */
1499 1.1 christos if (*q == ']')
1500 1.1 christos {
1501 1.1 christos while (q >= p && *q != '[')
1502 1.1 christos q--;
1503 1.1 christos /* Either q<p or we got matching '['. */
1504 1.1 christos if (q < p)
1505 1.1 christos err = _("no '[' to match ']'");
1506 1.1 christos else
1507 1.1 christos {
1508 1.1 christos /* Confusers like "[]" will eventually lose with a bad register
1509 1.1 christos * name error. So again we don't need to check for early '\0'. */
1510 1.1 christos if (q[3] == ']')
1511 1.1 christos ndx = vax_reg_parse (q[1], q[2], 0, 0);
1512 1.1 christos else if (q[4] == ']')
1513 1.1 christos ndx = vax_reg_parse (q[1], q[2], q[3], 0);
1514 1.1 christos else if (q[5] == ']')
1515 1.1 christos ndx = vax_reg_parse (q[1], q[2], q[3], q[4]);
1516 1.1 christos else
1517 1.1 christos ndx = -1;
1518 1.1 christos /* Since we saw a ']' we will demand a register name in the [].
1519 1.1 christos * If luser hasn't given us one: be rude. */
1520 1.1 christos if (ndx < 0)
1521 1.1 christos err = _("bad register in []");
1522 1.1 christos else if (ndx == PC)
1523 1.1 christos err = _("[PC] index banned");
1524 1.1 christos else
1525 1.1 christos /* Point q just before "[...]". */
1526 1.1 christos q--;
1527 1.1 christos }
1528 1.1 christos }
1529 1.1 christos else
1530 1.1 christos /* No ']', so no iNDeX register. */
1531 1.1 christos ndx = -1;
1532 1.1 christos
1533 1.1 christos /* If err = "..." then we lost: run away.
1534 1.1 christos Otherwise ndx == -1 if there was no "[...]".
1535 1.1 christos Otherwise, ndx is index register number, and q points before "[...]". */
1536 1.1 christos
1537 1.1 christos if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1538 1.1 christos q--;
1539 1.1 christos /* Reverse over whitespace, but don't. */
1540 1.1 christos /* Run back over *p. */
1541 1.1 christos if (!err || !*err)
1542 1.1 christos {
1543 1.1 christos /* no ()+ or -() seen yet */
1544 1.1 christos sign = 0;
1545 1.1 christos
1546 1.1 christos if (q > p + 3 && *q == '+' && q[-1] == ')')
1547 1.1 christos {
1548 1.1 christos sign = 1; /* we saw a ")+" */
1549 1.1 christos q--; /* q points to ')' */
1550 1.1 christos }
1551 1.1 christos
1552 1.1 christos if (*q == ')' && q > p + 2)
1553 1.1 christos {
1554 1.1 christos paren = 1; /* assume we have "(...)" */
1555 1.1 christos while (q >= p && *q != '(')
1556 1.1 christos q--;
1557 1.1 christos /* either q<p or we got matching '(' */
1558 1.1 christos if (q < p)
1559 1.1 christos err = _("no '(' to match ')'");
1560 1.1 christos else
1561 1.1 christos {
1562 1.1 christos /* Confusers like "()" will eventually lose with a bad register
1563 1.1 christos name error. So again we don't need to check for early '\0'. */
1564 1.1 christos if (q[3] == ')')
1565 1.1 christos reg = vax_reg_parse (q[1], q[2], 0, 0);
1566 1.1 christos else if (q[4] == ')')
1567 1.1 christos reg = vax_reg_parse (q[1], q[2], q[3], 0);
1568 1.1 christos else if (q[5] == ')')
1569 1.1 christos reg = vax_reg_parse (q[1], q[2], q[3], q[4]);
1570 1.1 christos else
1571 1.1 christos reg = -1;
1572 1.1 christos /* Since we saw a ')' we will demand a register name in the ')'.
1573 1.1 christos This is nasty: why can't our hypothetical assembler permit
1574 1.1 christos parenthesised expressions? BECAUSE I AM LAZY! That is why.
1575 1.1 christos Abuse luser if we didn't spy a register name. */
1576 1.1 christos if (reg < 0)
1577 1.1 christos {
1578 1.1 christos /* JF allow parenthesized expressions. I hope this works. */
1579 1.1 christos paren = 0;
1580 1.1 christos while (*q != ')')
1581 1.1 christos q++;
1582 1.1 christos /* err = "unknown register in ()"; */
1583 1.1 christos }
1584 1.1 christos else
1585 1.1 christos q--; /* point just before '(' of "(...)" */
1586 1.1 christos /* If err == "..." then we lost. Run away.
1587 1.1 christos Otherwise if reg >= 0 then we saw (Rn). */
1588 1.1 christos }
1589 1.1 christos /* If err == "..." then we lost.
1590 1.1 christos Otherwise paren==1 and reg = register in "()". */
1591 1.1 christos }
1592 1.1 christos else
1593 1.1 christos paren = 0;
1594 1.1 christos /* If err == "..." then we lost.
1595 1.1 christos Otherwise, q points just before "(Rn)", if any.
1596 1.1 christos If there was a "(...)" then paren==1, and reg is the register. */
1597 1.1 christos
1598 1.1 christos /* We should only seek '-' of "-(...)" if:
1599 1.1 christos we saw "(...)" paren == 1
1600 1.1 christos we have no errors so far ! *err
1601 1.1 christos we did not see '+' of "(...)+" sign < 1
1602 1.1 christos We don't check len. We want a specific error message later if
1603 1.1 christos user tries "x^...-(Rn)". This is a feature not a bug. */
1604 1.1 christos if (!err || !*err)
1605 1.1 christos {
1606 1.1 christos if (paren && sign < 1)/* !sign is adequate test */
1607 1.1 christos {
1608 1.1 christos if (*q == '-')
1609 1.1 christos {
1610 1.1 christos sign = -1;
1611 1.1 christos q--;
1612 1.1 christos }
1613 1.1 christos }
1614 1.1 christos /* We have back-tracked over most
1615 1.1 christos of the crud at the end of an operand.
1616 1.1 christos Unless err, we know: sign, paren. If paren, we know reg.
1617 1.1 christos The last case is of an expression "Rn".
1618 1.1 christos This is worth hunting for if !err, !paren.
1619 1.1 christos We wouldn't be here if err.
1620 1.1 christos We remember to save q, in case we didn't want "Rn" anyway. */
1621 1.1 christos if (!paren)
1622 1.1 christos {
1623 1.1 christos if (*q == ' ' && q >= p) /* Expect all whitespace reduced to ' '. */
1624 1.1 christos q--;
1625 1.1 christos /* Reverse over whitespace, but don't. */
1626 1.1 christos /* Run back over *p. */
1627 1.1 christos /* Room for Rn or Rnn (include prefix) exactly? */
1628 1.1 christos if (q > p && q < p + 4)
1629 1.1 christos reg = vax_reg_parse (p[0], p[1],
1630 1.1 christos q < p + 2 ? 0 : p[2],
1631 1.1 christos q < p + 3 ? 0 : p[3]);
1632 1.1 christos else
1633 1.1 christos reg = -1; /* Always comes here if no register at all. */
1634 1.1 christos /* Here with a definitive reg value. */
1635 1.1 christos if (reg >= 0)
1636 1.1 christos {
1637 1.1 christos oldq = q;
1638 1.1 christos q = p - 1;
1639 1.1 christos }
1640 1.1 christos }
1641 1.1 christos }
1642 1.1 christos }
1643 1.1 christos /* have reg. -1:absent; else 0:15. */
1644 1.1 christos
1645 1.1 christos /* We have: err, at, len, hash, ndx, sign, paren, reg.
1646 1.3 christos Also, any remaining expression is from *p through *q inclusive.
1647 1.1 christos Should there be no expression, q==p-1. So expression length = q-p+1.
1648 1.1 christos This completes the first part: parsing the operand text. */
1649 1.1 christos
1650 1.1 christos /* We now want to boil the data down, checking consistency on the way.
1652 1.1 christos We want: len, mode, reg, ndx, err, p, q, wrn, bug.
1653 1.1 christos We will deliver a 4-bit reg, and a 4-bit mode. */
1654 1.1 christos
1655 1.3 christos /* Case of branch operand. Different. No L^B^W^I^S^ allowed for instance.
1656 1.1 christos
1657 1.1 christos in: at ?
1658 1.1 christos len ?
1659 1.1 christos hash ?
1660 1.1 christos p:q ?
1661 1.1 christos sign ?
1662 1.1 christos paren ?
1663 1.1 christos reg ?
1664 1.1 christos ndx ?
1665 1.1 christos
1666 1.1 christos out: mode 0
1667 1.1 christos reg -1
1668 1.1 christos len ' '
1669 1.1 christos p:q whatever was input
1670 1.1 christos ndx -1
1671 1.1 christos err " " or error message, and other outputs trashed. */
1672 1.1 christos /* Branch operands have restricted forms. */
1673 1.1 christos if ((!err || !*err) && access_mode == 'b')
1674 1.3 christos {
1675 1.1 christos if (at || hash || sign || paren || ndx >= 0 || reg >= 0 || len != ' ')
1676 1.1 christos err = _("invalid branch operand");
1677 1.1 christos else
1678 1.1 christos err = " ";
1679 1.1 christos }
1680 1.1 christos
1681 1.1 christos /* Since nobody seems to use it: comment this 'feature'(?) out for now. */
1682 1.1 christos #ifdef NEVER
1683 1.3 christos /* Case of stand-alone operand. e.g. ".long foo"
1684 1.1 christos
1685 1.1 christos in: at ?
1686 1.1 christos len ?
1687 1.1 christos hash ?
1688 1.1 christos p:q ?
1689 1.1 christos sign ?
1690 1.1 christos paren ?
1691 1.1 christos reg ?
1692 1.1 christos ndx ?
1693 1.1 christos
1694 1.1 christos out: mode 0
1695 1.1 christos reg -1
1696 1.1 christos len ' '
1697 1.1 christos p:q whatever was input
1698 1.1 christos ndx -1
1699 1.1 christos err " " or error message, and other outputs trashed. */
1700 1.1 christos if ((!err || !*err) && access_mode == ' ')
1701 1.1 christos {
1702 1.1 christos if (at)
1703 1.1 christos err = _("address prohibits @");
1704 1.1 christos else if (hash)
1705 1.1 christos err = _("address prohibits #");
1706 1.1 christos else if (sign)
1707 1.1 christos {
1708 1.1 christos if (sign < 0)
1709 1.1 christos err = _("address prohibits -()");
1710 1.1 christos else
1711 1.1 christos err = _("address prohibits ()+");
1712 1.1 christos }
1713 1.1 christos else if (paren)
1714 1.1 christos err = _("address prohibits ()");
1715 1.1 christos else if (ndx >= 0)
1716 1.1 christos err = _("address prohibits []");
1717 1.1 christos else if (reg >= 0)
1718 1.1 christos err = _("address prohibits register");
1719 1.1 christos else if (len != ' ')
1720 1.3 christos err = _("address prohibits displacement length specifier");
1721 1.1 christos else
1722 1.1 christos {
1723 1.1 christos err = " "; /* succeed */
1724 1.1 christos mode = 0;
1725 1.1 christos }
1726 1.1 christos }
1727 1.1 christos #endif
1728 1.1 christos
1729 1.3 christos /* Case of S^#.
1730 1.1 christos
1731 1.1 christos in: at 0
1732 1.1 christos len 's' definition
1733 1.1 christos hash 1 demand
1734 1.1 christos p:q demand not empty
1735 1.1 christos sign 0 by paren==0
1736 1.1 christos paren 0 by "()" scan logic because "S^" seen
1737 1.1 christos reg -1 or nn by mistake
1738 1.1 christos ndx -1
1739 1.1 christos
1740 1.1 christos out: mode 0
1741 1.1 christos reg -1
1742 1.1 christos len 's'
1743 1.1 christos exp
1744 1.1 christos ndx -1 */
1745 1.1 christos if ((!err || !*err) && len == 's')
1746 1.1 christos {
1747 1.1 christos if (!hash || paren || at || ndx >= 0)
1748 1.1 christos err = _("invalid operand of S^#");
1749 1.1 christos else
1750 1.1 christos {
1751 1.1 christos if (reg >= 0)
1752 1.1 christos {
1753 1.1 christos /* Darn! we saw S^#Rnn ! put the Rnn back in
1754 1.1 christos expression. KLUDGE! Use oldq so we don't
1755 1.1 christos need to know exact length of reg name. */
1756 1.1 christos q = oldq;
1757 1.1 christos reg = 0;
1758 1.1 christos }
1759 1.1 christos /* We have all the expression we will ever get. */
1760 1.1 christos if (p > q)
1761 1.3 christos err = _("S^# needs expression");
1762 1.1 christos else if (access_mode == 'r')
1763 1.3 christos {
1764 1.1 christos err = " "; /* WIN! */
1765 1.1 christos mode = 0;
1766 1.1 christos }
1767 1.1 christos else
1768 1.1 christos err = _("S^# may only read-access");
1769 1.1 christos }
1770 1.1 christos }
1771 1.1 christos
1772 1.3 christos /* Case of -(Rn), which is weird case.
1773 1.1 christos
1774 1.1 christos in: at 0
1775 1.1 christos len '
1776 1.1 christos hash 0
1777 1.1 christos p:q q<p
1778 1.1 christos sign -1 by definition
1779 1.1 christos paren 1 by definition
1780 1.1 christos reg present by definition
1781 1.1 christos ndx optional
1782 1.1 christos
1783 1.1 christos out: mode 7
1784 1.1 christos reg present
1785 1.1 christos len ' '
1786 1.1 christos exp "" enforce empty expression
1787 1.1 christos ndx optional warn if same as reg. */
1788 1.1 christos if ((!err || !*err) && sign < 0)
1789 1.1 christos {
1790 1.1 christos if (len != ' ' || hash || at || p <= q)
1791 1.1 christos err = _("invalid operand of -()");
1792 1.1 christos else
1793 1.1 christos {
1794 1.1 christos err = " "; /* win */
1795 1.1 christos mode = 7;
1796 1.1 christos if (reg == PC)
1797 1.1 christos wrn = _("-(PC) unpredictable");
1798 1.1 christos else if (reg == ndx)
1799 1.1 christos wrn = _("[]index same as -()register: unpredictable");
1800 1.1 christos }
1801 1.1 christos }
1802 1.1 christos
1803 1.3 christos /* We convert "(Rn)" to "@Rn" for our convenience.
1804 1.1 christos (I hope this is convenient: has someone got a better way to parse this?)
1805 1.1 christos A side-effect of this is that "@Rn" is a valid operand. */
1806 1.1 christos if (paren && !sign && !hash && !at && len == ' ' && p > q)
1807 1.1 christos {
1808 1.1 christos at = 1;
1809 1.1 christos paren = 0;
1810 1.1 christos }
1811 1.1 christos
1812 1.3 christos /* Case of (Rn)+, which is slightly different.
1813 1.1 christos
1814 1.1 christos in: at
1815 1.1 christos len ' '
1816 1.1 christos hash 0
1817 1.1 christos p:q q<p
1818 1.1 christos sign +1 by definition
1819 1.1 christos paren 1 by definition
1820 1.1 christos reg present by definition
1821 1.1 christos ndx optional
1822 1.1 christos
1823 1.1 christos out: mode 8+@
1824 1.1 christos reg present
1825 1.1 christos len ' '
1826 1.1 christos exp "" enforce empty expression
1827 1.1 christos ndx optional warn if same as reg. */
1828 1.1 christos if ((!err || !*err) && sign > 0)
1829 1.1 christos {
1830 1.1 christos if (len != ' ' || hash || p <= q)
1831 1.1 christos err = _("invalid operand of ()+");
1832 1.1 christos else
1833 1.1 christos {
1834 1.3 christos err = " "; /* win */
1835 1.1 christos mode = 8 + (at ? 1 : 0);
1836 1.1 christos if (reg == PC)
1837 1.1 christos wrn = _("(PC)+ unpredictable");
1838 1.1 christos else if (reg == ndx)
1839 1.1 christos wrn = _("[]index same as ()+register: unpredictable");
1840 1.1 christos }
1841 1.1 christos }
1842 1.1 christos
1843 1.3 christos /* Case of #, without S^.
1844 1.1 christos
1845 1.1 christos in: at
1846 1.1 christos len ' ' or 'i'
1847 1.1 christos hash 1 by definition
1848 1.1 christos p:q
1849 1.1 christos sign 0
1850 1.1 christos paren 0
1851 1.1 christos reg absent
1852 1.1 christos ndx optional
1853 1.1 christos
1854 1.1 christos out: mode 8+@
1855 1.1 christos reg PC
1856 1.1 christos len ' ' or 'i'
1857 1.1 christos exp
1858 1.1 christos ndx optional. */
1859 1.1 christos if ((!err || !*err) && hash)
1860 1.1 christos {
1861 1.1 christos if (len != 'i' && len != ' ')
1862 1.1 christos err = _("# conflicts length");
1863 1.1 christos else if (paren)
1864 1.1 christos err = _("# bars register");
1865 1.1 christos else
1866 1.1 christos {
1867 1.1 christos if (reg >= 0)
1868 1.1 christos {
1869 1.1 christos /* Darn! we saw #Rnn! Put the Rnn back into the expression.
1870 1.1 christos By using oldq, we don't need to know how long Rnn was.
1871 1.1 christos KLUDGE! */
1872 1.1 christos q = oldq;
1873 1.1 christos reg = -1; /* No register any more. */
1874 1.1 christos }
1875 1.1 christos err = " "; /* Win. */
1876 1.1 christos
1877 1.1 christos /* JF a bugfix, I think! */
1878 1.1 christos if (at && access_mode == 'a')
1879 1.1 christos vopP->vop_nbytes = 4;
1880 1.1 christos
1881 1.1 christos mode = (at ? 9 : 8);
1882 1.3 christos reg = PC;
1883 1.1 christos if ((access_mode == 'm' || access_mode == 'w') && !at)
1884 1.1 christos wrn = _("writing or modifying # is unpredictable");
1885 1.1 christos }
1886 1.1 christos }
1887 1.1 christos /* If !*err, then sign == 0
1888 1.1 christos hash == 0 */
1889 1.1 christos
1890 1.1 christos /* Case of Rn. We separate this one because it has a few special
1891 1.3 christos errors the remaining modes lack.
1892 1.1 christos
1893 1.1 christos in: at optional
1894 1.1 christos len ' '
1895 1.1 christos hash 0 by program logic
1896 1.1 christos p:q empty
1897 1.1 christos sign 0 by program logic
1898 1.1 christos paren 0 by definition
1899 1.1 christos reg present by definition
1900 1.1 christos ndx optional
1901 1.1 christos
1902 1.1 christos out: mode 5+@
1903 1.1 christos reg present
1904 1.1 christos len ' ' enforce no length
1905 1.1 christos exp "" enforce empty expression
1906 1.1 christos ndx optional warn if same as reg. */
1907 1.1 christos if ((!err || !*err) && !paren && reg >= 0)
1908 1.1 christos {
1909 1.1 christos if (len != ' ')
1910 1.1 christos err = _("length not needed");
1911 1.1 christos else if (at)
1912 1.1 christos {
1913 1.1 christos err = " "; /* win */
1914 1.1 christos mode = 6; /* @Rn */
1915 1.1 christos }
1916 1.1 christos else if (ndx >= 0)
1917 1.1 christos err = _("can't []index a register, because it has no address");
1918 1.1 christos else if (access_mode == 'a')
1919 1.1 christos err = _("a register has no address");
1920 1.1 christos else
1921 1.1 christos {
1922 1.1 christos /* Idea here is to detect from length of datum
1923 1.1 christos and from register number if we will touch PC.
1924 1.1 christos Warn if we do.
1925 1.1 christos vop_nbytes is number of bytes in operand.
1926 1.1 christos Compute highest byte affected, compare to PC0. */
1927 1.1 christos if ((vopP->vop_nbytes + reg * 4) > 60)
1928 1.3 christos wrn = _("PC part of operand unpredictable");
1929 1.1 christos err = " "; /* win */
1930 1.1 christos mode = 5; /* Rn */
1931 1.1 christos }
1932 1.1 christos }
1933 1.1 christos /* If !*err, sign == 0
1934 1.1 christos hash == 0
1935 1.1 christos paren == 1 OR reg==-1 */
1936 1.1 christos
1937 1.3 christos /* Rest of cases fit into one bunch.
1938 1.1 christos
1939 1.1 christos in: at optional
1940 1.1 christos len ' ' or 'b' or 'w' or 'l'
1941 1.1 christos hash 0 by program logic
1942 1.1 christos p:q expected (empty is not an error)
1943 1.1 christos sign 0 by program logic
1944 1.1 christos paren optional
1945 1.1 christos reg optional
1946 1.1 christos ndx optional
1947 1.1 christos
1948 1.1 christos out: mode 10 + @ + len
1949 1.1 christos reg optional
1950 1.1 christos len ' ' or 'b' or 'w' or 'l'
1951 1.1 christos exp maybe empty
1952 1.1 christos ndx optional warn if same as reg. */
1953 1.1 christos if (!err || !*err)
1954 1.1 christos {
1955 1.1 christos err = " "; /* win (always) */
1956 1.1 christos mode = 10 + (at ? 1 : 0);
1957 1.1 christos switch (len)
1958 1.1 christos {
1959 1.1 christos case 'l':
1960 1.1 christos mode += 2;
1961 1.1 christos case 'w':
1962 1.1 christos mode += 2;
1963 1.1 christos case ' ': /* Assumed B^ until our caller changes it. */
1964 1.1 christos case 'b':
1965 1.1 christos break;
1966 1.1 christos }
1967 1.1 christos }
1968 1.1 christos
1969 1.1 christos /* here with completely specified mode
1970 1.1 christos len
1971 1.1 christos reg
1972 1.1 christos expression p,q
1973 1.1 christos ndx. */
1974 1.1 christos
1975 1.1 christos if (*err == ' ')
1976 1.1 christos err = 0; /* " " is no longer an error. */
1977 1.1 christos
1978 1.1 christos vopP->vop_mode = mode;
1979 1.1 christos vopP->vop_reg = reg;
1980 1.1 christos vopP->vop_short = len;
1981 1.1 christos vopP->vop_expr_begin = p;
1982 1.1 christos vopP->vop_expr_end = q;
1983 1.1 christos vopP->vop_ndx = ndx;
1984 1.1 christos vopP->vop_error = err;
1985 1.1 christos vopP->vop_warn = wrn;
1986 1.1 christos }
1987 1.3 christos
1988 1.1 christos /* This converts a string into a vax instruction.
1989 1.1 christos The string must be a bare single instruction in dec-vax (with BSD4 frobs)
1990 1.3 christos format.
1991 1.1 christos It provides some error messages: at most one fatal error message (which
1992 1.1 christos stops the scan) and at most one warning message for each operand.
1993 1.1 christos The vax instruction is returned in exploded form, since we have no
1994 1.1 christos knowledge of how you parse (or evaluate) your expressions.
1995 1.3 christos We do however strip off and decode addressing modes and operation
1996 1.1 christos mnemonic.
1997 1.1 christos
1998 1.1 christos The exploded instruction is returned to a struct vit of your choice.
1999 1.1 christos #include "vax-inst.h" to know what a struct vit is.
2000 1.1 christos
2001 1.1 christos This function's value is a string. If it is not "" then an internal
2002 1.1 christos logic error was found: read this code to assign meaning to the string.
2003 1.1 christos No argument string should generate such an error string:
2004 1.1 christos it means a bug in our code, not in the user's text.
2005 1.1 christos
2006 1.1 christos You MUST have called vip_begin() once before using this function. */
2007 1.1 christos
2008 1.1 christos static void
2009 1.1 christos vip (struct vit *vitP, /* We build an exploded instruction here. */
2010 1.1 christos char *instring) /* Text of a vax instruction: we modify. */
2011 1.1 christos {
2012 1.1 christos /* How to bit-encode this opcode. */
2013 1.1 christos struct vot_wot *vwP;
2014 1.1 christos /* 1/skip whitespace.2/scan vot_how */
2015 1.1 christos char *p;
2016 1.1 christos char *q;
2017 1.1 christos /* counts number of operands seen */
2018 1.1 christos unsigned char count;
2019 1.1 christos /* scan operands in struct vit */
2020 1.3 christos struct vop *operandp;
2021 1.1 christos /* error over all operands */
2022 1.1 christos const char *alloperr;
2023 1.1 christos /* Remember char, (we clobber it with '\0' temporarily). */
2024 1.1 christos char c;
2025 1.1 christos /* Op-code of this instruction. */
2026 1.1 christos vax_opcodeT oc;
2027 1.1 christos
2028 1.1 christos if (*instring == ' ')
2029 1.1 christos ++instring;
2030 1.1 christos
2031 1.1 christos /* MUST end in end-of-string or exactly 1 space. */
2032 1.1 christos for (p = instring; *p && *p != ' '; p++)
2033 1.1 christos ;
2034 1.1 christos
2035 1.1 christos /* Scanned up to end of operation-code. */
2036 1.1 christos /* Operation-code is ended with whitespace. */
2037 1.1 christos if (p - instring == 0)
2038 1.1 christos {
2039 1.1 christos vitP->vit_error = _("No operator");
2040 1.1 christos count = 0;
2041 1.1 christos memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
2042 1.1 christos }
2043 1.1 christos else
2044 1.1 christos {
2045 1.1 christos c = *p;
2046 1.1 christos *p = '\0';
2047 1.1 christos /* Here with instring pointing to what better be an op-name, and p
2048 1.1 christos pointing to character just past that.
2049 1.1 christos We trust instring points to an op-name, with no whitespace. */
2050 1.1 christos vwP = (struct vot_wot *) hash_find (op_hash, instring);
2051 1.1 christos /* Restore char after op-code. */
2052 1.1 christos *p = c;
2053 1.1 christos if (vwP == 0)
2054 1.1 christos {
2055 1.1 christos vitP->vit_error = _("Unknown operator");
2056 1.1 christos count = 0;
2057 1.1 christos memset (vitP->vit_opcode, '\0', sizeof (vitP->vit_opcode));
2058 1.1 christos }
2059 1.1 christos else
2060 1.1 christos {
2061 1.1 christos /* We found a match! So let's pick up as many operands as the
2062 1.1 christos instruction wants, and even gripe if there are too many.
2063 1.1 christos We expect comma to separate each operand.
2064 1.1 christos We let instring track the text, while p tracks a part of the
2065 1.1 christos struct vot. */
2066 1.1 christos const char *howp;
2067 1.1 christos /* The lines below know about 2-byte opcodes starting FD,FE or FF.
2068 1.1 christos They also understand synthetic opcodes. Note:
2069 1.1 christos we return 32 bits of opcode, including bucky bits, BUT
2070 1.1 christos an opcode length is either 8 or 16 bits for vit_opcode_nbytes. */
2071 1.1 christos oc = vwP->vot_code; /* The op-code. */
2072 1.1 christos vitP->vit_opcode_nbytes = (oc & 0xFF) >= 0xFD ? 2 : 1;
2073 1.1 christos md_number_to_chars (vitP->vit_opcode, oc, 4);
2074 1.1 christos count = 0; /* No operands seen yet. */
2075 1.1 christos instring = p; /* Point just past operation code. */
2076 1.1 christos alloperr = "";
2077 1.1 christos for (howp = vwP->vot_how, operandp = vitP->vit_operand;
2078 1.1 christos !(alloperr && *alloperr) && *howp;
2079 1.1 christos operandp++, howp += 2)
2080 1.1 christos {
2081 1.1 christos /* Here to parse one operand. Leave instring pointing just
2082 1.1 christos past any one ',' that marks the end of this operand. */
2083 1.1 christos if (!howp[1])
2084 1.1 christos as_fatal (_("odd number of bytes in operand description"));
2085 1.1 christos else if (*instring)
2086 1.1 christos {
2087 1.1 christos for (q = instring; (c = *q) && c != ','; q++)
2088 1.1 christos ;
2089 1.1 christos /* Q points to ',' or '\0' that ends argument. C is that
2090 1.1 christos character. */
2091 1.1 christos *q = 0;
2092 1.1 christos operandp->vop_width = howp[1];
2093 1.1 christos operandp->vop_nbytes = vax_operand_width_size[(unsigned) howp[1]];
2094 1.1 christos operandp->vop_access = howp[0];
2095 1.1 christos vip_op (instring, operandp);
2096 1.1 christos *q = c; /* Restore input text. */
2097 1.1 christos if (operandp->vop_error)
2098 1.1 christos alloperr = _("Bad operand");
2099 1.1 christos instring = q + (c ? 1 : 0); /* Next operand (if any). */
2100 1.1 christos count++; /* Won another argument, may have an operr. */
2101 1.1 christos }
2102 1.1 christos else
2103 1.1 christos alloperr = _("Not enough operands");
2104 1.1 christos }
2105 1.1 christos if (!*alloperr)
2106 1.1 christos {
2107 1.1 christos if (*instring == ' ')
2108 1.1 christos instring++;
2109 1.1 christos if (*instring)
2110 1.1 christos alloperr = _("Too many operands");
2111 1.1 christos }
2112 1.1 christos vitP->vit_error = alloperr;
2113 1.1 christos }
2114 1.1 christos }
2115 1.1 christos vitP->vit_operands = count;
2116 1.1 christos }
2117 1.1 christos
2118 1.1 christos #ifdef test
2120 1.1 christos
2121 1.1 christos /* Test program for above. */
2122 1.1 christos
2123 1.1 christos struct vit myvit; /* Build an exploded vax instruction here. */
2124 1.1 christos char answer[100]; /* Human types a line of vax assembler here. */
2125 1.1 christos char *mybug; /* "" or an internal logic diagnostic. */
2126 1.1 christos int mycount; /* Number of operands. */
2127 1.1 christos struct vop *myvop; /* Scan operands from myvit. */
2128 1.1 christos int mysynth; /* 1 means want synthetic opcodes. */
2129 1.1 christos char my_immediate[200];
2130 1.1 christos char my_indirect[200];
2131 1.1 christos char my_displen[200];
2132 1.1 christos
2133 1.1 christos int
2134 1.1 christos main (void)
2135 1.1 christos {
2136 1.1 christos char *p;
2137 1.1 christos
2138 1.1 christos printf ("0 means no synthetic instructions. ");
2139 1.1 christos printf ("Value for vip_begin? ");
2140 1.1 christos gets (answer);
2141 1.1 christos sscanf (answer, "%d", &mysynth);
2142 1.1 christos printf ("Synthetic opcodes %s be included.\n", mysynth ? "will" : "will not");
2143 1.1 christos printf ("enter immediate symbols eg enter # ");
2144 1.1 christos gets (my_immediate);
2145 1.1 christos printf ("enter indirect symbols eg enter @ ");
2146 1.1 christos gets (my_indirect);
2147 1.1 christos printf ("enter displen symbols eg enter ^ ");
2148 1.1 christos gets (my_displen);
2149 1.1 christos
2150 1.1 christos if (p = vip_begin (mysynth, my_immediate, my_indirect, my_displen))
2151 1.1 christos error ("vip_begin=%s", p);
2152 1.1 christos
2153 1.1 christos printf ("An empty input line will quit you from the vax instruction parser\n");
2154 1.1 christos for (;;)
2155 1.1 christos {
2156 1.1 christos printf ("vax instruction: ");
2157 1.1 christos fflush (stdout);
2158 1.1 christos gets (answer);
2159 1.1 christos if (!*answer)
2160 1.1 christos break; /* Out of for each input text loop. */
2161 1.1 christos
2162 1.1 christos vip (& myvit, answer);
2163 1.1 christos if (*myvit.vit_error)
2164 1.1 christos printf ("ERR:\"%s\"\n", myvit.vit_error);
2165 1.1 christos
2166 1.1 christos printf ("opcode=");
2167 1.1 christos for (mycount = myvit.vit_opcode_nbytes, p = myvit.vit_opcode;
2168 1.1 christos mycount;
2169 1.1 christos mycount--, p++)
2170 1.1 christos printf ("%02x ", *p & 0xFF);
2171 1.1 christos
2172 1.1 christos printf (" operand count=%d.\n", mycount = myvit.vit_operands);
2173 1.1 christos for (myvop = myvit.vit_operand; mycount; mycount--, myvop++)
2174 1.1 christos {
2175 1.1 christos printf ("mode=%xx reg=%xx ndx=%xx len='%c'=%c%c%d. expr=\"",
2176 1.1 christos myvop->vop_mode, myvop->vop_reg, myvop->vop_ndx,
2177 1.1 christos myvop->vop_short, myvop->vop_access, myvop->vop_width,
2178 1.1 christos myvop->vop_nbytes);
2179 1.1 christos for (p = myvop->vop_expr_begin; p <= myvop->vop_expr_end; p++)
2180 1.1 christos putchar (*p);
2181 1.1 christos
2182 1.1 christos printf ("\"\n");
2183 1.1 christos if (myvop->vop_error)
2184 1.1 christos printf (" err:\"%s\"\n", myvop->vop_error);
2185 1.1 christos
2186 1.1 christos if (myvop->vop_warn)
2187 1.1 christos printf (" wrn:\"%s\"\n", myvop->vop_warn);
2188 1.1 christos }
2189 1.1 christos }
2190 1.1 christos vip_end ();
2191 1.1 christos exit (EXIT_SUCCESS);
2192 1.1 christos }
2193 1.1 christos
2194 1.1 christos #endif
2195 1.1 christos
2196 1.1 christos #ifdef TEST /* #Define to use this testbed. */
2198 1.1 christos
2199 1.1 christos /* Follows a test program for this function.
2200 1.1 christos We declare arrays non-local in case some of our tiny-minded machines
2201 1.1 christos default to small stacks. Also, helps with some debuggers. */
2202 1.1 christos
2203 1.1 christos char answer[100]; /* Human types into here. */
2204 1.1 christos char *p; /* */
2205 1.1 christos char *myerr;
2206 1.1 christos char *mywrn;
2207 1.1 christos char *mybug;
2208 1.1 christos char myaccess;
2209 1.1 christos char mywidth;
2210 1.1 christos char mymode;
2211 1.1 christos char myreg;
2212 1.1 christos char mylen;
2213 1.1 christos char *myleft;
2214 1.1 christos char *myright;
2215 1.1 christos char myndx;
2216 1.1 christos int my_operand_length;
2217 1.1 christos char my_immediate[200];
2218 1.1 christos char my_indirect[200];
2219 1.1 christos char my_displen[200];
2220 1.1 christos
2221 1.1 christos int
2222 1.1 christos main (void)
2223 1.1 christos {
2224 1.1 christos printf ("enter immediate symbols eg enter # ");
2225 1.1 christos gets (my_immediate);
2226 1.1 christos printf ("enter indirect symbols eg enter @ ");
2227 1.1 christos gets (my_indirect);
2228 1.1 christos printf ("enter displen symbols eg enter ^ ");
2229 1.1 christos gets (my_displen);
2230 1.1 christos vip_op_defaults (my_immediate, my_indirect, my_displen);
2231 1.1 christos
2232 1.1 christos for (;;)
2233 1.1 christos {
2234 1.1 christos printf ("access,width (eg 'ab' or 'wh') [empty line to quit] : ");
2235 1.1 christos fflush (stdout);
2236 1.1 christos gets (answer);
2237 1.1 christos if (!answer[0])
2238 1.1 christos exit (EXIT_SUCCESS);
2239 1.1 christos myaccess = answer[0];
2240 1.1 christos mywidth = answer[1];
2241 1.1 christos switch (mywidth)
2242 1.1 christos {
2243 1.1 christos case 'b':
2244 1.1 christos my_operand_length = 1;
2245 1.1 christos break;
2246 1.1 christos case 'd':
2247 1.1 christos my_operand_length = 8;
2248 1.1 christos break;
2249 1.1 christos case 'f':
2250 1.1 christos my_operand_length = 4;
2251 1.1 christos break;
2252 1.1 christos case 'g':
2253 1.1 christos my_operand_length = 16;
2254 1.1 christos break;
2255 1.1 christos case 'h':
2256 1.1 christos my_operand_length = 32;
2257 1.1 christos break;
2258 1.1 christos case 'l':
2259 1.1 christos my_operand_length = 4;
2260 1.1 christos break;
2261 1.1 christos case 'o':
2262 1.1 christos my_operand_length = 16;
2263 1.1 christos break;
2264 1.1 christos case 'q':
2265 1.1 christos my_operand_length = 8;
2266 1.1 christos break;
2267 1.1 christos case 'w':
2268 1.1 christos my_operand_length = 2;
2269 1.1 christos break;
2270 1.1 christos case '!':
2271 1.1 christos case '?':
2272 1.1 christos case '-':
2273 1.1 christos my_operand_length = 0;
2274 1.1 christos break;
2275 1.1 christos
2276 1.1 christos default:
2277 1.1 christos my_operand_length = 2;
2278 1.1 christos printf ("I dn't understand access width %c\n", mywidth);
2279 1.1 christos break;
2280 1.1 christos }
2281 1.1 christos printf ("VAX assembler instruction operand: ");
2282 1.1 christos fflush (stdout);
2283 1.1 christos gets (answer);
2284 1.1 christos mybug = vip_op (answer, myaccess, mywidth, my_operand_length,
2285 1.1 christos &mymode, &myreg, &mylen, &myleft, &myright, &myndx,
2286 1.1 christos &myerr, &mywrn);
2287 1.1 christos if (*myerr)
2288 1.1 christos {
2289 1.1 christos printf ("error: \"%s\"\n", myerr);
2290 1.1 christos if (*mybug)
2291 1.1 christos printf (" bug: \"%s\"\n", mybug);
2292 1.1 christos }
2293 1.1 christos else
2294 1.1 christos {
2295 1.1 christos if (*mywrn)
2296 1.1 christos printf ("warning: \"%s\"\n", mywrn);
2297 1.1 christos mumble ("mode", mymode);
2298 1.1 christos mumble ("register", myreg);
2299 1.1 christos mumble ("index", myndx);
2300 1.1 christos printf ("width:'%c' ", mylen);
2301 1.1 christos printf ("expression: \"");
2302 1.1 christos while (myleft <= myright)
2303 1.1 christos putchar (*myleft++);
2304 1.1 christos printf ("\"\n");
2305 1.1 christos }
2306 1.1 christos }
2307 1.1 christos }
2308 1.1 christos
2309 1.1 christos void
2310 1.1 christos mumble (char *text, int value)
2311 1.1 christos {
2312 1.1 christos printf ("%s:", text);
2313 1.1 christos if (value >= 0)
2314 1.1 christos printf ("%xx", value);
2315 1.1 christos else
2316 1.1 christos printf ("ABSENT");
2317 1.1 christos printf (" ");
2318 1.1 christos }
2319 1.1 christos
2320 1.1 christos #endif
2321 1.1 christos
2322 1.1 christos int md_short_jump_size = 3;
2323 1.1 christos int md_long_jump_size = 6;
2324 1.1 christos
2325 1.1 christos void
2326 1.1 christos md_create_short_jump (char *ptr,
2327 1.1 christos addressT from_addr,
2328 1.1 christos addressT to_addr ATTRIBUTE_UNUSED,
2329 1.1 christos fragS *frag ATTRIBUTE_UNUSED,
2330 1.1 christos symbolS *to_symbol ATTRIBUTE_UNUSED)
2331 1.1 christos {
2332 1.1 christos valueT offset;
2333 1.1 christos
2334 1.1 christos /* This former calculation was off by two:
2335 1.1 christos offset = to_addr - (from_addr + 1);
2336 1.1 christos We need to account for the one byte instruction and also its
2337 1.1 christos two byte operand. */
2338 1.1 christos offset = to_addr - (from_addr + 1 + 2);
2339 1.1 christos *ptr++ = VAX_BRW; /* Branch with word (16 bit) offset. */
2340 1.1 christos md_number_to_chars (ptr, offset, 2);
2341 1.1 christos }
2342 1.1 christos
2343 1.1 christos void
2344 1.1 christos md_create_long_jump (char *ptr,
2345 1.1 christos addressT from_addr ATTRIBUTE_UNUSED,
2346 1.1 christos addressT to_addr,
2347 1.1 christos fragS *frag,
2348 1.1 christos symbolS *to_symbol)
2349 1.1 christos {
2350 1.1 christos valueT offset;
2351 1.1 christos
2352 1.1 christos offset = to_addr - S_GET_VALUE (to_symbol);
2353 1.1 christos *ptr++ = VAX_JMP; /* Arbitrary jump. */
2354 1.1 christos *ptr++ = VAX_ABSOLUTE_MODE;
2355 1.1 christos md_number_to_chars (ptr, offset, 4);
2356 1.1 christos fix_new (frag, ptr - frag->fr_literal, 4, to_symbol, (long) 0, 0, NO_RELOC);
2357 1.1 christos }
2358 1.1 christos
2359 1.1 christos #ifdef OBJ_VMS
2361 1.1 christos const char *md_shortopts = "d:STt:V+1h:Hv::";
2362 1.1 christos #elif defined(OBJ_ELF)
2363 1.1 christos const char *md_shortopts = "d:STt:VkKQ:";
2364 1.1 christos #else
2365 1.5 christos const char *md_shortopts = "d:STt:V";
2366 1.1 christos #endif
2367 1.1 christos struct option md_longopts[] =
2368 1.1 christos {
2369 1.1 christos #ifdef OBJ_ELF
2370 1.1 christos #define OPTION_PIC (OPTION_MD_BASE)
2371 1.1 christos { "pic", no_argument, NULL, OPTION_PIC },
2372 1.1 christos #endif
2373 1.1 christos { NULL, no_argument, NULL, 0 }
2374 1.1 christos };
2375 1.1 christos size_t md_longopts_size = sizeof (md_longopts);
2376 1.1 christos
2377 1.1 christos int
2378 1.1 christos md_parse_option (int c, const char *arg)
2379 1.1 christos {
2380 1.1 christos switch (c)
2381 1.1 christos {
2382 1.1 christos case 'S':
2383 1.1 christos as_warn (_("SYMBOL TABLE not implemented"));
2384 1.1 christos break;
2385 1.1 christos
2386 1.1 christos case 'T':
2387 1.1 christos as_warn (_("TOKEN TRACE not implemented"));
2388 1.1 christos break;
2389 1.1 christos
2390 1.1 christos case 'd':
2391 1.1 christos as_warn (_("Displacement length %s ignored!"), arg);
2392 1.1 christos break;
2393 1.1 christos
2394 1.1 christos case 't':
2395 1.1 christos as_warn (_("I don't need or use temp. file \"%s\"."), arg);
2396 1.1 christos break;
2397 1.1 christos
2398 1.1 christos case 'V':
2399 1.1 christos as_warn (_("I don't use an interpass file! -V ignored"));
2400 1.1 christos break;
2401 1.1 christos
2402 1.1 christos #ifdef OBJ_VMS
2403 1.1 christos case '+': /* For g++. Hash any name > 31 chars long. */
2404 1.1 christos flag_hash_long_names = 1;
2405 1.1 christos break;
2406 1.1 christos
2407 1.1 christos case '1': /* For backward compatibility. */
2408 1.1 christos flag_one = 1;
2409 1.1 christos break;
2410 1.1 christos
2411 1.1 christos case 'H': /* Show new symbol after hash truncation. */
2412 1.1 christos flag_show_after_trunc = 1;
2413 1.1 christos break;
2414 1.1 christos
2415 1.1 christos case 'h': /* No hashing of mixed-case names. */
2416 1.1 christos {
2417 1.1 christos extern char vms_name_mapping;
2418 1.1 christos vms_name_mapping = atoi (arg);
2419 1.1 christos flag_no_hash_mixed_case = 1;
2420 1.1 christos }
2421 1.1 christos break;
2422 1.1 christos
2423 1.1 christos case 'v':
2424 1.1 christos {
2425 1.1 christos extern char *compiler_version_string;
2426 1.1 christos
2427 1.1 christos if (!arg || !*arg || access (arg, 0) == 0)
2428 1.1 christos return 0; /* Have caller show the assembler version. */
2429 1.1 christos compiler_version_string = arg;
2430 1.1 christos }
2431 1.1 christos break;
2432 1.1 christos #endif
2433 1.1 christos
2434 1.1 christos #ifdef OBJ_ELF
2435 1.1 christos case OPTION_PIC:
2436 1.1 christos case 'k':
2437 1.1 christos flag_want_pic = 1;
2438 1.1 christos break; /* -pic, Position Independent Code. */
2439 1.1 christos
2440 1.1 christos /* -Qy, -Qn: SVR4 arguments controlling whether a .comment
2441 1.1 christos section should be emitted or not. FIXME: Not implemented. */
2442 1.1 christos case 'Q':
2443 1.1 christos break;
2444 1.1 christos #endif
2445 1.1 christos
2446 1.1 christos default:
2447 1.1 christos return 0;
2448 1.1 christos }
2449 1.1 christos
2450 1.1 christos return 1;
2451 1.1 christos }
2452 1.1 christos
2453 1.1 christos void
2454 1.1 christos md_show_usage (FILE *stream)
2455 1.1 christos {
2456 1.1 christos fprintf (stream, _("\
2457 1.1 christos VAX options:\n\
2458 1.1 christos -d LENGTH ignored\n\
2459 1.1 christos -J ignored\n\
2460 1.1 christos -S ignored\n\
2461 1.1 christos -t FILE ignored\n\
2462 1.1 christos -T ignored\n\
2463 1.1 christos -V ignored\n"));
2464 1.1 christos #ifdef OBJ_VMS
2465 1.1 christos fprintf (stream, _("\
2466 1.1 christos VMS options:\n\
2467 1.1 christos -+ hash encode names longer than 31 characters\n\
2468 1.1 christos -1 `const' handling compatible with gcc 1.x\n\
2469 1.1 christos -H show new symbol after hash truncation\n\
2470 1.1 christos -h NUM don't hash mixed-case names, and adjust case:\n\
2471 1.1 christos 0 = upper, 2 = lower, 3 = preserve case\n\
2472 1.1 christos -v\"VERSION\" code being assembled was produced by compiler \"VERSION\"\n"));
2473 1.1 christos #endif
2474 1.1 christos }
2475 1.1 christos
2476 1.1 christos /* We have no need to default values of symbols. */
2478 1.1 christos
2479 1.1 christos symbolS *
2480 1.1 christos md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
2481 1.1 christos {
2482 1.1 christos return NULL;
2483 1.1 christos }
2484 1.1 christos
2485 1.1 christos /* Round up a section size to the appropriate boundary. */
2486 1.1 christos valueT
2487 1.1 christos md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
2488 1.1 christos {
2489 1.1 christos /* Byte alignment is fine */
2490 1.1 christos return size;
2491 1.1 christos }
2492 1.1 christos
2493 1.1 christos /* Exactly what point is a PC-relative offset relative TO?
2494 1.1 christos On the vax, they're relative to the address of the offset, plus
2495 1.1 christos its size. */
2496 1.1 christos long
2497 1.3 christos md_pcrel_from (fixS *fixP)
2498 1.1 christos {
2499 1.1 christos return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
2500 1.1 christos }
2501 1.1 christos
2502 1.1 christos arelent *
2503 1.1 christos tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2504 1.1 christos {
2505 1.1 christos arelent *reloc;
2506 1.1 christos bfd_reloc_code_real_type code;
2507 1.1 christos
2508 1.1 christos if (fixp->fx_tcbit)
2509 1.1 christos abort ();
2510 1.1 christos
2511 1.1 christos if (fixp->fx_r_type != NO_RELOC)
2512 1.1 christos {
2513 1.1 christos code = fixp->fx_r_type;
2514 1.1 christos
2515 1.1 christos if (fixp->fx_pcrel)
2516 1.1 christos {
2517 1.1 christos switch (code)
2518 1.1 christos {
2519 1.1 christos case BFD_RELOC_8_PCREL:
2520 1.1 christos case BFD_RELOC_16_PCREL:
2521 1.1 christos case BFD_RELOC_32_PCREL:
2522 1.1 christos #ifdef OBJ_ELF
2523 1.1 christos case BFD_RELOC_8_GOT_PCREL:
2524 1.1 christos case BFD_RELOC_16_GOT_PCREL:
2525 1.1 christos case BFD_RELOC_32_GOT_PCREL:
2526 1.1 christos case BFD_RELOC_8_PLT_PCREL:
2527 1.1 christos case BFD_RELOC_16_PLT_PCREL:
2528 1.1 christos case BFD_RELOC_32_PLT_PCREL:
2529 1.1 christos #endif
2530 1.1 christos break;
2531 1.1 christos default:
2532 1.1 christos as_bad_where (fixp->fx_file, fixp->fx_line,
2533 1.1 christos _("Cannot make %s relocation PC relative"),
2534 1.1 christos bfd_get_reloc_code_name (code));
2535 1.1 christos }
2536 1.1 christos }
2537 1.1 christos }
2538 1.1 christos else
2539 1.1 christos {
2540 1.1 christos #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
2541 1.1 christos switch (F (fixp->fx_size, fixp->fx_pcrel))
2542 1.1 christos {
2543 1.5 christos #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
2544 1.5 christos MAP (1, 0, BFD_RELOC_8);
2545 1.1 christos MAP (2, 0, BFD_RELOC_16);
2546 1.1 christos MAP (4, 0, BFD_RELOC_32);
2547 1.1 christos MAP (1, 1, BFD_RELOC_8_PCREL);
2548 1.1 christos MAP (2, 1, BFD_RELOC_16_PCREL);
2549 1.1 christos MAP (4, 1, BFD_RELOC_32_PCREL);
2550 1.1 christos default:
2551 1.1 christos abort ();
2552 1.1 christos }
2553 1.1 christos }
2554 1.1 christos #undef F
2555 1.1 christos #undef MAP
2556 1.1 christos
2557 1.1 christos reloc = XNEW (arelent);
2558 1.1 christos reloc->sym_ptr_ptr = XNEW (asymbol *);
2559 1.1 christos *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2560 1.1 christos reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2561 1.1 christos #ifndef OBJ_ELF
2562 1.1 christos if (fixp->fx_pcrel)
2563 1.1 christos reloc->addend = fixp->fx_addnumber;
2564 1.1 christos else
2565 1.1 christos reloc->addend = 0;
2566 1.1 christos #else
2567 1.1 christos reloc->addend = fixp->fx_offset;
2568 1.1 christos #endif
2569 1.1 christos
2570 1.1 christos reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2571 1.1 christos gas_assert (reloc->howto != 0);
2572 1.1 christos
2573 1.1 christos return reloc;
2574 1.1 christos }
2575 1.1 christos
2576 1.1 christos /* vax:md_assemble() emit frags for 1 instruction given in textual form. */
2577 1.1 christos void
2578 1.1 christos md_assemble (char *instruction_string)
2579 1.1 christos {
2580 1.1 christos /* Non-zero if operand expression's segment is not known yet. */
2581 1.1 christos int is_undefined;
2582 1.1 christos /* Non-zero if operand expression's segment is absolute. */
2583 1.1 christos int is_absolute;
2584 1.1 christos int length_code;
2585 1.1 christos char *p;
2586 1.1 christos /* An operand. Scans all operands. */
2587 1.1 christos struct vop *operandP;
2588 1.1 christos char *save_input_line_pointer;
2589 1.1 christos /* What used to live after an expression. */
2590 1.1 christos char c_save;
2591 1.1 christos /* 1: instruction_string bad for all passes. */
2592 1.1 christos int goofed;
2593 1.1 christos /* Points to slot just after last operand. */
2594 1.1 christos struct vop *end_operandP;
2595 1.1 christos /* Points to expression values for this operand. */
2596 1.1 christos expressionS *expP;
2597 1.1 christos segT *segP;
2598 1.1 christos
2599 1.1 christos /* These refer to an instruction operand expression. */
2600 1.1 christos /* Target segment of the address. */
2601 1.1 christos segT to_seg;
2602 1.1 christos valueT this_add_number;
2603 1.1 christos /* Positive (minuend) symbol. */
2604 1.1 christos symbolS *this_add_symbol;
2605 1.1 christos /* As a number. */
2606 1.1 christos long opcode_as_number;
2607 1.1 christos /* Least significant byte 1st. */
2608 1.1 christos char *opcode_as_chars;
2609 1.1 christos /* As an array of characters. */
2610 1.1 christos /* Least significant byte 1st */
2611 1.1 christos char *opcode_low_byteP;
2612 1.1 christos /* length (bytes) meant by vop_short. */
2613 1.1 christos int length;
2614 1.1 christos /* 0, or 1 if '@' is in addressing mode. */
2615 1.1 christos int at;
2616 1.1 christos /* From vop_nbytes: vax_operand_width (in bytes) */
2617 1.1 christos int nbytes;
2618 1.1 christos FLONUM_TYPE *floatP;
2619 1.1 christos LITTLENUM_TYPE literal_float[8];
2620 1.1 christos /* Big enough for any floating point literal. */
2621 1.1 christos
2622 1.1 christos vip (&v, instruction_string);
2623 1.1 christos
2624 1.1 christos /* Now we try to find as many as_warn()s as we can. If we do any as_warn()s
2625 1.1 christos then goofed=1. Notice that we don't make any frags yet.
2626 1.1 christos Should goofed be 1, then this instruction will wedge in any pass,
2627 1.1 christos and we can safely flush it, without causing interpass symbol phase
2628 1.1 christos errors. That is, without changing label values in different passes. */
2629 1.1 christos if ((goofed = (*v.vit_error)) != 0)
2630 1.1 christos {
2631 1.1 christos as_fatal (_("Ignoring statement due to \"%s\""), v.vit_error);
2632 1.1 christos }
2633 1.1 christos /* We need to use expression() and friends, which require us to diddle
2634 1.1 christos input_line_pointer. So we save it and restore it later. */
2635 1.1 christos save_input_line_pointer = input_line_pointer;
2636 1.1 christos for (operandP = v.vit_operand,
2637 1.1 christos expP = exp_of_operand,
2638 1.1 christos segP = seg_of_operand,
2639 1.1 christos floatP = float_operand,
2640 1.1 christos end_operandP = v.vit_operand + v.vit_operands;
2641 1.1 christos
2642 1.1 christos operandP < end_operandP;
2643 1.1 christos
2644 1.1 christos operandP++, expP++, segP++, floatP++)
2645 1.1 christos {
2646 1.1 christos if (operandP->vop_error)
2647 1.1 christos {
2648 1.1 christos as_fatal (_("Aborting because statement has \"%s\""), operandP->vop_error);
2649 1.1 christos goofed = 1;
2650 1.1 christos }
2651 1.1 christos else
2652 1.1 christos {
2653 1.1 christos /* Statement has no syntax goofs: let's sniff the expression. */
2654 1.1 christos int can_be_short = 0; /* 1 if a bignum can be reduced to a short literal. */
2655 1.1 christos
2656 1.1 christos input_line_pointer = operandP->vop_expr_begin;
2657 1.1 christos c_save = operandP->vop_expr_end[1];
2658 1.1 christos operandP->vop_expr_end[1] = '\0';
2659 1.1 christos /* If to_seg == SEG_PASS1, expression() will have set need_pass_2 = 1. */
2660 1.1 christos *segP = expression (expP);
2661 1.1 christos switch (expP->X_op)
2662 1.1 christos {
2663 1.1 christos case O_absent:
2664 1.1 christos /* for BSD4.2 compatibility, missing expression is absolute 0 */
2665 1.1 christos expP->X_op = O_constant;
2666 1.1 christos expP->X_add_number = 0;
2667 1.1 christos /* For SEG_ABSOLUTE, we shouldn't need to set X_op_symbol,
2668 1.1 christos X_add_symbol to any particular value. But, we will program
2669 1.1 christos defensively. Since this situation occurs rarely so it costs
2670 1.1 christos us little to do, and stops Dean worrying about the origin of
2671 1.1 christos random bits in expressionS's. */
2672 1.1 christos expP->X_add_symbol = NULL;
2673 1.1 christos expP->X_op_symbol = NULL;
2674 1.1 christos break;
2675 1.1 christos
2676 1.1 christos case O_symbol:
2677 1.1 christos case O_constant:
2678 1.1 christos break;
2679 1.1 christos
2680 1.1 christos default:
2681 1.1 christos /* Major bug. We can't handle the case of a
2682 1.1 christos SEG_OP expression in a VIT_OPCODE_SYNTHETIC
2683 1.1 christos variable-length instruction.
2684 1.1 christos We don't have a frag type that is smart enough to
2685 1.1 christos relax a SEG_OP, and so we just force all
2686 1.1 christos SEG_OPs to behave like SEG_PASS1s.
2687 1.1 christos Clearly, if there is a demand we can invent a new or
2688 1.1 christos modified frag type and then coding up a frag for this
2689 1.1 christos case will be easy. SEG_OP was invented for the
2690 1.1 christos .words after a CASE opcode, and was never intended for
2691 1.1 christos instruction operands. */
2692 1.1 christos need_pass_2 = 1;
2693 1.1 christos as_fatal (_("Can't relocate expression"));
2694 1.1 christos break;
2695 1.1 christos
2696 1.1 christos case O_big:
2697 1.1 christos /* Preserve the bits. */
2698 1.1 christos if (expP->X_add_number > 0)
2699 1.1 christos {
2700 1.1 christos bignum_copy (generic_bignum, expP->X_add_number,
2701 1.1 christos floatP->low, SIZE_OF_LARGE_NUMBER);
2702 1.1 christos }
2703 1.1 christos else
2704 1.1 christos {
2705 1.1 christos know (expP->X_add_number < 0);
2706 1.1 christos flonum_copy (&generic_floating_point_number,
2707 1.1 christos floatP);
2708 1.1 christos if (strchr ("s i", operandP->vop_short))
2709 1.1 christos {
2710 1.1 christos /* Could possibly become S^# */
2711 1.1 christos flonum_gen2vax (-expP->X_add_number, floatP, literal_float);
2712 1.1 christos switch (-expP->X_add_number)
2713 1.1 christos {
2714 1.1 christos case 'f':
2715 1.1 christos can_be_short =
2716 1.1 christos (literal_float[0] & 0xFC0F) == 0x4000
2717 1.1 christos && literal_float[1] == 0;
2718 1.1 christos break;
2719 1.1 christos
2720 1.1 christos case 'd':
2721 1.1 christos can_be_short =
2722 1.1 christos (literal_float[0] & 0xFC0F) == 0x4000
2723 1.1 christos && literal_float[1] == 0
2724 1.1 christos && literal_float[2] == 0
2725 1.1 christos && literal_float[3] == 0;
2726 1.1 christos break;
2727 1.1 christos
2728 1.1 christos case 'g':
2729 1.1 christos can_be_short =
2730 1.1 christos (literal_float[0] & 0xFF81) == 0x4000
2731 1.1 christos && literal_float[1] == 0
2732 1.1 christos && literal_float[2] == 0
2733 1.1 christos && literal_float[3] == 0;
2734 1.1 christos break;
2735 1.1 christos
2736 1.1 christos case 'h':
2737 1.1 christos can_be_short = ((literal_float[0] & 0xFFF8) == 0x4000
2738 1.1 christos && (literal_float[1] & 0xE000) == 0
2739 1.1 christos && literal_float[2] == 0
2740 1.1 christos && literal_float[3] == 0
2741 1.1 christos && literal_float[4] == 0
2742 1.1 christos && literal_float[5] == 0
2743 1.1 christos && literal_float[6] == 0
2744 1.1 christos && literal_float[7] == 0);
2745 1.1 christos break;
2746 1.1 christos
2747 1.1 christos default:
2748 1.1 christos BAD_CASE (-expP->X_add_number);
2749 1.1 christos break;
2750 1.1 christos }
2751 1.1 christos }
2752 1.1 christos }
2753 1.1 christos
2754 1.1 christos if (operandP->vop_short == 's'
2755 1.1 christos || operandP->vop_short == 'i'
2756 1.1 christos || (operandP->vop_short == ' '
2757 1.1 christos && operandP->vop_reg == 0xF
2758 1.1 christos && (operandP->vop_mode & 0xE) == 0x8))
2759 1.1 christos {
2760 1.1 christos /* Saw a '#'. */
2761 1.1 christos if (operandP->vop_short == ' ')
2762 1.1 christos {
2763 1.1 christos /* We must chose S^ or I^. */
2764 1.1 christos if (expP->X_add_number > 0)
2765 1.1 christos {
2766 1.1 christos /* Bignum: Short literal impossible. */
2767 1.1 christos operandP->vop_short = 'i';
2768 1.1 christos operandP->vop_mode = 8;
2769 1.1 christos operandP->vop_reg = 0xF; /* VAX PC. */
2770 1.1 christos }
2771 1.1 christos else
2772 1.1 christos {
2773 1.1 christos /* Flonum: Try to do it. */
2774 1.1 christos if (can_be_short)
2775 1.1 christos {
2776 1.1 christos operandP->vop_short = 's';
2777 1.1 christos operandP->vop_mode = 0;
2778 1.1 christos operandP->vop_ndx = -1;
2779 1.1 christos operandP->vop_reg = -1;
2780 1.1 christos expP->X_op = O_constant;
2781 1.1 christos }
2782 1.1 christos else
2783 1.1 christos {
2784 1.1 christos operandP->vop_short = 'i';
2785 1.1 christos operandP->vop_mode = 8;
2786 1.1 christos operandP->vop_reg = 0xF; /* VAX PC */
2787 1.1 christos }
2788 1.1 christos } /* bignum or flonum ? */
2789 1.1 christos } /* if #, but no S^ or I^ seen. */
2790 1.1 christos /* No more ' ' case: either 's' or 'i'. */
2791 1.1 christos if (operandP->vop_short == 's')
2792 1.1 christos {
2793 1.1 christos /* Wants to be a short literal. */
2794 1.1 christos if (expP->X_add_number > 0)
2795 1.1 christos {
2796 1.1 christos as_warn (_("Bignum not permitted in short literal. Immediate mode assumed."));
2797 1.1 christos operandP->vop_short = 'i';
2798 1.1 christos operandP->vop_mode = 8;
2799 1.1 christos operandP->vop_reg = 0xF; /* VAX PC. */
2800 1.1 christos }
2801 1.1 christos else
2802 1.1 christos {
2803 1.1 christos if (!can_be_short)
2804 1.1 christos {
2805 1.1 christos as_warn (_("Can't do flonum short literal: immediate mode used."));
2806 1.1 christos operandP->vop_short = 'i';
2807 1.1 christos operandP->vop_mode = 8;
2808 1.1 christos operandP->vop_reg = 0xF; /* VAX PC. */
2809 1.1 christos }
2810 1.1 christos else
2811 1.1 christos {
2812 1.1 christos /* Encode short literal now. */
2813 1.1 christos int temp = 0;
2814 1.1 christos
2815 1.1 christos switch (-expP->X_add_number)
2816 1.1 christos {
2817 1.1 christos case 'f':
2818 1.1 christos case 'd':
2819 1.1 christos temp = literal_float[0] >> 4;
2820 1.1 christos break;
2821 1.1 christos
2822 1.1 christos case 'g':
2823 1.1 christos temp = literal_float[0] >> 1;
2824 1.1 christos break;
2825 1.1 christos
2826 1.1 christos case 'h':
2827 1.1 christos temp = ((literal_float[0] << 3) & 070)
2828 1.1 christos | ((literal_float[1] >> 13) & 07);
2829 1.1 christos break;
2830 1.1 christos
2831 1.1 christos default:
2832 1.1 christos BAD_CASE (-expP->X_add_number);
2833 1.1 christos break;
2834 1.1 christos }
2835 1.1 christos
2836 1.1 christos floatP->low[0] = temp & 077;
2837 1.1 christos floatP->low[1] = 0;
2838 1.1 christos }
2839 1.1 christos }
2840 1.1 christos }
2841 1.1 christos else
2842 1.1 christos {
2843 1.1 christos /* I^# seen: set it up if float. */
2844 1.1 christos if (expP->X_add_number < 0)
2845 1.1 christos {
2846 1.1 christos memcpy (floatP->low, literal_float, sizeof (literal_float));
2847 1.1 christos }
2848 1.1 christos } /* if S^# seen. */
2849 1.1 christos }
2850 1.1 christos else
2851 1.1 christos {
2852 1.1 christos as_warn (_("A bignum/flonum may not be a displacement: 0x%lx used"),
2853 1.1 christos (expP->X_add_number = 0x80000000L));
2854 1.1 christos /* Chosen so luser gets the most offset bits to patch later. */
2855 1.1 christos }
2856 1.1 christos expP->X_add_number = floatP->low[0]
2857 1.1 christos | ((LITTLENUM_MASK & (floatP->low[1])) << LITTLENUM_NUMBER_OF_BITS);
2858 1.1 christos
2859 1.1 christos /* For the O_big case we have:
2860 1.1 christos If vop_short == 's' then a short floating literal is in the
2861 1.1 christos lowest 6 bits of floatP -> low [0], which is
2862 1.1 christos big_operand_bits [---] [0].
2863 1.1 christos If vop_short == 'i' then the appropriate number of elements
2864 1.1 christos of big_operand_bits [---] [...] are set up with the correct
2865 1.1 christos bits.
2866 1.1 christos Also, just in case width is byte word or long, we copy the lowest
2867 1.1 christos 32 bits of the number to X_add_number. */
2868 1.1 christos break;
2869 1.1 christos }
2870 1.1 christos if (input_line_pointer != operandP->vop_expr_end + 1)
2871 1.1 christos {
2872 1.1 christos as_fatal ("Junk at end of expression \"%s\"", input_line_pointer);
2873 1.1 christos goofed = 1;
2874 1.1 christos }
2875 1.1 christos operandP->vop_expr_end[1] = c_save;
2876 1.1 christos }
2877 1.1 christos }
2878 1.1 christos
2879 1.1 christos input_line_pointer = save_input_line_pointer;
2880 1.1 christos
2881 1.1 christos if (need_pass_2 || goofed)
2882 1.1 christos return;
2883 1.1 christos
2884 1.1 christos dwarf2_emit_insn (0);
2885 1.1 christos /* Emit op-code. */
2886 1.1 christos /* Remember where it is, in case we want to modify the op-code later. */
2887 1.1 christos opcode_low_byteP = frag_more (v.vit_opcode_nbytes);
2888 1.1 christos memcpy (opcode_low_byteP, v.vit_opcode, v.vit_opcode_nbytes);
2889 1.1 christos opcode_as_chars = v.vit_opcode;
2890 1.1 christos opcode_as_number = md_chars_to_number ((unsigned char *) opcode_as_chars, 4);
2891 1.1 christos for (operandP = v.vit_operand,
2892 1.1 christos expP = exp_of_operand,
2893 1.1 christos segP = seg_of_operand,
2894 1.1 christos floatP = float_operand,
2895 1.1 christos end_operandP = v.vit_operand + v.vit_operands;
2896 1.1 christos
2897 1.1 christos operandP < end_operandP;
2898 1.1 christos
2899 1.1 christos operandP++,
2900 1.1 christos floatP++,
2901 1.1 christos segP++,
2902 1.1 christos expP++)
2903 1.1 christos {
2904 1.1 christos if (operandP->vop_ndx >= 0)
2905 1.1 christos {
2906 1.1 christos /* Indexed addressing byte. */
2907 1.1 christos /* Legality of indexed mode already checked: it is OK. */
2908 1.1 christos FRAG_APPEND_1_CHAR (0x40 + operandP->vop_ndx);
2909 1.1 christos } /* if(vop_ndx>=0) */
2910 1.1 christos
2911 1.1 christos /* Here to make main operand frag(s). */
2912 1.1 christos this_add_number = expP->X_add_number;
2913 1.1 christos this_add_symbol = expP->X_add_symbol;
2914 1.1 christos to_seg = *segP;
2915 1.1 christos is_undefined = (to_seg == undefined_section);
2916 1.1 christos is_absolute = (to_seg == absolute_section);
2917 1.1 christos at = operandP->vop_mode & 1;
2918 1.1 christos length = (operandP->vop_short == 'b'
2919 1.1 christos ? 1 : (operandP->vop_short == 'w'
2920 1.1 christos ? 2 : (operandP->vop_short == 'l'
2921 1.1 christos ? 4 : 0)));
2922 1.1 christos nbytes = operandP->vop_nbytes;
2923 1.1 christos if (operandP->vop_access == 'b')
2924 1.1 christos {
2925 1.1 christos if (to_seg == now_seg || is_undefined)
2926 1.1 christos {
2927 1.1 christos /* If is_undefined, then it might BECOME now_seg. */
2928 1.1 christos if (nbytes)
2929 1.1 christos {
2930 1.1 christos p = frag_more (nbytes);
2931 1.1 christos fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2932 1.1 christos this_add_symbol, this_add_number, 1, NO_RELOC);
2933 1.1 christos }
2934 1.1 christos else
2935 1.1 christos {
2936 1.1 christos /* to_seg==now_seg || to_seg == SEG_UNKNOWN */
2937 1.1 christos /* nbytes==0 */
2938 1.1 christos length_code = is_undefined ? STATE_UNDF : STATE_BYTE;
2939 1.1 christos if (opcode_as_number & VIT_OPCODE_SPECIAL)
2940 1.1 christos {
2941 1.1 christos if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
2942 1.1 christos {
2943 1.1 christos /* br or jsb */
2944 1.1 christos frag_var (rs_machine_dependent, 5, 1,
2945 1.1 christos ENCODE_RELAX (STATE_ALWAYS_BRANCH, length_code),
2946 1.1 christos this_add_symbol, this_add_number,
2947 1.1 christos opcode_low_byteP);
2948 1.1 christos }
2949 1.1 christos else
2950 1.1 christos {
2951 1.1 christos if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
2952 1.1 christos {
2953 1.1 christos length_code = STATE_WORD;
2954 1.1 christos /* JF: There is no state_byte for this one! */
2955 1.1 christos frag_var (rs_machine_dependent, 10, 2,
2956 1.1 christos ENCODE_RELAX (STATE_COMPLEX_BRANCH, length_code),
2957 1.1 christos this_add_symbol, this_add_number,
2958 1.1 christos opcode_low_byteP);
2959 1.1 christos }
2960 1.1 christos else
2961 1.1 christos {
2962 1.1 christos know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
2963 1.1 christos frag_var (rs_machine_dependent, 9, 1,
2964 1.1 christos ENCODE_RELAX (STATE_COMPLEX_HOP, length_code),
2965 1.1 christos this_add_symbol, this_add_number,
2966 1.1 christos opcode_low_byteP);
2967 1.1 christos }
2968 1.1 christos }
2969 1.1 christos }
2970 1.1 christos else
2971 1.1 christos {
2972 1.1 christos know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
2973 1.1 christos frag_var (rs_machine_dependent, 7, 1,
2974 1.1 christos ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, length_code),
2975 1.1 christos this_add_symbol, this_add_number,
2976 1.1 christos opcode_low_byteP);
2977 1.1 christos }
2978 1.1 christos }
2979 1.1 christos }
2980 1.1 christos else
2981 1.1 christos {
2982 1.1 christos /* to_seg != now_seg && to_seg != SEG_UNKNOWN */
2983 1.1 christos /* --- SEG FLOAT MAY APPEAR HERE --- */
2984 1.1 christos if (is_absolute)
2985 1.1 christos {
2986 1.1 christos if (nbytes)
2987 1.1 christos {
2988 1.1 christos know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
2989 1.1 christos p = frag_more (nbytes);
2990 1.1 christos /* Conventional relocation. */
2991 1.1 christos fix_new (frag_now, p - frag_now->fr_literal, nbytes,
2992 1.1 christos section_symbol (absolute_section),
2993 1.1 christos this_add_number, 1, NO_RELOC);
2994 1.1 christos }
2995 1.1 christos else
2996 1.1 christos {
2997 1.1 christos know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
2998 1.1 christos if (opcode_as_number & VIT_OPCODE_SPECIAL)
2999 1.1 christos {
3000 1.1 christos if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
3001 1.1 christos {
3002 1.1 christos /* br or jsb */
3003 1.1 christos *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
3004 1.1 christos know (opcode_as_chars[1] == 0);
3005 1.1 christos p = frag_more (5);
3006 1.1 christos p[0] = VAX_ABSOLUTE_MODE; /* @#... */
3007 1.1 christos md_number_to_chars (p + 1, this_add_number, 4);
3008 1.1 christos /* Now (eg) JMP @#foo or JSB @#foo. */
3009 1.1 christos }
3010 1.1 christos else
3011 1.1 christos {
3012 1.1 christos if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
3013 1.1 christos {
3014 1.1 christos p = frag_more (10);
3015 1.1 christos p[0] = 2;
3016 1.1 christos p[1] = 0;
3017 1.1 christos p[2] = VAX_BRB;
3018 1.1 christos p[3] = 6;
3019 1.1 christos p[4] = VAX_JMP;
3020 1.1 christos p[5] = VAX_ABSOLUTE_MODE; /* @#... */
3021 1.1 christos md_number_to_chars (p + 6, this_add_number, 4);
3022 1.1 christos /* Now (eg) ACBx 1f
3023 1.1 christos BRB 2f
3024 1.1 christos 1: JMP @#foo
3025 1.1 christos 2: */
3026 1.1 christos }
3027 1.1 christos else
3028 1.1 christos {
3029 1.1 christos know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
3030 1.1 christos p = frag_more (9);
3031 1.1 christos p[0] = 2;
3032 1.1 christos p[1] = VAX_BRB;
3033 1.1 christos p[2] = 6;
3034 1.1 christos p[3] = VAX_JMP;
3035 1.1 christos p[4] = VAX_ABSOLUTE_MODE; /* @#... */
3036 1.1 christos md_number_to_chars (p + 5, this_add_number, 4);
3037 1.1 christos /* Now (eg) xOBxxx 1f
3038 1.1 christos BRB 2f
3039 1.1 christos 1: JMP @#foo
3040 1.1 christos 2: */
3041 1.1 christos }
3042 1.1 christos }
3043 1.1 christos }
3044 1.1 christos else
3045 1.1 christos {
3046 1.1 christos /* b<cond> */
3047 1.1 christos *opcode_low_byteP ^= 1;
3048 1.1 christos /* To reverse the condition in a VAX branch,
3049 1.1 christos complement the lowest order bit. */
3050 1.1 christos p = frag_more (7);
3051 1.1 christos p[0] = 6;
3052 1.1 christos p[1] = VAX_JMP;
3053 1.1 christos p[2] = VAX_ABSOLUTE_MODE; /* @#... */
3054 1.1 christos md_number_to_chars (p + 3, this_add_number, 4);
3055 1.1 christos /* Now (eg) BLEQ 1f
3056 1.1 christos JMP @#foo
3057 1.1 christos 1: */
3058 1.1 christos }
3059 1.1 christos }
3060 1.1 christos }
3061 1.1 christos else
3062 1.1 christos {
3063 1.1 christos /* to_seg != now_seg && !is_undefinfed && !is_absolute */
3064 1.1 christos if (nbytes > 0)
3065 1.1 christos {
3066 1.1 christos /* Pc-relative. Conventional relocation. */
3067 1.1 christos know (!(opcode_as_number & VIT_OPCODE_SYNTHETIC));
3068 1.1 christos p = frag_more (nbytes);
3069 1.1 christos fix_new (frag_now, p - frag_now->fr_literal, nbytes,
3070 1.1 christos section_symbol (absolute_section),
3071 1.1 christos this_add_number, 1, NO_RELOC);
3072 1.1 christos }
3073 1.1 christos else
3074 1.1 christos {
3075 1.1 christos know (opcode_as_number & VIT_OPCODE_SYNTHETIC);
3076 1.1 christos if (opcode_as_number & VIT_OPCODE_SPECIAL)
3077 1.1 christos {
3078 1.1 christos if (operandP->vop_width == VAX_WIDTH_UNCONDITIONAL_JUMP)
3079 1.1 christos {
3080 1.1 christos /* br or jsb */
3081 1.1 christos know (opcode_as_chars[1] == 0);
3082 1.1 christos *opcode_low_byteP = opcode_as_chars[0] + VAX_WIDEN_LONG;
3083 1.1 christos p = frag_more (5);
3084 1.1 christos p[0] = VAX_PC_RELATIVE_MODE;
3085 1.1 christos fix_new (frag_now,
3086 1.1 christos p + 1 - frag_now->fr_literal, 4,
3087 1.1 christos this_add_symbol,
3088 1.1 christos this_add_number, 1, NO_RELOC);
3089 1.1 christos /* Now eg JMP foo or JSB foo. */
3090 1.1 christos }
3091 1.1 christos else
3092 1.1 christos {
3093 1.1 christos if (operandP->vop_width == VAX_WIDTH_WORD_JUMP)
3094 1.1 christos {
3095 1.1 christos p = frag_more (10);
3096 1.1 christos p[0] = 0;
3097 1.1 christos p[1] = 2;
3098 1.1 christos p[2] = VAX_BRB;
3099 1.1 christos p[3] = 6;
3100 1.1 christos p[4] = VAX_JMP;
3101 1.1 christos p[5] = VAX_PC_RELATIVE_MODE;
3102 1.1 christos fix_new (frag_now,
3103 1.1 christos p + 6 - frag_now->fr_literal, 4,
3104 1.1 christos this_add_symbol,
3105 1.1 christos this_add_number, 1, NO_RELOC);
3106 1.1 christos /* Now (eg) ACBx 1f
3107 1.1 christos BRB 2f
3108 1.1 christos 1: JMP foo
3109 1.1 christos 2: */
3110 1.1 christos }
3111 1.1 christos else
3112 1.1 christos {
3113 1.1 christos know (operandP->vop_width == VAX_WIDTH_BYTE_JUMP);
3114 1.1 christos p = frag_more (10);
3115 1.1 christos p[0] = 2;
3116 1.1 christos p[1] = VAX_BRB;
3117 1.1 christos p[2] = 6;
3118 1.1 christos p[3] = VAX_JMP;
3119 1.1 christos p[4] = VAX_PC_RELATIVE_MODE;
3120 1.1 christos fix_new (frag_now,
3121 1.1 christos p + 5 - frag_now->fr_literal,
3122 1.1 christos 4, this_add_symbol,
3123 1.1 christos this_add_number, 1, NO_RELOC);
3124 1.1 christos /* Now (eg) xOBxxx 1f
3125 1.1 christos BRB 2f
3126 1.1 christos 1: JMP foo
3127 1.1 christos 2: */
3128 1.1 christos }
3129 1.1 christos }
3130 1.1 christos }
3131 1.1 christos else
3132 1.1 christos {
3133 1.1 christos know (operandP->vop_width == VAX_WIDTH_CONDITIONAL_JUMP);
3134 1.1 christos *opcode_low_byteP ^= 1; /* Reverse branch condition. */
3135 1.1 christos p = frag_more (7);
3136 1.1 christos p[0] = 6;
3137 1.1 christos p[1] = VAX_JMP;
3138 1.1 christos p[2] = VAX_PC_RELATIVE_MODE;
3139 1.1 christos fix_new (frag_now, p + 3 - frag_now->fr_literal,
3140 1.1 christos 4, this_add_symbol,
3141 1.1 christos this_add_number, 1, NO_RELOC);
3142 1.1 christos }
3143 1.1 christos }
3144 1.1 christos }
3145 1.1 christos }
3146 1.1 christos }
3147 1.1 christos else
3148 1.1 christos {
3149 1.1 christos /* So it is ordinary operand. */
3150 1.1 christos know (operandP->vop_access != 'b');
3151 1.1 christos /* ' ' target-independent: elsewhere. */
3152 1.1 christos know (operandP->vop_access != ' ');
3153 1.1 christos know (operandP->vop_access == 'a'
3154 1.1 christos || operandP->vop_access == 'm'
3155 1.1 christos || operandP->vop_access == 'r'
3156 1.1 christos || operandP->vop_access == 'v'
3157 1.1 christos || operandP->vop_access == 'w');
3158 1.1 christos if (operandP->vop_short == 's')
3159 1.1 christos {
3160 1.1 christos if (is_absolute)
3161 1.1 christos {
3162 1.1 christos if (this_add_number >= 64)
3163 1.1 christos {
3164 1.1 christos as_warn (_("Short literal overflow(%ld.), immediate mode assumed."),
3165 1.1 christos (long) this_add_number);
3166 1.1 christos operandP->vop_short = 'i';
3167 1.1 christos operandP->vop_mode = 8;
3168 1.1 christos operandP->vop_reg = 0xF;
3169 1.1 christos }
3170 1.1 christos }
3171 1.1 christos else
3172 1.1 christos {
3173 1.1 christos as_warn (_("Forced short literal to immediate mode. now_seg=%s to_seg=%s"),
3174 1.1 christos segment_name (now_seg), segment_name (to_seg));
3175 1.1 christos operandP->vop_short = 'i';
3176 1.1 christos operandP->vop_mode = 8;
3177 1.1 christos operandP->vop_reg = 0xF;
3178 1.1 christos }
3179 1.1 christos }
3180 1.1 christos if (operandP->vop_reg >= 0 && (operandP->vop_mode < 8
3181 1.1 christos || (operandP->vop_reg != 0xF && operandP->vop_mode < 10)))
3182 1.1 christos {
3183 1.1 christos /* One byte operand. */
3184 1.1 christos know (operandP->vop_mode > 3);
3185 1.1 christos FRAG_APPEND_1_CHAR (operandP->vop_mode << 4 | operandP->vop_reg);
3186 1.1 christos /* All 1-bytes except S^# happen here. */
3187 1.1 christos }
3188 1.1 christos else
3189 1.1 christos {
3190 1.1 christos /* {@}{q^}foo{(Rn)} or S^#foo */
3191 1.1 christos if (operandP->vop_reg == -1 && operandP->vop_short != 's')
3192 1.1 christos {
3193 1.1 christos /* "{@}{q^}foo" */
3194 1.1 christos if (to_seg == now_seg)
3195 1.1 christos {
3196 1.1 christos if (length == 0)
3197 1.1 christos {
3198 1.1 christos know (operandP->vop_short == ' ');
3199 1.1 christos length_code = STATE_BYTE;
3200 1.1 christos #ifdef OBJ_ELF
3201 1.1 christos if (S_IS_EXTERNAL (this_add_symbol)
3202 1.1 christos || S_IS_WEAK (this_add_symbol))
3203 1.1 christos length_code = STATE_UNDF;
3204 1.1 christos #endif
3205 1.1 christos p = frag_var (rs_machine_dependent, 10, 2,
3206 1.1 christos ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3207 1.1 christos this_add_symbol, this_add_number,
3208 1.1 christos opcode_low_byteP);
3209 1.1 christos know (operandP->vop_mode == 10 + at);
3210 1.1 christos *p = at << 4;
3211 1.1 christos /* At is the only context we need to carry
3212 1.1 christos to other side of relax() process. Must
3213 1.1 christos be in the correct bit position of VAX
3214 1.1 christos operand spec. byte. */
3215 1.1 christos }
3216 1.1 christos else
3217 1.1 christos {
3218 1.1 christos know (length);
3219 1.1 christos know (operandP->vop_short != ' ');
3220 1.1 christos p = frag_more (length + 1);
3221 1.1 christos p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3222 1.1 christos fix_new (frag_now, p + 1 - frag_now->fr_literal,
3223 1.1 christos length, this_add_symbol,
3224 1.1 christos this_add_number, 1, NO_RELOC);
3225 1.1 christos }
3226 1.1 christos }
3227 1.1 christos else
3228 1.1 christos {
3229 1.1 christos /* to_seg != now_seg */
3230 1.1 christos if (this_add_symbol == NULL)
3231 1.1 christos {
3232 1.1 christos know (is_absolute);
3233 1.1 christos /* Do @#foo: simpler relocation than foo-.(pc) anyway. */
3234 1.1 christos p = frag_more (5);
3235 1.1 christos p[0] = VAX_ABSOLUTE_MODE; /* @#... */
3236 1.1 christos md_number_to_chars (p + 1, this_add_number, 4);
3237 1.1 christos if (length && length != 4)
3238 1.1 christos as_warn (_("Length specification ignored. Address mode 9F used"));
3239 1.1 christos }
3240 1.1 christos else
3241 1.1 christos {
3242 1.1 christos /* {@}{q^}other_seg */
3243 1.1 christos know ((length == 0 && operandP->vop_short == ' ')
3244 1.1 christos || (length > 0 && operandP->vop_short != ' '));
3245 1.1 christos if (is_undefined
3246 1.1 christos #ifdef OBJ_ELF
3247 1.1 christos || S_IS_WEAK(this_add_symbol)
3248 1.1 christos || S_IS_EXTERNAL(this_add_symbol)
3249 1.1 christos #endif
3250 1.1 christos )
3251 1.1 christos {
3252 1.1 christos switch (length)
3253 1.1 christos {
3254 1.1 christos default: length_code = STATE_UNDF; break;
3255 1.1 christos case 1: length_code = STATE_BYTE; break;
3256 1.1 christos case 2: length_code = STATE_WORD; break;
3257 1.1 christos case 4: length_code = STATE_LONG; break;
3258 1.1 christos }
3259 1.1 christos /* We have a SEG_UNKNOWN symbol. It might
3260 1.1 christos turn out to be in the same segment as
3261 1.1 christos the instruction, permitting relaxation. */
3262 1.1 christos p = frag_var (rs_machine_dependent, 5, 2,
3263 1.1 christos ENCODE_RELAX (STATE_PC_RELATIVE, length_code),
3264 1.1 christos this_add_symbol, this_add_number,
3265 1.1 christos opcode_low_byteP);
3266 1.1 christos p[0] = at << 4;
3267 1.1 christos }
3268 1.1 christos else
3269 1.1 christos {
3270 1.1 christos if (length == 0)
3271 1.1 christos {
3272 1.1 christos know (operandP->vop_short == ' ');
3273 1.1 christos length = 4; /* Longest possible. */
3274 1.1 christos }
3275 1.1 christos p = frag_more (length + 1);
3276 1.1 christos p[0] = 0xF | ((at + "?\12\14?\16"[length]) << 4);
3277 1.1 christos md_number_to_chars (p + 1, this_add_number, length);
3278 1.1 christos fix_new (frag_now,
3279 1.1 christos p + 1 - frag_now->fr_literal,
3280 1.1 christos length, this_add_symbol,
3281 1.1 christos this_add_number, 1, NO_RELOC);
3282 1.1 christos }
3283 1.1 christos }
3284 1.1 christos }
3285 1.1 christos }
3286 1.1 christos else
3287 1.1 christos {
3288 1.1 christos /* {@}{q^}foo(Rn) or S^# or I^# or # */
3289 1.1 christos if (operandP->vop_mode < 0xA)
3290 1.1 christos {
3291 1.1 christos /* # or S^# or I^# */
3292 1.1 christos if (operandP->vop_access == 'v'
3293 1.1 christos || operandP->vop_access == 'a')
3294 1.1 christos {
3295 1.1 christos if (operandP->vop_access == 'v')
3296 1.1 christos as_warn (_("Invalid operand: immediate value used as base address."));
3297 1.1 christos else
3298 1.1 christos as_warn (_("Invalid operand: immediate value used as address."));
3299 1.1 christos /* gcc 2.6.3 is known to generate these in at least
3300 1.1 christos one case. */
3301 1.1 christos }
3302 1.1 christos if (length == 0
3303 1.1 christos && is_absolute && (expP->X_op != O_big)
3304 1.1 christos && operandP->vop_mode == 8 /* No '@'. */
3305 1.1 christos && this_add_number < 64)
3306 1.1 christos {
3307 1.1 christos operandP->vop_short = 's';
3308 1.1 christos }
3309 1.1 christos if (operandP->vop_short == 's')
3310 1.1 christos {
3311 1.1 christos FRAG_APPEND_1_CHAR (this_add_number);
3312 1.1 christos }
3313 1.1 christos else
3314 1.1 christos {
3315 1.1 christos /* I^#... */
3316 1.1 christos know (nbytes);
3317 1.1 christos p = frag_more (nbytes + 1);
3318 1.1 christos know (operandP->vop_reg == 0xF);
3319 1.1 christos #ifdef OBJ_ELF
3320 1.1 christos if (flag_want_pic && operandP->vop_mode == 8
3321 1.1 christos && this_add_symbol != NULL)
3322 1.1 christos {
3323 1.1 christos as_warn (_("Symbol '%s' used as immediate operand in PIC mode."),
3324 1.1 christos S_GET_NAME (this_add_symbol));
3325 1.1 christos }
3326 1.1 christos #endif
3327 1.1 christos p[0] = (operandP->vop_mode << 4) | 0xF;
3328 1.1 christos if ((is_absolute) && (expP->X_op != O_big))
3329 1.1 christos {
3330 1.1 christos /* If nbytes > 4, then we are scrod. We
3331 1.1 christos don't know if the high order bytes
3332 1.1 christos are to be 0xFF or 0x00. BSD4.2 & RMS
3333 1.1 christos say use 0x00. OK --- but this
3334 1.1 christos assembler needs ANOTHER rewrite to
3335 1.1 christos cope properly with this bug. */
3336 1.1 christos md_number_to_chars (p + 1, this_add_number,
3337 1.1 christos min (sizeof (valueT),
3338 1.1 christos (size_t) nbytes));
3339 1.1 christos if ((size_t) nbytes > sizeof (valueT))
3340 1.1 christos memset (p + 1 + sizeof (valueT),
3341 1.1 christos '\0', nbytes - sizeof (valueT));
3342 1.1 christos }
3343 1.1 christos else
3344 1.1 christos {
3345 1.1 christos if (expP->X_op == O_big)
3346 1.1 christos {
3347 1.1 christos /* Problem here is to get the bytes
3348 1.1 christos in the right order. We stored
3349 1.1 christos our constant as LITTLENUMs, not
3350 1.1 christos bytes. */
3351 1.1 christos LITTLENUM_TYPE *lP;
3352 1.1 christos
3353 1.1 christos lP = floatP->low;
3354 1.1 christos if (nbytes & 1)
3355 1.1 christos {
3356 1.1 christos know (nbytes == 1);
3357 1.1 christos p[1] = *lP;
3358 1.1 christos }
3359 1.1 christos else
3360 1.1 christos {
3361 1.1 christos for (p++; nbytes; nbytes -= 2, p += 2, lP++)
3362 1.1 christos md_number_to_chars (p, *lP, 2);
3363 1.1 christos }
3364 1.1 christos }
3365 1.1 christos else
3366 1.1 christos {
3367 1.1 christos fix_new (frag_now, p + 1 - frag_now->fr_literal,
3368 1.1 christos nbytes, this_add_symbol,
3369 1.1 christos this_add_number, 0, NO_RELOC);
3370 1.1 christos }
3371 1.1 christos }
3372 1.1 christos }
3373 1.1 christos }
3374 1.1 christos else
3375 1.1 christos {
3376 1.1 christos /* {@}{q^}foo(Rn) */
3377 1.1 christos know ((length == 0 && operandP->vop_short == ' ')
3378 1.1 christos || (length > 0 && operandP->vop_short != ' '));
3379 1.1 christos if (length == 0)
3380 1.1 christos {
3381 1.1 christos if (is_absolute)
3382 1.1 christos {
3383 1.1 christos long test;
3384 1.1 christos
3385 1.1 christos test = this_add_number;
3386 1.1 christos
3387 1.1 christos if (test < 0)
3388 1.1 christos test = ~test;
3389 1.1 christos
3390 1.1 christos length = test & 0xffff8000 ? 4
3391 1.1 christos : test & 0xffffff80 ? 2
3392 1.1 christos : 1;
3393 1.1 christos }
3394 1.1 christos else
3395 1.1 christos {
3396 1.1 christos length = 4;
3397 1.1 christos }
3398 1.1 christos }
3399 1.1 christos #ifdef OBJ_ELF
3400 1.1 christos if (flag_want_pic && this_add_symbol != NULL)
3401 1.1 christos {
3402 1.1 christos as_warn (_("Symbol '%s' used as displacement in PIC mode."),
3403 1.1 christos S_GET_NAME (this_add_symbol));
3404 1.1 christos }
3405 1.1 christos #endif
3406 1.1 christos p = frag_more (1 + length);
3407 1.1 christos know (operandP->vop_reg != 0xf);
3408 1.1 christos know (operandP->vop_reg >= 0);
3409 1.1 christos p[0] = operandP->vop_reg
3410 1.1 christos | ((at | "?\12\14?\16"[length]) << 4);
3411 1.1 christos if (is_absolute)
3412 1.1 christos {
3413 1.1 christos md_number_to_chars (p + 1, this_add_number, length);
3414 1.1 christos }
3415 1.1 christos else
3416 1.1 christos {
3417 1.1 christos fix_new (frag_now, p + 1 - frag_now->fr_literal,
3418 1.1 christos length, this_add_symbol,
3419 1.1 christos this_add_number, 0, NO_RELOC);
3420 1.1 christos }
3421 1.1 christos }
3422 1.1 christos }
3423 1.1 christos }
3424 1.1 christos }
3425 1.1 christos }
3426 1.1 christos }
3427 1.1 christos
3428 1.1 christos void
3429 1.1 christos md_begin (void)
3430 1.1 christos {
3431 1.1 christos const char *errtxt;
3432 1.1 christos FLONUM_TYPE *fP;
3433 1.3 christos int i;
3434 1.1 christos
3435 1.1 christos if ((errtxt = vip_begin (1, "$", "*", "`")) != 0)
3436 1.1 christos as_fatal (_("VIP_BEGIN error:%s"), errtxt);
3437 1.5 christos
3438 1.1 christos for (i = 0, fP = float_operand;
3439 1.1 christos fP < float_operand + VIT_MAX_OPERANDS;
3440 1.1 christos i++, fP++)
3441 1.1 christos {
3442 1.1 christos fP->low = &big_operand_bits[i][0];
3443 1.1 christos fP->high = &big_operand_bits[i][SIZE_OF_LARGE_NUMBER - 1];
3444 1.1 christos }
3445 1.1 christos }
3446 1.1 christos
3447 1.1 christos bfd_reloc_code_real_type
3448 1.1 christos vax_cons (expressionS *exp, int size)
3449 1.1 christos {
3450 1.1 christos char *save;
3451 1.1 christos const char *vax_cons_special_reloc;
3452 1.1 christos
3453 1.1 christos SKIP_WHITESPACE ();
3454 1.1 christos vax_cons_special_reloc = NULL;
3455 1.1 christos save = input_line_pointer;
3456 1.1 christos if (input_line_pointer[0] == '%')
3457 1.1 christos {
3458 1.1 christos if (strncmp (input_line_pointer + 1, "pcrel", 5) == 0)
3459 1.1 christos {
3460 1.1 christos input_line_pointer += 6;
3461 1.1 christos vax_cons_special_reloc = "pcrel";
3462 1.1 christos }
3463 1.1 christos if (vax_cons_special_reloc)
3464 1.1 christos {
3465 1.1 christos int bad = 0;
3466 1.1 christos
3467 1.1 christos switch (size)
3468 1.1 christos {
3469 1.1 christos case 1:
3470 1.1 christos if (*input_line_pointer != '8')
3471 1.1 christos bad = 1;
3472 1.1 christos input_line_pointer--;
3473 1.1 christos break;
3474 1.1 christos case 2:
3475 1.1 christos if (input_line_pointer[0] != '1' || input_line_pointer[1] != '6')
3476 1.1 christos bad = 1;
3477 1.1 christos break;
3478 1.1 christos case 4:
3479 1.1 christos if (input_line_pointer[0] != '3' || input_line_pointer[1] != '2')
3480 1.1 christos bad = 1;
3481 1.1 christos break;
3482 1.1 christos default:
3483 1.1 christos bad = 1;
3484 1.1 christos break;
3485 1.1 christos }
3486 1.1 christos
3487 1.1 christos if (bad)
3488 1.1 christos {
3489 1.1 christos as_bad (_("Illegal operands: Only %%r_%s%d allowed in %d-byte data fields"),
3490 1.1 christos vax_cons_special_reloc, size * 8, size);
3491 1.1 christos }
3492 1.1 christos else
3493 1.1 christos {
3494 1.1 christos input_line_pointer += 2;
3495 1.1 christos if (*input_line_pointer != '(')
3496 1.1 christos {
3497 1.1 christos as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3498 1.1 christos vax_cons_special_reloc, size * 8);
3499 1.1 christos bad = 1;
3500 1.1 christos }
3501 1.1 christos }
3502 1.1 christos
3503 1.1 christos if (bad)
3504 1.1 christos {
3505 1.1 christos input_line_pointer = save;
3506 1.1 christos vax_cons_special_reloc = NULL;
3507 1.1 christos }
3508 1.1 christos else
3509 1.1 christos {
3510 1.1 christos int c;
3511 1.1 christos char *end = ++input_line_pointer;
3512 1.1 christos int npar = 0;
3513 1.1 christos
3514 1.1 christos while (! is_end_of_line[(c = *end)])
3515 1.1 christos {
3516 1.1 christos if (c == '(')
3517 1.1 christos npar++;
3518 1.1 christos else if (c == ')')
3519 1.1 christos {
3520 1.1 christos if (!npar)
3521 1.1 christos break;
3522 1.1 christos npar--;
3523 1.1 christos }
3524 1.1 christos end++;
3525 1.1 christos }
3526 1.1 christos
3527 1.1 christos if (c != ')')
3528 1.1 christos as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3529 1.1 christos vax_cons_special_reloc, size * 8);
3530 1.1 christos else
3531 1.1 christos {
3532 1.1 christos *end = '\0';
3533 1.1 christos expression (exp);
3534 1.1 christos *end = c;
3535 1.1 christos if (input_line_pointer != end)
3536 1.1 christos {
3537 1.1 christos as_bad (_("Illegal operands: %%r_%s%d requires arguments in ()"),
3538 1.1 christos vax_cons_special_reloc, size * 8);
3539 1.1 christos }
3540 1.1 christos else
3541 1.3 christos {
3542 1.3 christos input_line_pointer++;
3543 1.3 christos SKIP_WHITESPACE ();
3544 1.3 christos c = *input_line_pointer;
3545 1.3 christos if (! is_end_of_line[c] && c != ',')
3546 1.3 christos as_bad (_("Illegal operands: garbage after %%r_%s%d()"),
3547 1.3 christos vax_cons_special_reloc, size * 8);
3548 1.3 christos }
3549 1.1 christos }
3550 1.1 christos }
3551 1.1 christos }
3552 1.1 christos }
3553 1.1 christos if (vax_cons_special_reloc == NULL)
3554 1.1 christos expression (exp);
3555 1.3 christos else
3556 1.3 christos switch (size)
3557 1.1 christos {
3558 1.3 christos case 1: return BFD_RELOC_8_PCREL;
3559 1.3 christos case 2: return BFD_RELOC_16_PCREL;
3560 1.3 christos case 4: return BFD_RELOC_32_PCREL;
3561 1.3 christos }
3562 1.1 christos return NO_RELOC;
3563 1.1 christos }
3564 1.1 christos
3565 1.1 christos /* This is called by emit_expr via TC_CONS_FIX_NEW when creating a
3566 1.5 christos reloc for a cons. */
3567 1.1 christos
3568 1.1 christos void
3569 1.1 christos vax_cons_fix_new (fragS *frag, int where, unsigned int nbytes, expressionS *exp,
3570 1.1 christos bfd_reloc_code_real_type r)
3571 1.1 christos {
3572 1.1 christos if (r == NO_RELOC)
3573 1.1 christos r = (nbytes == 1 ? BFD_RELOC_8
3574 1.1 christos : nbytes == 2 ? BFD_RELOC_16
3575 1.1 christos : BFD_RELOC_32);
3576 1.1 christos
3577 1.1 christos fix_new_exp (frag, where, (int) nbytes, exp, 0, r);
3578 1.1 christos }
3579 1.1 christos
3580 1.1 christos const char *
3581 1.1 christos md_atof (int type, char * litP, int * sizeP)
3582 1.1 christos {
3583 1.1 christos return vax_md_atof (type, litP, sizeP);
3584 1.1 christos }
3585 1.1 christos
3586 1.1 christos void
3587 1.1 christos vax_cfi_frame_initial_instructions (void)
3588 1.1 christos {
3589 1.1 christos cfi_add_CFA_def_cfa (14, 0);
3590 1.1 christos }
3591 1.1 christos
3592 1.1 christos int
3593 1.1 christos tc_vax_regname_to_dw2regnum (char *regname)
3594 1.1 christos {
3595 1.1 christos unsigned int i;
3596 1.1 christos static const struct { char *name; int dw2regnum; } regnames[] =
3597 1.1 christos {
3598 1.1 christos { "r0", 0 }, { "r1", 1 }, { "r2", 2 }, { "r3", 3 },
3599 1.1 christos { "r4", 4 }, { "r5", 5 }, { "r6", 6 }, { "r7", 7 },
3600 1.1 christos { "r8", 8 }, { "r9", 9 }, { "r10", 10 }, { "r11", 11 },
3601 1.1 christos { "ap", 12 }, { "fp", 13 }, { "sp", 14 }, { "pc", 15 },
3602 1.1 christos { "psw", 16 },
3603 1.1 christos };
3604
3605 for (i = 0; i < ARRAY_SIZE (regnames); ++i)
3606 if (strcmp (regnames[i].name, regname) == 0)
3607 return regnames[i].dw2regnum;
3608
3609 return -1;
3610 }
3611
3612 void
3613 vax_cfi_emit_pcrel_expr (expressionS *expP, unsigned int nbytes)
3614 {
3615 expP->X_add_number += nbytes;
3616 emit_expr (expP, nbytes);
3617 }
3618