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