rx.h revision 1.1.1.2
1/* Opcode decoder for the Renesas RX
2   Copyright (C) 2008-2015 Free Software Foundation, Inc.
3   Written by DJ Delorie <dj@redhat.com>
4
5   This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler.
6
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 3 of the License, or
10   (at your option) any later version.
11
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.
16
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., 51 Franklin Street - Fifth Floor, Boston, MA
20   02110-1301, USA.  */
21
22/* The RX decoder in libopcodes is used by the simulator, gdb's
23   analyzer, and the disassembler.  Given an opcode data source,
24   it decodes the next opcode into the following structures.  */
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30typedef enum
31{
32  RX_AnySize = 0,
33  RX_Byte, /* undefined extension */
34  RX_UByte,
35  RX_SByte,
36  RX_Word, /* undefined extension */
37  RX_UWord,
38  RX_SWord,
39  RX_3Byte,
40  RX_Long,
41  RX_Bad_Size,
42  RX_MAX_SIZE
43} RX_Size;
44
45typedef enum
46{
47  RX_Operand_None,
48  RX_Operand_Immediate,	/* #addend */
49  RX_Operand_Register,	/* Rn */
50  RX_Operand_Indirect,	/* [Rn + addend] */
51  RX_Operand_Zero_Indirect,/* [Rn] */
52  RX_Operand_Postinc,	/* [Rn+] */
53  RX_Operand_Predec,	/* [-Rn] */
54  RX_Operand_Condition,	/* eq, gtu, etc */
55  RX_Operand_Flag,	/* [UIOSZC] */
56  RX_Operand_TwoReg,	/* [Rn + scale*R2] */
57} RX_Operand_Type;
58
59typedef enum
60{
61  RXO_unknown,
62  RXO_mov,	/* d = s (signed) */
63  RXO_movbi,	/* d = [s,s2] (signed) */
64  RXO_movbir,	/* [s,s2] = d (signed) */
65  RXO_pushm,	/* s..s2 */
66  RXO_popm,	/* s..s2 */
67  RXO_xchg,	/* s <-> d */
68  RXO_stcc,	/* d = s if cond(s2) */
69  RXO_rtsd,	/* rtsd, 1=imm, 2-0 = reg if reg type */
70
71  /* These are all either d OP= s or, if s2 is set, d = s OP s2.  Note
72     that d may be "None".  */
73  RXO_and,
74  RXO_or,
75  RXO_xor,
76  RXO_add,
77  RXO_sub,
78  RXO_mul,
79  RXO_div,
80  RXO_divu,
81  RXO_shll,
82  RXO_shar,
83  RXO_shlr,
84
85  RXO_adc,	/* d = d + s + carry */
86  RXO_sbb,	/* d = d - s - ~carry */
87  RXO_abs,	/* d = |s| */
88  RXO_max,	/* d = max(d,s) */
89  RXO_min,	/* d = min(d,s) */
90  RXO_emul,	/* d:64 = d:32 * s */
91  RXO_emulu,	/* d:64 = d:32 * s (unsigned) */
92
93  RXO_rolc,	/* d <<= 1 through carry */
94  RXO_rorc,	/* d >>= 1 through carry*/
95  RXO_rotl,	/* d <<= #s without carry */
96  RXO_rotr,	/* d >>= #s without carry*/
97  RXO_revw,	/* d = revw(s) */
98  RXO_revl,	/* d = revl(s) */
99  RXO_branch,	/* pc = d if cond(s) */
100  RXO_branchrel,/* pc += d if cond(s) */
101  RXO_jsr,	/* pc = d */
102  RXO_jsrrel,	/* pc += d */
103  RXO_rts,
104  RXO_nop,
105  RXO_nop2,
106  RXO_nop3,
107  RXO_nop4,
108  RXO_nop5,
109  RXO_nop6,
110  RXO_nop7,
111
112  RXO_scmpu,
113  RXO_smovu,
114  RXO_smovb,
115  RXO_suntil,
116  RXO_swhile,
117  RXO_smovf,
118  RXO_sstr,
119
120  RXO_rmpa,
121  RXO_mulhi,
122  RXO_mullo,
123  RXO_machi,
124  RXO_maclo,
125  RXO_mvtachi,
126  RXO_mvtaclo,
127  RXO_mvfachi,
128  RXO_mvfacmi,
129  RXO_mvfaclo,
130  RXO_racw,
131
132  RXO_sat,	/* sat(d) */
133  RXO_satr,
134
135  RXO_fadd,	/* d op= s */
136  RXO_fcmp,
137  RXO_fsub,
138  RXO_ftoi,
139  RXO_fmul,
140  RXO_fdiv,
141  RXO_round,
142  RXO_itof,
143
144  RXO_bset,	/* d |= (1<<s) */
145  RXO_bclr,	/* d &= ~(1<<s) */
146  RXO_btst,	/* s & (1<<s2) */
147  RXO_bnot,	/* d ^= (1<<s) */
148  RXO_bmcc,	/* d<s> = cond(s2) */
149
150  RXO_clrpsw,	/* flag index in d */
151  RXO_setpsw,	/* flag index in d */
152  RXO_mvtipl,	/* new IPL in s */
153
154  RXO_rtfi,
155  RXO_rte,
156  RXO_rtd,	/* undocumented */
157  RXO_brk,
158  RXO_dbt,	/* undocumented */
159  RXO_int,	/* vector id in s */
160  RXO_stop,
161  RXO_wait,
162
163  RXO_sccnd,	/* d = cond(s) ? 1 : 0 */
164} RX_Opcode_ID;
165
166/* Condition bitpatterns, as registers.  */
167#define RXC_eq		0
168#define RXC_z		0
169#define RXC_ne		1
170#define RXC_nz		1
171#define RXC_c		2
172#define RXC_nc		3
173#define RXC_gtu		4
174#define RXC_leu		5
175#define RXC_pz		6
176#define RXC_n		7
177#define RXC_ge		8
178#define RXC_lt		9
179#define RXC_gt		10
180#define RXC_le		11
181#define RXC_o		12
182#define RXC_no		13
183#define RXC_always	14
184#define RXC_never	15
185
186typedef struct
187{
188  RX_Operand_Type  type;
189  int              reg;
190  int              addend;
191  RX_Size          size;
192} RX_Opcode_Operand;
193
194typedef struct
195{
196  RX_Opcode_ID      id;
197  int               n_bytes;
198  int               prefix;
199  char *            syntax;
200  RX_Size           size;
201  /* By convention, these are destination, source1, source2.  */
202  RX_Opcode_Operand op[3];
203
204  /* The logic here is:
205     newflags = (oldflags & ~(int)flags_0) | flags_1 | (op_flags & flags_s)
206     Only the O, S, Z, and C flags are affected.  */
207  char flags_0; /* This also clears out flags-to-be-set.  */
208  char flags_1;
209  char flags_s;
210} RX_Opcode_Decoded;
211
212/* Within the syntax, %c-style format specifiers are as follows:
213
214   %% = '%' character
215   %0 = operand[0] (destination)
216   %1 = operand[1] (source)
217   %2 = operand[2] (2nd source)
218   %s = operation size (b/w/l)
219   %SN = operand size [N] (N=0,1,2)
220   %aN = op[N] as an address (N=0,1,2)
221
222   Register numbers 0..15 are general registers.  16..31 are control
223   registers.  32..47 are condition codes.  */
224
225int rx_decode_opcode (unsigned long, RX_Opcode_Decoded *, int (*)(void *), void *);
226
227#ifdef __cplusplus
228}
229#endif
230