1 /* Print VAX instructions for GDB, the GNU debugger.
2 Copyright 1986, 1989, 1991, 1992, 1995, 1996, 1998, 1999, 2000, 2002
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "opcode/vax.h"
29 /* Return 1 if P points to an invalid floating point value.
30 LEN is the length in bytes -- not relevant on the Vax. */
32 /* FIXME: cagney/2002-01-19: The macro below was originally defined in
33 tm-vax.h and used in values.c. Two problems. Firstly this is a
34 very non-portable and secondly it is wrong. The VAX should be
35 using floatformat and associated methods to identify and handle
36 invalid floating-point values. Adding to the poor target's woes
37 there is no floatformat_vax_{f,d} and no TARGET_FLOAT_FORMAT
40 /* FIXME: cagney/2002-01-19: It turns out that the only thing that
41 uses this macro is the vax disassembler code (so how old is this
42 target?). This target should instead be using the opcodes
43 disassembler. That allowing the macro to be eliminated. */
45 #define INVALID_FLOAT(p, len) ((*(short *) p & 0xff80) == 0x8000)
47 /* Vax instructions are never longer than this. */
50 /* Number of elements in the opcode table. */
51 #define NOPCODES (sizeof votstrs / sizeof votstrs[0])
53 static unsigned char *print_insn_arg ();
56 vax_register_name (int regno)
58 static char *register_names[] =
60 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
61 "r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc",
67 if (regno >= (sizeof(register_names) / sizeof(*register_names)))
69 return (register_names[regno]);
73 vax_register_byte (int regno)
79 vax_register_raw_size (int regno)
85 vax_register_virtual_size (int regno)
91 vax_register_virtual_type (int regno)
93 return (builtin_type_int);
96 /* Advance PC across any function entry prologue instructions
97 to reach some "real" code. */
100 vax_skip_prologue (CORE_ADDR pc)
102 register int op = (unsigned char) read_memory_integer (pc, 1);
104 pc += 2; /* skip brb */
106 pc += 3; /* skip brw */
108 && ((unsigned char) read_memory_integer (pc + 2, 1)) == 0x5E)
109 pc += 3; /* skip subl2 */
111 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xAE
112 && ((unsigned char) read_memory_integer (pc + 3, 1)) == 0x5E)
113 pc += 4; /* skip movab */
115 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xCE
116 && ((unsigned char) read_memory_integer (pc + 4, 1)) == 0x5E)
117 pc += 5; /* skip movab */
119 && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xEE
120 && ((unsigned char) read_memory_integer (pc + 6, 1)) == 0x5E)
121 pc += 7; /* skip movab */
125 /* Return number of args passed to a frame.
126 Can return -1, meaning no way to tell. */
129 vax_frame_num_args (struct frame_info *fi)
131 return (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1));
136 /* Print the vax instruction at address MEMADDR in debugged memory,
137 from disassembler info INFO.
138 Returns length of the instruction, in bytes. */
141 vax_print_insn (CORE_ADDR memaddr, disassemble_info *info)
143 unsigned char buffer[MAXLEN];
145 register unsigned char *p;
148 int status = (*info->read_memory_func) (memaddr, buffer, MAXLEN, info);
151 (*info->memory_error_func) (status, memaddr, info);
155 for (i = 0; i < NOPCODES; i++)
156 if (votstrs[i].detail.code == buffer[0]
157 || votstrs[i].detail.code == *(unsigned short *) buffer)
160 /* Handle undefined instructions. */
163 (*info->fprintf_func) (info->stream, "0%o", buffer[0]);
167 (*info->fprintf_func) (info->stream, "%s", votstrs[i].name);
169 /* Point at first byte of argument data,
170 and at descriptor for first argument. */
171 p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
172 d = votstrs[i].detail.args;
175 (*info->fprintf_func) (info->stream, " ");
179 p = print_insn_arg (d, p, memaddr + (p - buffer), info);
182 (*info->fprintf_func) (info->stream, ",");
187 static unsigned char *
188 print_insn_arg (char *d, register char *p, CORE_ADDR addr,
189 disassemble_info *info)
191 register int regnum = *p & 0xf;
197 (*info->fprintf_func) (info->stream, "0x%x", addr + *p++ + 1);
200 (*info->fprintf_func) (info->stream, "0x%x", addr + *(short *) p + 2);
205 switch ((*p++ >> 4) & 0xf)
210 case 3: /* Literal mode */
211 if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
213 *(int *) &floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
214 (*info->fprintf_func) (info->stream, "$%f", floatlitbuf);
217 (*info->fprintf_func) (info->stream, "$%d", p[-1] & 0x3f);
220 case 4: /* Indexed */
221 p = (char *) print_insn_arg (d, p, addr + 1, info);
222 (*info->fprintf_func) (info->stream, "[%s]", REGISTER_NAME (regnum));
225 case 5: /* Register */
226 (*info->fprintf_func) (info->stream, REGISTER_NAME (regnum));
229 case 7: /* Autodecrement */
230 (*info->fprintf_func) (info->stream, "-");
231 case 6: /* Register deferred */
232 (*info->fprintf_func) (info->stream, "(%s)", REGISTER_NAME (regnum));
235 case 9: /* Autoincrement deferred */
236 (*info->fprintf_func) (info->stream, "@");
237 if (regnum == PC_REGNUM)
239 (*info->fprintf_func) (info->stream, "#");
240 info->target = *(long *) p;
241 (*info->print_address_func) (info->target, info);
245 case 8: /* Autoincrement */
246 if (regnum == PC_REGNUM)
248 (*info->fprintf_func) (info->stream, "#");
252 (*info->fprintf_func) (info->stream, "%d", *p++);
256 (*info->fprintf_func) (info->stream, "%d", *(short *) p);
261 (*info->fprintf_func) (info->stream, "%d", *(long *) p);
266 (*info->fprintf_func) (info->stream, "0x%x%08x",
267 ((long *) p)[1], ((long *) p)[0]);
272 (*info->fprintf_func) (info->stream, "0x%x%08x%08x%08x",
273 ((long *) p)[3], ((long *) p)[2],
274 ((long *) p)[1], ((long *) p)[0]);
279 if (INVALID_FLOAT (p, 4))
280 (*info->fprintf_func) (info->stream,
281 "<<invalid float 0x%x>>",
284 (*info->fprintf_func) (info->stream, "%f", *(float *) p);
289 if (INVALID_FLOAT (p, 8))
290 (*info->fprintf_func) (info->stream,
291 "<<invalid float 0x%x%08x>>",
292 ((long *) p)[1], ((long *) p)[0]);
294 (*info->fprintf_func) (info->stream, "%f", *(double *) p);
299 (*info->fprintf_func) (info->stream, "g-float");
304 (*info->fprintf_func) (info->stream, "h-float");
311 (*info->fprintf_func) (info->stream, "(%s)+", REGISTER_NAME (regnum));
314 case 11: /* Byte displacement deferred */
315 (*info->fprintf_func) (info->stream, "@");
316 case 10: /* Byte displacement */
317 if (regnum == PC_REGNUM)
319 info->target = addr + *p + 2;
320 (*info->print_address_func) (info->target, info);
323 (*info->fprintf_func) (info->stream, "%d(%s)", *p, REGISTER_NAME (regnum));
327 case 13: /* Word displacement deferred */
328 (*info->fprintf_func) (info->stream, "@");
329 case 12: /* Word displacement */
330 if (regnum == PC_REGNUM)
332 info->target = addr + *(short *) p + 3;
333 (*info->print_address_func) (info->target, info);
336 (*info->fprintf_func) (info->stream, "%d(%s)",
337 *(short *) p, REGISTER_NAME (regnum));
341 case 15: /* Long displacement deferred */
342 (*info->fprintf_func) (info->stream, "@");
343 case 14: /* Long displacement */
344 if (regnum == PC_REGNUM)
346 info->target = addr + *(short *) p + 5;
347 (*info->print_address_func) (info->target, info);
350 (*info->fprintf_func) (info->stream, "%d(%s)",
351 *(long *) p, REGISTER_NAME (regnum));
355 return (unsigned char *) p;
359 _initialize_vax_tdep (void)
361 tm_print_insn = vax_print_insn;