xref: /netbsd-src/external/gpl3/gdb/dist/cpu/mt.opc (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
14e98e3e1Schristos/* Morpho Technologies mRISC opcode support, for GNU Binutils.  -*- C -*-
2*a2e2270fSchristos   Copyright 2001, 2007, 2008, 2009, 2012 Free Software Foundation, Inc.
34e98e3e1Schristos
44e98e3e1Schristos   Contributed by Red Hat Inc; developed under contract from
54e98e3e1Schristos   Morpho Technologies.
64e98e3e1Schristos
74e98e3e1Schristos   This file is part of the GNU Binutils.
84e98e3e1Schristos
94e98e3e1Schristos   This program is free software; you can redistribute it and/or modify
104e98e3e1Schristos   it under the terms of the GNU General Public License as published by
114e98e3e1Schristos   the Free Software Foundation; either version 3 of the License, or
124e98e3e1Schristos   (at your option) any later version.
134e98e3e1Schristos
144e98e3e1Schristos   This program is distributed in the hope that it will be useful,
154e98e3e1Schristos   but WITHOUT ANY WARRANTY; without even the implied warranty of
164e98e3e1Schristos   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
174e98e3e1Schristos   GNU General Public License for more details.
184e98e3e1Schristos
194e98e3e1Schristos   You should have received a copy of the GNU General Public License
204e98e3e1Schristos   along with this program; if not, write to the Free Software
214e98e3e1Schristos   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
224e98e3e1Schristos   MA 02110-1301, USA.  */
234e98e3e1Schristos
244e98e3e1Schristos
254e98e3e1Schristos/* Each section is delimited with start and end markers.
264e98e3e1Schristos
274e98e3e1Schristos   <arch>-opc.h additions use: "-- opc.h"
284e98e3e1Schristos   <arch>-opc.c additions use: "-- opc.c"
294e98e3e1Schristos   <arch>-asm.c additions use: "-- asm.c"
304e98e3e1Schristos   <arch>-dis.c additions use: "-- dis.c"
314e98e3e1Schristos   <arch>-ibd.h additions use: "-- ibd.h"  */
324e98e3e1Schristos
334e98e3e1Schristos/* -- opc.h */
344e98e3e1Schristos
354e98e3e1Schristos/* Check applicability of instructions against machines.  */
364e98e3e1Schristos#define CGEN_VALIDATE_INSN_SUPPORTED
374e98e3e1Schristos
384e98e3e1Schristos/* Allows reason codes to be output when assembler errors occur.  */
394e98e3e1Schristos#define CGEN_VERBOSE_ASSEMBLER_ERRORS
404e98e3e1Schristos
414e98e3e1Schristos/* Override disassembly hashing - there are variable bits in the top
424e98e3e1Schristos   byte of these instructions.  */
434e98e3e1Schristos#define CGEN_DIS_HASH_SIZE 8
444e98e3e1Schristos#define CGEN_DIS_HASH(buf, value) (((* (unsigned char *) (buf)) >> 5) % CGEN_DIS_HASH_SIZE)
454e98e3e1Schristos
464e98e3e1Schristos#define CGEN_ASM_HASH_SIZE 127
474e98e3e1Schristos#define CGEN_ASM_HASH(insn) mt_asm_hash (insn)
484e98e3e1Schristos
494e98e3e1Schristosextern unsigned int mt_asm_hash (const char *);
504e98e3e1Schristos
514e98e3e1Schristosextern int mt_cgen_insn_supported (CGEN_CPU_DESC, const CGEN_INSN *);
524e98e3e1Schristos
534e98e3e1Schristos
544e98e3e1Schristos/* -- opc.c */
554e98e3e1Schristos#include "safe-ctype.h"
564e98e3e1Schristos
574e98e3e1Schristos/* Special check to ensure that instruction exists for given machine.  */
584e98e3e1Schristos
594e98e3e1Schristosint
604e98e3e1Schristosmt_cgen_insn_supported (CGEN_CPU_DESC cd, const CGEN_INSN *insn)
614e98e3e1Schristos{
624e98e3e1Schristos  int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
634e98e3e1Schristos
644e98e3e1Schristos  /* No mach attribute?  Assume it's supported for all machs.  */
654e98e3e1Schristos  if (machs == 0)
664e98e3e1Schristos    return 1;
674e98e3e1Schristos
684e98e3e1Schristos  return ((machs & cd->machs) != 0);
694e98e3e1Schristos}
704e98e3e1Schristos
714e98e3e1Schristos/* A better hash function for instruction mnemonics.  */
724e98e3e1Schristos
734e98e3e1Schristosunsigned int
744e98e3e1Schristosmt_asm_hash (const char* insn)
754e98e3e1Schristos{
764e98e3e1Schristos  unsigned int hash;
774e98e3e1Schristos  const char* m = insn;
784e98e3e1Schristos
794e98e3e1Schristos  for (hash = 0; *m && ! ISSPACE (*m); m++)
804e98e3e1Schristos    hash = (hash * 23) ^ (0x1F & TOLOWER (*m));
814e98e3e1Schristos
824e98e3e1Schristos  /* printf ("%s %d\n", insn, (hash % CGEN_ASM_HASH_SIZE)); */
834e98e3e1Schristos
844e98e3e1Schristos  return hash % CGEN_ASM_HASH_SIZE;
854e98e3e1Schristos}
864e98e3e1Schristos
874e98e3e1Schristos
884e98e3e1Schristos/* -- asm.c */
894e98e3e1Schristos/* Range checking for signed numbers.  Returns 0 if acceptable
904e98e3e1Schristos   and 1 if the value is out of bounds for a signed quantity.  */
914e98e3e1Schristos
924e98e3e1Schristosstatic int
934e98e3e1Schristossigned_out_of_bounds (long val)
944e98e3e1Schristos{
954e98e3e1Schristos  if ((val < -32768) || (val > 32767))
964e98e3e1Schristos    return 1;
974e98e3e1Schristos  return 0;
984e98e3e1Schristos}
994e98e3e1Schristos
1004e98e3e1Schristosstatic const char *
1014e98e3e1Schristosparse_loopsize (CGEN_CPU_DESC cd,
1024e98e3e1Schristos		const char **strp,
1034e98e3e1Schristos		int opindex,
1044e98e3e1Schristos		void *arg)
1054e98e3e1Schristos{
1064e98e3e1Schristos  signed long * valuep = (signed long *) arg;
1074e98e3e1Schristos  const char *errmsg;
1084e98e3e1Schristos  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
1094e98e3e1Schristos  enum cgen_parse_operand_result result_type;
1104e98e3e1Schristos  bfd_vma value;
1114e98e3e1Schristos
1124e98e3e1Schristos  /* Is it a control transfer instructions?  */
1134e98e3e1Schristos  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_LOOPSIZE)
1144e98e3e1Schristos    {
1154e98e3e1Schristos      code = BFD_RELOC_MT_PCINSN8;
1164e98e3e1Schristos      errmsg = cgen_parse_address (cd, strp, opindex, code,
1174e98e3e1Schristos                                   & result_type, & value);
1184e98e3e1Schristos      *valuep = value;
1194e98e3e1Schristos      return errmsg;
1204e98e3e1Schristos    }
1214e98e3e1Schristos
1224e98e3e1Schristos  abort ();
1234e98e3e1Schristos}
1244e98e3e1Schristos
1254e98e3e1Schristosstatic const char *
1264e98e3e1Schristosparse_imm16 (CGEN_CPU_DESC cd,
1274e98e3e1Schristos	     const char **strp,
1284e98e3e1Schristos	     int opindex,
1294e98e3e1Schristos	     void *arg)
1304e98e3e1Schristos{
1314e98e3e1Schristos  signed long * valuep = (signed long *) arg;
1324e98e3e1Schristos  const char *errmsg;
1334e98e3e1Schristos  enum cgen_parse_operand_result result_type;
1344e98e3e1Schristos  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
1354e98e3e1Schristos  bfd_vma value;
1364e98e3e1Schristos
1374e98e3e1Schristos  /* Is it a control transfer instructions?  */
1384e98e3e1Schristos  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16O)
1394e98e3e1Schristos    {
1404e98e3e1Schristos      code = BFD_RELOC_16_PCREL;
1414e98e3e1Schristos      errmsg = cgen_parse_address (cd, strp, opindex, code,
1424e98e3e1Schristos                                   & result_type, & value);
1434e98e3e1Schristos      if (errmsg == NULL)
1444e98e3e1Schristos	{
1454e98e3e1Schristos	  if (signed_out_of_bounds (value))
1464e98e3e1Schristos	    errmsg = _("Operand out of range. Must be between -32768 and 32767.");
1474e98e3e1Schristos	}
1484e98e3e1Schristos      *valuep = value;
1494e98e3e1Schristos      return errmsg;
1504e98e3e1Schristos    }
1514e98e3e1Schristos
1524e98e3e1Schristos  /* If it's not a control transfer instruction, then
1534e98e3e1Schristos     we have to check for %OP relocating operators.  */
1544e98e3e1Schristos  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16L)
1554e98e3e1Schristos    ;
1564e98e3e1Schristos  else if (strncmp (*strp, "%hi16", 5) == 0)
1574e98e3e1Schristos    {
1584e98e3e1Schristos      *strp += 5;
1594e98e3e1Schristos      code = BFD_RELOC_HI16;
1604e98e3e1Schristos    }
1614e98e3e1Schristos  else if (strncmp (*strp, "%lo16", 5) == 0)
1624e98e3e1Schristos    {
1634e98e3e1Schristos      *strp += 5;
1644e98e3e1Schristos      code = BFD_RELOC_LO16;
1654e98e3e1Schristos    }
1664e98e3e1Schristos
1674e98e3e1Schristos  /* If we found a %OP relocating operator, then parse it as an address.
1684e98e3e1Schristos     If not, we need to parse it as an integer, either signed or unsigned
1694e98e3e1Schristos     depending on which operand type we have.  */
1704e98e3e1Schristos  if (code != BFD_RELOC_NONE)
1714e98e3e1Schristos    {
1724e98e3e1Schristos       /* %OP relocating operator found.  */
1734e98e3e1Schristos       errmsg = cgen_parse_address (cd, strp, opindex, code,
1744e98e3e1Schristos                                   & result_type, & value);
1754e98e3e1Schristos       if (errmsg == NULL)
1764e98e3e1Schristos	 {
1774e98e3e1Schristos           switch (result_type)
1784e98e3e1Schristos	     {
1794e98e3e1Schristos	     case (CGEN_PARSE_OPERAND_RESULT_NUMBER):
1804e98e3e1Schristos	       if (code == BFD_RELOC_HI16)
1814e98e3e1Schristos		 value = (value >> 16) & 0xFFFF;
1824e98e3e1Schristos	       else if (code == BFD_RELOC_LO16)
1834e98e3e1Schristos		 value = value  & 0xFFFF;
1844e98e3e1Schristos	       else
1854e98e3e1Schristos		 errmsg = _("Biiiig Trouble in parse_imm16!");
1864e98e3e1Schristos	       break;
1874e98e3e1Schristos
1884e98e3e1Schristos	     case (CGEN_PARSE_OPERAND_RESULT_QUEUED):
1894e98e3e1Schristos	       /* No special processing for this case.  */
1904e98e3e1Schristos	       break;
1914e98e3e1Schristos
1924e98e3e1Schristos	     default:
1934e98e3e1Schristos	       errmsg = _("The percent-operator's operand is not a symbol");
1944e98e3e1Schristos	       break;
1954e98e3e1Schristos             }
1964e98e3e1Schristos	 }
1974e98e3e1Schristos       *valuep = value;
1984e98e3e1Schristos    }
1994e98e3e1Schristos  else
2004e98e3e1Schristos    {
2014e98e3e1Schristos      /* Parse hex values like 0xffff as unsigned, and sign extend
2024e98e3e1Schristos	 them manually.  */
2034e98e3e1Schristos      int parse_signed = (opindex == (CGEN_OPERAND_TYPE)MT_OPERAND_IMM16);
2044e98e3e1Schristos
2054e98e3e1Schristos      if ((*strp)[0] == '0'
2064e98e3e1Schristos	  && ((*strp)[1] == 'x' || (*strp)[1] == 'X'))
2074e98e3e1Schristos	parse_signed = 0;
2084e98e3e1Schristos
2094e98e3e1Schristos      /* No relocating operator.  Parse as an number.  */
2104e98e3e1Schristos      if (parse_signed)
2114e98e3e1Schristos	{
2124e98e3e1Schristos          /* Parse as as signed integer.  */
2134e98e3e1Schristos
2144e98e3e1Schristos          errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
2154e98e3e1Schristos
2164e98e3e1Schristos          if (errmsg == NULL)
2174e98e3e1Schristos	    {
2184e98e3e1Schristos#if 0
2194e98e3e1Schristos	      /* Manual range checking is needed for the signed case.  */
2204e98e3e1Schristos	      if (*valuep & 0x8000)
2214e98e3e1Schristos                value = 0xffff0000 | *valuep;
2224e98e3e1Schristos	      else
2234e98e3e1Schristos                value = *valuep;
2244e98e3e1Schristos
2254e98e3e1Schristos	      if (signed_out_of_bounds (value))
2264e98e3e1Schristos	        errmsg = _("Operand out of range. Must be between -32768 and 32767.");
2274e98e3e1Schristos	      /* Truncate to 16 bits. This is necessary
2284e98e3e1Schristos		 because cgen will have sign extended *valuep.  */
2294e98e3e1Schristos	      *valuep &= 0xFFFF;
2304e98e3e1Schristos#endif
2314e98e3e1Schristos	    }
2324e98e3e1Schristos	}
2334e98e3e1Schristos      else
2344e98e3e1Schristos	{
2354e98e3e1Schristos          /* MT_OPERAND_IMM16Z.  Parse as an unsigned integer.  */
2364e98e3e1Schristos          errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) valuep);
2374e98e3e1Schristos
2384e98e3e1Schristos	  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16
2394e98e3e1Schristos	      && *valuep >= 0x8000
2404e98e3e1Schristos	      && *valuep <= 0xffff)
2414e98e3e1Schristos	    *valuep -= 0x10000;
2424e98e3e1Schristos	}
2434e98e3e1Schristos    }
2444e98e3e1Schristos
2454e98e3e1Schristos  return errmsg;
2464e98e3e1Schristos}
2474e98e3e1Schristos
2484e98e3e1Schristos
2494e98e3e1Schristosstatic const char *
2504e98e3e1Schristosparse_dup (CGEN_CPU_DESC cd,
2514e98e3e1Schristos	   const char **strp,
2524e98e3e1Schristos	   int opindex,
2534e98e3e1Schristos	   unsigned long *valuep)
2544e98e3e1Schristos{
2554e98e3e1Schristos  const char *errmsg = NULL;
2564e98e3e1Schristos
2574e98e3e1Schristos  if (strncmp (*strp, "dup", 3) == 0 || strncmp (*strp, "DUP", 3) == 0)
2584e98e3e1Schristos    {
2594e98e3e1Schristos      *strp += 3;
2604e98e3e1Schristos      *valuep = 1;
2614e98e3e1Schristos    }
2624e98e3e1Schristos  else if (strncmp (*strp, "xx", 2) == 0 || strncmp (*strp, "XX", 2) == 0)
2634e98e3e1Schristos    {
2644e98e3e1Schristos      *strp += 2;
2654e98e3e1Schristos      *valuep = 0;
2664e98e3e1Schristos    }
2674e98e3e1Schristos  else
2684e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
2694e98e3e1Schristos
2704e98e3e1Schristos  return errmsg;
2714e98e3e1Schristos}
2724e98e3e1Schristos
2734e98e3e1Schristos
2744e98e3e1Schristosstatic const char *
2754e98e3e1Schristosparse_ball (CGEN_CPU_DESC cd,
2764e98e3e1Schristos	    const char **strp,
2774e98e3e1Schristos	    int opindex,
2784e98e3e1Schristos	    unsigned long *valuep)
2794e98e3e1Schristos{
2804e98e3e1Schristos  const char *errmsg = NULL;
2814e98e3e1Schristos
2824e98e3e1Schristos  if (strncmp (*strp, "all", 3) == 0 || strncmp (*strp, "ALL", 3) == 0)
2834e98e3e1Schristos    {
2844e98e3e1Schristos      *strp += 3;
2854e98e3e1Schristos      *valuep = 1;
2864e98e3e1Schristos    }
2874e98e3e1Schristos  else if (strncmp (*strp, "one", 3) == 0 || strncmp (*strp, "ONE", 3) == 0)
2884e98e3e1Schristos    {
2894e98e3e1Schristos      *strp += 3;
2904e98e3e1Schristos      *valuep = 0;
2914e98e3e1Schristos    }
2924e98e3e1Schristos  else
2934e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
2944e98e3e1Schristos
2954e98e3e1Schristos  return errmsg;
2964e98e3e1Schristos}
2974e98e3e1Schristos
2984e98e3e1Schristosstatic const char *
2994e98e3e1Schristosparse_xmode (CGEN_CPU_DESC cd,
3004e98e3e1Schristos	     const char **strp,
3014e98e3e1Schristos	     int opindex,
3024e98e3e1Schristos	     unsigned long *valuep)
3034e98e3e1Schristos{
3044e98e3e1Schristos  const char *errmsg = NULL;
3054e98e3e1Schristos
3064e98e3e1Schristos  if (strncmp (*strp, "pm", 2) == 0 || strncmp (*strp, "PM", 2) == 0)
3074e98e3e1Schristos    {
3084e98e3e1Schristos      *strp += 2;
3094e98e3e1Schristos      *valuep = 1;
3104e98e3e1Schristos    }
3114e98e3e1Schristos  else if (strncmp (*strp, "xm", 2) == 0 || strncmp (*strp, "XM", 2) == 0)
3124e98e3e1Schristos    {
3134e98e3e1Schristos      *strp += 2;
3144e98e3e1Schristos      *valuep = 0;
3154e98e3e1Schristos    }
3164e98e3e1Schristos  else
3174e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
3184e98e3e1Schristos
3194e98e3e1Schristos  return errmsg;
3204e98e3e1Schristos}
3214e98e3e1Schristos
3224e98e3e1Schristosstatic const char *
3234e98e3e1Schristosparse_rc (CGEN_CPU_DESC cd,
3244e98e3e1Schristos	  const char **strp,
3254e98e3e1Schristos	  int opindex,
3264e98e3e1Schristos	  unsigned long *valuep)
3274e98e3e1Schristos{
3284e98e3e1Schristos  const char *errmsg = NULL;
3294e98e3e1Schristos
3304e98e3e1Schristos  if (strncmp (*strp, "r", 1) == 0 || strncmp (*strp, "R", 1) == 0)
3314e98e3e1Schristos    {
3324e98e3e1Schristos      *strp += 1;
3334e98e3e1Schristos      *valuep = 1;
3344e98e3e1Schristos    }
3354e98e3e1Schristos  else if (strncmp (*strp, "c", 1) == 0 || strncmp (*strp, "C", 1) == 0)
3364e98e3e1Schristos    {
3374e98e3e1Schristos      *strp += 1;
3384e98e3e1Schristos      *valuep = 0;
3394e98e3e1Schristos    }
3404e98e3e1Schristos  else
3414e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
3424e98e3e1Schristos
3434e98e3e1Schristos  return errmsg;
3444e98e3e1Schristos}
3454e98e3e1Schristos
3464e98e3e1Schristosstatic const char *
3474e98e3e1Schristosparse_cbrb (CGEN_CPU_DESC cd,
3484e98e3e1Schristos	    const char **strp,
3494e98e3e1Schristos	    int opindex,
3504e98e3e1Schristos	    unsigned long *valuep)
3514e98e3e1Schristos{
3524e98e3e1Schristos  const char *errmsg = NULL;
3534e98e3e1Schristos
3544e98e3e1Schristos  if (strncmp (*strp, "rb", 2) == 0 || strncmp (*strp, "RB", 2) == 0)
3554e98e3e1Schristos    {
3564e98e3e1Schristos      *strp += 2;
3574e98e3e1Schristos      *valuep = 1;
3584e98e3e1Schristos    }
3594e98e3e1Schristos  else if (strncmp (*strp, "cb", 2) == 0 || strncmp (*strp, "CB", 2) == 0)
3604e98e3e1Schristos    {
3614e98e3e1Schristos      *strp += 2;
3624e98e3e1Schristos      *valuep = 0;
3634e98e3e1Schristos    }
3644e98e3e1Schristos  else
3654e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
3664e98e3e1Schristos
3674e98e3e1Schristos  return errmsg;
3684e98e3e1Schristos}
3694e98e3e1Schristos
3704e98e3e1Schristosstatic const char *
3714e98e3e1Schristosparse_rbbc (CGEN_CPU_DESC cd,
3724e98e3e1Schristos	    const char **strp,
3734e98e3e1Schristos	    int opindex,
3744e98e3e1Schristos	    unsigned long *valuep)
3754e98e3e1Schristos{
3764e98e3e1Schristos  const char *errmsg = NULL;
3774e98e3e1Schristos
3784e98e3e1Schristos  if (strncmp (*strp, "rt", 2) == 0 || strncmp (*strp, "RT", 2) == 0)
3794e98e3e1Schristos    {
3804e98e3e1Schristos      *strp += 2;
3814e98e3e1Schristos      *valuep = 0;
3824e98e3e1Schristos    }
3834e98e3e1Schristos  else if (strncmp (*strp, "br1", 3) == 0 || strncmp (*strp, "BR1", 3) == 0)
3844e98e3e1Schristos    {
3854e98e3e1Schristos      *strp += 3;
3864e98e3e1Schristos      *valuep = 1;
3874e98e3e1Schristos    }
3884e98e3e1Schristos  else if (strncmp (*strp, "br2", 3) == 0 || strncmp (*strp, "BR2", 3) == 0)
3894e98e3e1Schristos    {
3904e98e3e1Schristos      *strp += 3;
3914e98e3e1Schristos      *valuep = 2;
3924e98e3e1Schristos    }
3934e98e3e1Schristos  else if (strncmp (*strp, "cs", 2) == 0 || strncmp (*strp, "CS", 2) == 0)
3944e98e3e1Schristos    {
3954e98e3e1Schristos      *strp += 2;
3964e98e3e1Schristos      *valuep = 3;
3974e98e3e1Schristos    }
3984e98e3e1Schristos  else
3994e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
4004e98e3e1Schristos
4014e98e3e1Schristos  return errmsg;
4024e98e3e1Schristos}
4034e98e3e1Schristos
4044e98e3e1Schristosstatic const char *
4054e98e3e1Schristosparse_type (CGEN_CPU_DESC cd,
4064e98e3e1Schristos	    const char **strp,
4074e98e3e1Schristos	    int opindex,
4084e98e3e1Schristos	    unsigned long *valuep)
4094e98e3e1Schristos{
4104e98e3e1Schristos  const char *errmsg = NULL;
4114e98e3e1Schristos
4124e98e3e1Schristos  if (strncmp (*strp, "odd", 3) == 0 || strncmp (*strp, "ODD", 3) == 0)
4134e98e3e1Schristos    {
4144e98e3e1Schristos      *strp += 3;
4154e98e3e1Schristos      *valuep = 0;
4164e98e3e1Schristos    }
4174e98e3e1Schristos  else if (strncmp (*strp, "even", 4) == 0 || strncmp (*strp, "EVEN", 4) == 0)
4184e98e3e1Schristos    {
4194e98e3e1Schristos      *strp += 4;
4204e98e3e1Schristos      *valuep = 1;
4214e98e3e1Schristos    }
4224e98e3e1Schristos  else if (strncmp (*strp, "oe", 2) == 0 || strncmp (*strp, "OE", 2) == 0)
4234e98e3e1Schristos    {
4244e98e3e1Schristos      *strp += 2;
4254e98e3e1Schristos      *valuep = 2;
4264e98e3e1Schristos    }
4274e98e3e1Schristos  else
4284e98e3e1Schristos    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
4294e98e3e1Schristos
4304e98e3e1Schristos if ((errmsg == NULL) && (*valuep == 3))
4314e98e3e1Schristos    errmsg = _("invalid operand.  type may have values 0,1,2 only.");
4324e98e3e1Schristos
4334e98e3e1Schristos  return errmsg;
4344e98e3e1Schristos}
4354e98e3e1Schristos
4364e98e3e1Schristos/* -- dis.c */
4374e98e3e1Schristosstatic void
4384e98e3e1Schristosprint_dollarhex (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
4394e98e3e1Schristos		 void * dis_info,
4404e98e3e1Schristos		 long value,
4414e98e3e1Schristos		 unsigned int attrs ATTRIBUTE_UNUSED,
4424e98e3e1Schristos		 bfd_vma pc ATTRIBUTE_UNUSED,
4434e98e3e1Schristos		 int length ATTRIBUTE_UNUSED)
4444e98e3e1Schristos{
4454e98e3e1Schristos  disassemble_info *info = (disassemble_info *) dis_info;
4464e98e3e1Schristos
447*a2e2270fSchristos  info->fprintf_func (info->stream, "$%lx", value & 0xffffffff);
4484e98e3e1Schristos
4494e98e3e1Schristos  if (0)
4504e98e3e1Schristos    print_normal (cd, dis_info, value, attrs, pc, length);
4514e98e3e1Schristos}
4524e98e3e1Schristos
4534e98e3e1Schristosstatic void
4544e98e3e1Schristosprint_pcrel (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
4554e98e3e1Schristos	     void * dis_info,
4564e98e3e1Schristos	     long value,
4574e98e3e1Schristos	     unsigned int attrs ATTRIBUTE_UNUSED,
4584e98e3e1Schristos	     bfd_vma pc ATTRIBUTE_UNUSED,
4594e98e3e1Schristos	     int length ATTRIBUTE_UNUSED)
4604e98e3e1Schristos{
4614e98e3e1Schristos  print_address (cd, dis_info, value + pc, attrs, pc, length);
4624e98e3e1Schristos}
4634e98e3e1Schristos
4644e98e3e1Schristos/* -- */
4654e98e3e1Schristos
4664e98e3e1Schristos
4674e98e3e1Schristos
4684e98e3e1Schristos
4694e98e3e1Schristos
470