Move core_addr_lessthan and core_addr_greaterthan to arch-utils.
[deliverable/binutils-gdb.git] / gdb / tahoe-tdep.c
index ea8a752af6d59de5a9ea4b72e43c7ac5a9a20900..e4011f3f95e84f4153e3fb4afb68e0e7d0c1b22f 100644 (file)
-/* Print instructions for Tahoe target machines, for GDB.
-   Copyright 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
-   Contributed by the State University of New York at Buffalo, by the
-   Distributed Computer Systems Lab, Department of Computer Science, 1991.
-
-This file is part of GDB.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-#include "defs.h"
-#include "symtab.h"
-#include "opcode/tahoe.h"
-
-/* Tahoe instructions are never longer than this.  */
-#define MAXLEN 62
-
-/* Number of elements in the opcode table.  */
-#define NOPCODES (sizeof votstrs / sizeof votstrs[0])
-
-static unsigned char *print_insn_arg ();
-
-/* Print the Tahoe instruction at address MEMADDR in debugged memory,
-   on STREAM.  Returns length of the instruction, in bytes.  */
-
-int
-tahoe_print_insn (memaddr, stream)
-     CORE_ADDR memaddr;
-     GDB_FILE *stream;
-{
-  unsigned char buffer[MAXLEN];
-  register int i;
-  register unsigned char *p;
-  register char *d;
-
-  read_memory (memaddr, buffer, MAXLEN);
-
-  for (i = 0; i < NOPCODES; i++)
-    if (votstrs[i].detail.code == buffer[0]
-       || votstrs[i].detail.code == *(unsigned short *)buffer)
-      break;
-
-  /* Handle undefined instructions.  */
-  if (i == NOPCODES)
-    {
-      fprintf_unfiltered (stream, "0%o", buffer[0]);
-      return 1;
-    }
-
-  fprintf_unfiltered (stream, "%s", votstrs[i].name);
-
-  /* Point at first byte of argument data,
-     and at descriptor for first argument.  */
-  p = buffer + 1 + (votstrs[i].detail.code >= 0x100);
-  d = votstrs[i].detail.args;
-
-  if (*d)
-    fputc_unfiltered ('\t', stream);
-
-  while (*d)
-    {
-      p = print_insn_arg (d, p, memaddr + (p - buffer), stream);
-      d += 2;
-      if (*d)
-       fprintf_unfiltered (stream, ",");
-    }
-  return p - buffer;
-}
-/*******************************************************************/
-static unsigned char *
-print_insn_arg (d, p, addr, stream)
-     char *d;
-     register char *p;
-     CORE_ADDR addr;
-     GDB_FILE *stream;
-{
-  int temp1 = 0;
-  register int regnum = *p & 0xf;
-  float floatlitbuf;
-
-  if (*d == 'b')
-    {
-      if (d[1] == 'b')
-       fprintf_unfiltered (stream, "0x%x", addr + *p++ + 1);
-      else
-       {
-
-         temp1 = *p;
-         temp1 <<= 8;
-         temp1 |= *(p + 1);
-         fprintf_unfiltered (stream, "0x%x", addr + temp1 + 2);
-         p += 2;
-       }
-    }
-  else
-    switch ((*p++ >> 4) & 0xf)
-      {
-      case 0:
-      case 1:
-      case 2:
-      case 3:                  /* Literal (short immediate byte) mode */
-       if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h')
-         {
-           *(int *)&floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4);
-           fprintf_unfiltered (stream, "$%f", floatlitbuf);
-         }
-       else
-         fprintf_unfiltered (stream, "$%d", p[-1] & 0x3f);
-       break;
-
-      case 4:                  /* Indexed */
-       p = (char *) print_insn_arg (d, p, addr + 1, stream);
-       fprintf_unfiltered (stream, "[%s]", REGISTER_NAME (regnum));
-       break;
-
-      case 5:                  /* Register */
-       fprintf_unfiltered (stream, REGISTER_NAME (regnum));
-       break;
-
-      case 7:                  /* Autodecrement */
-       fputc_unfiltered ('-', stream);
-      case 6:                  /* Register deferred */
-       fprintf_unfiltered (stream, "(%s)", REGISTER_NAME (regnum));
-       break;
-
-      case 9:                  /* Absolute Address & Autoincrement deferred */
-       fputc_unfiltered ('*', stream);
-       if (regnum == PC_REGNUM)
-         {
-           temp1 = *p;
-           temp1 <<= 8;
-           temp1 |= *(p +1);
-
-           fputc_unfiltered ('$', stream);
-           print_address (temp1, stream);
-           p += 4;
-           break;
-         }
-      case 8:                  /*Immediate & Autoincrement SP */
-        if (regnum == 8)         /*88 is Immediate Byte Mode*/
-         fprintf_unfiltered (stream, "$%d", *p++);
-
-       else if (regnum == 9)        /*89 is Immediate Word Mode*/
-         {
-           temp1 = *p;
-           temp1 <<= 8; 
-           temp1 |= *(p +1);
-           fprintf_unfiltered (stream, "$%d", temp1);
-           p += 2;
-         }  
-
-       else if (regnum == PC_REGNUM)    /*8F is Immediate Long Mode*/
-         {
-           temp1 = *p;
-           temp1 <<=8;
-           temp1 |= *(p +1);
-           temp1 <<=8;
-           temp1 |= *(p +2);
-           temp1 <<= 8;
-           temp1 |= *(p +3);
-           fprintf_unfiltered (stream, "$%d", temp1);
-           p += 4;
-         }
-
-       else                            /*8E is Autoincrement SP Mode*/
-             fprintf_unfiltered (stream, "(%s)+", REGISTER_NAME (regnum));
-       break;
-
-      case 11:                 /* Register + Byte Displacement Deferred Mode*/
-       fputc_unfiltered ('*', stream);
-      case 10:                 /* Register + Byte Displacement Mode*/
-       if (regnum == PC_REGNUM)
-         print_address (addr + *p + 2, stream);
-       else
-         fprintf_unfiltered (stream, "%d(%s)", *p, REGISTER_NAME (regnum));
-       p += 1;
-       break;
-
-      case 13:                 /* Register + Word Displacement Deferred Mode*/
-       fputc_unfiltered ('*', stream);
-      case 12:                 /* Register + Word Displacement Mode*/
-       temp1 = *p;
-       temp1 <<= 8;
-       temp1 |= *(p +1);
-       if (regnum == PC_REGNUM)
-         print_address (addr + temp1 + 3, stream);
-       else
-         fprintf_unfiltered (stream, "%d(%s)", temp1, REGISTER_NAME (regnum));
-       p += 2;
-       break;
-
-      case 15:                 /* Register + Long Displacement Deferred Mode*/
-       fputc_unfiltered ('*', stream);
-      case 14:                 /* Register + Long Displacement Mode*/
-       temp1 = *p;
-       temp1 <<= 8;
-       temp1 |= *(p +1);
-       temp1 <<= 8;
-       temp1 |= *(p +2);
-       temp1 <<= 8;
-       temp1 |= *(p +3);
-       if (regnum == PC_REGNUM)
-         print_address (addr + temp1 + 5, stream);
-       else
-         fprintf_unfiltered (stream, "%d(%s)", temp1, REGISTER_NAME (regnum));
-       p += 4;
-      }
-
-  return (unsigned char *) p;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
+/* OBSOLETE /* Print instructions for Tahoe target machines, for GDB. */
+/* OBSOLETE    Copyright 1986, 1989, 1991, 1992, 2000 Free Software Foundation, Inc. */
+/* OBSOLETE    Contributed by the State University of New York at Buffalo, by the */
+/* OBSOLETE    Distributed Computer Systems Lab, Department of Computer Science, 1991. */
+/* OBSOLETE  */
+/* OBSOLETE    This file is part of GDB. */
+/* OBSOLETE  */
+/* OBSOLETE    This program is free software; you can redistribute it and/or modify */
+/* OBSOLETE    it under the terms of the GNU General Public License as published by */
+/* OBSOLETE    the Free Software Foundation; either version 2 of the License, or */
+/* OBSOLETE    (at your option) any later version. */
+/* OBSOLETE  */
+/* OBSOLETE    This program is distributed in the hope that it will be useful, */
+/* OBSOLETE    but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/* OBSOLETE    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the */
+/* OBSOLETE    GNU General Public License for more details. */
+/* OBSOLETE  */
+/* OBSOLETE    You should have received a copy of the GNU General Public License */
+/* OBSOLETE    along with this program; if not, write to the Free Software */
+/* OBSOLETE    Foundation, Inc., 59 Temple Place - Suite 330, */
+/* OBSOLETE    Boston, MA 02111-1307, USA.  *x/ */
+/* OBSOLETE  */
+/* OBSOLETE #include "defs.h" */
+/* OBSOLETE #include "symtab.h" */
+/* OBSOLETE #include "opcode/tahoe.h" */
+/* OBSOLETE  */
+/* OBSOLETE /* Tahoe instructions are never longer than this.  *x/ */
+/* OBSOLETE #define MAXLEN 62 */
+/* OBSOLETE  */
+/* OBSOLETE /* Number of elements in the opcode table.  *x/ */
+/* OBSOLETE #define NOPCODES (sizeof votstrs / sizeof votstrs[0]) */
+/* OBSOLETE  */
+/* OBSOLETE static unsigned char *print_insn_arg (); */
+/* OBSOLETE  */
+/* OBSOLETE /* Advance PC across any function entry prologue instructions */
+/* OBSOLETE    to reach some "real" code.  *x/ */
+/* OBSOLETE  */
+/* OBSOLETE CORE_ADDR */
+/* OBSOLETE tahoe_skip_prologue (pc) */
+/* OBSOLETE      CORE_ADDR pc; */
+/* OBSOLETE { */
+/* OBSOLETE   register int op = (unsigned char) read_memory_integer (pc, 1); */
+/* OBSOLETE   if (op == 0x11) */
+/* OBSOLETE     pc += 2;                       /* skip brb *x/ */
+/* OBSOLETE   if (op == 0x13) */
+/* OBSOLETE     pc += 3;                       /* skip brw *x/ */
+/* OBSOLETE   if (op == 0x2c */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 2, 1)) == 0x5e) */
+/* OBSOLETE     pc += 3;                       /* skip subl2 *x/ */
+/* OBSOLETE   if (op == 0xe9 */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xae */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 3, 1)) == 0x5e) */
+/* OBSOLETE     pc += 4;                       /* skip movab *x/ */
+/* OBSOLETE   if (op == 0xe9 */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xce */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 4, 1)) == 0x5e) */
+/* OBSOLETE     pc += 5;                       /* skip movab *x/ */
+/* OBSOLETE   if (op == 0xe9 */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 1, 1)) == 0xee */
+/* OBSOLETE       && ((unsigned char) read_memory_integer (pc + 6, 1)) == 0x5e) */
+/* OBSOLETE     pc += 7;                       /* skip movab *x/ */
+/* OBSOLETE   return pc; */
+/* OBSOLETE } */
+/* OBSOLETE  */
+/* OBSOLETE /* Return number of args passed to a frame. */
+/* OBSOLETE    Can return -1, meaning no way to tell.  *x/ */
+/* OBSOLETE  */
+/* OBSOLETE int */
+/* OBSOLETE tahoe_frame_num_args (fi) */
+/* OBSOLETE      struct frame_info *fi; */
+/* OBSOLETE { */
+/* OBSOLETE   return (((0xffff & read_memory_integer (((fi)->frame - 4), 4)) - 4) >> 2); */
+/* OBSOLETE } */
+/* OBSOLETE  */
+/* OBSOLETE /* Print the Tahoe instruction at address MEMADDR in debugged memory, */
+/* OBSOLETE    on STREAM.  Returns length of the instruction, in bytes.  *x/ */
+/* OBSOLETE  */
+/* OBSOLETE int */
+/* OBSOLETE tahoe_print_insn (memaddr, stream) */
+/* OBSOLETE      CORE_ADDR memaddr; */
+/* OBSOLETE      struct ui_file *stream; */
+/* OBSOLETE { */
+/* OBSOLETE   unsigned char buffer[MAXLEN]; */
+/* OBSOLETE   register int i; */
+/* OBSOLETE   register unsigned char *p; */
+/* OBSOLETE   register char *d; */
+/* OBSOLETE  */
+/* OBSOLETE   read_memory (memaddr, buffer, MAXLEN); */
+/* OBSOLETE  */
+/* OBSOLETE   for (i = 0; i < NOPCODES; i++) */
+/* OBSOLETE     if (votstrs[i].detail.code == buffer[0] */
+/* OBSOLETE    || votstrs[i].detail.code == *(unsigned short *) buffer) */
+/* OBSOLETE       break; */
+/* OBSOLETE  */
+/* OBSOLETE   /* Handle undefined instructions.  *x/ */
+/* OBSOLETE   if (i == NOPCODES) */
+/* OBSOLETE     { */
+/* OBSOLETE       fprintf_unfiltered (stream, "0%o", buffer[0]); */
+/* OBSOLETE       return 1; */
+/* OBSOLETE     } */
+/* OBSOLETE  */
+/* OBSOLETE   fprintf_unfiltered (stream, "%s", votstrs[i].name); */
+/* OBSOLETE  */
+/* OBSOLETE   /* Point at first byte of argument data, */
+/* OBSOLETE      and at descriptor for first argument.  *x/ */
+/* OBSOLETE   p = buffer + 1 + (votstrs[i].detail.code >= 0x100); */
+/* OBSOLETE   d = votstrs[i].detail.args; */
+/* OBSOLETE  */
+/* OBSOLETE   if (*d) */
+/* OBSOLETE     fputc_unfiltered ('\t', stream); */
+/* OBSOLETE  */
+/* OBSOLETE   while (*d) */
+/* OBSOLETE     { */
+/* OBSOLETE       p = print_insn_arg (d, p, memaddr + (p - buffer), stream); */
+/* OBSOLETE       d += 2; */
+/* OBSOLETE       if (*d) */
+/* OBSOLETE    fprintf_unfiltered (stream, ","); */
+/* OBSOLETE     } */
+/* OBSOLETE   return p - buffer; */
+/* OBSOLETE } */
+/* OBSOLETE /*******************************************************************x/ */
+/* OBSOLETE static unsigned char * */
+/* OBSOLETE print_insn_arg (d, p, addr, stream) */
+/* OBSOLETE      char *d; */
+/* OBSOLETE      register char *p; */
+/* OBSOLETE      CORE_ADDR addr; */
+/* OBSOLETE      struct ui_file *stream; */
+/* OBSOLETE { */
+/* OBSOLETE   int temp1 = 0; */
+/* OBSOLETE   register int regnum = *p & 0xf; */
+/* OBSOLETE   float floatlitbuf; */
+/* OBSOLETE  */
+/* OBSOLETE   if (*d == 'b') */
+/* OBSOLETE     { */
+/* OBSOLETE       if (d[1] == 'b') */
+/* OBSOLETE    fprintf_unfiltered (stream, "0x%x", addr + *p++ + 1); */
+/* OBSOLETE       else */
+/* OBSOLETE    { */
+/* OBSOLETE  */
+/* OBSOLETE      temp1 = *p; */
+/* OBSOLETE      temp1 <<= 8; */
+/* OBSOLETE      temp1 |= *(p + 1); */
+/* OBSOLETE      fprintf_unfiltered (stream, "0x%x", addr + temp1 + 2); */
+/* OBSOLETE      p += 2; */
+/* OBSOLETE    } */
+/* OBSOLETE     } */
+/* OBSOLETE   else */
+/* OBSOLETE     switch ((*p++ >> 4) & 0xf) */
+/* OBSOLETE       { */
+/* OBSOLETE       case 0: */
+/* OBSOLETE       case 1: */
+/* OBSOLETE       case 2: */
+/* OBSOLETE       case 3:                      /* Literal (short immediate byte) mode *x/ */
+/* OBSOLETE    if (d[1] == 'd' || d[1] == 'f' || d[1] == 'g' || d[1] == 'h') */
+/* OBSOLETE      { */
+/* OBSOLETE        *(int *) &floatlitbuf = 0x4000 + ((p[-1] & 0x3f) << 4); */
+/* OBSOLETE        fprintf_unfiltered (stream, "$%f", floatlitbuf); */
+/* OBSOLETE      } */
+/* OBSOLETE    else */
+/* OBSOLETE      fprintf_unfiltered (stream, "$%d", p[-1] & 0x3f); */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 4:                      /* Indexed *x/ */
+/* OBSOLETE    p = (char *) print_insn_arg (d, p, addr + 1, stream); */
+/* OBSOLETE    fprintf_unfiltered (stream, "[%s]", REGISTER_NAME (regnum)); */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 5:                      /* Register *x/ */
+/* OBSOLETE    fprintf_unfiltered (stream, REGISTER_NAME (regnum)); */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 7:                      /* Autodecrement *x/ */
+/* OBSOLETE    fputc_unfiltered ('-', stream); */
+/* OBSOLETE       case 6:                      /* Register deferred *x/ */
+/* OBSOLETE    fprintf_unfiltered (stream, "(%s)", REGISTER_NAME (regnum)); */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 9:                      /* Absolute Address & Autoincrement deferred *x/ */
+/* OBSOLETE    fputc_unfiltered ('*', stream); */
+/* OBSOLETE    if (regnum == PC_REGNUM) */
+/* OBSOLETE      { */
+/* OBSOLETE        temp1 = *p; */
+/* OBSOLETE        temp1 <<= 8; */
+/* OBSOLETE        temp1 |= *(p + 1); */
+/* OBSOLETE  */
+/* OBSOLETE        fputc_unfiltered ('$', stream); */
+/* OBSOLETE        print_address (temp1, stream); */
+/* OBSOLETE        p += 4; */
+/* OBSOLETE        break; */
+/* OBSOLETE      } */
+/* OBSOLETE       case 8:                      /*Immediate & Autoincrement SP *x/ */
+/* OBSOLETE    if (regnum == 8)        /*88 is Immediate Byte Mode *x/ */
+/* OBSOLETE      fprintf_unfiltered (stream, "$%d", *p++); */
+/* OBSOLETE  */
+/* OBSOLETE    else if (regnum == 9)   /*89 is Immediate Word Mode *x/ */
+/* OBSOLETE      { */
+/* OBSOLETE        temp1 = *p; */
+/* OBSOLETE        temp1 <<= 8; */
+/* OBSOLETE        temp1 |= *(p + 1); */
+/* OBSOLETE        fprintf_unfiltered (stream, "$%d", temp1); */
+/* OBSOLETE        p += 2; */
+/* OBSOLETE      } */
+/* OBSOLETE  */
+/* OBSOLETE    else if (regnum == PC_REGNUM)   /*8F is Immediate Long Mode *x/ */
+/* OBSOLETE      { */
+/* OBSOLETE        temp1 = *p; */
+/* OBSOLETE        temp1 <<= 8; */
+/* OBSOLETE        temp1 |= *(p + 1); */
+/* OBSOLETE        temp1 <<= 8; */
+/* OBSOLETE        temp1 |= *(p + 2); */
+/* OBSOLETE        temp1 <<= 8; */
+/* OBSOLETE        temp1 |= *(p + 3); */
+/* OBSOLETE        fprintf_unfiltered (stream, "$%d", temp1); */
+/* OBSOLETE        p += 4; */
+/* OBSOLETE      } */
+/* OBSOLETE  */
+/* OBSOLETE    else                    /*8E is Autoincrement SP Mode *x/ */
+/* OBSOLETE      fprintf_unfiltered (stream, "(%s)+", REGISTER_NAME (regnum)); */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 11:                     /* Register + Byte Displacement Deferred Mode *x/ */
+/* OBSOLETE    fputc_unfiltered ('*', stream); */
+/* OBSOLETE       case 10:                     /* Register + Byte Displacement Mode *x/ */
+/* OBSOLETE    if (regnum == PC_REGNUM) */
+/* OBSOLETE      print_address (addr + *p + 2, stream); */
+/* OBSOLETE    else */
+/* OBSOLETE      fprintf_unfiltered (stream, "%d(%s)", *p, REGISTER_NAME (regnum)); */
+/* OBSOLETE    p += 1; */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 13:                     /* Register + Word Displacement Deferred Mode *x/ */
+/* OBSOLETE    fputc_unfiltered ('*', stream); */
+/* OBSOLETE       case 12:                     /* Register + Word Displacement Mode *x/ */
+/* OBSOLETE    temp1 = *p; */
+/* OBSOLETE    temp1 <<= 8; */
+/* OBSOLETE    temp1 |= *(p + 1); */
+/* OBSOLETE    if (regnum == PC_REGNUM) */
+/* OBSOLETE      print_address (addr + temp1 + 3, stream); */
+/* OBSOLETE    else */
+/* OBSOLETE      fprintf_unfiltered (stream, "%d(%s)", temp1, REGISTER_NAME (regnum)); */
+/* OBSOLETE    p += 2; */
+/* OBSOLETE    break; */
+/* OBSOLETE  */
+/* OBSOLETE       case 15:                     /* Register + Long Displacement Deferred Mode *x/ */
+/* OBSOLETE    fputc_unfiltered ('*', stream); */
+/* OBSOLETE       case 14:                     /* Register + Long Displacement Mode *x/ */
+/* OBSOLETE    temp1 = *p; */
+/* OBSOLETE    temp1 <<= 8; */
+/* OBSOLETE    temp1 |= *(p + 1); */
+/* OBSOLETE    temp1 <<= 8; */
+/* OBSOLETE    temp1 |= *(p + 2); */
+/* OBSOLETE    temp1 <<= 8; */
+/* OBSOLETE    temp1 |= *(p + 3); */
+/* OBSOLETE    if (regnum == PC_REGNUM) */
+/* OBSOLETE      print_address (addr + temp1 + 5, stream); */
+/* OBSOLETE    else */
+/* OBSOLETE      fprintf_unfiltered (stream, "%d(%s)", temp1, REGISTER_NAME (regnum)); */
+/* OBSOLETE    p += 4; */
+/* OBSOLETE       } */
+/* OBSOLETE  */
+/* OBSOLETE   return (unsigned char *) p; */
+/* OBSOLETE } */
This page took 0.028033 seconds and 4 git commands to generate.