File: openrisc.opc

package info (click to toggle)
gnat-gdb 5.3.gnat.0.0.20030225-8
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 75,144 kB
  • ctags: 101,348
  • sloc: ansic: 873,511; exp: 46,950; sh: 16,123; makefile: 11,757; yacc: 6,092; asm: 5,027; cpp: 4,044; perl: 2,624; lex: 877; sed: 550; lisp: 394; awk: 170; pascal: 57; java: 7; fortran: 5
file content (152 lines) | stat: -rw-r--r-- 3,943 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* OpenRISC opcode support.  -*- C -*-
   Copyright (C) 2000, 2001 Free Software Foundation
   Based upon work by Red Hat, Inc.
   This file is part of CGEN.  */

/* This file is an addendum to or32.cpu.  Heavy use of C code isn't
   appropriate in .cpu files, so it resides here.  This especially applies
   to assembly/disassembly where parsing/printing can be quite involved.
   Such things aren't really part of the specification of the cpu, per se,
   so .cpu files provide the general framework and .opc files handle the
   nitty-gritty details as necessary.

   Each section is delimited with start and end markers.

   <arch>-opc.h additions use: "-- opc.h"
   <arch>-opc.c additions use: "-- opc.c"
   <arch>-asm.c additions use: "-- asm.c"
   <arch>-dis.c additions use: "-- dis.c"
   <arch>-ibd.h additions use: "-- ibd.h"
*/

/* -- opc.h */
#undef  CGEN_DIS_HASH_SIZE
#define CGEN_DIS_HASH_SIZE 64
#undef  CGEN_DIS_HASH
#define CGEN_DIS_HASH(buffer, value) (((unsigned char *) (buffer))[0] >> 2)

extern long openrisc_sign_extend_16bit PARAMS ((long));
/* -- */

/* -- opc.c */
/* -- */

/* -- asm.c */

#define CGEN_VERBOSE_ASSEMBLER_ERRORS

static const char * parse_hi16
  PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
static const char * parse_lo16
  PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));

long
openrisc_sign_extend_16bit (value)
     long value;
{
  return (long) (short) value;
}

/* Handle hi().  */

static const char *
parse_hi16 (cd, strp, opindex, valuep)
     CGEN_CPU_DESC cd;
     const char **strp;
     int opindex;
     unsigned long *valuep;
{
  const char *errmsg;
  enum cgen_parse_operand_result result_type;
  bfd_vma value;

  if (**strp == '#')
    ++*strp;

  if (strncasecmp (*strp, "hi(", 3) == 0)
    {
      *strp += 3;

#if 0
      errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
      if (errmsg != NULL)
        fprintf (stderr, "parse_hi: %s\n", errmsg);
      if (errmsg != NULL)
#endif
        errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16,
                                     &result_type, &value);
      if (**strp != ')')
        return "missing `)'";
      ++*strp;
      if (errmsg == NULL
          && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
        value >>= 16;
      *valuep = (long) (short) value;

      return errmsg;
    }
  else
    {
      if (**strp == '-')
        errmsg = cgen_parse_signed_integer (cd, strp, opindex, (long *) &value);
      else
        errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) &value);
    }
  *valuep = (long) (short) (value & 0xffff);
  return errmsg;
}

/* Handle lo().  */

static const char *
parse_lo16 (cd, strp, opindex, valuep)
     CGEN_CPU_DESC cd;
     const char **strp;
     int opindex;
     unsigned long *valuep;
{
  const char *errmsg;
  enum cgen_parse_operand_result result_type;
  bfd_vma value;

  if (**strp == '#')
    ++*strp;

  if (strncasecmp (*strp, "lo(", 3) == 0)
    {
      *strp += 3;

#if 0 
      errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
      if (errmsg != NULL)
        fprintf (stderr, "parse_lo: %s\n", errmsg);

      if (errmsg != NULL)
#endif
        errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_LO16,
                                     &result_type, &value);
      if (**strp != ')')
        return "missing `)'";
      ++*strp;
      if (errmsg == NULL
          && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
        value &= 0xffff;
      *valuep = (long) (short) value;

      return errmsg;
    }

  if (**strp == '-')
    errmsg = cgen_parse_signed_integer (cd, strp, opindex, (long *) &value);
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) &value);
  *valuep = (long) (short) (value & 0xffff);
  return errmsg;
}

/* -- */

/* -- ibd.h */
extern long openrisc_sign_extend_16bit PARAMS ((long));

/* -- */