xref: /aosp_15_r20/external/capstone/arch/M68K/M68KDisassembler.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
2*9a0e4156SSadaf Ebrahimi /* ========================= LICENSING & COPYRIGHT ======================== */
3*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
4*9a0e4156SSadaf Ebrahimi /*
5*9a0e4156SSadaf Ebrahimi  *                                  MUSASHI
6*9a0e4156SSadaf Ebrahimi  *                                Version 3.4
7*9a0e4156SSadaf Ebrahimi  *
8*9a0e4156SSadaf Ebrahimi  * A portable Motorola M680x0 processor emulation engine.
9*9a0e4156SSadaf Ebrahimi  * Copyright 1998-2001 Karl Stenerud.  All rights reserved.
10*9a0e4156SSadaf Ebrahimi  *
11*9a0e4156SSadaf Ebrahimi  * Permission is hereby granted, free of charge, to any person obtaining a copy
12*9a0e4156SSadaf Ebrahimi  * of this software and associated documentation files (the "Software"), to deal
13*9a0e4156SSadaf Ebrahimi  * in the Software without restriction, including without limitation the rights
14*9a0e4156SSadaf Ebrahimi  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15*9a0e4156SSadaf Ebrahimi  * copies of the Software, and to permit persons to whom the Software is
16*9a0e4156SSadaf Ebrahimi  * furnished to do so, subject to the following conditions:
17*9a0e4156SSadaf Ebrahimi  *
18*9a0e4156SSadaf Ebrahimi  * The above copyright notice and this permission notice shall be included in
19*9a0e4156SSadaf Ebrahimi  * all copies or substantial portions of the Software.
20*9a0e4156SSadaf Ebrahimi 
21*9a0e4156SSadaf Ebrahimi  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22*9a0e4156SSadaf Ebrahimi  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*9a0e4156SSadaf Ebrahimi  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24*9a0e4156SSadaf Ebrahimi  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25*9a0e4156SSadaf Ebrahimi  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26*9a0e4156SSadaf Ebrahimi  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27*9a0e4156SSadaf Ebrahimi  * THE SOFTWARE.
28*9a0e4156SSadaf Ebrahimi  */
29*9a0e4156SSadaf Ebrahimi 
30*9a0e4156SSadaf Ebrahimi /* The code bellow is based on MUSASHI but has been heavily modified for capstore by
31*9a0e4156SSadaf Ebrahimi  * Daniel Collin <[email protected]> 2015-2016 */
32*9a0e4156SSadaf Ebrahimi 
33*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
34*9a0e4156SSadaf Ebrahimi /* ================================ INCLUDES ============================== */
35*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
36*9a0e4156SSadaf Ebrahimi 
37*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
38*9a0e4156SSadaf Ebrahimi #include <stdio.h>
39*9a0e4156SSadaf Ebrahimi #include <string.h>
40*9a0e4156SSadaf Ebrahimi 
41*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h"
42*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
43*9a0e4156SSadaf Ebrahimi 
44*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
45*9a0e4156SSadaf Ebrahimi #include "../../MCInstrDesc.h"
46*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
47*9a0e4156SSadaf Ebrahimi #include "M68KInstPrinter.h"
48*9a0e4156SSadaf Ebrahimi #include "M68KDisassembler.h"
49*9a0e4156SSadaf Ebrahimi 
50*9a0e4156SSadaf Ebrahimi #ifndef DECL_SPEC
51*9a0e4156SSadaf Ebrahimi #ifdef _MSC_VER
52*9a0e4156SSadaf Ebrahimi #define DECL_SPEC __cdecl
53*9a0e4156SSadaf Ebrahimi #else
54*9a0e4156SSadaf Ebrahimi #define DECL_SPEC
55*9a0e4156SSadaf Ebrahimi #endif	// _MSC_VER
56*9a0e4156SSadaf Ebrahimi #endif	// DECL_SPEC
57*9a0e4156SSadaf Ebrahimi 
58*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
59*9a0e4156SSadaf Ebrahimi /* ============================ GENERAL DEFINES =========================== */
60*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
61*9a0e4156SSadaf Ebrahimi 
62*9a0e4156SSadaf Ebrahimi /* unsigned int and int must be at least 32 bits wide */
63*9a0e4156SSadaf Ebrahimi #undef uint
64*9a0e4156SSadaf Ebrahimi #define uint unsigned int
65*9a0e4156SSadaf Ebrahimi 
66*9a0e4156SSadaf Ebrahimi /* Bit Isolation Functions */
67*9a0e4156SSadaf Ebrahimi #define BIT_0(A)  ((A) & 0x00000001)
68*9a0e4156SSadaf Ebrahimi #define BIT_1(A)  ((A) & 0x00000002)
69*9a0e4156SSadaf Ebrahimi #define BIT_2(A)  ((A) & 0x00000004)
70*9a0e4156SSadaf Ebrahimi #define BIT_3(A)  ((A) & 0x00000008)
71*9a0e4156SSadaf Ebrahimi #define BIT_4(A)  ((A) & 0x00000010)
72*9a0e4156SSadaf Ebrahimi #define BIT_5(A)  ((A) & 0x00000020)
73*9a0e4156SSadaf Ebrahimi #define BIT_6(A)  ((A) & 0x00000040)
74*9a0e4156SSadaf Ebrahimi #define BIT_7(A)  ((A) & 0x00000080)
75*9a0e4156SSadaf Ebrahimi #define BIT_8(A)  ((A) & 0x00000100)
76*9a0e4156SSadaf Ebrahimi #define BIT_9(A)  ((A) & 0x00000200)
77*9a0e4156SSadaf Ebrahimi #define BIT_A(A)  ((A) & 0x00000400)
78*9a0e4156SSadaf Ebrahimi #define BIT_B(A)  ((A) & 0x00000800)
79*9a0e4156SSadaf Ebrahimi #define BIT_C(A)  ((A) & 0x00001000)
80*9a0e4156SSadaf Ebrahimi #define BIT_D(A)  ((A) & 0x00002000)
81*9a0e4156SSadaf Ebrahimi #define BIT_E(A)  ((A) & 0x00004000)
82*9a0e4156SSadaf Ebrahimi #define BIT_F(A)  ((A) & 0x00008000)
83*9a0e4156SSadaf Ebrahimi #define BIT_10(A) ((A) & 0x00010000)
84*9a0e4156SSadaf Ebrahimi #define BIT_11(A) ((A) & 0x00020000)
85*9a0e4156SSadaf Ebrahimi #define BIT_12(A) ((A) & 0x00040000)
86*9a0e4156SSadaf Ebrahimi #define BIT_13(A) ((A) & 0x00080000)
87*9a0e4156SSadaf Ebrahimi #define BIT_14(A) ((A) & 0x00100000)
88*9a0e4156SSadaf Ebrahimi #define BIT_15(A) ((A) & 0x00200000)
89*9a0e4156SSadaf Ebrahimi #define BIT_16(A) ((A) & 0x00400000)
90*9a0e4156SSadaf Ebrahimi #define BIT_17(A) ((A) & 0x00800000)
91*9a0e4156SSadaf Ebrahimi #define BIT_18(A) ((A) & 0x01000000)
92*9a0e4156SSadaf Ebrahimi #define BIT_19(A) ((A) & 0x02000000)
93*9a0e4156SSadaf Ebrahimi #define BIT_1A(A) ((A) & 0x04000000)
94*9a0e4156SSadaf Ebrahimi #define BIT_1B(A) ((A) & 0x08000000)
95*9a0e4156SSadaf Ebrahimi #define BIT_1C(A) ((A) & 0x10000000)
96*9a0e4156SSadaf Ebrahimi #define BIT_1D(A) ((A) & 0x20000000)
97*9a0e4156SSadaf Ebrahimi #define BIT_1E(A) ((A) & 0x40000000)
98*9a0e4156SSadaf Ebrahimi #define BIT_1F(A) ((A) & 0x80000000)
99*9a0e4156SSadaf Ebrahimi 
100*9a0e4156SSadaf Ebrahimi /* These are the CPU types understood by this disassembler */
101*9a0e4156SSadaf Ebrahimi #define TYPE_68000 1
102*9a0e4156SSadaf Ebrahimi #define TYPE_68010 2
103*9a0e4156SSadaf Ebrahimi #define TYPE_68020 4
104*9a0e4156SSadaf Ebrahimi #define TYPE_68030 8
105*9a0e4156SSadaf Ebrahimi #define TYPE_68040 16
106*9a0e4156SSadaf Ebrahimi 
107*9a0e4156SSadaf Ebrahimi #define M68000_ONLY		TYPE_68000
108*9a0e4156SSadaf Ebrahimi 
109*9a0e4156SSadaf Ebrahimi #define M68010_ONLY		TYPE_68010
110*9a0e4156SSadaf Ebrahimi #define M68010_LESS		(TYPE_68000 | TYPE_68010)
111*9a0e4156SSadaf Ebrahimi #define M68010_PLUS		(TYPE_68010 | TYPE_68020 | TYPE_68030 | TYPE_68040)
112*9a0e4156SSadaf Ebrahimi 
113*9a0e4156SSadaf Ebrahimi #define M68020_ONLY 	TYPE_68020
114*9a0e4156SSadaf Ebrahimi #define M68020_LESS 	(TYPE_68010 | TYPE_68020)
115*9a0e4156SSadaf Ebrahimi #define M68020_PLUS		(TYPE_68020 | TYPE_68030 | TYPE_68040)
116*9a0e4156SSadaf Ebrahimi 
117*9a0e4156SSadaf Ebrahimi #define M68030_ONLY 	TYPE_68030
118*9a0e4156SSadaf Ebrahimi #define M68030_LESS 	(TYPE_68010 | TYPE_68020 | TYPE_68030)
119*9a0e4156SSadaf Ebrahimi #define M68030_PLUS		(TYPE_68030 | TYPE_68040)
120*9a0e4156SSadaf Ebrahimi 
121*9a0e4156SSadaf Ebrahimi #define M68040_PLUS		TYPE_68040
122*9a0e4156SSadaf Ebrahimi 
123*9a0e4156SSadaf Ebrahimi enum {
124*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_INVALID,
125*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68000,
126*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68010,
127*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68EC020,
128*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68020,
129*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68030,	/* Supported by disassembler ONLY */
130*9a0e4156SSadaf Ebrahimi 	M68K_CPU_TYPE_68040		/* Supported by disassembler ONLY */
131*9a0e4156SSadaf Ebrahimi };
132*9a0e4156SSadaf Ebrahimi 
133*9a0e4156SSadaf Ebrahimi /* Extension word formats */
134*9a0e4156SSadaf Ebrahimi #define EXT_8BIT_DISPLACEMENT(A)          ((A)&0xff)
135*9a0e4156SSadaf Ebrahimi #define EXT_FULL(A)                       BIT_8(A)
136*9a0e4156SSadaf Ebrahimi #define EXT_EFFECTIVE_ZERO(A)             (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0)
137*9a0e4156SSadaf Ebrahimi #define EXT_BASE_REGISTER_PRESENT(A)      (!BIT_7(A))
138*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_REGISTER_PRESENT(A)     (!BIT_6(A))
139*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_REGISTER(A)             (((A)>>12)&7)
140*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_PRE_POST(A)             (EXT_INDEX_PRESENT(A) && (A)&3)
141*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_PRE(A)                  (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0)
142*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_POST(A)                 (EXT_INDEX_PRESENT(A) && ((A)&7) > 4)
143*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_SCALE(A)                (((A)>>9)&3)
144*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_LONG(A)                 BIT_B(A)
145*9a0e4156SSadaf Ebrahimi #define EXT_INDEX_AR(A)                   BIT_F(A)
146*9a0e4156SSadaf Ebrahimi #define EXT_BASE_DISPLACEMENT_PRESENT(A)  (((A)&0x30) > 0x10)
147*9a0e4156SSadaf Ebrahimi #define EXT_BASE_DISPLACEMENT_WORD(A)     (((A)&0x30) == 0x20)
148*9a0e4156SSadaf Ebrahimi #define EXT_BASE_DISPLACEMENT_LONG(A)     (((A)&0x30) == 0x30)
149*9a0e4156SSadaf Ebrahimi #define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44)
150*9a0e4156SSadaf Ebrahimi #define EXT_OUTER_DISPLACEMENT_WORD(A)    (((A)&3) == 2 && ((A)&0x47) < 0x44)
151*9a0e4156SSadaf Ebrahimi #define EXT_OUTER_DISPLACEMENT_LONG(A)    (((A)&3) == 3 && ((A)&0x47) < 0x44)
152*9a0e4156SSadaf Ebrahimi 
153*9a0e4156SSadaf Ebrahimi #define IS_BITSET(val,b) ((val) & (1 << (b)))
154*9a0e4156SSadaf Ebrahimi #define BITFIELD_MASK(sb,eb)  (((1 << ((sb) + 1))-1) & (~((1 << (eb))-1)))
155*9a0e4156SSadaf Ebrahimi #define BITFIELD(val,sb,eb) ((BITFIELD_MASK(sb,eb) & (val)) >> (eb))
156*9a0e4156SSadaf Ebrahimi 
157*9a0e4156SSadaf Ebrahimi ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
158*9a0e4156SSadaf Ebrahimi 
m68k_read_disassembler_16(const m68k_info * info,const uint64_t addr)159*9a0e4156SSadaf Ebrahimi static unsigned int m68k_read_disassembler_16(const m68k_info *info, const uint64_t addr)
160*9a0e4156SSadaf Ebrahimi {
161*9a0e4156SSadaf Ebrahimi 	const uint16_t v0 = info->code[addr + 0];
162*9a0e4156SSadaf Ebrahimi 	const uint16_t v1 = info->code[addr + 1];
163*9a0e4156SSadaf Ebrahimi 	return (v0 << 8) | v1;
164*9a0e4156SSadaf Ebrahimi }
165*9a0e4156SSadaf Ebrahimi 
m68k_read_disassembler_32(const m68k_info * info,const uint64_t addr)166*9a0e4156SSadaf Ebrahimi static unsigned int m68k_read_disassembler_32(const m68k_info *info, const uint64_t addr)
167*9a0e4156SSadaf Ebrahimi {
168*9a0e4156SSadaf Ebrahimi 	const uint32_t v0 = info->code[addr + 0];
169*9a0e4156SSadaf Ebrahimi 	const uint32_t v1 = info->code[addr + 1];
170*9a0e4156SSadaf Ebrahimi 	const uint32_t v2 = info->code[addr + 2];
171*9a0e4156SSadaf Ebrahimi 	const uint32_t v3 = info->code[addr + 3];
172*9a0e4156SSadaf Ebrahimi 	return (v0 << 24) | (v1 << 16) | (v2 << 8) | v3;
173*9a0e4156SSadaf Ebrahimi }
174*9a0e4156SSadaf Ebrahimi 
m68k_read_disassembler_64(const m68k_info * info,const uint64_t addr)175*9a0e4156SSadaf Ebrahimi static uint64_t m68k_read_disassembler_64(const m68k_info *info, const uint64_t addr)
176*9a0e4156SSadaf Ebrahimi {
177*9a0e4156SSadaf Ebrahimi 	const uint64_t v0 = info->code[addr + 0];
178*9a0e4156SSadaf Ebrahimi 	const uint64_t v1 = info->code[addr + 1];
179*9a0e4156SSadaf Ebrahimi 	const uint64_t v2 = info->code[addr + 2];
180*9a0e4156SSadaf Ebrahimi 	const uint64_t v3 = info->code[addr + 3];
181*9a0e4156SSadaf Ebrahimi 	const uint64_t v4 = info->code[addr + 4];
182*9a0e4156SSadaf Ebrahimi 	const uint64_t v5 = info->code[addr + 5];
183*9a0e4156SSadaf Ebrahimi 	const uint64_t v6 = info->code[addr + 6];
184*9a0e4156SSadaf Ebrahimi 	const uint64_t v7 = info->code[addr + 7];
185*9a0e4156SSadaf Ebrahimi 	return (v0 << 56) | (v1 << 48) | (v2 << 40) | (v3 << 32) | (v4 << 24) | (v5 << 16) | (v6 << 8) | v7;
186*9a0e4156SSadaf Ebrahimi }
187*9a0e4156SSadaf Ebrahimi 
m68k_read_safe_16(const m68k_info * info,const uint64_t address)188*9a0e4156SSadaf Ebrahimi static unsigned int m68k_read_safe_16(const m68k_info *info, const uint64_t address)
189*9a0e4156SSadaf Ebrahimi {
190*9a0e4156SSadaf Ebrahimi 	const uint64_t addr = (address - info->baseAddress) & info->address_mask;
191*9a0e4156SSadaf Ebrahimi 	if (info->code_len < addr + 2) {
192*9a0e4156SSadaf Ebrahimi 		return 0xaaaa;
193*9a0e4156SSadaf Ebrahimi 	}
194*9a0e4156SSadaf Ebrahimi 	return m68k_read_disassembler_16(info, addr);
195*9a0e4156SSadaf Ebrahimi }
196*9a0e4156SSadaf Ebrahimi 
m68k_read_safe_32(const m68k_info * info,const uint64_t address)197*9a0e4156SSadaf Ebrahimi static unsigned int m68k_read_safe_32(const m68k_info *info, const uint64_t address)
198*9a0e4156SSadaf Ebrahimi {
199*9a0e4156SSadaf Ebrahimi 	const uint64_t addr = (address - info->baseAddress) & info->address_mask;
200*9a0e4156SSadaf Ebrahimi 	if (info->code_len < addr + 4) {
201*9a0e4156SSadaf Ebrahimi 		return 0xaaaaaaaa;
202*9a0e4156SSadaf Ebrahimi 	}
203*9a0e4156SSadaf Ebrahimi 	return m68k_read_disassembler_32(info, addr);
204*9a0e4156SSadaf Ebrahimi }
205*9a0e4156SSadaf Ebrahimi 
m68k_read_safe_64(const m68k_info * info,const uint64_t address)206*9a0e4156SSadaf Ebrahimi static uint64_t m68k_read_safe_64(const m68k_info *info, const uint64_t address)
207*9a0e4156SSadaf Ebrahimi {
208*9a0e4156SSadaf Ebrahimi 	const uint64_t addr = (address - info->baseAddress) & info->address_mask;
209*9a0e4156SSadaf Ebrahimi 	if (info->code_len < addr + 8) {
210*9a0e4156SSadaf Ebrahimi 		return 0xaaaaaaaaaaaaaaaaLL;
211*9a0e4156SSadaf Ebrahimi 	}
212*9a0e4156SSadaf Ebrahimi 	return m68k_read_disassembler_64(info, addr);
213*9a0e4156SSadaf Ebrahimi }
214*9a0e4156SSadaf Ebrahimi 
215*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
216*9a0e4156SSadaf Ebrahimi /* =============================== PROTOTYPES ============================= */
217*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
218*9a0e4156SSadaf Ebrahimi 
219*9a0e4156SSadaf Ebrahimi /* make signed integers 100% portably */
220*9a0e4156SSadaf Ebrahimi static int make_int_8(int value);
221*9a0e4156SSadaf Ebrahimi static int make_int_16(int value);
222*9a0e4156SSadaf Ebrahimi 
223*9a0e4156SSadaf Ebrahimi /* Stuff to build the opcode handler jump table */
224*9a0e4156SSadaf Ebrahimi static void build_opcode_table(void);
225*9a0e4156SSadaf Ebrahimi static int valid_ea(uint opcode, uint mask);
226*9a0e4156SSadaf Ebrahimi static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr);
227*9a0e4156SSadaf Ebrahimi static void d68000_invalid(m68k_info *info);
228*9a0e4156SSadaf Ebrahimi static int instruction_is_valid(m68k_info *info, const unsigned int word_check);
229*9a0e4156SSadaf Ebrahimi 
230*9a0e4156SSadaf Ebrahimi /* used to build opcode handler jump table */
231*9a0e4156SSadaf Ebrahimi typedef struct {
232*9a0e4156SSadaf Ebrahimi 	void (*opcode_handler)(m68k_info *info); /* handler function */
233*9a0e4156SSadaf Ebrahimi 	uint mask;                    /* mask on opcode */
234*9a0e4156SSadaf Ebrahimi 	uint match;                   /* what to match after masking */
235*9a0e4156SSadaf Ebrahimi 	uint ea_mask;                 /* what ea modes are allowed */
236*9a0e4156SSadaf Ebrahimi 	uint mask2;                   /* mask the 2nd word */
237*9a0e4156SSadaf Ebrahimi 	uint match2;                  /* what to match after masking */
238*9a0e4156SSadaf Ebrahimi } opcode_struct;
239*9a0e4156SSadaf Ebrahimi 
240*9a0e4156SSadaf Ebrahimi typedef struct {
241*9a0e4156SSadaf Ebrahimi 	void (*instruction)(m68k_info *info);    /* handler function */
242*9a0e4156SSadaf Ebrahimi 	uint word2_mask;              /* mask the 2nd word */
243*9a0e4156SSadaf Ebrahimi 	uint word2_match;             /* what to match after masking */
244*9a0e4156SSadaf Ebrahimi } instruction_struct;
245*9a0e4156SSadaf Ebrahimi 
246*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
247*9a0e4156SSadaf Ebrahimi /* ================================= DATA ================================= */
248*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
249*9a0e4156SSadaf Ebrahimi 
250*9a0e4156SSadaf Ebrahimi /* Opcode handler jump table */
251*9a0e4156SSadaf Ebrahimi static instruction_struct g_instruction_table[0x10000];
252*9a0e4156SSadaf Ebrahimi 
253*9a0e4156SSadaf Ebrahimi /* used by ops like asr, ror, addq, etc */
254*9a0e4156SSadaf Ebrahimi static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};
255*9a0e4156SSadaf Ebrahimi 
256*9a0e4156SSadaf Ebrahimi static uint g_5bit_data_table[32] = {
257*9a0e4156SSadaf Ebrahimi 	32,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
258*9a0e4156SSadaf Ebrahimi 	16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
259*9a0e4156SSadaf Ebrahimi };
260*9a0e4156SSadaf Ebrahimi 
261*9a0e4156SSadaf Ebrahimi static m68k_insn s_branch_lut[] = {
262*9a0e4156SSadaf Ebrahimi 	M68K_INS_INVALID, M68K_INS_INVALID, M68K_INS_BHI, M68K_INS_BLS,
263*9a0e4156SSadaf Ebrahimi 	M68K_INS_BCC, M68K_INS_BCS, M68K_INS_BNE, M68K_INS_BEQ,
264*9a0e4156SSadaf Ebrahimi 	M68K_INS_BVC, M68K_INS_BVS, M68K_INS_BPL, M68K_INS_BMI,
265*9a0e4156SSadaf Ebrahimi 	M68K_INS_BGE, M68K_INS_BLT, M68K_INS_BGT, M68K_INS_BLE,
266*9a0e4156SSadaf Ebrahimi };
267*9a0e4156SSadaf Ebrahimi 
268*9a0e4156SSadaf Ebrahimi static m68k_insn s_dbcc_lut[] = {
269*9a0e4156SSadaf Ebrahimi 	M68K_INS_DBT, M68K_INS_DBF, M68K_INS_DBHI, M68K_INS_DBLS,
270*9a0e4156SSadaf Ebrahimi 	M68K_INS_DBCC, M68K_INS_DBCS, M68K_INS_DBNE, M68K_INS_DBEQ,
271*9a0e4156SSadaf Ebrahimi 	M68K_INS_DBVC, M68K_INS_DBVS, M68K_INS_DBPL, M68K_INS_DBMI,
272*9a0e4156SSadaf Ebrahimi 	M68K_INS_DBGE, M68K_INS_DBLT, M68K_INS_DBGT, M68K_INS_DBLE,
273*9a0e4156SSadaf Ebrahimi };
274*9a0e4156SSadaf Ebrahimi 
275*9a0e4156SSadaf Ebrahimi static m68k_insn s_scc_lut[] = {
276*9a0e4156SSadaf Ebrahimi 	M68K_INS_ST, M68K_INS_SF, M68K_INS_SHI, M68K_INS_SLS,
277*9a0e4156SSadaf Ebrahimi 	M68K_INS_SCC, M68K_INS_SCS, M68K_INS_SNE, M68K_INS_SEQ,
278*9a0e4156SSadaf Ebrahimi 	M68K_INS_SVC, M68K_INS_SVS, M68K_INS_SPL, M68K_INS_SMI,
279*9a0e4156SSadaf Ebrahimi 	M68K_INS_SGE, M68K_INS_SLT, M68K_INS_SGT, M68K_INS_SLE,
280*9a0e4156SSadaf Ebrahimi };
281*9a0e4156SSadaf Ebrahimi 
282*9a0e4156SSadaf Ebrahimi static m68k_insn s_trap_lut[] = {
283*9a0e4156SSadaf Ebrahimi 	M68K_INS_TRAPT, M68K_INS_TRAPF, M68K_INS_TRAPHI, M68K_INS_TRAPLS,
284*9a0e4156SSadaf Ebrahimi 	M68K_INS_TRAPCC, M68K_INS_TRAPCS, M68K_INS_TRAPNE, M68K_INS_TRAPEQ,
285*9a0e4156SSadaf Ebrahimi 	M68K_INS_TRAPVC, M68K_INS_TRAPVS, M68K_INS_TRAPPL, M68K_INS_TRAPMI,
286*9a0e4156SSadaf Ebrahimi 	M68K_INS_TRAPGE, M68K_INS_TRAPLT, M68K_INS_TRAPGT, M68K_INS_TRAPLE,
287*9a0e4156SSadaf Ebrahimi };
288*9a0e4156SSadaf Ebrahimi 
289*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
290*9a0e4156SSadaf Ebrahimi /* =========================== UTILITY FUNCTIONS ========================== */
291*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
292*9a0e4156SSadaf Ebrahimi 
293*9a0e4156SSadaf Ebrahimi #define LIMIT_CPU_TYPES(info, ALLOWED_CPU_TYPES)	\
294*9a0e4156SSadaf Ebrahimi 	do {						\
295*9a0e4156SSadaf Ebrahimi 		if (!(info->type & ALLOWED_CPU_TYPES)) {	\
296*9a0e4156SSadaf Ebrahimi 			d68000_invalid(info);		\
297*9a0e4156SSadaf Ebrahimi 			return;				\
298*9a0e4156SSadaf Ebrahimi 		}					\
299*9a0e4156SSadaf Ebrahimi 	} while (0)
300*9a0e4156SSadaf Ebrahimi 
peek_imm_8(const m68k_info * info)301*9a0e4156SSadaf Ebrahimi static unsigned int peek_imm_8(const m68k_info *info)  { return (m68k_read_safe_16((info), (info)->pc)&0xff); }
peek_imm_16(const m68k_info * info)302*9a0e4156SSadaf Ebrahimi static unsigned int peek_imm_16(const m68k_info *info) { return m68k_read_safe_16((info), (info)->pc); }
peek_imm_32(const m68k_info * info)303*9a0e4156SSadaf Ebrahimi static unsigned int peek_imm_32(const m68k_info *info) { return m68k_read_safe_32((info), (info)->pc); }
peek_imm_64(const m68k_info * info)304*9a0e4156SSadaf Ebrahimi static unsigned long long peek_imm_64(const m68k_info *info) { return m68k_read_safe_64((info), (info)->pc); }
305*9a0e4156SSadaf Ebrahimi 
read_imm_8(m68k_info * info)306*9a0e4156SSadaf Ebrahimi static unsigned int read_imm_8(m68k_info *info)  { const unsigned int value = peek_imm_8(info);  (info)->pc+=2; return value; }
read_imm_16(m68k_info * info)307*9a0e4156SSadaf Ebrahimi static unsigned int read_imm_16(m68k_info *info) { const unsigned int value = peek_imm_16(info); (info)->pc+=2; return value; }
read_imm_32(m68k_info * info)308*9a0e4156SSadaf Ebrahimi static unsigned int read_imm_32(m68k_info *info) { const unsigned int value = peek_imm_32(info); (info)->pc+=4; return value; }
read_imm_64(m68k_info * info)309*9a0e4156SSadaf Ebrahimi static unsigned long long read_imm_64(m68k_info *info) { const unsigned long long value = peek_imm_64(info); (info)->pc+=8; return value; }
310*9a0e4156SSadaf Ebrahimi 
311*9a0e4156SSadaf Ebrahimi /* Fake a split interface */
312*9a0e4156SSadaf Ebrahimi #define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0)
313*9a0e4156SSadaf Ebrahimi #define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1)
314*9a0e4156SSadaf Ebrahimi #define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2)
315*9a0e4156SSadaf Ebrahimi 
316*9a0e4156SSadaf Ebrahimi #define get_imm_str_s8() get_imm_str_s(0)
317*9a0e4156SSadaf Ebrahimi #define get_imm_str_s16() get_imm_str_s(1)
318*9a0e4156SSadaf Ebrahimi #define get_imm_str_s32() get_imm_str_s(2)
319*9a0e4156SSadaf Ebrahimi 
320*9a0e4156SSadaf Ebrahimi #define get_imm_str_u8() get_imm_str_u(0)
321*9a0e4156SSadaf Ebrahimi #define get_imm_str_u16() get_imm_str_u(1)
322*9a0e4156SSadaf Ebrahimi #define get_imm_str_u32() get_imm_str_u(2)
323*9a0e4156SSadaf Ebrahimi 
324*9a0e4156SSadaf Ebrahimi 
325*9a0e4156SSadaf Ebrahimi /* 100% portable signed int generators */
make_int_8(int value)326*9a0e4156SSadaf Ebrahimi static int make_int_8(int value)
327*9a0e4156SSadaf Ebrahimi {
328*9a0e4156SSadaf Ebrahimi 	return (value & 0x80) ? value | ~0xff : value & 0xff;
329*9a0e4156SSadaf Ebrahimi }
330*9a0e4156SSadaf Ebrahimi 
make_int_16(int value)331*9a0e4156SSadaf Ebrahimi static int make_int_16(int value)
332*9a0e4156SSadaf Ebrahimi {
333*9a0e4156SSadaf Ebrahimi 	return (value & 0x8000) ? value | ~0xffff : value & 0xffff;
334*9a0e4156SSadaf Ebrahimi }
335*9a0e4156SSadaf Ebrahimi 
get_with_index_address_mode(m68k_info * info,cs_m68k_op * op,uint instruction,uint size,bool is_pc)336*9a0e4156SSadaf Ebrahimi static void get_with_index_address_mode(m68k_info *info, cs_m68k_op* op, uint instruction, uint size, bool is_pc)
337*9a0e4156SSadaf Ebrahimi {
338*9a0e4156SSadaf Ebrahimi 	uint extension = read_imm_16(info);
339*9a0e4156SSadaf Ebrahimi 
340*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_AREGI_INDEX_BASE_DISP;
341*9a0e4156SSadaf Ebrahimi 
342*9a0e4156SSadaf Ebrahimi 	if (EXT_FULL(extension)) {
343*9a0e4156SSadaf Ebrahimi 		uint preindex;
344*9a0e4156SSadaf Ebrahimi 		uint postindex;
345*9a0e4156SSadaf Ebrahimi 
346*9a0e4156SSadaf Ebrahimi 		op->mem.base_reg = M68K_REG_INVALID;
347*9a0e4156SSadaf Ebrahimi 		op->mem.index_reg = M68K_REG_INVALID;
348*9a0e4156SSadaf Ebrahimi 
349*9a0e4156SSadaf Ebrahimi 		/* Not sure how to deal with this?
350*9a0e4156SSadaf Ebrahimi 		   if (EXT_EFFECTIVE_ZERO(extension)) {
351*9a0e4156SSadaf Ebrahimi 		   strcpy(mode, "0");
352*9a0e4156SSadaf Ebrahimi 		   break;
353*9a0e4156SSadaf Ebrahimi 		   }
354*9a0e4156SSadaf Ebrahimi 		 */
355*9a0e4156SSadaf Ebrahimi 
356*9a0e4156SSadaf Ebrahimi 		op->mem.in_disp = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32(info) : read_imm_16(info)) : 0;
357*9a0e4156SSadaf Ebrahimi 		op->mem.out_disp = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32(info) : read_imm_16(info)) : 0;
358*9a0e4156SSadaf Ebrahimi 
359*9a0e4156SSadaf Ebrahimi 		if (EXT_BASE_REGISTER_PRESENT(extension)) {
360*9a0e4156SSadaf Ebrahimi 			if (is_pc) {
361*9a0e4156SSadaf Ebrahimi 				op->mem.base_reg = M68K_REG_PC;
362*9a0e4156SSadaf Ebrahimi 			} else {
363*9a0e4156SSadaf Ebrahimi 				op->mem.base_reg = M68K_REG_A0 + (instruction & 7);
364*9a0e4156SSadaf Ebrahimi 			}
365*9a0e4156SSadaf Ebrahimi 		}
366*9a0e4156SSadaf Ebrahimi 
367*9a0e4156SSadaf Ebrahimi 		if (EXT_INDEX_REGISTER_PRESENT(extension)) {
368*9a0e4156SSadaf Ebrahimi 			if (EXT_INDEX_AR(extension)) {
369*9a0e4156SSadaf Ebrahimi 				op->mem.index_reg = M68K_REG_A0 + EXT_INDEX_REGISTER(extension);
370*9a0e4156SSadaf Ebrahimi 			} else {
371*9a0e4156SSadaf Ebrahimi 				op->mem.index_reg = M68K_REG_D0 + EXT_INDEX_REGISTER(extension);
372*9a0e4156SSadaf Ebrahimi 			}
373*9a0e4156SSadaf Ebrahimi 
374*9a0e4156SSadaf Ebrahimi 			op->mem.index_size = EXT_INDEX_LONG(extension) ? 1 : 0;
375*9a0e4156SSadaf Ebrahimi 
376*9a0e4156SSadaf Ebrahimi 			if (EXT_INDEX_SCALE(extension)) {
377*9a0e4156SSadaf Ebrahimi 				op->mem.scale = 1 << EXT_INDEX_SCALE(extension);
378*9a0e4156SSadaf Ebrahimi 			}
379*9a0e4156SSadaf Ebrahimi 		}
380*9a0e4156SSadaf Ebrahimi 
381*9a0e4156SSadaf Ebrahimi 		preindex = (extension & 7) > 0 && (extension & 7) < 4;
382*9a0e4156SSadaf Ebrahimi 		postindex = (extension & 7) > 4;
383*9a0e4156SSadaf Ebrahimi 
384*9a0e4156SSadaf Ebrahimi 		if (preindex) {
385*9a0e4156SSadaf Ebrahimi 			op->address_mode = is_pc ? M68K_AM_PC_MEMI_PRE_INDEX : M68K_AM_MEMI_PRE_INDEX;
386*9a0e4156SSadaf Ebrahimi 		} else if (postindex) {
387*9a0e4156SSadaf Ebrahimi 			op->address_mode = is_pc ? M68K_AM_PC_MEMI_POST_INDEX : M68K_AM_MEMI_POST_INDEX;
388*9a0e4156SSadaf Ebrahimi 		}
389*9a0e4156SSadaf Ebrahimi 
390*9a0e4156SSadaf Ebrahimi 		return;
391*9a0e4156SSadaf Ebrahimi 	}
392*9a0e4156SSadaf Ebrahimi 
393*9a0e4156SSadaf Ebrahimi 	op->mem.index_reg = (EXT_INDEX_AR(extension) ? M68K_REG_A0 : M68K_REG_D0) + EXT_INDEX_REGISTER(extension);
394*9a0e4156SSadaf Ebrahimi 	op->mem.index_size = EXT_INDEX_LONG(extension) ? 1 : 0;
395*9a0e4156SSadaf Ebrahimi 
396*9a0e4156SSadaf Ebrahimi 	if (EXT_8BIT_DISPLACEMENT(extension) == 0) {
397*9a0e4156SSadaf Ebrahimi 		if (is_pc) {
398*9a0e4156SSadaf Ebrahimi 			op->mem.base_reg = M68K_REG_PC;
399*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_PCI_INDEX_BASE_DISP;
400*9a0e4156SSadaf Ebrahimi 		} else {
401*9a0e4156SSadaf Ebrahimi 			op->mem.base_reg = M68K_REG_A0 + (instruction & 7);
402*9a0e4156SSadaf Ebrahimi 		}
403*9a0e4156SSadaf Ebrahimi 	} else {
404*9a0e4156SSadaf Ebrahimi 		if (is_pc) {
405*9a0e4156SSadaf Ebrahimi 			op->mem.base_reg = M68K_REG_PC;
406*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_PCI_INDEX_8_BIT_DISP;
407*9a0e4156SSadaf Ebrahimi 		} else {
408*9a0e4156SSadaf Ebrahimi 			op->mem.base_reg = M68K_REG_A0 + (instruction & 7);
409*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_AREGI_INDEX_8_BIT_DISP;
410*9a0e4156SSadaf Ebrahimi 		}
411*9a0e4156SSadaf Ebrahimi 
412*9a0e4156SSadaf Ebrahimi 		op->mem.disp = (int8_t)(extension & 0xff);
413*9a0e4156SSadaf Ebrahimi 	}
414*9a0e4156SSadaf Ebrahimi 
415*9a0e4156SSadaf Ebrahimi 	if (EXT_INDEX_SCALE(extension)) {
416*9a0e4156SSadaf Ebrahimi 		op->mem.scale = 1 << EXT_INDEX_SCALE(extension);
417*9a0e4156SSadaf Ebrahimi 	}
418*9a0e4156SSadaf Ebrahimi }
419*9a0e4156SSadaf Ebrahimi 
420*9a0e4156SSadaf Ebrahimi /* Make string of effective address mode */
get_ea_mode_op(m68k_info * info,cs_m68k_op * op,uint instruction,uint size)421*9a0e4156SSadaf Ebrahimi static void get_ea_mode_op(m68k_info *info, cs_m68k_op* op, uint instruction, uint size)
422*9a0e4156SSadaf Ebrahimi {
423*9a0e4156SSadaf Ebrahimi 	// default to memory
424*9a0e4156SSadaf Ebrahimi 
425*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_MEM;
426*9a0e4156SSadaf Ebrahimi 
427*9a0e4156SSadaf Ebrahimi 	switch (instruction & 0x3f) {
428*9a0e4156SSadaf Ebrahimi 		case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
429*9a0e4156SSadaf Ebrahimi 			/* data register direct */
430*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REG_DIRECT_DATA;
431*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_D0 + (instruction & 7);
432*9a0e4156SSadaf Ebrahimi 			op->type = M68K_OP_REG;
433*9a0e4156SSadaf Ebrahimi 			break;
434*9a0e4156SSadaf Ebrahimi 
435*9a0e4156SSadaf Ebrahimi 		case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
436*9a0e4156SSadaf Ebrahimi 			/* address register direct */
437*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REG_DIRECT_ADDR;
438*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_A0 + (instruction & 7);
439*9a0e4156SSadaf Ebrahimi 			op->type = M68K_OP_REG;
440*9a0e4156SSadaf Ebrahimi 			break;
441*9a0e4156SSadaf Ebrahimi 
442*9a0e4156SSadaf Ebrahimi 		case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
443*9a0e4156SSadaf Ebrahimi 			/* address register indirect */
444*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REGI_ADDR;
445*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_A0 + (instruction & 7);
446*9a0e4156SSadaf Ebrahimi 			break;
447*9a0e4156SSadaf Ebrahimi 
448*9a0e4156SSadaf Ebrahimi 		case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:
449*9a0e4156SSadaf Ebrahimi 			/* address register indirect with postincrement */
450*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REGI_ADDR_POST_INC;
451*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_A0 + (instruction & 7);
452*9a0e4156SSadaf Ebrahimi 			break;
453*9a0e4156SSadaf Ebrahimi 
454*9a0e4156SSadaf Ebrahimi 		case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:
455*9a0e4156SSadaf Ebrahimi 			/* address register indirect with predecrement */
456*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REGI_ADDR_PRE_DEC;
457*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_A0 + (instruction & 7);
458*9a0e4156SSadaf Ebrahimi 			break;
459*9a0e4156SSadaf Ebrahimi 
460*9a0e4156SSadaf Ebrahimi 		case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
461*9a0e4156SSadaf Ebrahimi 			/* address register indirect with displacement*/
462*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_REGI_ADDR_DISP;
463*9a0e4156SSadaf Ebrahimi 			op->mem.base_reg = M68K_REG_A0 + (instruction & 7);
464*9a0e4156SSadaf Ebrahimi 			op->mem.disp = (int16_t)read_imm_16(info);
465*9a0e4156SSadaf Ebrahimi 			break;
466*9a0e4156SSadaf Ebrahimi 
467*9a0e4156SSadaf Ebrahimi 		case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
468*9a0e4156SSadaf Ebrahimi 			/* address register indirect with index */
469*9a0e4156SSadaf Ebrahimi 			get_with_index_address_mode(info, op, instruction, size, false);
470*9a0e4156SSadaf Ebrahimi 			break;
471*9a0e4156SSadaf Ebrahimi 
472*9a0e4156SSadaf Ebrahimi 		case 0x38:
473*9a0e4156SSadaf Ebrahimi 			/* absolute short address */
474*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_ABSOLUTE_DATA_SHORT;
475*9a0e4156SSadaf Ebrahimi 			op->imm = read_imm_16(info);
476*9a0e4156SSadaf Ebrahimi 			break;
477*9a0e4156SSadaf Ebrahimi 
478*9a0e4156SSadaf Ebrahimi 		case 0x39:
479*9a0e4156SSadaf Ebrahimi 			/* absolute long address */
480*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_ABSOLUTE_DATA_LONG;
481*9a0e4156SSadaf Ebrahimi 			op->imm = read_imm_32(info);
482*9a0e4156SSadaf Ebrahimi 			break;
483*9a0e4156SSadaf Ebrahimi 
484*9a0e4156SSadaf Ebrahimi 		case 0x3a:
485*9a0e4156SSadaf Ebrahimi 			/* program counter with displacement */
486*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_PCI_DISP;
487*9a0e4156SSadaf Ebrahimi 			op->mem.disp = (int16_t)read_imm_16(info);
488*9a0e4156SSadaf Ebrahimi 			break;
489*9a0e4156SSadaf Ebrahimi 
490*9a0e4156SSadaf Ebrahimi 		case 0x3b:
491*9a0e4156SSadaf Ebrahimi 			/* program counter with index */
492*9a0e4156SSadaf Ebrahimi 			get_with_index_address_mode(info, op, instruction, size, true);
493*9a0e4156SSadaf Ebrahimi 			break;
494*9a0e4156SSadaf Ebrahimi 
495*9a0e4156SSadaf Ebrahimi 		case 0x3c:
496*9a0e4156SSadaf Ebrahimi 			op->address_mode = M68K_AM_IMMEDIATE;
497*9a0e4156SSadaf Ebrahimi 			op->type = M68K_OP_IMM;
498*9a0e4156SSadaf Ebrahimi 
499*9a0e4156SSadaf Ebrahimi 			if (size == 1)
500*9a0e4156SSadaf Ebrahimi 				op->imm = read_imm_8(info) & 0xff;
501*9a0e4156SSadaf Ebrahimi 			else if (size == 2)
502*9a0e4156SSadaf Ebrahimi 				op->imm = read_imm_16(info) & 0xffff;
503*9a0e4156SSadaf Ebrahimi 			else if (size == 4)
504*9a0e4156SSadaf Ebrahimi 				op->imm = read_imm_32(info);
505*9a0e4156SSadaf Ebrahimi 			else
506*9a0e4156SSadaf Ebrahimi 				op->imm = read_imm_64(info);
507*9a0e4156SSadaf Ebrahimi 
508*9a0e4156SSadaf Ebrahimi 			break;
509*9a0e4156SSadaf Ebrahimi 
510*9a0e4156SSadaf Ebrahimi 		default:
511*9a0e4156SSadaf Ebrahimi 			break;
512*9a0e4156SSadaf Ebrahimi 	}
513*9a0e4156SSadaf Ebrahimi }
514*9a0e4156SSadaf Ebrahimi 
set_insn_group(m68k_info * info,m68k_group_type group)515*9a0e4156SSadaf Ebrahimi static void set_insn_group(m68k_info *info, m68k_group_type group)
516*9a0e4156SSadaf Ebrahimi {
517*9a0e4156SSadaf Ebrahimi 	info->groups[info->groups_count++] = (uint8_t)group;
518*9a0e4156SSadaf Ebrahimi }
519*9a0e4156SSadaf Ebrahimi 
build_init_op(m68k_info * info,int opcode,int count,int size)520*9a0e4156SSadaf Ebrahimi static cs_m68k* build_init_op(m68k_info *info, int opcode, int count, int size)
521*9a0e4156SSadaf Ebrahimi {
522*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
523*9a0e4156SSadaf Ebrahimi 
524*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, opcode);
525*9a0e4156SSadaf Ebrahimi 
526*9a0e4156SSadaf Ebrahimi 	ext = &info->extension;
527*9a0e4156SSadaf Ebrahimi 
528*9a0e4156SSadaf Ebrahimi 	ext->op_count = (uint8_t)count;
529*9a0e4156SSadaf Ebrahimi 	ext->op_size.type = M68K_SIZE_TYPE_CPU;
530*9a0e4156SSadaf Ebrahimi 	ext->op_size.cpu_size = size;
531*9a0e4156SSadaf Ebrahimi 
532*9a0e4156SSadaf Ebrahimi 	return ext;
533*9a0e4156SSadaf Ebrahimi }
534*9a0e4156SSadaf Ebrahimi 
build_re_gen_1(m68k_info * info,bool isDreg,int opcode,uint8_t size)535*9a0e4156SSadaf Ebrahimi static void build_re_gen_1(m68k_info *info, bool isDreg, int opcode, uint8_t size)
536*9a0e4156SSadaf Ebrahimi {
537*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
538*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
539*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
540*9a0e4156SSadaf Ebrahimi 
541*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
542*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
543*9a0e4156SSadaf Ebrahimi 
544*9a0e4156SSadaf Ebrahimi 	if (isDreg) {
545*9a0e4156SSadaf Ebrahimi 		op0->address_mode = M68K_AM_REG_DIRECT_DATA;
546*9a0e4156SSadaf Ebrahimi 		op0->reg = M68K_REG_D0 + ((info->ir >> 9 ) & 7);
547*9a0e4156SSadaf Ebrahimi 	} else {
548*9a0e4156SSadaf Ebrahimi 		op0->address_mode = M68K_AM_REG_DIRECT_ADDR;
549*9a0e4156SSadaf Ebrahimi 		op0->reg = M68K_REG_A0 + ((info->ir >> 9 ) & 7);
550*9a0e4156SSadaf Ebrahimi 	}
551*9a0e4156SSadaf Ebrahimi 
552*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, size);
553*9a0e4156SSadaf Ebrahimi }
554*9a0e4156SSadaf Ebrahimi 
build_re_1(m68k_info * info,int opcode,uint8_t size)555*9a0e4156SSadaf Ebrahimi static void build_re_1(m68k_info *info, int opcode, uint8_t size)
556*9a0e4156SSadaf Ebrahimi {
557*9a0e4156SSadaf Ebrahimi 	build_re_gen_1(info, true, opcode, size);
558*9a0e4156SSadaf Ebrahimi }
559*9a0e4156SSadaf Ebrahimi 
build_er_gen_1(m68k_info * info,bool isDreg,int opcode,uint8_t size)560*9a0e4156SSadaf Ebrahimi static void build_er_gen_1(m68k_info *info, bool isDreg, int opcode, uint8_t size)
561*9a0e4156SSadaf Ebrahimi {
562*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
563*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
564*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
565*9a0e4156SSadaf Ebrahimi 
566*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
567*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
568*9a0e4156SSadaf Ebrahimi 
569*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, size);
570*9a0e4156SSadaf Ebrahimi 
571*9a0e4156SSadaf Ebrahimi 	if (isDreg) {
572*9a0e4156SSadaf Ebrahimi 		op1->address_mode = M68K_AM_REG_DIRECT_DATA;
573*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
574*9a0e4156SSadaf Ebrahimi 	} else {
575*9a0e4156SSadaf Ebrahimi 		op1->address_mode = M68K_AM_REG_DIRECT_ADDR;
576*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7);
577*9a0e4156SSadaf Ebrahimi 	}
578*9a0e4156SSadaf Ebrahimi }
579*9a0e4156SSadaf Ebrahimi 
build_rr(m68k_info * info,int opcode,uint8_t size,int imm)580*9a0e4156SSadaf Ebrahimi static void build_rr(m68k_info *info, int opcode, uint8_t size, int imm)
581*9a0e4156SSadaf Ebrahimi {
582*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
583*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
584*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op2;
585*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
586*9a0e4156SSadaf Ebrahimi 
587*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
588*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
589*9a0e4156SSadaf Ebrahimi 	op2 = &ext->operands[2];
590*9a0e4156SSadaf Ebrahimi 
591*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REG_DIRECT_DATA;
592*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + (info->ir & 7);
593*9a0e4156SSadaf Ebrahimi 
594*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_DATA;
595*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
596*9a0e4156SSadaf Ebrahimi 
597*9a0e4156SSadaf Ebrahimi 	if (imm > 0) {
598*9a0e4156SSadaf Ebrahimi 		ext->op_count = 3;
599*9a0e4156SSadaf Ebrahimi 		op2->type = M68K_OP_IMM;
600*9a0e4156SSadaf Ebrahimi 		op2->address_mode = M68K_AM_IMMEDIATE;
601*9a0e4156SSadaf Ebrahimi 		op2->imm = imm;
602*9a0e4156SSadaf Ebrahimi 	}
603*9a0e4156SSadaf Ebrahimi }
604*9a0e4156SSadaf Ebrahimi 
build_r(m68k_info * info,int opcode,uint8_t size)605*9a0e4156SSadaf Ebrahimi static void build_r(m68k_info *info, int opcode, uint8_t size)
606*9a0e4156SSadaf Ebrahimi {
607*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
608*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
609*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
610*9a0e4156SSadaf Ebrahimi 
611*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
612*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
613*9a0e4156SSadaf Ebrahimi 
614*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REG_DIRECT_DATA;
615*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
616*9a0e4156SSadaf Ebrahimi 
617*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_DATA;
618*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + (info->ir & 7);
619*9a0e4156SSadaf Ebrahimi }
620*9a0e4156SSadaf Ebrahimi 
build_imm_ea(m68k_info * info,int opcode,uint8_t size,int imm)621*9a0e4156SSadaf Ebrahimi static void build_imm_ea(m68k_info *info, int opcode, uint8_t size, int imm)
622*9a0e4156SSadaf Ebrahimi {
623*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
624*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
625*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
626*9a0e4156SSadaf Ebrahimi 
627*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
628*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
629*9a0e4156SSadaf Ebrahimi 
630*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
631*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
632*9a0e4156SSadaf Ebrahimi 	op0->imm = imm;
633*9a0e4156SSadaf Ebrahimi 
634*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, size);
635*9a0e4156SSadaf Ebrahimi }
636*9a0e4156SSadaf Ebrahimi 
build_3bit_d(m68k_info * info,int opcode,int size)637*9a0e4156SSadaf Ebrahimi static void build_3bit_d(m68k_info *info, int opcode, int size)
638*9a0e4156SSadaf Ebrahimi {
639*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
640*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
641*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
642*9a0e4156SSadaf Ebrahimi 
643*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
644*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
645*9a0e4156SSadaf Ebrahimi 
646*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
647*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
648*9a0e4156SSadaf Ebrahimi 	op0->imm = g_3bit_qdata_table[(info->ir >> 9) & 7];
649*9a0e4156SSadaf Ebrahimi 
650*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_DATA;
651*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + (info->ir & 7);
652*9a0e4156SSadaf Ebrahimi }
653*9a0e4156SSadaf Ebrahimi 
build_3bit_ea(m68k_info * info,int opcode,int size)654*9a0e4156SSadaf Ebrahimi static void build_3bit_ea(m68k_info *info, int opcode, int size)
655*9a0e4156SSadaf Ebrahimi {
656*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
657*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
658*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
659*9a0e4156SSadaf Ebrahimi 
660*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
661*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
662*9a0e4156SSadaf Ebrahimi 
663*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
664*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
665*9a0e4156SSadaf Ebrahimi 	op0->imm = g_3bit_qdata_table[(info->ir >> 9) & 7];
666*9a0e4156SSadaf Ebrahimi 
667*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, size);
668*9a0e4156SSadaf Ebrahimi }
669*9a0e4156SSadaf Ebrahimi 
build_mm(m68k_info * info,int opcode,uint8_t size,int imm)670*9a0e4156SSadaf Ebrahimi static void build_mm(m68k_info *info, int opcode, uint8_t size, int imm)
671*9a0e4156SSadaf Ebrahimi {
672*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
673*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
674*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op2;
675*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
676*9a0e4156SSadaf Ebrahimi 
677*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
678*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
679*9a0e4156SSadaf Ebrahimi 	op2 = &ext->operands[2];
680*9a0e4156SSadaf Ebrahimi 
681*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REGI_ADDR_PRE_DEC;
682*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_A0 + (info->ir & 7);
683*9a0e4156SSadaf Ebrahimi 
684*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REGI_ADDR_PRE_DEC;
685*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7);
686*9a0e4156SSadaf Ebrahimi 
687*9a0e4156SSadaf Ebrahimi 	if (imm > 0) {
688*9a0e4156SSadaf Ebrahimi 		ext->op_count = 3;
689*9a0e4156SSadaf Ebrahimi 		op2->type = M68K_OP_IMM;
690*9a0e4156SSadaf Ebrahimi 		op2->address_mode = M68K_AM_IMMEDIATE;
691*9a0e4156SSadaf Ebrahimi 		op2->imm = imm;
692*9a0e4156SSadaf Ebrahimi 	}
693*9a0e4156SSadaf Ebrahimi }
694*9a0e4156SSadaf Ebrahimi 
build_ea(m68k_info * info,int opcode,uint8_t size)695*9a0e4156SSadaf Ebrahimi static void build_ea(m68k_info *info, int opcode, uint8_t size)
696*9a0e4156SSadaf Ebrahimi {
697*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, size);
698*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, size);
699*9a0e4156SSadaf Ebrahimi }
700*9a0e4156SSadaf Ebrahimi 
build_ea_a(m68k_info * info,int opcode,uint8_t size)701*9a0e4156SSadaf Ebrahimi static void build_ea_a(m68k_info *info, int opcode, uint8_t size)
702*9a0e4156SSadaf Ebrahimi {
703*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
704*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
705*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
706*9a0e4156SSadaf Ebrahimi 
707*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
708*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
709*9a0e4156SSadaf Ebrahimi 
710*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, size);
711*9a0e4156SSadaf Ebrahimi 
712*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_ADDR;
713*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7);
714*9a0e4156SSadaf Ebrahimi }
715*9a0e4156SSadaf Ebrahimi 
build_ea_ea(m68k_info * info,int opcode,int size)716*9a0e4156SSadaf Ebrahimi static void build_ea_ea(m68k_info *info, int opcode, int size)
717*9a0e4156SSadaf Ebrahimi {
718*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
719*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
720*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
721*9a0e4156SSadaf Ebrahimi 
722*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
723*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
724*9a0e4156SSadaf Ebrahimi 
725*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, size);
726*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, (((info->ir>>9) & 7) | ((info->ir>>3) & 0x38)), size);
727*9a0e4156SSadaf Ebrahimi }
728*9a0e4156SSadaf Ebrahimi 
build_pi_pi(m68k_info * info,int opcode,int size)729*9a0e4156SSadaf Ebrahimi static void build_pi_pi(m68k_info *info, int opcode, int size)
730*9a0e4156SSadaf Ebrahimi {
731*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
732*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
733*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
734*9a0e4156SSadaf Ebrahimi 
735*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
736*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
737*9a0e4156SSadaf Ebrahimi 
738*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REGI_ADDR_POST_INC;
739*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_A0 + (info->ir & 7);
740*9a0e4156SSadaf Ebrahimi 
741*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REGI_ADDR_POST_INC;
742*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7);
743*9a0e4156SSadaf Ebrahimi }
744*9a0e4156SSadaf Ebrahimi 
build_imm_special_reg(m68k_info * info,int opcode,int imm,int size,m68k_reg reg)745*9a0e4156SSadaf Ebrahimi static void build_imm_special_reg(m68k_info *info, int opcode, int imm, int size, m68k_reg reg)
746*9a0e4156SSadaf Ebrahimi {
747*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
748*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
749*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
750*9a0e4156SSadaf Ebrahimi 
751*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
752*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
753*9a0e4156SSadaf Ebrahimi 
754*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
755*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
756*9a0e4156SSadaf Ebrahimi 	op0->imm = imm;
757*9a0e4156SSadaf Ebrahimi 
758*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
759*9a0e4156SSadaf Ebrahimi 	op1->reg = reg;
760*9a0e4156SSadaf Ebrahimi }
761*9a0e4156SSadaf Ebrahimi 
build_relative_branch(m68k_info * info,int opcode,int size,int displacement)762*9a0e4156SSadaf Ebrahimi static void build_relative_branch(m68k_info *info, int opcode, int size, int displacement)
763*9a0e4156SSadaf Ebrahimi {
764*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
765*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, size);
766*9a0e4156SSadaf Ebrahimi 
767*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
768*9a0e4156SSadaf Ebrahimi 
769*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_BR_DISP;
770*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_BRANCH_DISPLACEMENT;
771*9a0e4156SSadaf Ebrahimi 	op->br_disp.disp = displacement;
772*9a0e4156SSadaf Ebrahimi 	op->br_disp.disp_size = size;
773*9a0e4156SSadaf Ebrahimi 
774*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
775*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_BRANCH_RELATIVE);
776*9a0e4156SSadaf Ebrahimi }
777*9a0e4156SSadaf Ebrahimi 
build_absolute_jump_with_immediate(m68k_info * info,int opcode,int size,int immediate)778*9a0e4156SSadaf Ebrahimi static void build_absolute_jump_with_immediate(m68k_info *info, int opcode, int size, int immediate)
779*9a0e4156SSadaf Ebrahimi {
780*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
781*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, size);
782*9a0e4156SSadaf Ebrahimi 
783*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
784*9a0e4156SSadaf Ebrahimi 
785*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_IMM;
786*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_IMMEDIATE;
787*9a0e4156SSadaf Ebrahimi 	op->imm = immediate;
788*9a0e4156SSadaf Ebrahimi 
789*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
790*9a0e4156SSadaf Ebrahimi }
791*9a0e4156SSadaf Ebrahimi 
build_bcc(m68k_info * info,int size,int displacement)792*9a0e4156SSadaf Ebrahimi static void build_bcc(m68k_info *info, int size, int displacement)
793*9a0e4156SSadaf Ebrahimi {
794*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, s_branch_lut[(info->ir >> 8) & 0xf], size, displacement);
795*9a0e4156SSadaf Ebrahimi }
796*9a0e4156SSadaf Ebrahimi 
build_trap(m68k_info * info,int size,int immediate)797*9a0e4156SSadaf Ebrahimi static void build_trap(m68k_info *info, int size, int immediate)
798*9a0e4156SSadaf Ebrahimi {
799*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, s_trap_lut[(info->ir >> 8) & 0xf], size, immediate);
800*9a0e4156SSadaf Ebrahimi }
801*9a0e4156SSadaf Ebrahimi 
build_dbxx(m68k_info * info,int opcode,int size,int displacement)802*9a0e4156SSadaf Ebrahimi static void build_dbxx(m68k_info *info, int opcode, int size, int displacement)
803*9a0e4156SSadaf Ebrahimi {
804*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
805*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
806*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
807*9a0e4156SSadaf Ebrahimi 
808*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
809*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
810*9a0e4156SSadaf Ebrahimi 
811*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REG_DIRECT_DATA;
812*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + (info->ir & 7);
813*9a0e4156SSadaf Ebrahimi 
814*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_BR_DISP;
815*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_BRANCH_DISPLACEMENT;
816*9a0e4156SSadaf Ebrahimi 	op1->br_disp.disp = displacement;
817*9a0e4156SSadaf Ebrahimi 	op1->br_disp.disp_size = M68K_OP_BR_DISP_SIZE_LONG;
818*9a0e4156SSadaf Ebrahimi 
819*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
820*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_BRANCH_RELATIVE);
821*9a0e4156SSadaf Ebrahimi }
822*9a0e4156SSadaf Ebrahimi 
build_dbcc(m68k_info * info,int size,int displacement)823*9a0e4156SSadaf Ebrahimi static void build_dbcc(m68k_info *info, int size, int displacement)
824*9a0e4156SSadaf Ebrahimi {
825*9a0e4156SSadaf Ebrahimi 	build_dbxx(info, s_dbcc_lut[(info->ir >> 8) & 0xf], size, displacement);
826*9a0e4156SSadaf Ebrahimi }
827*9a0e4156SSadaf Ebrahimi 
build_d_d_ea(m68k_info * info,int opcode,int size)828*9a0e4156SSadaf Ebrahimi static void build_d_d_ea(m68k_info *info, int opcode, int size)
829*9a0e4156SSadaf Ebrahimi {
830*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
831*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
832*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op2;
833*9a0e4156SSadaf Ebrahimi 	uint extension = read_imm_16(info);
834*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 3, size);
835*9a0e4156SSadaf Ebrahimi 
836*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
837*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
838*9a0e4156SSadaf Ebrahimi 	op2 = &ext->operands[2];
839*9a0e4156SSadaf Ebrahimi 
840*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REG_DIRECT_DATA;
841*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + (extension & 7);
842*9a0e4156SSadaf Ebrahimi 
843*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_DATA;
844*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + ((extension >> 6) & 7);
845*9a0e4156SSadaf Ebrahimi 
846*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op2, info->ir, size);
847*9a0e4156SSadaf Ebrahimi }
848*9a0e4156SSadaf Ebrahimi 
build_bitfield_ins(m68k_info * info,int opcode,int has_d_arg)849*9a0e4156SSadaf Ebrahimi static void build_bitfield_ins(m68k_info *info, int opcode, int has_d_arg)
850*9a0e4156SSadaf Ebrahimi {
851*9a0e4156SSadaf Ebrahimi 	uint8_t offset;
852*9a0e4156SSadaf Ebrahimi 	uint8_t width;
853*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op_ea;
854*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
855*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, 0);
856*9a0e4156SSadaf Ebrahimi 	uint extension = read_imm_16(info);
857*9a0e4156SSadaf Ebrahimi 
858*9a0e4156SSadaf Ebrahimi 	op_ea = &ext->operands[0];
859*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
860*9a0e4156SSadaf Ebrahimi 
861*9a0e4156SSadaf Ebrahimi 	if (BIT_B(extension))
862*9a0e4156SSadaf Ebrahimi 		offset = (extension >> 6) & 7;
863*9a0e4156SSadaf Ebrahimi 	else
864*9a0e4156SSadaf Ebrahimi 		offset = (extension >> 6) & 31;
865*9a0e4156SSadaf Ebrahimi 
866*9a0e4156SSadaf Ebrahimi 	if (BIT_5(extension))
867*9a0e4156SSadaf Ebrahimi 		width = extension & 7;
868*9a0e4156SSadaf Ebrahimi 	else
869*9a0e4156SSadaf Ebrahimi 		width = (uint8_t)g_5bit_data_table[extension & 31];
870*9a0e4156SSadaf Ebrahimi 
871*9a0e4156SSadaf Ebrahimi 	if (has_d_arg) {
872*9a0e4156SSadaf Ebrahimi 		ext->op_count = 2;
873*9a0e4156SSadaf Ebrahimi 		op1->address_mode = M68K_AM_REG_DIRECT_DATA;
874*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_D0 + ((extension >> 12) & 7);
875*9a0e4156SSadaf Ebrahimi 	}
876*9a0e4156SSadaf Ebrahimi 
877*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op_ea, info->ir, 1);
878*9a0e4156SSadaf Ebrahimi 
879*9a0e4156SSadaf Ebrahimi 	op_ea->mem.bitfield = 1;
880*9a0e4156SSadaf Ebrahimi 	op_ea->mem.width = width;
881*9a0e4156SSadaf Ebrahimi 	op_ea->mem.offset = offset;
882*9a0e4156SSadaf Ebrahimi }
883*9a0e4156SSadaf Ebrahimi 
build_d(m68k_info * info,int opcode,int size)884*9a0e4156SSadaf Ebrahimi static void build_d(m68k_info *info, int opcode, int size)
885*9a0e4156SSadaf Ebrahimi {
886*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, size);
887*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
888*9a0e4156SSadaf Ebrahimi 
889*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
890*9a0e4156SSadaf Ebrahimi 
891*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_REG_DIRECT_DATA;
892*9a0e4156SSadaf Ebrahimi 	op->reg = M68K_REG_D0 + (info->ir & 7);
893*9a0e4156SSadaf Ebrahimi }
894*9a0e4156SSadaf Ebrahimi 
reverse_bits(uint v)895*9a0e4156SSadaf Ebrahimi static uint16_t reverse_bits(uint v)
896*9a0e4156SSadaf Ebrahimi {
897*9a0e4156SSadaf Ebrahimi 	uint r = v; // r will be reversed bits of v; first get LSB of v
898*9a0e4156SSadaf Ebrahimi 	uint s = 16 - 1; // extra shift needed at end
899*9a0e4156SSadaf Ebrahimi 
900*9a0e4156SSadaf Ebrahimi 	for (v >>= 1; v; v >>= 1) {
901*9a0e4156SSadaf Ebrahimi 		r <<= 1;
902*9a0e4156SSadaf Ebrahimi 		r |= v & 1;
903*9a0e4156SSadaf Ebrahimi 		s--;
904*9a0e4156SSadaf Ebrahimi 	}
905*9a0e4156SSadaf Ebrahimi 
906*9a0e4156SSadaf Ebrahimi 	return r <<= s; // shift when v's highest bits are zero
907*9a0e4156SSadaf Ebrahimi }
908*9a0e4156SSadaf Ebrahimi 
reverse_bits_8(uint v)909*9a0e4156SSadaf Ebrahimi static uint8_t reverse_bits_8(uint v)
910*9a0e4156SSadaf Ebrahimi {
911*9a0e4156SSadaf Ebrahimi 	uint r = v; // r will be reversed bits of v; first get LSB of v
912*9a0e4156SSadaf Ebrahimi 	uint s = 8 - 1; // extra shift needed at end
913*9a0e4156SSadaf Ebrahimi 
914*9a0e4156SSadaf Ebrahimi 	for (v >>= 1; v; v >>= 1) {
915*9a0e4156SSadaf Ebrahimi 		r <<= 1;
916*9a0e4156SSadaf Ebrahimi 		r |= v & 1;
917*9a0e4156SSadaf Ebrahimi 		s--;
918*9a0e4156SSadaf Ebrahimi 	}
919*9a0e4156SSadaf Ebrahimi 
920*9a0e4156SSadaf Ebrahimi 	return r <<= s; // shift when v's highest bits are zero
921*9a0e4156SSadaf Ebrahimi }
922*9a0e4156SSadaf Ebrahimi 
923*9a0e4156SSadaf Ebrahimi 
build_movem_re(m68k_info * info,int opcode,int size)924*9a0e4156SSadaf Ebrahimi static void build_movem_re(m68k_info *info, int opcode, int size)
925*9a0e4156SSadaf Ebrahimi {
926*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
927*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
928*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
929*9a0e4156SSadaf Ebrahimi 
930*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
931*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
932*9a0e4156SSadaf Ebrahimi 
933*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_REG_BITS;
934*9a0e4156SSadaf Ebrahimi 	op0->register_bits = read_imm_16(info);
935*9a0e4156SSadaf Ebrahimi 
936*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, size);
937*9a0e4156SSadaf Ebrahimi 
938*9a0e4156SSadaf Ebrahimi 	if (op1->address_mode == M68K_AM_REGI_ADDR_PRE_DEC)
939*9a0e4156SSadaf Ebrahimi 		op0->register_bits = reverse_bits(op0->register_bits);
940*9a0e4156SSadaf Ebrahimi }
941*9a0e4156SSadaf Ebrahimi 
build_movem_er(m68k_info * info,int opcode,int size)942*9a0e4156SSadaf Ebrahimi static void build_movem_er(m68k_info *info, int opcode, int size)
943*9a0e4156SSadaf Ebrahimi {
944*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
945*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
946*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 2, size);
947*9a0e4156SSadaf Ebrahimi 
948*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
949*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
950*9a0e4156SSadaf Ebrahimi 
951*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_REG_BITS;
952*9a0e4156SSadaf Ebrahimi 	op1->register_bits = read_imm_16(info);
953*9a0e4156SSadaf Ebrahimi 
954*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, size);
955*9a0e4156SSadaf Ebrahimi }
956*9a0e4156SSadaf Ebrahimi 
build_imm(m68k_info * info,int opcode,int data)957*9a0e4156SSadaf Ebrahimi static void build_imm(m68k_info *info, int opcode, int data)
958*9a0e4156SSadaf Ebrahimi {
959*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
960*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, opcode, 1, 0);
961*9a0e4156SSadaf Ebrahimi 
962*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, opcode);
963*9a0e4156SSadaf Ebrahimi 
964*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
965*9a0e4156SSadaf Ebrahimi 
966*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_IMM;
967*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_IMMEDIATE;
968*9a0e4156SSadaf Ebrahimi 	op->imm = data;
969*9a0e4156SSadaf Ebrahimi }
970*9a0e4156SSadaf Ebrahimi 
build_illegal(m68k_info * info,int data)971*9a0e4156SSadaf Ebrahimi static void build_illegal(m68k_info *info, int data)
972*9a0e4156SSadaf Ebrahimi {
973*9a0e4156SSadaf Ebrahimi 	build_imm(info, M68K_INS_ILLEGAL, data);
974*9a0e4156SSadaf Ebrahimi }
975*9a0e4156SSadaf Ebrahimi 
build_invalid(m68k_info * info,int data)976*9a0e4156SSadaf Ebrahimi static void build_invalid(m68k_info *info, int data)
977*9a0e4156SSadaf Ebrahimi {
978*9a0e4156SSadaf Ebrahimi 	build_imm(info, M68K_INS_INVALID, data);
979*9a0e4156SSadaf Ebrahimi }
980*9a0e4156SSadaf Ebrahimi 
build_cas2(m68k_info * info,int size)981*9a0e4156SSadaf Ebrahimi static void build_cas2(m68k_info *info, int size)
982*9a0e4156SSadaf Ebrahimi {
983*9a0e4156SSadaf Ebrahimi 	uint word3;
984*9a0e4156SSadaf Ebrahimi 	uint extension;
985*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
986*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
987*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op2;
988*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_CAS2, 3, size);
989*9a0e4156SSadaf Ebrahimi 	int reg_0, reg_1;
990*9a0e4156SSadaf Ebrahimi 
991*9a0e4156SSadaf Ebrahimi 	/* cas2 is the only 3 words instruction, word2 and word3 have the same motif bits to check */
992*9a0e4156SSadaf Ebrahimi 	word3 = peek_imm_32(info) & 0xffff;
993*9a0e4156SSadaf Ebrahimi 	if (!instruction_is_valid(info, word3))
994*9a0e4156SSadaf Ebrahimi 		return;
995*9a0e4156SSadaf Ebrahimi 
996*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
997*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
998*9a0e4156SSadaf Ebrahimi 	op2 = &ext->operands[2];
999*9a0e4156SSadaf Ebrahimi 
1000*9a0e4156SSadaf Ebrahimi 	extension = read_imm_32(info);
1001*9a0e4156SSadaf Ebrahimi 
1002*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
1003*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_REG_PAIR;
1004*9a0e4156SSadaf Ebrahimi 	op0->reg_pair.reg_0 = (extension >> 16) & 7;
1005*9a0e4156SSadaf Ebrahimi 	op0->reg_pair.reg_1 = extension & 7;
1006*9a0e4156SSadaf Ebrahimi 
1007*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
1008*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_REG_PAIR;
1009*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_0 = (extension >> 22) & 7;
1010*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_1 = (extension >> 6) & 7;
1011*9a0e4156SSadaf Ebrahimi 
1012*9a0e4156SSadaf Ebrahimi 	reg_0 = (extension >> 28) & 7;
1013*9a0e4156SSadaf Ebrahimi 	reg_1 = (extension >> 12) & 7;
1014*9a0e4156SSadaf Ebrahimi 
1015*9a0e4156SSadaf Ebrahimi 	op2->address_mode = M68K_AM_NONE;
1016*9a0e4156SSadaf Ebrahimi 	op2->type = M68K_OP_REG_PAIR;
1017*9a0e4156SSadaf Ebrahimi 	op2->reg_pair.reg_0 = reg_0 + (BIT_1F(extension) ? 8 : 0);
1018*9a0e4156SSadaf Ebrahimi 	op2->reg_pair.reg_1 = reg_1 + (BIT_F(extension) ? 8 : 0);
1019*9a0e4156SSadaf Ebrahimi }
1020*9a0e4156SSadaf Ebrahimi 
build_chk2_cmp2(m68k_info * info,int size)1021*9a0e4156SSadaf Ebrahimi static void build_chk2_cmp2(m68k_info *info, int size)
1022*9a0e4156SSadaf Ebrahimi {
1023*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1024*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1025*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_CHK2, 2, size);
1026*9a0e4156SSadaf Ebrahimi 
1027*9a0e4156SSadaf Ebrahimi 	uint extension = read_imm_16(info);
1028*9a0e4156SSadaf Ebrahimi 
1029*9a0e4156SSadaf Ebrahimi 	if (BIT_B(extension))
1030*9a0e4156SSadaf Ebrahimi 		MCInst_setOpcode(info->inst, M68K_INS_CHK2);
1031*9a0e4156SSadaf Ebrahimi 	else
1032*9a0e4156SSadaf Ebrahimi 		MCInst_setOpcode(info->inst, M68K_INS_CMP2);
1033*9a0e4156SSadaf Ebrahimi 
1034*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1035*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1036*9a0e4156SSadaf Ebrahimi 
1037*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, size);
1038*9a0e4156SSadaf Ebrahimi 
1039*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
1040*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_REG;
1041*9a0e4156SSadaf Ebrahimi 	op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7);
1042*9a0e4156SSadaf Ebrahimi }
1043*9a0e4156SSadaf Ebrahimi 
build_move16(m68k_info * info,int data[2],int modes[2])1044*9a0e4156SSadaf Ebrahimi static void build_move16(m68k_info *info, int data[2], int modes[2])
1045*9a0e4156SSadaf Ebrahimi {
1046*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE16, 2, 0);
1047*9a0e4156SSadaf Ebrahimi 	int i;
1048*9a0e4156SSadaf Ebrahimi 
1049*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < 2; ++i) {
1050*9a0e4156SSadaf Ebrahimi 		cs_m68k_op* op = &ext->operands[i];
1051*9a0e4156SSadaf Ebrahimi 		const int d = data[i];
1052*9a0e4156SSadaf Ebrahimi 		const int m = modes[i];
1053*9a0e4156SSadaf Ebrahimi 
1054*9a0e4156SSadaf Ebrahimi 		op->type = M68K_OP_MEM;
1055*9a0e4156SSadaf Ebrahimi 
1056*9a0e4156SSadaf Ebrahimi 		if (m == M68K_AM_REGI_ADDR_POST_INC || m == M68K_AM_REG_DIRECT_ADDR) {
1057*9a0e4156SSadaf Ebrahimi 			op->address_mode = m;
1058*9a0e4156SSadaf Ebrahimi 			op->reg = M68K_REG_A0 + d;
1059*9a0e4156SSadaf Ebrahimi 		} else {
1060*9a0e4156SSadaf Ebrahimi 			op->address_mode = m;
1061*9a0e4156SSadaf Ebrahimi 			op->imm = d;
1062*9a0e4156SSadaf Ebrahimi 		}
1063*9a0e4156SSadaf Ebrahimi 	}
1064*9a0e4156SSadaf Ebrahimi }
1065*9a0e4156SSadaf Ebrahimi 
build_link(m68k_info * info,int disp,int size)1066*9a0e4156SSadaf Ebrahimi static void build_link(m68k_info *info, int disp, int size)
1067*9a0e4156SSadaf Ebrahimi {
1068*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1069*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1070*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_LINK, 2, size);
1071*9a0e4156SSadaf Ebrahimi 
1072*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1073*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1074*9a0e4156SSadaf Ebrahimi 
1075*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
1076*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_A0 + (info->ir & 7);
1077*9a0e4156SSadaf Ebrahimi 
1078*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_IMMEDIATE;
1079*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_IMM;
1080*9a0e4156SSadaf Ebrahimi 	op1->imm = disp;
1081*9a0e4156SSadaf Ebrahimi }
1082*9a0e4156SSadaf Ebrahimi 
build_cpush_cinv(m68k_info * info,int op_offset)1083*9a0e4156SSadaf Ebrahimi static void build_cpush_cinv(m68k_info *info, int op_offset)
1084*9a0e4156SSadaf Ebrahimi {
1085*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1086*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1087*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_INVALID, 2, 0);
1088*9a0e4156SSadaf Ebrahimi 
1089*9a0e4156SSadaf Ebrahimi 	switch ((info->ir >> 3) & 3) { // scope
1090*9a0e4156SSadaf Ebrahimi 		// Invalid
1091*9a0e4156SSadaf Ebrahimi 		case 0:
1092*9a0e4156SSadaf Ebrahimi 			d68000_invalid(info);
1093*9a0e4156SSadaf Ebrahimi 			return;
1094*9a0e4156SSadaf Ebrahimi 			// Line
1095*9a0e4156SSadaf Ebrahimi 		case 1:
1096*9a0e4156SSadaf Ebrahimi 			MCInst_setOpcode(info->inst, op_offset + 0);
1097*9a0e4156SSadaf Ebrahimi 			break;
1098*9a0e4156SSadaf Ebrahimi 			// Page
1099*9a0e4156SSadaf Ebrahimi 		case 2:
1100*9a0e4156SSadaf Ebrahimi 			MCInst_setOpcode(info->inst, op_offset + 1);
1101*9a0e4156SSadaf Ebrahimi 			break;
1102*9a0e4156SSadaf Ebrahimi 			// All
1103*9a0e4156SSadaf Ebrahimi 		case 3:
1104*9a0e4156SSadaf Ebrahimi 			ext->op_count = 1;
1105*9a0e4156SSadaf Ebrahimi 			MCInst_setOpcode(info->inst, op_offset + 2);
1106*9a0e4156SSadaf Ebrahimi 			break;
1107*9a0e4156SSadaf Ebrahimi 	}
1108*9a0e4156SSadaf Ebrahimi 
1109*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1110*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1111*9a0e4156SSadaf Ebrahimi 
1112*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
1113*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
1114*9a0e4156SSadaf Ebrahimi 	op0->imm = (info->ir >> 6) & 3;
1115*9a0e4156SSadaf Ebrahimi 
1116*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_MEM;
1117*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_ADDR;
1118*9a0e4156SSadaf Ebrahimi 	op1->imm = M68K_REG_A0 + (info->ir & 7);
1119*9a0e4156SSadaf Ebrahimi }
1120*9a0e4156SSadaf Ebrahimi 
build_movep_re(m68k_info * info,int size)1121*9a0e4156SSadaf Ebrahimi static void build_movep_re(m68k_info *info, int size)
1122*9a0e4156SSadaf Ebrahimi {
1123*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1124*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1125*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVEP, 2, size);
1126*9a0e4156SSadaf Ebrahimi 
1127*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1128*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1129*9a0e4156SSadaf Ebrahimi 
1130*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
1131*9a0e4156SSadaf Ebrahimi 
1132*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REGI_ADDR_DISP;
1133*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_MEM;
1134*9a0e4156SSadaf Ebrahimi 	op1->mem.base_reg = M68K_REG_A0 + (info->ir & 7);
1135*9a0e4156SSadaf Ebrahimi 	op1->mem.disp = (int16_t)read_imm_16(info);
1136*9a0e4156SSadaf Ebrahimi }
1137*9a0e4156SSadaf Ebrahimi 
build_movep_er(m68k_info * info,int size)1138*9a0e4156SSadaf Ebrahimi static void build_movep_er(m68k_info *info, int size)
1139*9a0e4156SSadaf Ebrahimi {
1140*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1141*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1142*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVEP, 2, size);
1143*9a0e4156SSadaf Ebrahimi 
1144*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1145*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1146*9a0e4156SSadaf Ebrahimi 
1147*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_REGI_ADDR_DISP;
1148*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_MEM;
1149*9a0e4156SSadaf Ebrahimi 	op0->mem.base_reg = M68K_REG_A0 + (info->ir & 7);
1150*9a0e4156SSadaf Ebrahimi 	op0->mem.disp = (int16_t)read_imm_16(info);
1151*9a0e4156SSadaf Ebrahimi 
1152*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
1153*9a0e4156SSadaf Ebrahimi }
1154*9a0e4156SSadaf Ebrahimi 
build_moves(m68k_info * info,int size)1155*9a0e4156SSadaf Ebrahimi static void build_moves(m68k_info *info, int size)
1156*9a0e4156SSadaf Ebrahimi {
1157*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1158*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1159*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVES, 2, size);
1160*9a0e4156SSadaf Ebrahimi 	uint extension = read_imm_16(info);
1161*9a0e4156SSadaf Ebrahimi 
1162*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1163*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1164*9a0e4156SSadaf Ebrahimi 
1165*9a0e4156SSadaf Ebrahimi 	if (BIT_B(extension)) {
1166*9a0e4156SSadaf Ebrahimi 		op0->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7);
1167*9a0e4156SSadaf Ebrahimi 		get_ea_mode_op(info, op1, info->ir, size);
1168*9a0e4156SSadaf Ebrahimi 	} else {
1169*9a0e4156SSadaf Ebrahimi 		get_ea_mode_op(info, op0, info->ir, size);
1170*9a0e4156SSadaf Ebrahimi 		op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7);
1171*9a0e4156SSadaf Ebrahimi 	}
1172*9a0e4156SSadaf Ebrahimi }
1173*9a0e4156SSadaf Ebrahimi 
build_er_1(m68k_info * info,int opcode,uint8_t size)1174*9a0e4156SSadaf Ebrahimi static void build_er_1(m68k_info *info, int opcode, uint8_t size)
1175*9a0e4156SSadaf Ebrahimi {
1176*9a0e4156SSadaf Ebrahimi 	build_er_gen_1(info, true, opcode, size);
1177*9a0e4156SSadaf Ebrahimi }
1178*9a0e4156SSadaf Ebrahimi 
1179*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
1180*9a0e4156SSadaf Ebrahimi /* ========================= INSTRUCTION HANDLERS ========================= */
1181*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
1182*9a0e4156SSadaf Ebrahimi /* Instruction handler function names follow this convention:
1183*9a0e4156SSadaf Ebrahimi  *
1184*9a0e4156SSadaf Ebrahimi  * d68000_NAME_EXTENSIONS(void)
1185*9a0e4156SSadaf Ebrahimi  * where NAME is the name of the opcode it handles and EXTENSIONS are any
1186*9a0e4156SSadaf Ebrahimi  * extensions for special instances of that opcode.
1187*9a0e4156SSadaf Ebrahimi  *
1188*9a0e4156SSadaf Ebrahimi  * Examples:
1189*9a0e4156SSadaf Ebrahimi  *   d68000_add_er_8(): add opcode, from effective address to register,
1190*9a0e4156SSadaf Ebrahimi  *                      size = byte
1191*9a0e4156SSadaf Ebrahimi  *
1192*9a0e4156SSadaf Ebrahimi  *   d68000_asr_s_8(): arithmetic shift right, static count, size = byte
1193*9a0e4156SSadaf Ebrahimi  *
1194*9a0e4156SSadaf Ebrahimi  *
1195*9a0e4156SSadaf Ebrahimi  * Common extensions:
1196*9a0e4156SSadaf Ebrahimi  * 8   : size = byte
1197*9a0e4156SSadaf Ebrahimi  * 16  : size = word
1198*9a0e4156SSadaf Ebrahimi  * 32  : size = long
1199*9a0e4156SSadaf Ebrahimi  * rr  : register to register
1200*9a0e4156SSadaf Ebrahimi  * mm  : memory to memory
1201*9a0e4156SSadaf Ebrahimi  * r   : register
1202*9a0e4156SSadaf Ebrahimi  * s   : static
1203*9a0e4156SSadaf Ebrahimi  * er  : effective address -> register
1204*9a0e4156SSadaf Ebrahimi  * re  : register -> effective address
1205*9a0e4156SSadaf Ebrahimi  * ea  : using effective address mode of operation
1206*9a0e4156SSadaf Ebrahimi  * d   : data register direct
1207*9a0e4156SSadaf Ebrahimi  * a   : address register direct
1208*9a0e4156SSadaf Ebrahimi  * ai  : address register indirect
1209*9a0e4156SSadaf Ebrahimi  * pi  : address register indirect with postincrement
1210*9a0e4156SSadaf Ebrahimi  * pd  : address register indirect with predecrement
1211*9a0e4156SSadaf Ebrahimi  * di  : address register indirect with displacement
1212*9a0e4156SSadaf Ebrahimi  * ix  : address register indirect with index
1213*9a0e4156SSadaf Ebrahimi  * aw  : absolute word
1214*9a0e4156SSadaf Ebrahimi  * al  : absolute long
1215*9a0e4156SSadaf Ebrahimi  */
1216*9a0e4156SSadaf Ebrahimi 
1217*9a0e4156SSadaf Ebrahimi 
d68000_invalid(m68k_info * info)1218*9a0e4156SSadaf Ebrahimi static void d68000_invalid(m68k_info *info)
1219*9a0e4156SSadaf Ebrahimi {
1220*9a0e4156SSadaf Ebrahimi 	build_invalid(info, info->ir);
1221*9a0e4156SSadaf Ebrahimi }
1222*9a0e4156SSadaf Ebrahimi 
d68000_illegal(m68k_info * info)1223*9a0e4156SSadaf Ebrahimi static void d68000_illegal(m68k_info *info)
1224*9a0e4156SSadaf Ebrahimi {
1225*9a0e4156SSadaf Ebrahimi 	build_illegal(info, info->ir);
1226*9a0e4156SSadaf Ebrahimi }
1227*9a0e4156SSadaf Ebrahimi 
d68000_1010(m68k_info * info)1228*9a0e4156SSadaf Ebrahimi static void d68000_1010(m68k_info *info)
1229*9a0e4156SSadaf Ebrahimi {
1230*9a0e4156SSadaf Ebrahimi 	build_invalid(info, info->ir);
1231*9a0e4156SSadaf Ebrahimi }
1232*9a0e4156SSadaf Ebrahimi 
d68000_1111(m68k_info * info)1233*9a0e4156SSadaf Ebrahimi static void d68000_1111(m68k_info *info)
1234*9a0e4156SSadaf Ebrahimi {
1235*9a0e4156SSadaf Ebrahimi 	build_invalid(info, info->ir);
1236*9a0e4156SSadaf Ebrahimi }
1237*9a0e4156SSadaf Ebrahimi 
d68000_abcd_rr(m68k_info * info)1238*9a0e4156SSadaf Ebrahimi static void d68000_abcd_rr(m68k_info *info)
1239*9a0e4156SSadaf Ebrahimi {
1240*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_ABCD, 1, 0);
1241*9a0e4156SSadaf Ebrahimi }
1242*9a0e4156SSadaf Ebrahimi 
d68000_abcd_mm(m68k_info * info)1243*9a0e4156SSadaf Ebrahimi static void d68000_abcd_mm(m68k_info *info)
1244*9a0e4156SSadaf Ebrahimi {
1245*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_ABCD, 1, 0);
1246*9a0e4156SSadaf Ebrahimi }
1247*9a0e4156SSadaf Ebrahimi 
d68000_add_er_8(m68k_info * info)1248*9a0e4156SSadaf Ebrahimi static void d68000_add_er_8(m68k_info *info)
1249*9a0e4156SSadaf Ebrahimi {
1250*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_ADD, 1);
1251*9a0e4156SSadaf Ebrahimi }
1252*9a0e4156SSadaf Ebrahimi 
d68000_add_er_16(m68k_info * info)1253*9a0e4156SSadaf Ebrahimi static void d68000_add_er_16(m68k_info *info)
1254*9a0e4156SSadaf Ebrahimi {
1255*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_ADD, 2);
1256*9a0e4156SSadaf Ebrahimi }
1257*9a0e4156SSadaf Ebrahimi 
d68000_add_er_32(m68k_info * info)1258*9a0e4156SSadaf Ebrahimi static void d68000_add_er_32(m68k_info *info)
1259*9a0e4156SSadaf Ebrahimi {
1260*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_ADD, 4);
1261*9a0e4156SSadaf Ebrahimi }
1262*9a0e4156SSadaf Ebrahimi 
d68000_add_re_8(m68k_info * info)1263*9a0e4156SSadaf Ebrahimi static void d68000_add_re_8(m68k_info *info)
1264*9a0e4156SSadaf Ebrahimi {
1265*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_ADD, 1);
1266*9a0e4156SSadaf Ebrahimi }
1267*9a0e4156SSadaf Ebrahimi 
d68000_add_re_16(m68k_info * info)1268*9a0e4156SSadaf Ebrahimi static void d68000_add_re_16(m68k_info *info)
1269*9a0e4156SSadaf Ebrahimi {
1270*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_ADD, 2);
1271*9a0e4156SSadaf Ebrahimi }
1272*9a0e4156SSadaf Ebrahimi 
d68000_add_re_32(m68k_info * info)1273*9a0e4156SSadaf Ebrahimi static void d68000_add_re_32(m68k_info *info)
1274*9a0e4156SSadaf Ebrahimi {
1275*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_ADD, 4);
1276*9a0e4156SSadaf Ebrahimi }
1277*9a0e4156SSadaf Ebrahimi 
d68000_adda_16(m68k_info * info)1278*9a0e4156SSadaf Ebrahimi static void d68000_adda_16(m68k_info *info)
1279*9a0e4156SSadaf Ebrahimi {
1280*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_ADDA, 2);
1281*9a0e4156SSadaf Ebrahimi }
1282*9a0e4156SSadaf Ebrahimi 
d68000_adda_32(m68k_info * info)1283*9a0e4156SSadaf Ebrahimi static void d68000_adda_32(m68k_info *info)
1284*9a0e4156SSadaf Ebrahimi {
1285*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_ADDA, 4);
1286*9a0e4156SSadaf Ebrahimi }
1287*9a0e4156SSadaf Ebrahimi 
d68000_addi_8(m68k_info * info)1288*9a0e4156SSadaf Ebrahimi static void d68000_addi_8(m68k_info *info)
1289*9a0e4156SSadaf Ebrahimi {
1290*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ADDI, 1, read_imm_8(info));
1291*9a0e4156SSadaf Ebrahimi }
1292*9a0e4156SSadaf Ebrahimi 
d68000_addi_16(m68k_info * info)1293*9a0e4156SSadaf Ebrahimi static void d68000_addi_16(m68k_info *info)
1294*9a0e4156SSadaf Ebrahimi {
1295*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ADDI, 2, read_imm_16(info));
1296*9a0e4156SSadaf Ebrahimi }
1297*9a0e4156SSadaf Ebrahimi 
d68000_addi_32(m68k_info * info)1298*9a0e4156SSadaf Ebrahimi static void d68000_addi_32(m68k_info *info)
1299*9a0e4156SSadaf Ebrahimi {
1300*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ADDI, 4, read_imm_32(info));
1301*9a0e4156SSadaf Ebrahimi }
1302*9a0e4156SSadaf Ebrahimi 
d68000_addq_8(m68k_info * info)1303*9a0e4156SSadaf Ebrahimi static void d68000_addq_8(m68k_info *info)
1304*9a0e4156SSadaf Ebrahimi {
1305*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_ADDQ, 1);
1306*9a0e4156SSadaf Ebrahimi }
1307*9a0e4156SSadaf Ebrahimi 
d68000_addq_16(m68k_info * info)1308*9a0e4156SSadaf Ebrahimi static void d68000_addq_16(m68k_info *info)
1309*9a0e4156SSadaf Ebrahimi {
1310*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_ADDQ, 2);
1311*9a0e4156SSadaf Ebrahimi }
1312*9a0e4156SSadaf Ebrahimi 
d68000_addq_32(m68k_info * info)1313*9a0e4156SSadaf Ebrahimi static void d68000_addq_32(m68k_info *info)
1314*9a0e4156SSadaf Ebrahimi {
1315*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_ADDQ, 4);
1316*9a0e4156SSadaf Ebrahimi }
1317*9a0e4156SSadaf Ebrahimi 
d68000_addx_rr_8(m68k_info * info)1318*9a0e4156SSadaf Ebrahimi static void d68000_addx_rr_8(m68k_info *info)
1319*9a0e4156SSadaf Ebrahimi {
1320*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_ADDX, 1, 0);
1321*9a0e4156SSadaf Ebrahimi }
1322*9a0e4156SSadaf Ebrahimi 
d68000_addx_rr_16(m68k_info * info)1323*9a0e4156SSadaf Ebrahimi static void d68000_addx_rr_16(m68k_info *info)
1324*9a0e4156SSadaf Ebrahimi {
1325*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_ADDX, 2, 0);
1326*9a0e4156SSadaf Ebrahimi }
1327*9a0e4156SSadaf Ebrahimi 
d68000_addx_rr_32(m68k_info * info)1328*9a0e4156SSadaf Ebrahimi static void d68000_addx_rr_32(m68k_info *info)
1329*9a0e4156SSadaf Ebrahimi {
1330*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_ADDX, 4, 0);
1331*9a0e4156SSadaf Ebrahimi }
1332*9a0e4156SSadaf Ebrahimi 
d68000_addx_mm_8(m68k_info * info)1333*9a0e4156SSadaf Ebrahimi static void d68000_addx_mm_8(m68k_info *info)
1334*9a0e4156SSadaf Ebrahimi {
1335*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_ADDX, 1, 0);
1336*9a0e4156SSadaf Ebrahimi }
1337*9a0e4156SSadaf Ebrahimi 
d68000_addx_mm_16(m68k_info * info)1338*9a0e4156SSadaf Ebrahimi static void d68000_addx_mm_16(m68k_info *info)
1339*9a0e4156SSadaf Ebrahimi {
1340*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_ADDX, 2, 0);
1341*9a0e4156SSadaf Ebrahimi }
1342*9a0e4156SSadaf Ebrahimi 
d68000_addx_mm_32(m68k_info * info)1343*9a0e4156SSadaf Ebrahimi static void d68000_addx_mm_32(m68k_info *info)
1344*9a0e4156SSadaf Ebrahimi {
1345*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_ADDX, 4, 0);
1346*9a0e4156SSadaf Ebrahimi }
1347*9a0e4156SSadaf Ebrahimi 
d68000_and_er_8(m68k_info * info)1348*9a0e4156SSadaf Ebrahimi static void d68000_and_er_8(m68k_info *info)
1349*9a0e4156SSadaf Ebrahimi {
1350*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_AND, 1);
1351*9a0e4156SSadaf Ebrahimi }
1352*9a0e4156SSadaf Ebrahimi 
d68000_and_er_16(m68k_info * info)1353*9a0e4156SSadaf Ebrahimi static void d68000_and_er_16(m68k_info *info)
1354*9a0e4156SSadaf Ebrahimi {
1355*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_AND, 2);
1356*9a0e4156SSadaf Ebrahimi }
1357*9a0e4156SSadaf Ebrahimi 
d68000_and_er_32(m68k_info * info)1358*9a0e4156SSadaf Ebrahimi static void d68000_and_er_32(m68k_info *info)
1359*9a0e4156SSadaf Ebrahimi {
1360*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_AND, 4);
1361*9a0e4156SSadaf Ebrahimi }
1362*9a0e4156SSadaf Ebrahimi 
d68000_and_re_8(m68k_info * info)1363*9a0e4156SSadaf Ebrahimi static void d68000_and_re_8(m68k_info *info)
1364*9a0e4156SSadaf Ebrahimi {
1365*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_AND, 1);
1366*9a0e4156SSadaf Ebrahimi }
1367*9a0e4156SSadaf Ebrahimi 
d68000_and_re_16(m68k_info * info)1368*9a0e4156SSadaf Ebrahimi static void d68000_and_re_16(m68k_info *info)
1369*9a0e4156SSadaf Ebrahimi {
1370*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_AND, 2);
1371*9a0e4156SSadaf Ebrahimi }
1372*9a0e4156SSadaf Ebrahimi 
d68000_and_re_32(m68k_info * info)1373*9a0e4156SSadaf Ebrahimi static void d68000_and_re_32(m68k_info *info)
1374*9a0e4156SSadaf Ebrahimi {
1375*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_AND, 4);
1376*9a0e4156SSadaf Ebrahimi }
1377*9a0e4156SSadaf Ebrahimi 
d68000_andi_8(m68k_info * info)1378*9a0e4156SSadaf Ebrahimi static void d68000_andi_8(m68k_info *info)
1379*9a0e4156SSadaf Ebrahimi {
1380*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ANDI, 1, read_imm_8(info));
1381*9a0e4156SSadaf Ebrahimi }
1382*9a0e4156SSadaf Ebrahimi 
d68000_andi_16(m68k_info * info)1383*9a0e4156SSadaf Ebrahimi static void d68000_andi_16(m68k_info *info)
1384*9a0e4156SSadaf Ebrahimi {
1385*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ANDI, 2, read_imm_16(info));
1386*9a0e4156SSadaf Ebrahimi }
1387*9a0e4156SSadaf Ebrahimi 
d68000_andi_32(m68k_info * info)1388*9a0e4156SSadaf Ebrahimi static void d68000_andi_32(m68k_info *info)
1389*9a0e4156SSadaf Ebrahimi {
1390*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ANDI, 4, read_imm_32(info));
1391*9a0e4156SSadaf Ebrahimi }
1392*9a0e4156SSadaf Ebrahimi 
d68000_andi_to_ccr(m68k_info * info)1393*9a0e4156SSadaf Ebrahimi static void d68000_andi_to_ccr(m68k_info *info)
1394*9a0e4156SSadaf Ebrahimi {
1395*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_ANDI, read_imm_8(info), 1, M68K_REG_CCR);
1396*9a0e4156SSadaf Ebrahimi }
1397*9a0e4156SSadaf Ebrahimi 
d68000_andi_to_sr(m68k_info * info)1398*9a0e4156SSadaf Ebrahimi static void d68000_andi_to_sr(m68k_info *info)
1399*9a0e4156SSadaf Ebrahimi {
1400*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_ANDI, read_imm_16(info), 2, M68K_REG_SR);
1401*9a0e4156SSadaf Ebrahimi }
1402*9a0e4156SSadaf Ebrahimi 
d68000_asr_s_8(m68k_info * info)1403*9a0e4156SSadaf Ebrahimi static void d68000_asr_s_8(m68k_info *info)
1404*9a0e4156SSadaf Ebrahimi {
1405*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASR, 1);
1406*9a0e4156SSadaf Ebrahimi }
1407*9a0e4156SSadaf Ebrahimi 
d68000_asr_s_16(m68k_info * info)1408*9a0e4156SSadaf Ebrahimi static void d68000_asr_s_16(m68k_info *info)
1409*9a0e4156SSadaf Ebrahimi {
1410*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASR, 2);
1411*9a0e4156SSadaf Ebrahimi }
1412*9a0e4156SSadaf Ebrahimi 
d68000_asr_s_32(m68k_info * info)1413*9a0e4156SSadaf Ebrahimi static void d68000_asr_s_32(m68k_info *info)
1414*9a0e4156SSadaf Ebrahimi {
1415*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASR, 4);
1416*9a0e4156SSadaf Ebrahimi }
1417*9a0e4156SSadaf Ebrahimi 
d68000_asr_r_8(m68k_info * info)1418*9a0e4156SSadaf Ebrahimi static void d68000_asr_r_8(m68k_info *info)
1419*9a0e4156SSadaf Ebrahimi {
1420*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASR, 1);
1421*9a0e4156SSadaf Ebrahimi }
1422*9a0e4156SSadaf Ebrahimi 
d68000_asr_r_16(m68k_info * info)1423*9a0e4156SSadaf Ebrahimi static void d68000_asr_r_16(m68k_info *info)
1424*9a0e4156SSadaf Ebrahimi {
1425*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASR, 2);
1426*9a0e4156SSadaf Ebrahimi }
1427*9a0e4156SSadaf Ebrahimi 
d68000_asr_r_32(m68k_info * info)1428*9a0e4156SSadaf Ebrahimi static void d68000_asr_r_32(m68k_info *info)
1429*9a0e4156SSadaf Ebrahimi {
1430*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASR, 4);
1431*9a0e4156SSadaf Ebrahimi }
1432*9a0e4156SSadaf Ebrahimi 
d68000_asr_ea(m68k_info * info)1433*9a0e4156SSadaf Ebrahimi static void d68000_asr_ea(m68k_info *info)
1434*9a0e4156SSadaf Ebrahimi {
1435*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ASR, 2);
1436*9a0e4156SSadaf Ebrahimi }
1437*9a0e4156SSadaf Ebrahimi 
d68000_asl_s_8(m68k_info * info)1438*9a0e4156SSadaf Ebrahimi static void d68000_asl_s_8(m68k_info *info)
1439*9a0e4156SSadaf Ebrahimi {
1440*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASL, 1);
1441*9a0e4156SSadaf Ebrahimi }
1442*9a0e4156SSadaf Ebrahimi 
d68000_asl_s_16(m68k_info * info)1443*9a0e4156SSadaf Ebrahimi static void d68000_asl_s_16(m68k_info *info)
1444*9a0e4156SSadaf Ebrahimi {
1445*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASL, 2);
1446*9a0e4156SSadaf Ebrahimi }
1447*9a0e4156SSadaf Ebrahimi 
d68000_asl_s_32(m68k_info * info)1448*9a0e4156SSadaf Ebrahimi static void d68000_asl_s_32(m68k_info *info)
1449*9a0e4156SSadaf Ebrahimi {
1450*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ASL, 4);
1451*9a0e4156SSadaf Ebrahimi }
1452*9a0e4156SSadaf Ebrahimi 
d68000_asl_r_8(m68k_info * info)1453*9a0e4156SSadaf Ebrahimi static void d68000_asl_r_8(m68k_info *info)
1454*9a0e4156SSadaf Ebrahimi {
1455*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASL, 1);
1456*9a0e4156SSadaf Ebrahimi }
1457*9a0e4156SSadaf Ebrahimi 
d68000_asl_r_16(m68k_info * info)1458*9a0e4156SSadaf Ebrahimi static void d68000_asl_r_16(m68k_info *info)
1459*9a0e4156SSadaf Ebrahimi {
1460*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASL, 2);
1461*9a0e4156SSadaf Ebrahimi }
1462*9a0e4156SSadaf Ebrahimi 
d68000_asl_r_32(m68k_info * info)1463*9a0e4156SSadaf Ebrahimi static void d68000_asl_r_32(m68k_info *info)
1464*9a0e4156SSadaf Ebrahimi {
1465*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ASL, 4);
1466*9a0e4156SSadaf Ebrahimi }
1467*9a0e4156SSadaf Ebrahimi 
d68000_asl_ea(m68k_info * info)1468*9a0e4156SSadaf Ebrahimi static void d68000_asl_ea(m68k_info *info)
1469*9a0e4156SSadaf Ebrahimi {
1470*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ASL, 2);
1471*9a0e4156SSadaf Ebrahimi }
1472*9a0e4156SSadaf Ebrahimi 
d68000_bcc_8(m68k_info * info)1473*9a0e4156SSadaf Ebrahimi static void d68000_bcc_8(m68k_info *info)
1474*9a0e4156SSadaf Ebrahimi {
1475*9a0e4156SSadaf Ebrahimi 	build_bcc(info, 1, make_int_8(info->ir));
1476*9a0e4156SSadaf Ebrahimi }
1477*9a0e4156SSadaf Ebrahimi 
d68000_bcc_16(m68k_info * info)1478*9a0e4156SSadaf Ebrahimi static void d68000_bcc_16(m68k_info *info)
1479*9a0e4156SSadaf Ebrahimi {
1480*9a0e4156SSadaf Ebrahimi 	build_bcc(info, 2, make_int_16(read_imm_16(info)));
1481*9a0e4156SSadaf Ebrahimi }
1482*9a0e4156SSadaf Ebrahimi 
d68020_bcc_32(m68k_info * info)1483*9a0e4156SSadaf Ebrahimi static void d68020_bcc_32(m68k_info *info)
1484*9a0e4156SSadaf Ebrahimi {
1485*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1486*9a0e4156SSadaf Ebrahimi 	build_bcc(info, 4, read_imm_32(info));
1487*9a0e4156SSadaf Ebrahimi }
1488*9a0e4156SSadaf Ebrahimi 
d68000_bchg_r(m68k_info * info)1489*9a0e4156SSadaf Ebrahimi static void d68000_bchg_r(m68k_info *info)
1490*9a0e4156SSadaf Ebrahimi {
1491*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_BCHG, 1);
1492*9a0e4156SSadaf Ebrahimi }
1493*9a0e4156SSadaf Ebrahimi 
d68000_bchg_s(m68k_info * info)1494*9a0e4156SSadaf Ebrahimi static void d68000_bchg_s(m68k_info *info)
1495*9a0e4156SSadaf Ebrahimi {
1496*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_BCHG, 1, read_imm_8(info));
1497*9a0e4156SSadaf Ebrahimi }
1498*9a0e4156SSadaf Ebrahimi 
d68000_bclr_r(m68k_info * info)1499*9a0e4156SSadaf Ebrahimi static void d68000_bclr_r(m68k_info *info)
1500*9a0e4156SSadaf Ebrahimi {
1501*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_BCLR, 1);
1502*9a0e4156SSadaf Ebrahimi }
1503*9a0e4156SSadaf Ebrahimi 
d68000_bclr_s(m68k_info * info)1504*9a0e4156SSadaf Ebrahimi static void d68000_bclr_s(m68k_info *info)
1505*9a0e4156SSadaf Ebrahimi {
1506*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_BCLR, 1, read_imm_8(info));
1507*9a0e4156SSadaf Ebrahimi }
1508*9a0e4156SSadaf Ebrahimi 
d68010_bkpt(m68k_info * info)1509*9a0e4156SSadaf Ebrahimi static void d68010_bkpt(m68k_info *info)
1510*9a0e4156SSadaf Ebrahimi {
1511*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1512*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, M68K_INS_BKPT, 0, info->ir & 7);
1513*9a0e4156SSadaf Ebrahimi }
1514*9a0e4156SSadaf Ebrahimi 
d68020_bfchg(m68k_info * info)1515*9a0e4156SSadaf Ebrahimi static void d68020_bfchg(m68k_info *info)
1516*9a0e4156SSadaf Ebrahimi {
1517*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1518*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFCHG, false);
1519*9a0e4156SSadaf Ebrahimi }
1520*9a0e4156SSadaf Ebrahimi 
1521*9a0e4156SSadaf Ebrahimi 
d68020_bfclr(m68k_info * info)1522*9a0e4156SSadaf Ebrahimi static void d68020_bfclr(m68k_info *info)
1523*9a0e4156SSadaf Ebrahimi {
1524*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1525*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFCLR, false);
1526*9a0e4156SSadaf Ebrahimi }
1527*9a0e4156SSadaf Ebrahimi 
d68020_bfexts(m68k_info * info)1528*9a0e4156SSadaf Ebrahimi static void d68020_bfexts(m68k_info *info)
1529*9a0e4156SSadaf Ebrahimi {
1530*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1531*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFEXTS, true);
1532*9a0e4156SSadaf Ebrahimi }
1533*9a0e4156SSadaf Ebrahimi 
d68020_bfextu(m68k_info * info)1534*9a0e4156SSadaf Ebrahimi static void d68020_bfextu(m68k_info *info)
1535*9a0e4156SSadaf Ebrahimi {
1536*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1537*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFEXTU, true);
1538*9a0e4156SSadaf Ebrahimi }
1539*9a0e4156SSadaf Ebrahimi 
d68020_bfffo(m68k_info * info)1540*9a0e4156SSadaf Ebrahimi static void d68020_bfffo(m68k_info *info)
1541*9a0e4156SSadaf Ebrahimi {
1542*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1543*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFFFO, true);
1544*9a0e4156SSadaf Ebrahimi }
1545*9a0e4156SSadaf Ebrahimi 
d68020_bfins(m68k_info * info)1546*9a0e4156SSadaf Ebrahimi static void d68020_bfins(m68k_info *info)
1547*9a0e4156SSadaf Ebrahimi {
1548*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = &info->extension;
1549*9a0e4156SSadaf Ebrahimi 	cs_m68k_op temp;
1550*9a0e4156SSadaf Ebrahimi 
1551*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1552*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFINS, true);
1553*9a0e4156SSadaf Ebrahimi 
1554*9a0e4156SSadaf Ebrahimi 	// a bit hacky but we need to flip the args on only this instruction
1555*9a0e4156SSadaf Ebrahimi 
1556*9a0e4156SSadaf Ebrahimi 	temp = ext->operands[0];
1557*9a0e4156SSadaf Ebrahimi 	ext->operands[0] = ext->operands[1];
1558*9a0e4156SSadaf Ebrahimi 	ext->operands[1] = temp;
1559*9a0e4156SSadaf Ebrahimi }
1560*9a0e4156SSadaf Ebrahimi 
d68020_bfset(m68k_info * info)1561*9a0e4156SSadaf Ebrahimi static void d68020_bfset(m68k_info *info)
1562*9a0e4156SSadaf Ebrahimi {
1563*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1564*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFSET, false);
1565*9a0e4156SSadaf Ebrahimi }
1566*9a0e4156SSadaf Ebrahimi 
d68020_bftst(m68k_info * info)1567*9a0e4156SSadaf Ebrahimi static void d68020_bftst(m68k_info *info)
1568*9a0e4156SSadaf Ebrahimi {
1569*9a0e4156SSadaf Ebrahimi 	build_bitfield_ins(info, M68K_INS_BFTST, false);
1570*9a0e4156SSadaf Ebrahimi }
1571*9a0e4156SSadaf Ebrahimi 
d68000_bra_8(m68k_info * info)1572*9a0e4156SSadaf Ebrahimi static void d68000_bra_8(m68k_info *info)
1573*9a0e4156SSadaf Ebrahimi {
1574*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BRA, 1, make_int_8(info->ir));
1575*9a0e4156SSadaf Ebrahimi }
1576*9a0e4156SSadaf Ebrahimi 
d68000_bra_16(m68k_info * info)1577*9a0e4156SSadaf Ebrahimi static void d68000_bra_16(m68k_info *info)
1578*9a0e4156SSadaf Ebrahimi {
1579*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BRA, 2, make_int_16(read_imm_16(info)));
1580*9a0e4156SSadaf Ebrahimi }
1581*9a0e4156SSadaf Ebrahimi 
d68020_bra_32(m68k_info * info)1582*9a0e4156SSadaf Ebrahimi static void d68020_bra_32(m68k_info *info)
1583*9a0e4156SSadaf Ebrahimi {
1584*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1585*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BRA, 4, read_imm_32(info));
1586*9a0e4156SSadaf Ebrahimi }
1587*9a0e4156SSadaf Ebrahimi 
d68000_bset_r(m68k_info * info)1588*9a0e4156SSadaf Ebrahimi static void d68000_bset_r(m68k_info *info)
1589*9a0e4156SSadaf Ebrahimi {
1590*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_BSET, 1);
1591*9a0e4156SSadaf Ebrahimi }
1592*9a0e4156SSadaf Ebrahimi 
d68000_bset_s(m68k_info * info)1593*9a0e4156SSadaf Ebrahimi static void d68000_bset_s(m68k_info *info)
1594*9a0e4156SSadaf Ebrahimi {
1595*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_BSET, 1, read_imm_8(info));
1596*9a0e4156SSadaf Ebrahimi }
1597*9a0e4156SSadaf Ebrahimi 
d68000_bsr_8(m68k_info * info)1598*9a0e4156SSadaf Ebrahimi static void d68000_bsr_8(m68k_info *info)
1599*9a0e4156SSadaf Ebrahimi {
1600*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BSR, 1, make_int_8(info->ir));
1601*9a0e4156SSadaf Ebrahimi }
1602*9a0e4156SSadaf Ebrahimi 
d68000_bsr_16(m68k_info * info)1603*9a0e4156SSadaf Ebrahimi static void d68000_bsr_16(m68k_info *info)
1604*9a0e4156SSadaf Ebrahimi {
1605*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BSR, 2, make_int_16(read_imm_16(info)));
1606*9a0e4156SSadaf Ebrahimi }
1607*9a0e4156SSadaf Ebrahimi 
d68020_bsr_32(m68k_info * info)1608*9a0e4156SSadaf Ebrahimi static void d68020_bsr_32(m68k_info *info)
1609*9a0e4156SSadaf Ebrahimi {
1610*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1611*9a0e4156SSadaf Ebrahimi 	build_relative_branch(info, M68K_INS_BSR, 4, peek_imm_32(info));
1612*9a0e4156SSadaf Ebrahimi }
1613*9a0e4156SSadaf Ebrahimi 
d68000_btst_r(m68k_info * info)1614*9a0e4156SSadaf Ebrahimi static void d68000_btst_r(m68k_info *info)
1615*9a0e4156SSadaf Ebrahimi {
1616*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_BTST, 4);
1617*9a0e4156SSadaf Ebrahimi }
1618*9a0e4156SSadaf Ebrahimi 
d68000_btst_s(m68k_info * info)1619*9a0e4156SSadaf Ebrahimi static void d68000_btst_s(m68k_info *info)
1620*9a0e4156SSadaf Ebrahimi {
1621*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_BTST, 1, read_imm_8(info));
1622*9a0e4156SSadaf Ebrahimi }
1623*9a0e4156SSadaf Ebrahimi 
d68020_callm(m68k_info * info)1624*9a0e4156SSadaf Ebrahimi static void d68020_callm(m68k_info *info)
1625*9a0e4156SSadaf Ebrahimi {
1626*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_ONLY);
1627*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CALLM, 0, read_imm_8(info));
1628*9a0e4156SSadaf Ebrahimi }
1629*9a0e4156SSadaf Ebrahimi 
d68020_cas_8(m68k_info * info)1630*9a0e4156SSadaf Ebrahimi static void d68020_cas_8(m68k_info *info)
1631*9a0e4156SSadaf Ebrahimi {
1632*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1633*9a0e4156SSadaf Ebrahimi 	build_d_d_ea(info, M68K_INS_CAS, 1);
1634*9a0e4156SSadaf Ebrahimi }
1635*9a0e4156SSadaf Ebrahimi 
d68020_cas_16(m68k_info * info)1636*9a0e4156SSadaf Ebrahimi static void d68020_cas_16(m68k_info *info)
1637*9a0e4156SSadaf Ebrahimi {
1638*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1639*9a0e4156SSadaf Ebrahimi 	build_d_d_ea(info, M68K_INS_CAS, 2);
1640*9a0e4156SSadaf Ebrahimi }
1641*9a0e4156SSadaf Ebrahimi 
d68020_cas_32(m68k_info * info)1642*9a0e4156SSadaf Ebrahimi static void d68020_cas_32(m68k_info *info)
1643*9a0e4156SSadaf Ebrahimi {
1644*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1645*9a0e4156SSadaf Ebrahimi 	build_d_d_ea(info, M68K_INS_CAS, 4);
1646*9a0e4156SSadaf Ebrahimi }
1647*9a0e4156SSadaf Ebrahimi 
d68020_cas2_16(m68k_info * info)1648*9a0e4156SSadaf Ebrahimi static void d68020_cas2_16(m68k_info *info)
1649*9a0e4156SSadaf Ebrahimi {
1650*9a0e4156SSadaf Ebrahimi 	build_cas2(info, 2);
1651*9a0e4156SSadaf Ebrahimi }
1652*9a0e4156SSadaf Ebrahimi 
d68020_cas2_32(m68k_info * info)1653*9a0e4156SSadaf Ebrahimi static void d68020_cas2_32(m68k_info *info)
1654*9a0e4156SSadaf Ebrahimi {
1655*9a0e4156SSadaf Ebrahimi 	build_cas2(info, 4);
1656*9a0e4156SSadaf Ebrahimi }
1657*9a0e4156SSadaf Ebrahimi 
d68000_chk_16(m68k_info * info)1658*9a0e4156SSadaf Ebrahimi static void d68000_chk_16(m68k_info *info)
1659*9a0e4156SSadaf Ebrahimi {
1660*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_CHK, 2);
1661*9a0e4156SSadaf Ebrahimi }
1662*9a0e4156SSadaf Ebrahimi 
d68020_chk_32(m68k_info * info)1663*9a0e4156SSadaf Ebrahimi static void d68020_chk_32(m68k_info *info)
1664*9a0e4156SSadaf Ebrahimi {
1665*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1666*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_CHK, 4);
1667*9a0e4156SSadaf Ebrahimi }
1668*9a0e4156SSadaf Ebrahimi 
d68020_chk2_cmp2_8(m68k_info * info)1669*9a0e4156SSadaf Ebrahimi static void d68020_chk2_cmp2_8(m68k_info *info)
1670*9a0e4156SSadaf Ebrahimi {
1671*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1672*9a0e4156SSadaf Ebrahimi 	build_chk2_cmp2(info, 1);
1673*9a0e4156SSadaf Ebrahimi }
1674*9a0e4156SSadaf Ebrahimi 
d68020_chk2_cmp2_16(m68k_info * info)1675*9a0e4156SSadaf Ebrahimi static void d68020_chk2_cmp2_16(m68k_info *info)
1676*9a0e4156SSadaf Ebrahimi {
1677*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1678*9a0e4156SSadaf Ebrahimi 	build_chk2_cmp2(info, 2);
1679*9a0e4156SSadaf Ebrahimi }
1680*9a0e4156SSadaf Ebrahimi 
d68020_chk2_cmp2_32(m68k_info * info)1681*9a0e4156SSadaf Ebrahimi static void d68020_chk2_cmp2_32(m68k_info *info)
1682*9a0e4156SSadaf Ebrahimi {
1683*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1684*9a0e4156SSadaf Ebrahimi 	build_chk2_cmp2(info, 4);
1685*9a0e4156SSadaf Ebrahimi }
1686*9a0e4156SSadaf Ebrahimi 
d68040_cinv(m68k_info * info)1687*9a0e4156SSadaf Ebrahimi static void d68040_cinv(m68k_info *info)
1688*9a0e4156SSadaf Ebrahimi {
1689*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
1690*9a0e4156SSadaf Ebrahimi 	build_cpush_cinv(info, M68K_INS_CINVL);
1691*9a0e4156SSadaf Ebrahimi }
1692*9a0e4156SSadaf Ebrahimi 
d68000_clr_8(m68k_info * info)1693*9a0e4156SSadaf Ebrahimi static void d68000_clr_8(m68k_info *info)
1694*9a0e4156SSadaf Ebrahimi {
1695*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_CLR, 1);
1696*9a0e4156SSadaf Ebrahimi }
1697*9a0e4156SSadaf Ebrahimi 
d68000_clr_16(m68k_info * info)1698*9a0e4156SSadaf Ebrahimi static void d68000_clr_16(m68k_info *info)
1699*9a0e4156SSadaf Ebrahimi {
1700*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_CLR, 2);
1701*9a0e4156SSadaf Ebrahimi }
1702*9a0e4156SSadaf Ebrahimi 
d68000_clr_32(m68k_info * info)1703*9a0e4156SSadaf Ebrahimi static void d68000_clr_32(m68k_info *info)
1704*9a0e4156SSadaf Ebrahimi {
1705*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_CLR, 4);
1706*9a0e4156SSadaf Ebrahimi }
1707*9a0e4156SSadaf Ebrahimi 
d68000_cmp_8(m68k_info * info)1708*9a0e4156SSadaf Ebrahimi static void d68000_cmp_8(m68k_info *info)
1709*9a0e4156SSadaf Ebrahimi {
1710*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_CMP, 1);
1711*9a0e4156SSadaf Ebrahimi }
1712*9a0e4156SSadaf Ebrahimi 
d68000_cmp_16(m68k_info * info)1713*9a0e4156SSadaf Ebrahimi static void d68000_cmp_16(m68k_info *info)
1714*9a0e4156SSadaf Ebrahimi {
1715*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_CMP, 2);
1716*9a0e4156SSadaf Ebrahimi }
1717*9a0e4156SSadaf Ebrahimi 
d68000_cmp_32(m68k_info * info)1718*9a0e4156SSadaf Ebrahimi static void d68000_cmp_32(m68k_info *info)
1719*9a0e4156SSadaf Ebrahimi {
1720*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_CMP, 4);
1721*9a0e4156SSadaf Ebrahimi }
1722*9a0e4156SSadaf Ebrahimi 
d68000_cmpa_16(m68k_info * info)1723*9a0e4156SSadaf Ebrahimi static void d68000_cmpa_16(m68k_info *info)
1724*9a0e4156SSadaf Ebrahimi {
1725*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_CMPA, 2);
1726*9a0e4156SSadaf Ebrahimi }
1727*9a0e4156SSadaf Ebrahimi 
d68000_cmpa_32(m68k_info * info)1728*9a0e4156SSadaf Ebrahimi static void d68000_cmpa_32(m68k_info *info)
1729*9a0e4156SSadaf Ebrahimi {
1730*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_CMPA, 4);
1731*9a0e4156SSadaf Ebrahimi }
1732*9a0e4156SSadaf Ebrahimi 
d68000_cmpi_8(m68k_info * info)1733*9a0e4156SSadaf Ebrahimi static void d68000_cmpi_8(m68k_info *info)
1734*9a0e4156SSadaf Ebrahimi {
1735*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 1, read_imm_8(info));
1736*9a0e4156SSadaf Ebrahimi }
1737*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcdi_8(m68k_info * info)1738*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcdi_8(m68k_info *info)
1739*9a0e4156SSadaf Ebrahimi {
1740*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1741*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 1, read_imm_8(info));
1742*9a0e4156SSadaf Ebrahimi }
1743*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcix_8(m68k_info * info)1744*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcix_8(m68k_info *info)
1745*9a0e4156SSadaf Ebrahimi {
1746*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1747*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 1, read_imm_8(info));
1748*9a0e4156SSadaf Ebrahimi }
1749*9a0e4156SSadaf Ebrahimi 
d68000_cmpi_16(m68k_info * info)1750*9a0e4156SSadaf Ebrahimi static void d68000_cmpi_16(m68k_info *info)
1751*9a0e4156SSadaf Ebrahimi {
1752*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 2, read_imm_16(info));
1753*9a0e4156SSadaf Ebrahimi }
1754*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcdi_16(m68k_info * info)1755*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcdi_16(m68k_info *info)
1756*9a0e4156SSadaf Ebrahimi {
1757*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1758*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 2, read_imm_16(info));
1759*9a0e4156SSadaf Ebrahimi }
1760*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcix_16(m68k_info * info)1761*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcix_16(m68k_info *info)
1762*9a0e4156SSadaf Ebrahimi {
1763*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1764*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 2, read_imm_16(info));
1765*9a0e4156SSadaf Ebrahimi }
1766*9a0e4156SSadaf Ebrahimi 
d68000_cmpi_32(m68k_info * info)1767*9a0e4156SSadaf Ebrahimi static void d68000_cmpi_32(m68k_info *info)
1768*9a0e4156SSadaf Ebrahimi {
1769*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 4, read_imm_32(info));
1770*9a0e4156SSadaf Ebrahimi }
1771*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcdi_32(m68k_info * info)1772*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcdi_32(m68k_info *info)
1773*9a0e4156SSadaf Ebrahimi {
1774*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1775*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 4, read_imm_32(info));
1776*9a0e4156SSadaf Ebrahimi }
1777*9a0e4156SSadaf Ebrahimi 
d68020_cmpi_pcix_32(m68k_info * info)1778*9a0e4156SSadaf Ebrahimi static void d68020_cmpi_pcix_32(m68k_info *info)
1779*9a0e4156SSadaf Ebrahimi {
1780*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
1781*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_CMPI, 4, read_imm_32(info));
1782*9a0e4156SSadaf Ebrahimi }
1783*9a0e4156SSadaf Ebrahimi 
d68000_cmpm_8(m68k_info * info)1784*9a0e4156SSadaf Ebrahimi static void d68000_cmpm_8(m68k_info *info)
1785*9a0e4156SSadaf Ebrahimi {
1786*9a0e4156SSadaf Ebrahimi 	build_pi_pi(info, M68K_INS_CMPM, 1);
1787*9a0e4156SSadaf Ebrahimi }
1788*9a0e4156SSadaf Ebrahimi 
d68000_cmpm_16(m68k_info * info)1789*9a0e4156SSadaf Ebrahimi static void d68000_cmpm_16(m68k_info *info)
1790*9a0e4156SSadaf Ebrahimi {
1791*9a0e4156SSadaf Ebrahimi 	build_pi_pi(info, M68K_INS_CMPM, 2);
1792*9a0e4156SSadaf Ebrahimi }
1793*9a0e4156SSadaf Ebrahimi 
d68000_cmpm_32(m68k_info * info)1794*9a0e4156SSadaf Ebrahimi static void d68000_cmpm_32(m68k_info *info)
1795*9a0e4156SSadaf Ebrahimi {
1796*9a0e4156SSadaf Ebrahimi 	build_pi_pi(info, M68K_INS_CMPM, 4);
1797*9a0e4156SSadaf Ebrahimi }
1798*9a0e4156SSadaf Ebrahimi 
make_cpbcc_operand(cs_m68k_op * op,int size,int displacement)1799*9a0e4156SSadaf Ebrahimi static void make_cpbcc_operand(cs_m68k_op* op, int size, int displacement)
1800*9a0e4156SSadaf Ebrahimi {
1801*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_BRANCH_DISPLACEMENT;
1802*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_BR_DISP;
1803*9a0e4156SSadaf Ebrahimi 	op->br_disp.disp = displacement;
1804*9a0e4156SSadaf Ebrahimi 	op->br_disp.disp_size = size;
1805*9a0e4156SSadaf Ebrahimi }
1806*9a0e4156SSadaf Ebrahimi 
d68020_cpbcc_16(m68k_info * info)1807*9a0e4156SSadaf Ebrahimi static void d68020_cpbcc_16(m68k_info *info)
1808*9a0e4156SSadaf Ebrahimi {
1809*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1810*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
1811*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1812*9a0e4156SSadaf Ebrahimi 
1813*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
1814*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (info->ir & 0x2f);
1815*9a0e4156SSadaf Ebrahimi 
1816*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FBF, 1, 2);
1817*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1818*9a0e4156SSadaf Ebrahimi 
1819*9a0e4156SSadaf Ebrahimi 	make_cpbcc_operand(op0, M68K_OP_BR_DISP_SIZE_WORD, make_int_16(read_imm_16(info)));
1820*9a0e4156SSadaf Ebrahimi 
1821*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
1822*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_BRANCH_RELATIVE);
1823*9a0e4156SSadaf Ebrahimi }
1824*9a0e4156SSadaf Ebrahimi 
d68020_cpbcc_32(m68k_info * info)1825*9a0e4156SSadaf Ebrahimi static void d68020_cpbcc_32(m68k_info *info)
1826*9a0e4156SSadaf Ebrahimi {
1827*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
1828*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1829*9a0e4156SSadaf Ebrahimi 
1830*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1831*9a0e4156SSadaf Ebrahimi 
1832*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1833*9a0e4156SSadaf Ebrahimi 
1834*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
1835*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (info->ir & 0x2f);
1836*9a0e4156SSadaf Ebrahimi 
1837*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FBF, 1, 4);
1838*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1839*9a0e4156SSadaf Ebrahimi 
1840*9a0e4156SSadaf Ebrahimi 	make_cpbcc_operand(op0, M68K_OP_BR_DISP_SIZE_LONG, read_imm_32(info));
1841*9a0e4156SSadaf Ebrahimi 
1842*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
1843*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_BRANCH_RELATIVE);
1844*9a0e4156SSadaf Ebrahimi }
1845*9a0e4156SSadaf Ebrahimi 
d68020_cpdbcc(m68k_info * info)1846*9a0e4156SSadaf Ebrahimi static void d68020_cpdbcc(m68k_info *info)
1847*9a0e4156SSadaf Ebrahimi {
1848*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
1849*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1850*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1851*9a0e4156SSadaf Ebrahimi 	uint ext1, ext2;
1852*9a0e4156SSadaf Ebrahimi 
1853*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1854*9a0e4156SSadaf Ebrahimi 
1855*9a0e4156SSadaf Ebrahimi 	ext1 = read_imm_16(info);
1856*9a0e4156SSadaf Ebrahimi 	ext2 = read_imm_16(info);
1857*9a0e4156SSadaf Ebrahimi 
1858*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
1859*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (ext1 & 0x2f);
1860*9a0e4156SSadaf Ebrahimi 
1861*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FDBF, 2, 0);
1862*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
1863*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
1864*9a0e4156SSadaf Ebrahimi 
1865*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + (info->ir & 7);
1866*9a0e4156SSadaf Ebrahimi 
1867*9a0e4156SSadaf Ebrahimi 	make_cpbcc_operand(op1, M68K_OP_BR_DISP_SIZE_WORD, make_int_16(ext2) + 2);
1868*9a0e4156SSadaf Ebrahimi 
1869*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
1870*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_BRANCH_RELATIVE);
1871*9a0e4156SSadaf Ebrahimi }
1872*9a0e4156SSadaf Ebrahimi 
fmove_fpcr(m68k_info * info,uint extension)1873*9a0e4156SSadaf Ebrahimi static void fmove_fpcr(m68k_info *info, uint extension)
1874*9a0e4156SSadaf Ebrahimi {
1875*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* special;
1876*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op_ea;
1877*9a0e4156SSadaf Ebrahimi 
1878*9a0e4156SSadaf Ebrahimi 	int regsel = (extension >> 10) & 0x7;
1879*9a0e4156SSadaf Ebrahimi 	int dir = (extension >> 13) & 0x1;
1880*9a0e4156SSadaf Ebrahimi 
1881*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_FMOVE, 2, 4);
1882*9a0e4156SSadaf Ebrahimi 
1883*9a0e4156SSadaf Ebrahimi 	special = &ext->operands[0];
1884*9a0e4156SSadaf Ebrahimi 	op_ea = &ext->operands[1];
1885*9a0e4156SSadaf Ebrahimi 
1886*9a0e4156SSadaf Ebrahimi 	if (!dir) {
1887*9a0e4156SSadaf Ebrahimi 		cs_m68k_op* t = special;
1888*9a0e4156SSadaf Ebrahimi 		special = op_ea;
1889*9a0e4156SSadaf Ebrahimi 		op_ea = t;
1890*9a0e4156SSadaf Ebrahimi 	}
1891*9a0e4156SSadaf Ebrahimi 
1892*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op_ea, info->ir, 4);
1893*9a0e4156SSadaf Ebrahimi 
1894*9a0e4156SSadaf Ebrahimi 	if (regsel & 4)
1895*9a0e4156SSadaf Ebrahimi 		special->reg = M68K_REG_FPCR;
1896*9a0e4156SSadaf Ebrahimi 	else if (regsel & 2)
1897*9a0e4156SSadaf Ebrahimi 		special->reg = M68K_REG_FPSR;
1898*9a0e4156SSadaf Ebrahimi 	else if (regsel & 1)
1899*9a0e4156SSadaf Ebrahimi 		special->reg = M68K_REG_FPIAR;
1900*9a0e4156SSadaf Ebrahimi }
1901*9a0e4156SSadaf Ebrahimi 
fmovem(m68k_info * info,uint extension)1902*9a0e4156SSadaf Ebrahimi static void fmovem(m68k_info *info, uint extension)
1903*9a0e4156SSadaf Ebrahimi {
1904*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op_reglist;
1905*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op_ea;
1906*9a0e4156SSadaf Ebrahimi 	int dir = (extension >> 13) & 0x1;
1907*9a0e4156SSadaf Ebrahimi 	int mode = (extension >> 11) & 0x3;
1908*9a0e4156SSadaf Ebrahimi 	uint reglist = extension & 0xff;
1909*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_FMOVEM, 2, 0);
1910*9a0e4156SSadaf Ebrahimi 
1911*9a0e4156SSadaf Ebrahimi 	op_reglist = &ext->operands[0];
1912*9a0e4156SSadaf Ebrahimi 	op_ea = &ext->operands[1];
1913*9a0e4156SSadaf Ebrahimi 
1914*9a0e4156SSadaf Ebrahimi 	// flip args around
1915*9a0e4156SSadaf Ebrahimi 
1916*9a0e4156SSadaf Ebrahimi 	if (!dir) {
1917*9a0e4156SSadaf Ebrahimi 		cs_m68k_op* t = op_reglist;
1918*9a0e4156SSadaf Ebrahimi 		op_reglist = op_ea;
1919*9a0e4156SSadaf Ebrahimi 		op_ea = t;
1920*9a0e4156SSadaf Ebrahimi 	}
1921*9a0e4156SSadaf Ebrahimi 
1922*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op_ea, info->ir, 0);
1923*9a0e4156SSadaf Ebrahimi 
1924*9a0e4156SSadaf Ebrahimi 	switch (mode) {
1925*9a0e4156SSadaf Ebrahimi 		case 1 : // Dynamic list in dn register
1926*9a0e4156SSadaf Ebrahimi 			op_reglist->reg = M68K_REG_D0 + ((reglist >> 4) & 7);
1927*9a0e4156SSadaf Ebrahimi 			break;
1928*9a0e4156SSadaf Ebrahimi 
1929*9a0e4156SSadaf Ebrahimi 		case 0 :
1930*9a0e4156SSadaf Ebrahimi 			op_reglist->address_mode = M68K_AM_NONE;
1931*9a0e4156SSadaf Ebrahimi 			op_reglist->type = M68K_OP_REG_BITS;
1932*9a0e4156SSadaf Ebrahimi 			op_reglist->register_bits = reglist << 16;
1933*9a0e4156SSadaf Ebrahimi 			break;
1934*9a0e4156SSadaf Ebrahimi 
1935*9a0e4156SSadaf Ebrahimi 		case 2 : // Static list
1936*9a0e4156SSadaf Ebrahimi 			op_reglist->address_mode = M68K_AM_NONE;
1937*9a0e4156SSadaf Ebrahimi 			op_reglist->type = M68K_OP_REG_BITS;
1938*9a0e4156SSadaf Ebrahimi 			op_reglist->register_bits = ((uint32_t)reverse_bits_8(reglist)) << 16;
1939*9a0e4156SSadaf Ebrahimi 			break;
1940*9a0e4156SSadaf Ebrahimi 	}
1941*9a0e4156SSadaf Ebrahimi }
1942*9a0e4156SSadaf Ebrahimi 
d68020_cpgen(m68k_info * info)1943*9a0e4156SSadaf Ebrahimi static void d68020_cpgen(m68k_info *info)
1944*9a0e4156SSadaf Ebrahimi {
1945*9a0e4156SSadaf Ebrahimi 	cs_m68k *ext;
1946*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
1947*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
1948*9a0e4156SSadaf Ebrahimi 	bool supports_single_op;
1949*9a0e4156SSadaf Ebrahimi 	uint next;
1950*9a0e4156SSadaf Ebrahimi 	int rm, src, dst, opmode;
1951*9a0e4156SSadaf Ebrahimi 
1952*9a0e4156SSadaf Ebrahimi 
1953*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
1954*9a0e4156SSadaf Ebrahimi 
1955*9a0e4156SSadaf Ebrahimi 	supports_single_op = true;
1956*9a0e4156SSadaf Ebrahimi 
1957*9a0e4156SSadaf Ebrahimi 	next = read_imm_16(info);
1958*9a0e4156SSadaf Ebrahimi 
1959*9a0e4156SSadaf Ebrahimi 	rm = (next >> 14) & 0x1;
1960*9a0e4156SSadaf Ebrahimi 	src = (next >> 10) & 0x7;
1961*9a0e4156SSadaf Ebrahimi 	dst = (next >> 7) & 0x7;
1962*9a0e4156SSadaf Ebrahimi 	opmode = next & 0x3f;
1963*9a0e4156SSadaf Ebrahimi 
1964*9a0e4156SSadaf Ebrahimi 	// special handling for fmovecr
1965*9a0e4156SSadaf Ebrahimi 
1966*9a0e4156SSadaf Ebrahimi 	if (BITFIELD(info->ir, 5, 0) == 0 && BITFIELD(next, 15, 10) == 0x17) {
1967*9a0e4156SSadaf Ebrahimi 		cs_m68k_op* op0;
1968*9a0e4156SSadaf Ebrahimi 		cs_m68k_op* op1;
1969*9a0e4156SSadaf Ebrahimi 		cs_m68k* ext = build_init_op(info, M68K_INS_FMOVECR, 2, 0);
1970*9a0e4156SSadaf Ebrahimi 
1971*9a0e4156SSadaf Ebrahimi 		op0 = &ext->operands[0];
1972*9a0e4156SSadaf Ebrahimi 		op1 = &ext->operands[1];
1973*9a0e4156SSadaf Ebrahimi 
1974*9a0e4156SSadaf Ebrahimi 		op0->address_mode = M68K_AM_IMMEDIATE;
1975*9a0e4156SSadaf Ebrahimi 		op0->type = M68K_OP_IMM;
1976*9a0e4156SSadaf Ebrahimi 		op0->imm = next & 0x3f;
1977*9a0e4156SSadaf Ebrahimi 
1978*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_FP0 + ((next >> 7) & 7);
1979*9a0e4156SSadaf Ebrahimi 
1980*9a0e4156SSadaf Ebrahimi 		return;
1981*9a0e4156SSadaf Ebrahimi 	}
1982*9a0e4156SSadaf Ebrahimi 
1983*9a0e4156SSadaf Ebrahimi 	// deal with extended move stuff
1984*9a0e4156SSadaf Ebrahimi 
1985*9a0e4156SSadaf Ebrahimi 	switch ((next >> 13) & 0x7) {
1986*9a0e4156SSadaf Ebrahimi 		// fmovem fpcr
1987*9a0e4156SSadaf Ebrahimi 		case 0x4:	// FMOVEM ea, FPCR
1988*9a0e4156SSadaf Ebrahimi 		case 0x5:	// FMOVEM FPCR, ea
1989*9a0e4156SSadaf Ebrahimi 			fmove_fpcr(info, next);
1990*9a0e4156SSadaf Ebrahimi 			return;
1991*9a0e4156SSadaf Ebrahimi 
1992*9a0e4156SSadaf Ebrahimi 		// fmovem list
1993*9a0e4156SSadaf Ebrahimi 		case 0x6:
1994*9a0e4156SSadaf Ebrahimi 		case 0x7:
1995*9a0e4156SSadaf Ebrahimi 			fmovem(info, next);
1996*9a0e4156SSadaf Ebrahimi 			return;
1997*9a0e4156SSadaf Ebrahimi 	}
1998*9a0e4156SSadaf Ebrahimi 
1999*9a0e4156SSadaf Ebrahimi 	// See comment bellow on why this is being done
2000*9a0e4156SSadaf Ebrahimi 
2001*9a0e4156SSadaf Ebrahimi 	if ((next >> 6) & 1)
2002*9a0e4156SSadaf Ebrahimi 		opmode &= ~4;
2003*9a0e4156SSadaf Ebrahimi 
2004*9a0e4156SSadaf Ebrahimi 	// special handling of some instructions here
2005*9a0e4156SSadaf Ebrahimi 
2006*9a0e4156SSadaf Ebrahimi 	switch (opmode) {
2007*9a0e4156SSadaf Ebrahimi 		case 0x00: MCInst_setOpcode(info->inst, M68K_INS_FMOVE); supports_single_op = false; break;
2008*9a0e4156SSadaf Ebrahimi 		case 0x01: MCInst_setOpcode(info->inst, M68K_INS_FINT); break;
2009*9a0e4156SSadaf Ebrahimi 		case 0x02: MCInst_setOpcode(info->inst, M68K_INS_FSINH); break;
2010*9a0e4156SSadaf Ebrahimi 		case 0x03: MCInst_setOpcode(info->inst, M68K_INS_FINTRZ); break;
2011*9a0e4156SSadaf Ebrahimi 		case 0x04: MCInst_setOpcode(info->inst, M68K_INS_FSQRT); break;
2012*9a0e4156SSadaf Ebrahimi 		case 0x06: MCInst_setOpcode(info->inst, M68K_INS_FLOGNP1); break;
2013*9a0e4156SSadaf Ebrahimi 		case 0x08: MCInst_setOpcode(info->inst, M68K_INS_FETOXM1); break;
2014*9a0e4156SSadaf Ebrahimi 		case 0x09: MCInst_setOpcode(info->inst, M68K_INS_FATANH); break;
2015*9a0e4156SSadaf Ebrahimi 		case 0x0a: MCInst_setOpcode(info->inst, M68K_INS_FATAN); break;
2016*9a0e4156SSadaf Ebrahimi 		case 0x0c: MCInst_setOpcode(info->inst, M68K_INS_FASIN); break;
2017*9a0e4156SSadaf Ebrahimi 		case 0x0d: MCInst_setOpcode(info->inst, M68K_INS_FATANH); break;
2018*9a0e4156SSadaf Ebrahimi 		case 0x0e: MCInst_setOpcode(info->inst, M68K_INS_FSIN); break;
2019*9a0e4156SSadaf Ebrahimi 		case 0x0f: MCInst_setOpcode(info->inst, M68K_INS_FTAN); break;
2020*9a0e4156SSadaf Ebrahimi 		case 0x10: MCInst_setOpcode(info->inst, M68K_INS_FETOX); break;
2021*9a0e4156SSadaf Ebrahimi 		case 0x11: MCInst_setOpcode(info->inst, M68K_INS_FTWOTOX); break;
2022*9a0e4156SSadaf Ebrahimi 		case 0x12: MCInst_setOpcode(info->inst, M68K_INS_FTENTOX); break;
2023*9a0e4156SSadaf Ebrahimi 		case 0x14: MCInst_setOpcode(info->inst, M68K_INS_FLOGN); break;
2024*9a0e4156SSadaf Ebrahimi 		case 0x15: MCInst_setOpcode(info->inst, M68K_INS_FLOG10); break;
2025*9a0e4156SSadaf Ebrahimi 		case 0x16: MCInst_setOpcode(info->inst, M68K_INS_FLOG2); break;
2026*9a0e4156SSadaf Ebrahimi 		case 0x18: MCInst_setOpcode(info->inst, M68K_INS_FABS); break;
2027*9a0e4156SSadaf Ebrahimi 		case 0x19: MCInst_setOpcode(info->inst, M68K_INS_FCOSH); break;
2028*9a0e4156SSadaf Ebrahimi 		case 0x1a: MCInst_setOpcode(info->inst, M68K_INS_FNEG); break;
2029*9a0e4156SSadaf Ebrahimi 		case 0x1c: MCInst_setOpcode(info->inst, M68K_INS_FACOS); break;
2030*9a0e4156SSadaf Ebrahimi 		case 0x1d: MCInst_setOpcode(info->inst, M68K_INS_FCOS); break;
2031*9a0e4156SSadaf Ebrahimi 		case 0x1e: MCInst_setOpcode(info->inst, M68K_INS_FGETEXP); break;
2032*9a0e4156SSadaf Ebrahimi 		case 0x1f: MCInst_setOpcode(info->inst, M68K_INS_FGETMAN); break;
2033*9a0e4156SSadaf Ebrahimi 		case 0x20: MCInst_setOpcode(info->inst, M68K_INS_FDIV); supports_single_op = false; break;
2034*9a0e4156SSadaf Ebrahimi 		case 0x21: MCInst_setOpcode(info->inst, M68K_INS_FMOD); supports_single_op = false; break;
2035*9a0e4156SSadaf Ebrahimi 		case 0x22: MCInst_setOpcode(info->inst, M68K_INS_FADD); supports_single_op = false; break;
2036*9a0e4156SSadaf Ebrahimi 		case 0x23: MCInst_setOpcode(info->inst, M68K_INS_FMUL); supports_single_op = false; break;
2037*9a0e4156SSadaf Ebrahimi 		case 0x24: MCInst_setOpcode(info->inst, M68K_INS_FSGLDIV); supports_single_op = false; break;
2038*9a0e4156SSadaf Ebrahimi 		case 0x25: MCInst_setOpcode(info->inst, M68K_INS_FREM); break;
2039*9a0e4156SSadaf Ebrahimi 		case 0x26: MCInst_setOpcode(info->inst, M68K_INS_FSCALE); break;
2040*9a0e4156SSadaf Ebrahimi 		case 0x27: MCInst_setOpcode(info->inst, M68K_INS_FSGLMUL); break;
2041*9a0e4156SSadaf Ebrahimi 		case 0x28: MCInst_setOpcode(info->inst, M68K_INS_FSUB); supports_single_op = false; break;
2042*9a0e4156SSadaf Ebrahimi 		case 0x38: MCInst_setOpcode(info->inst, M68K_INS_FCMP); supports_single_op = false; break;
2043*9a0e4156SSadaf Ebrahimi 		case 0x3a: MCInst_setOpcode(info->inst, M68K_INS_FTST); break;
2044*9a0e4156SSadaf Ebrahimi 		default:
2045*9a0e4156SSadaf Ebrahimi 			break;
2046*9a0e4156SSadaf Ebrahimi 	}
2047*9a0e4156SSadaf Ebrahimi 
2048*9a0e4156SSadaf Ebrahimi 	// Some trickery here! It's not documented but if bit 6 is set this is a s/d opcode and then
2049*9a0e4156SSadaf Ebrahimi 	// if bit 2 is set it's a d. As we already have set our opcode in the code above we can just
2050*9a0e4156SSadaf Ebrahimi 	// offset it as the following 2 op codes (if s/d is supported) will always be directly after it
2051*9a0e4156SSadaf Ebrahimi 
2052*9a0e4156SSadaf Ebrahimi 	if ((next >> 6) & 1) {
2053*9a0e4156SSadaf Ebrahimi 		if ((next >> 2) & 1)
2054*9a0e4156SSadaf Ebrahimi 			info->inst->Opcode += 2;
2055*9a0e4156SSadaf Ebrahimi 		else
2056*9a0e4156SSadaf Ebrahimi 			info->inst->Opcode += 1;
2057*9a0e4156SSadaf Ebrahimi 	}
2058*9a0e4156SSadaf Ebrahimi 
2059*9a0e4156SSadaf Ebrahimi 	ext = &info->extension;
2060*9a0e4156SSadaf Ebrahimi 
2061*9a0e4156SSadaf Ebrahimi 	ext->op_count = 2;
2062*9a0e4156SSadaf Ebrahimi 	ext->op_size.type = M68K_SIZE_TYPE_CPU;
2063*9a0e4156SSadaf Ebrahimi 	ext->op_size.cpu_size = 0;
2064*9a0e4156SSadaf Ebrahimi 
2065*9a0e4156SSadaf Ebrahimi 	// Special case - adjust direction of fmove
2066*9a0e4156SSadaf Ebrahimi 	if ((opmode == 0x00) && ((next >> 13) & 0x1) != 0) {
2067*9a0e4156SSadaf Ebrahimi 		op0 = &ext->operands[1];
2068*9a0e4156SSadaf Ebrahimi 		op1 = &ext->operands[0];
2069*9a0e4156SSadaf Ebrahimi 	} else {
2070*9a0e4156SSadaf Ebrahimi 		op0 = &ext->operands[0];
2071*9a0e4156SSadaf Ebrahimi 		op1 = &ext->operands[1];
2072*9a0e4156SSadaf Ebrahimi 	}
2073*9a0e4156SSadaf Ebrahimi 
2074*9a0e4156SSadaf Ebrahimi 	if (rm == 0 && supports_single_op && src == dst) {
2075*9a0e4156SSadaf Ebrahimi 		ext->op_count = 1;
2076*9a0e4156SSadaf Ebrahimi 		op0->reg = M68K_REG_FP0 + dst;
2077*9a0e4156SSadaf Ebrahimi 		return;
2078*9a0e4156SSadaf Ebrahimi 	}
2079*9a0e4156SSadaf Ebrahimi 
2080*9a0e4156SSadaf Ebrahimi 	if (rm == 1) {
2081*9a0e4156SSadaf Ebrahimi 		switch (src) {
2082*9a0e4156SSadaf Ebrahimi 			case 0x00 :
2083*9a0e4156SSadaf Ebrahimi 				ext->op_size.cpu_size = M68K_CPU_SIZE_LONG;
2084*9a0e4156SSadaf Ebrahimi 				get_ea_mode_op(info, op0, info->ir, 4);
2085*9a0e4156SSadaf Ebrahimi 				break;
2086*9a0e4156SSadaf Ebrahimi 
2087*9a0e4156SSadaf Ebrahimi 			case 0x06 :
2088*9a0e4156SSadaf Ebrahimi 				ext->op_size.cpu_size = M68K_CPU_SIZE_BYTE;
2089*9a0e4156SSadaf Ebrahimi 				get_ea_mode_op(info, op0, info->ir, 1);
2090*9a0e4156SSadaf Ebrahimi 				break;
2091*9a0e4156SSadaf Ebrahimi 
2092*9a0e4156SSadaf Ebrahimi 			case 0x04 :
2093*9a0e4156SSadaf Ebrahimi 				ext->op_size.cpu_size = M68K_CPU_SIZE_WORD;
2094*9a0e4156SSadaf Ebrahimi 				get_ea_mode_op(info, op0, info->ir, 2);
2095*9a0e4156SSadaf Ebrahimi 				break;
2096*9a0e4156SSadaf Ebrahimi 
2097*9a0e4156SSadaf Ebrahimi 			case 0x01 :
2098*9a0e4156SSadaf Ebrahimi 				ext->op_size.type = M68K_SIZE_TYPE_FPU;
2099*9a0e4156SSadaf Ebrahimi 				ext->op_size.fpu_size = M68K_FPU_SIZE_SINGLE;
2100*9a0e4156SSadaf Ebrahimi 				get_ea_mode_op(info, op0, info->ir, 4);
2101*9a0e4156SSadaf Ebrahimi 				op0->type = M68K_OP_FP_SINGLE;
2102*9a0e4156SSadaf Ebrahimi 				break;
2103*9a0e4156SSadaf Ebrahimi 
2104*9a0e4156SSadaf Ebrahimi 			case 0x05:
2105*9a0e4156SSadaf Ebrahimi 				ext->op_size.type = M68K_SIZE_TYPE_FPU;
2106*9a0e4156SSadaf Ebrahimi 				ext->op_size.fpu_size = M68K_FPU_SIZE_DOUBLE;
2107*9a0e4156SSadaf Ebrahimi 				get_ea_mode_op(info, op0, info->ir, 8);
2108*9a0e4156SSadaf Ebrahimi 				op0->type = M68K_OP_FP_DOUBLE;
2109*9a0e4156SSadaf Ebrahimi 				break;
2110*9a0e4156SSadaf Ebrahimi 
2111*9a0e4156SSadaf Ebrahimi 			default :
2112*9a0e4156SSadaf Ebrahimi 				ext->op_size.type = M68K_SIZE_TYPE_FPU;
2113*9a0e4156SSadaf Ebrahimi 				ext->op_size.fpu_size = M68K_FPU_SIZE_EXTENDED;
2114*9a0e4156SSadaf Ebrahimi 				break;
2115*9a0e4156SSadaf Ebrahimi 		}
2116*9a0e4156SSadaf Ebrahimi 	} else {
2117*9a0e4156SSadaf Ebrahimi 		op0->reg = M68K_REG_FP0 + src;
2118*9a0e4156SSadaf Ebrahimi 	}
2119*9a0e4156SSadaf Ebrahimi 
2120*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_FP0 + dst;
2121*9a0e4156SSadaf Ebrahimi }
2122*9a0e4156SSadaf Ebrahimi 
d68020_cprestore(m68k_info * info)2123*9a0e4156SSadaf Ebrahimi static void d68020_cprestore(m68k_info *info)
2124*9a0e4156SSadaf Ebrahimi {
2125*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2126*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2127*9a0e4156SSadaf Ebrahimi 
2128*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FRESTORE, 1, 0);
2129*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 1);
2130*9a0e4156SSadaf Ebrahimi }
2131*9a0e4156SSadaf Ebrahimi 
d68020_cpsave(m68k_info * info)2132*9a0e4156SSadaf Ebrahimi static void d68020_cpsave(m68k_info *info)
2133*9a0e4156SSadaf Ebrahimi {
2134*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2135*9a0e4156SSadaf Ebrahimi 
2136*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2137*9a0e4156SSadaf Ebrahimi 
2138*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FSAVE, 1, 0);
2139*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 1);
2140*9a0e4156SSadaf Ebrahimi }
2141*9a0e4156SSadaf Ebrahimi 
d68020_cpscc(m68k_info * info)2142*9a0e4156SSadaf Ebrahimi static void d68020_cpscc(m68k_info *info)
2143*9a0e4156SSadaf Ebrahimi {
2144*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2145*9a0e4156SSadaf Ebrahimi 
2146*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2147*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FSF, 1, 1);
2148*9a0e4156SSadaf Ebrahimi 
2149*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
2150*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (read_imm_16(info) & 0x2f);
2151*9a0e4156SSadaf Ebrahimi 
2152*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 1);
2153*9a0e4156SSadaf Ebrahimi }
2154*9a0e4156SSadaf Ebrahimi 
d68020_cptrapcc_0(m68k_info * info)2155*9a0e4156SSadaf Ebrahimi static void d68020_cptrapcc_0(m68k_info *info)
2156*9a0e4156SSadaf Ebrahimi {
2157*9a0e4156SSadaf Ebrahimi 	uint extension1;
2158*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2159*9a0e4156SSadaf Ebrahimi 
2160*9a0e4156SSadaf Ebrahimi 	extension1 = read_imm_16(info);
2161*9a0e4156SSadaf Ebrahimi 
2162*9a0e4156SSadaf Ebrahimi 	build_init_op(info, M68K_INS_FTRAPF, 0, 0);
2163*9a0e4156SSadaf Ebrahimi 
2164*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
2165*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (extension1 & 0x2f);
2166*9a0e4156SSadaf Ebrahimi }
2167*9a0e4156SSadaf Ebrahimi 
d68020_cptrapcc_16(m68k_info * info)2168*9a0e4156SSadaf Ebrahimi static void d68020_cptrapcc_16(m68k_info *info)
2169*9a0e4156SSadaf Ebrahimi {
2170*9a0e4156SSadaf Ebrahimi 	uint extension1, extension2;
2171*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2172*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2173*9a0e4156SSadaf Ebrahimi 
2174*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2175*9a0e4156SSadaf Ebrahimi 
2176*9a0e4156SSadaf Ebrahimi 	extension1 = read_imm_16(info);
2177*9a0e4156SSadaf Ebrahimi 	extension2 = read_imm_16(info);
2178*9a0e4156SSadaf Ebrahimi 
2179*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FTRAPF, 1, 2);
2180*9a0e4156SSadaf Ebrahimi 
2181*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
2182*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (extension1 & 0x2f);
2183*9a0e4156SSadaf Ebrahimi 
2184*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2185*9a0e4156SSadaf Ebrahimi 
2186*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
2187*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
2188*9a0e4156SSadaf Ebrahimi 	op0->imm = extension2;
2189*9a0e4156SSadaf Ebrahimi }
2190*9a0e4156SSadaf Ebrahimi 
d68020_cptrapcc_32(m68k_info * info)2191*9a0e4156SSadaf Ebrahimi static void d68020_cptrapcc_32(m68k_info *info)
2192*9a0e4156SSadaf Ebrahimi {
2193*9a0e4156SSadaf Ebrahimi 	uint extension1, extension2;
2194*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2195*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2196*9a0e4156SSadaf Ebrahimi 
2197*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2198*9a0e4156SSadaf Ebrahimi 
2199*9a0e4156SSadaf Ebrahimi 	extension1 = read_imm_16(info);
2200*9a0e4156SSadaf Ebrahimi 	extension2 = read_imm_32(info);
2201*9a0e4156SSadaf Ebrahimi 
2202*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_FTRAPF, 1, 2);
2203*9a0e4156SSadaf Ebrahimi 
2204*9a0e4156SSadaf Ebrahimi 	// these are all in row with the extension so just doing a add here is fine
2205*9a0e4156SSadaf Ebrahimi 	info->inst->Opcode += (extension1 & 0x2f);
2206*9a0e4156SSadaf Ebrahimi 
2207*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2208*9a0e4156SSadaf Ebrahimi 
2209*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
2210*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
2211*9a0e4156SSadaf Ebrahimi 	op0->imm = extension2;
2212*9a0e4156SSadaf Ebrahimi }
2213*9a0e4156SSadaf Ebrahimi 
d68040_cpush(m68k_info * info)2214*9a0e4156SSadaf Ebrahimi static void d68040_cpush(m68k_info *info)
2215*9a0e4156SSadaf Ebrahimi {
2216*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2217*9a0e4156SSadaf Ebrahimi 	build_cpush_cinv(info, M68K_INS_CPUSHL);
2218*9a0e4156SSadaf Ebrahimi }
2219*9a0e4156SSadaf Ebrahimi 
d68000_dbra(m68k_info * info)2220*9a0e4156SSadaf Ebrahimi static void d68000_dbra(m68k_info *info)
2221*9a0e4156SSadaf Ebrahimi {
2222*9a0e4156SSadaf Ebrahimi 	build_dbxx(info, M68K_INS_DBRA, 0, make_int_16(read_imm_16(info)));
2223*9a0e4156SSadaf Ebrahimi }
2224*9a0e4156SSadaf Ebrahimi 
d68000_dbcc(m68k_info * info)2225*9a0e4156SSadaf Ebrahimi static void d68000_dbcc(m68k_info *info)
2226*9a0e4156SSadaf Ebrahimi {
2227*9a0e4156SSadaf Ebrahimi 	build_dbcc(info, 0, make_int_16(read_imm_16(info)));
2228*9a0e4156SSadaf Ebrahimi }
2229*9a0e4156SSadaf Ebrahimi 
d68000_divs(m68k_info * info)2230*9a0e4156SSadaf Ebrahimi static void d68000_divs(m68k_info *info)
2231*9a0e4156SSadaf Ebrahimi {
2232*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_DIVS, 2);
2233*9a0e4156SSadaf Ebrahimi }
2234*9a0e4156SSadaf Ebrahimi 
d68000_divu(m68k_info * info)2235*9a0e4156SSadaf Ebrahimi static void d68000_divu(m68k_info *info)
2236*9a0e4156SSadaf Ebrahimi {
2237*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_DIVU, 2);
2238*9a0e4156SSadaf Ebrahimi }
2239*9a0e4156SSadaf Ebrahimi 
d68020_divl(m68k_info * info)2240*9a0e4156SSadaf Ebrahimi static void d68020_divl(m68k_info *info)
2241*9a0e4156SSadaf Ebrahimi {
2242*9a0e4156SSadaf Ebrahimi 	uint extension, insn_signed;
2243*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2244*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2245*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2246*9a0e4156SSadaf Ebrahimi 	uint reg_0, reg_1;
2247*9a0e4156SSadaf Ebrahimi 
2248*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2249*9a0e4156SSadaf Ebrahimi 
2250*9a0e4156SSadaf Ebrahimi 	extension = read_imm_16(info);
2251*9a0e4156SSadaf Ebrahimi 	insn_signed = 0;
2252*9a0e4156SSadaf Ebrahimi 
2253*9a0e4156SSadaf Ebrahimi 	if (BIT_B((extension)))
2254*9a0e4156SSadaf Ebrahimi 		insn_signed = 1;
2255*9a0e4156SSadaf Ebrahimi 
2256*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, insn_signed ? M68K_INS_DIVS : M68K_INS_DIVU, 2, 4);
2257*9a0e4156SSadaf Ebrahimi 
2258*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2259*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2260*9a0e4156SSadaf Ebrahimi 
2261*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, 4);
2262*9a0e4156SSadaf Ebrahimi 
2263*9a0e4156SSadaf Ebrahimi 	reg_0 = extension & 7;
2264*9a0e4156SSadaf Ebrahimi 	reg_1 = (extension >> 12) & 7;
2265*9a0e4156SSadaf Ebrahimi 
2266*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2267*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_REG_PAIR;
2268*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_0 = reg_0;
2269*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_1 = reg_1;
2270*9a0e4156SSadaf Ebrahimi 
2271*9a0e4156SSadaf Ebrahimi 	if ((reg_0 == reg_1) || !BIT_A(extension)) {
2272*9a0e4156SSadaf Ebrahimi 		op1->type = M68K_OP_REG;
2273*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_D0 + reg_1;
2274*9a0e4156SSadaf Ebrahimi 	}
2275*9a0e4156SSadaf Ebrahimi }
2276*9a0e4156SSadaf Ebrahimi 
d68000_eor_8(m68k_info * info)2277*9a0e4156SSadaf Ebrahimi static void d68000_eor_8(m68k_info *info)
2278*9a0e4156SSadaf Ebrahimi {
2279*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_EOR, 1);
2280*9a0e4156SSadaf Ebrahimi }
2281*9a0e4156SSadaf Ebrahimi 
d68000_eor_16(m68k_info * info)2282*9a0e4156SSadaf Ebrahimi static void d68000_eor_16(m68k_info *info)
2283*9a0e4156SSadaf Ebrahimi {
2284*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_EOR, 2);
2285*9a0e4156SSadaf Ebrahimi }
2286*9a0e4156SSadaf Ebrahimi 
d68000_eor_32(m68k_info * info)2287*9a0e4156SSadaf Ebrahimi static void d68000_eor_32(m68k_info *info)
2288*9a0e4156SSadaf Ebrahimi {
2289*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_EOR, 4);
2290*9a0e4156SSadaf Ebrahimi }
2291*9a0e4156SSadaf Ebrahimi 
d68000_eori_8(m68k_info * info)2292*9a0e4156SSadaf Ebrahimi static void d68000_eori_8(m68k_info *info)
2293*9a0e4156SSadaf Ebrahimi {
2294*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_EORI, 1, read_imm_8(info));
2295*9a0e4156SSadaf Ebrahimi }
2296*9a0e4156SSadaf Ebrahimi 
d68000_eori_16(m68k_info * info)2297*9a0e4156SSadaf Ebrahimi static void d68000_eori_16(m68k_info *info)
2298*9a0e4156SSadaf Ebrahimi {
2299*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_EORI, 2, read_imm_16(info));
2300*9a0e4156SSadaf Ebrahimi }
2301*9a0e4156SSadaf Ebrahimi 
d68000_eori_32(m68k_info * info)2302*9a0e4156SSadaf Ebrahimi static void d68000_eori_32(m68k_info *info)
2303*9a0e4156SSadaf Ebrahimi {
2304*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_EORI, 4, read_imm_32(info));
2305*9a0e4156SSadaf Ebrahimi }
2306*9a0e4156SSadaf Ebrahimi 
d68000_eori_to_ccr(m68k_info * info)2307*9a0e4156SSadaf Ebrahimi static void d68000_eori_to_ccr(m68k_info *info)
2308*9a0e4156SSadaf Ebrahimi {
2309*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_EORI, read_imm_8(info), 1, M68K_REG_CCR);
2310*9a0e4156SSadaf Ebrahimi }
2311*9a0e4156SSadaf Ebrahimi 
d68000_eori_to_sr(m68k_info * info)2312*9a0e4156SSadaf Ebrahimi static void d68000_eori_to_sr(m68k_info *info)
2313*9a0e4156SSadaf Ebrahimi {
2314*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_EORI, read_imm_16(info), 2, M68K_REG_SR);
2315*9a0e4156SSadaf Ebrahimi }
2316*9a0e4156SSadaf Ebrahimi 
d68000_exg_dd(m68k_info * info)2317*9a0e4156SSadaf Ebrahimi static void d68000_exg_dd(m68k_info *info)
2318*9a0e4156SSadaf Ebrahimi {
2319*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_EXG, 4);
2320*9a0e4156SSadaf Ebrahimi }
2321*9a0e4156SSadaf Ebrahimi 
d68000_exg_aa(m68k_info * info)2322*9a0e4156SSadaf Ebrahimi static void d68000_exg_aa(m68k_info *info)
2323*9a0e4156SSadaf Ebrahimi {
2324*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2325*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2326*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_EXG, 2, 4);
2327*9a0e4156SSadaf Ebrahimi 
2328*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2329*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2330*9a0e4156SSadaf Ebrahimi 
2331*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2332*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_A0 + ((info->ir >> 9) & 7);
2333*9a0e4156SSadaf Ebrahimi 
2334*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2335*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + (info->ir & 7);
2336*9a0e4156SSadaf Ebrahimi }
2337*9a0e4156SSadaf Ebrahimi 
d68000_exg_da(m68k_info * info)2338*9a0e4156SSadaf Ebrahimi static void d68000_exg_da(m68k_info *info)
2339*9a0e4156SSadaf Ebrahimi {
2340*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2341*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2342*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_EXG, 2, 4);
2343*9a0e4156SSadaf Ebrahimi 
2344*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2345*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2346*9a0e4156SSadaf Ebrahimi 
2347*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2348*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
2349*9a0e4156SSadaf Ebrahimi 
2350*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2351*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + (info->ir & 7);
2352*9a0e4156SSadaf Ebrahimi }
2353*9a0e4156SSadaf Ebrahimi 
d68000_ext_16(m68k_info * info)2354*9a0e4156SSadaf Ebrahimi static void d68000_ext_16(m68k_info *info)
2355*9a0e4156SSadaf Ebrahimi {
2356*9a0e4156SSadaf Ebrahimi 	build_d(info, M68K_INS_EXT, 2);
2357*9a0e4156SSadaf Ebrahimi }
2358*9a0e4156SSadaf Ebrahimi 
d68000_ext_32(m68k_info * info)2359*9a0e4156SSadaf Ebrahimi static void d68000_ext_32(m68k_info *info)
2360*9a0e4156SSadaf Ebrahimi {
2361*9a0e4156SSadaf Ebrahimi 	build_d(info, M68K_INS_EXT, 4);
2362*9a0e4156SSadaf Ebrahimi }
2363*9a0e4156SSadaf Ebrahimi 
d68020_extb_32(m68k_info * info)2364*9a0e4156SSadaf Ebrahimi static void d68020_extb_32(m68k_info *info)
2365*9a0e4156SSadaf Ebrahimi {
2366*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2367*9a0e4156SSadaf Ebrahimi 	build_d(info, M68K_INS_EXTB, 4);
2368*9a0e4156SSadaf Ebrahimi }
2369*9a0e4156SSadaf Ebrahimi 
d68000_jmp(m68k_info * info)2370*9a0e4156SSadaf Ebrahimi static void d68000_jmp(m68k_info *info)
2371*9a0e4156SSadaf Ebrahimi {
2372*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_JMP, 1, 0);
2373*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
2374*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 4);
2375*9a0e4156SSadaf Ebrahimi }
2376*9a0e4156SSadaf Ebrahimi 
d68000_jsr(m68k_info * info)2377*9a0e4156SSadaf Ebrahimi static void d68000_jsr(m68k_info *info)
2378*9a0e4156SSadaf Ebrahimi {
2379*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_JSR, 1, 0);
2380*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_JUMP);
2381*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 4);
2382*9a0e4156SSadaf Ebrahimi }
2383*9a0e4156SSadaf Ebrahimi 
d68000_lea(m68k_info * info)2384*9a0e4156SSadaf Ebrahimi static void d68000_lea(m68k_info *info)
2385*9a0e4156SSadaf Ebrahimi {
2386*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_LEA, 4);
2387*9a0e4156SSadaf Ebrahimi }
2388*9a0e4156SSadaf Ebrahimi 
d68000_link_16(m68k_info * info)2389*9a0e4156SSadaf Ebrahimi static void d68000_link_16(m68k_info *info)
2390*9a0e4156SSadaf Ebrahimi {
2391*9a0e4156SSadaf Ebrahimi 	build_link(info, read_imm_16(info), 2);
2392*9a0e4156SSadaf Ebrahimi }
2393*9a0e4156SSadaf Ebrahimi 
d68020_link_32(m68k_info * info)2394*9a0e4156SSadaf Ebrahimi static void d68020_link_32(m68k_info *info)
2395*9a0e4156SSadaf Ebrahimi {
2396*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2397*9a0e4156SSadaf Ebrahimi 	build_link(info, read_imm_32(info), 4);
2398*9a0e4156SSadaf Ebrahimi }
2399*9a0e4156SSadaf Ebrahimi 
d68000_lsr_s_8(m68k_info * info)2400*9a0e4156SSadaf Ebrahimi static void d68000_lsr_s_8(m68k_info *info)
2401*9a0e4156SSadaf Ebrahimi {
2402*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSR, 1);
2403*9a0e4156SSadaf Ebrahimi }
2404*9a0e4156SSadaf Ebrahimi 
d68000_lsr_s_16(m68k_info * info)2405*9a0e4156SSadaf Ebrahimi static void d68000_lsr_s_16(m68k_info *info)
2406*9a0e4156SSadaf Ebrahimi {
2407*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSR, 2);
2408*9a0e4156SSadaf Ebrahimi }
2409*9a0e4156SSadaf Ebrahimi 
d68000_lsr_s_32(m68k_info * info)2410*9a0e4156SSadaf Ebrahimi static void d68000_lsr_s_32(m68k_info *info)
2411*9a0e4156SSadaf Ebrahimi {
2412*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSR, 4);
2413*9a0e4156SSadaf Ebrahimi }
2414*9a0e4156SSadaf Ebrahimi 
d68000_lsr_r_8(m68k_info * info)2415*9a0e4156SSadaf Ebrahimi static void d68000_lsr_r_8(m68k_info *info)
2416*9a0e4156SSadaf Ebrahimi {
2417*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSR, 1);
2418*9a0e4156SSadaf Ebrahimi }
2419*9a0e4156SSadaf Ebrahimi 
d68000_lsr_r_16(m68k_info * info)2420*9a0e4156SSadaf Ebrahimi static void d68000_lsr_r_16(m68k_info *info)
2421*9a0e4156SSadaf Ebrahimi {
2422*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSR, 2);
2423*9a0e4156SSadaf Ebrahimi }
2424*9a0e4156SSadaf Ebrahimi 
d68000_lsr_r_32(m68k_info * info)2425*9a0e4156SSadaf Ebrahimi static void d68000_lsr_r_32(m68k_info *info)
2426*9a0e4156SSadaf Ebrahimi {
2427*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSR, 4);
2428*9a0e4156SSadaf Ebrahimi }
2429*9a0e4156SSadaf Ebrahimi 
d68000_lsr_ea(m68k_info * info)2430*9a0e4156SSadaf Ebrahimi static void d68000_lsr_ea(m68k_info *info)
2431*9a0e4156SSadaf Ebrahimi {
2432*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_LSR, 2);
2433*9a0e4156SSadaf Ebrahimi }
2434*9a0e4156SSadaf Ebrahimi 
d68000_lsl_s_8(m68k_info * info)2435*9a0e4156SSadaf Ebrahimi static void d68000_lsl_s_8(m68k_info *info)
2436*9a0e4156SSadaf Ebrahimi {
2437*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSL, 1);
2438*9a0e4156SSadaf Ebrahimi }
2439*9a0e4156SSadaf Ebrahimi 
d68000_lsl_s_16(m68k_info * info)2440*9a0e4156SSadaf Ebrahimi static void d68000_lsl_s_16(m68k_info *info)
2441*9a0e4156SSadaf Ebrahimi {
2442*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSL, 2);
2443*9a0e4156SSadaf Ebrahimi }
2444*9a0e4156SSadaf Ebrahimi 
d68000_lsl_s_32(m68k_info * info)2445*9a0e4156SSadaf Ebrahimi static void d68000_lsl_s_32(m68k_info *info)
2446*9a0e4156SSadaf Ebrahimi {
2447*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_LSL, 4);
2448*9a0e4156SSadaf Ebrahimi }
2449*9a0e4156SSadaf Ebrahimi 
d68000_lsl_r_8(m68k_info * info)2450*9a0e4156SSadaf Ebrahimi static void d68000_lsl_r_8(m68k_info *info)
2451*9a0e4156SSadaf Ebrahimi {
2452*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSL, 1);
2453*9a0e4156SSadaf Ebrahimi }
2454*9a0e4156SSadaf Ebrahimi 
d68000_lsl_r_16(m68k_info * info)2455*9a0e4156SSadaf Ebrahimi static void d68000_lsl_r_16(m68k_info *info)
2456*9a0e4156SSadaf Ebrahimi {
2457*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSL, 2);
2458*9a0e4156SSadaf Ebrahimi }
2459*9a0e4156SSadaf Ebrahimi 
d68000_lsl_r_32(m68k_info * info)2460*9a0e4156SSadaf Ebrahimi static void d68000_lsl_r_32(m68k_info *info)
2461*9a0e4156SSadaf Ebrahimi {
2462*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_LSL, 4);
2463*9a0e4156SSadaf Ebrahimi }
2464*9a0e4156SSadaf Ebrahimi 
d68000_lsl_ea(m68k_info * info)2465*9a0e4156SSadaf Ebrahimi static void d68000_lsl_ea(m68k_info *info)
2466*9a0e4156SSadaf Ebrahimi {
2467*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_LSL, 2);
2468*9a0e4156SSadaf Ebrahimi }
2469*9a0e4156SSadaf Ebrahimi 
d68000_move_8(m68k_info * info)2470*9a0e4156SSadaf Ebrahimi static void d68000_move_8(m68k_info *info)
2471*9a0e4156SSadaf Ebrahimi {
2472*9a0e4156SSadaf Ebrahimi 	build_ea_ea(info, M68K_INS_MOVE, 1);
2473*9a0e4156SSadaf Ebrahimi }
2474*9a0e4156SSadaf Ebrahimi 
d68000_move_16(m68k_info * info)2475*9a0e4156SSadaf Ebrahimi static void d68000_move_16(m68k_info *info)
2476*9a0e4156SSadaf Ebrahimi {
2477*9a0e4156SSadaf Ebrahimi 	build_ea_ea(info, M68K_INS_MOVE, 2);
2478*9a0e4156SSadaf Ebrahimi }
2479*9a0e4156SSadaf Ebrahimi 
d68000_move_32(m68k_info * info)2480*9a0e4156SSadaf Ebrahimi static void d68000_move_32(m68k_info *info)
2481*9a0e4156SSadaf Ebrahimi {
2482*9a0e4156SSadaf Ebrahimi 	build_ea_ea(info, M68K_INS_MOVE, 4);
2483*9a0e4156SSadaf Ebrahimi }
2484*9a0e4156SSadaf Ebrahimi 
d68000_movea_16(m68k_info * info)2485*9a0e4156SSadaf Ebrahimi static void d68000_movea_16(m68k_info *info)
2486*9a0e4156SSadaf Ebrahimi {
2487*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_MOVEA, 2);
2488*9a0e4156SSadaf Ebrahimi }
2489*9a0e4156SSadaf Ebrahimi 
d68000_movea_32(m68k_info * info)2490*9a0e4156SSadaf Ebrahimi static void d68000_movea_32(m68k_info *info)
2491*9a0e4156SSadaf Ebrahimi {
2492*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_MOVEA, 4);
2493*9a0e4156SSadaf Ebrahimi }
2494*9a0e4156SSadaf Ebrahimi 
d68000_move_to_ccr(m68k_info * info)2495*9a0e4156SSadaf Ebrahimi static void d68000_move_to_ccr(m68k_info *info)
2496*9a0e4156SSadaf Ebrahimi {
2497*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2498*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2499*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2);
2500*9a0e4156SSadaf Ebrahimi 
2501*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2502*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2503*9a0e4156SSadaf Ebrahimi 
2504*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, 1);
2505*9a0e4156SSadaf Ebrahimi 
2506*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2507*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_CCR;
2508*9a0e4156SSadaf Ebrahimi }
2509*9a0e4156SSadaf Ebrahimi 
d68010_move_fr_ccr(m68k_info * info)2510*9a0e4156SSadaf Ebrahimi static void d68010_move_fr_ccr(m68k_info *info)
2511*9a0e4156SSadaf Ebrahimi {
2512*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2513*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2514*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2515*9a0e4156SSadaf Ebrahimi 
2516*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
2517*9a0e4156SSadaf Ebrahimi 
2518*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_MOVE, 2, 2);
2519*9a0e4156SSadaf Ebrahimi 
2520*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2521*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2522*9a0e4156SSadaf Ebrahimi 
2523*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2524*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_CCR;
2525*9a0e4156SSadaf Ebrahimi 
2526*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, 1);
2527*9a0e4156SSadaf Ebrahimi }
2528*9a0e4156SSadaf Ebrahimi 
d68000_move_fr_sr(m68k_info * info)2529*9a0e4156SSadaf Ebrahimi static void d68000_move_fr_sr(m68k_info *info)
2530*9a0e4156SSadaf Ebrahimi {
2531*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2532*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2533*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2);
2534*9a0e4156SSadaf Ebrahimi 
2535*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2536*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2537*9a0e4156SSadaf Ebrahimi 
2538*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2539*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_SR;
2540*9a0e4156SSadaf Ebrahimi 
2541*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op1, info->ir, 2);
2542*9a0e4156SSadaf Ebrahimi }
2543*9a0e4156SSadaf Ebrahimi 
d68000_move_to_sr(m68k_info * info)2544*9a0e4156SSadaf Ebrahimi static void d68000_move_to_sr(m68k_info *info)
2545*9a0e4156SSadaf Ebrahimi {
2546*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2547*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2548*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2);
2549*9a0e4156SSadaf Ebrahimi 
2550*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2551*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2552*9a0e4156SSadaf Ebrahimi 
2553*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, 2);
2554*9a0e4156SSadaf Ebrahimi 
2555*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2556*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_SR;
2557*9a0e4156SSadaf Ebrahimi }
2558*9a0e4156SSadaf Ebrahimi 
d68000_move_fr_usp(m68k_info * info)2559*9a0e4156SSadaf Ebrahimi static void d68000_move_fr_usp(m68k_info *info)
2560*9a0e4156SSadaf Ebrahimi {
2561*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2562*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2563*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 0);
2564*9a0e4156SSadaf Ebrahimi 
2565*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2566*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2567*9a0e4156SSadaf Ebrahimi 
2568*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2569*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_USP;
2570*9a0e4156SSadaf Ebrahimi 
2571*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2572*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_A0 + (info->ir & 7);
2573*9a0e4156SSadaf Ebrahimi }
2574*9a0e4156SSadaf Ebrahimi 
d68000_move_to_usp(m68k_info * info)2575*9a0e4156SSadaf Ebrahimi static void d68000_move_to_usp(m68k_info *info)
2576*9a0e4156SSadaf Ebrahimi {
2577*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2578*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2579*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 0);
2580*9a0e4156SSadaf Ebrahimi 
2581*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2582*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2583*9a0e4156SSadaf Ebrahimi 
2584*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_NONE;
2585*9a0e4156SSadaf Ebrahimi 	op0->reg = M68K_REG_A0 + (info->ir & 7);
2586*9a0e4156SSadaf Ebrahimi 
2587*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2588*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_USP;
2589*9a0e4156SSadaf Ebrahimi }
2590*9a0e4156SSadaf Ebrahimi 
d68010_movec(m68k_info * info)2591*9a0e4156SSadaf Ebrahimi static void d68010_movec(m68k_info *info)
2592*9a0e4156SSadaf Ebrahimi {
2593*9a0e4156SSadaf Ebrahimi 	uint extension;
2594*9a0e4156SSadaf Ebrahimi 	m68k_reg reg;
2595*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2596*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2597*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2598*9a0e4156SSadaf Ebrahimi 
2599*9a0e4156SSadaf Ebrahimi 
2600*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
2601*9a0e4156SSadaf Ebrahimi 
2602*9a0e4156SSadaf Ebrahimi 	extension = read_imm_16(info);
2603*9a0e4156SSadaf Ebrahimi 	reg = M68K_REG_INVALID;
2604*9a0e4156SSadaf Ebrahimi 
2605*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, M68K_INS_MOVEC, 2, 0);
2606*9a0e4156SSadaf Ebrahimi 
2607*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2608*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2609*9a0e4156SSadaf Ebrahimi 
2610*9a0e4156SSadaf Ebrahimi 	switch (extension & 0xfff) {
2611*9a0e4156SSadaf Ebrahimi 		case 0x000: reg = M68K_REG_SFC; break;
2612*9a0e4156SSadaf Ebrahimi 		case 0x001: reg = M68K_REG_DFC; break;
2613*9a0e4156SSadaf Ebrahimi 		case 0x800: reg = M68K_REG_USP; break;
2614*9a0e4156SSadaf Ebrahimi 		case 0x801: reg = M68K_REG_VBR; break;
2615*9a0e4156SSadaf Ebrahimi 		case 0x002: reg = M68K_REG_CACR; break;
2616*9a0e4156SSadaf Ebrahimi 		case 0x802: reg = M68K_REG_CAAR; break;
2617*9a0e4156SSadaf Ebrahimi 		case 0x803: reg = M68K_REG_MSP; break;
2618*9a0e4156SSadaf Ebrahimi 		case 0x804: reg = M68K_REG_ISP; break;
2619*9a0e4156SSadaf Ebrahimi 		case 0x003: reg = M68K_REG_TC; break;
2620*9a0e4156SSadaf Ebrahimi 		case 0x004: reg = M68K_REG_ITT0; break;
2621*9a0e4156SSadaf Ebrahimi 		case 0x005: reg = M68K_REG_ITT1; break;
2622*9a0e4156SSadaf Ebrahimi 		case 0x006: reg = M68K_REG_DTT0; break;
2623*9a0e4156SSadaf Ebrahimi 		case 0x007: reg = M68K_REG_DTT1; break;
2624*9a0e4156SSadaf Ebrahimi 		case 0x805: reg = M68K_REG_MMUSR; break;
2625*9a0e4156SSadaf Ebrahimi 		case 0x806: reg = M68K_REG_URP; break;
2626*9a0e4156SSadaf Ebrahimi 		case 0x807: reg = M68K_REG_SRP; break;
2627*9a0e4156SSadaf Ebrahimi 	}
2628*9a0e4156SSadaf Ebrahimi 
2629*9a0e4156SSadaf Ebrahimi 	if (BIT_1(info->ir)) {
2630*9a0e4156SSadaf Ebrahimi 		op0->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7);
2631*9a0e4156SSadaf Ebrahimi 		op1->reg = reg;
2632*9a0e4156SSadaf Ebrahimi 	} else {
2633*9a0e4156SSadaf Ebrahimi 		op0->reg = reg;
2634*9a0e4156SSadaf Ebrahimi 		op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7);
2635*9a0e4156SSadaf Ebrahimi 	}
2636*9a0e4156SSadaf Ebrahimi }
2637*9a0e4156SSadaf Ebrahimi 
d68000_movem_pd_16(m68k_info * info)2638*9a0e4156SSadaf Ebrahimi static void d68000_movem_pd_16(m68k_info *info)
2639*9a0e4156SSadaf Ebrahimi {
2640*9a0e4156SSadaf Ebrahimi 	build_movem_re(info, M68K_INS_MOVEM, 2);
2641*9a0e4156SSadaf Ebrahimi }
2642*9a0e4156SSadaf Ebrahimi 
d68000_movem_pd_32(m68k_info * info)2643*9a0e4156SSadaf Ebrahimi static void d68000_movem_pd_32(m68k_info *info)
2644*9a0e4156SSadaf Ebrahimi {
2645*9a0e4156SSadaf Ebrahimi 	build_movem_re(info, M68K_INS_MOVEM, 4);
2646*9a0e4156SSadaf Ebrahimi }
2647*9a0e4156SSadaf Ebrahimi 
d68000_movem_er_16(m68k_info * info)2648*9a0e4156SSadaf Ebrahimi static void d68000_movem_er_16(m68k_info *info)
2649*9a0e4156SSadaf Ebrahimi {
2650*9a0e4156SSadaf Ebrahimi 	build_movem_er(info, M68K_INS_MOVEM, 2);
2651*9a0e4156SSadaf Ebrahimi }
2652*9a0e4156SSadaf Ebrahimi 
d68000_movem_er_32(m68k_info * info)2653*9a0e4156SSadaf Ebrahimi static void d68000_movem_er_32(m68k_info *info)
2654*9a0e4156SSadaf Ebrahimi {
2655*9a0e4156SSadaf Ebrahimi 	build_movem_er(info, M68K_INS_MOVEM, 4);
2656*9a0e4156SSadaf Ebrahimi }
2657*9a0e4156SSadaf Ebrahimi 
d68000_movem_re_16(m68k_info * info)2658*9a0e4156SSadaf Ebrahimi static void d68000_movem_re_16(m68k_info *info)
2659*9a0e4156SSadaf Ebrahimi {
2660*9a0e4156SSadaf Ebrahimi 	build_movem_re(info, M68K_INS_MOVEM, 2);
2661*9a0e4156SSadaf Ebrahimi }
2662*9a0e4156SSadaf Ebrahimi 
d68000_movem_re_32(m68k_info * info)2663*9a0e4156SSadaf Ebrahimi static void d68000_movem_re_32(m68k_info *info)
2664*9a0e4156SSadaf Ebrahimi {
2665*9a0e4156SSadaf Ebrahimi 	build_movem_re(info, M68K_INS_MOVEM, 4);
2666*9a0e4156SSadaf Ebrahimi }
2667*9a0e4156SSadaf Ebrahimi 
d68000_movep_re_16(m68k_info * info)2668*9a0e4156SSadaf Ebrahimi static void d68000_movep_re_16(m68k_info *info)
2669*9a0e4156SSadaf Ebrahimi {
2670*9a0e4156SSadaf Ebrahimi 	build_movep_re(info, 2);
2671*9a0e4156SSadaf Ebrahimi }
2672*9a0e4156SSadaf Ebrahimi 
d68000_movep_re_32(m68k_info * info)2673*9a0e4156SSadaf Ebrahimi static void d68000_movep_re_32(m68k_info *info)
2674*9a0e4156SSadaf Ebrahimi {
2675*9a0e4156SSadaf Ebrahimi 	build_movep_re(info, 4);
2676*9a0e4156SSadaf Ebrahimi }
2677*9a0e4156SSadaf Ebrahimi 
d68000_movep_er_16(m68k_info * info)2678*9a0e4156SSadaf Ebrahimi static void d68000_movep_er_16(m68k_info *info)
2679*9a0e4156SSadaf Ebrahimi {
2680*9a0e4156SSadaf Ebrahimi 	build_movep_er(info, 2);
2681*9a0e4156SSadaf Ebrahimi }
2682*9a0e4156SSadaf Ebrahimi 
d68000_movep_er_32(m68k_info * info)2683*9a0e4156SSadaf Ebrahimi static void d68000_movep_er_32(m68k_info *info)
2684*9a0e4156SSadaf Ebrahimi {
2685*9a0e4156SSadaf Ebrahimi 	build_movep_er(info, 4);
2686*9a0e4156SSadaf Ebrahimi }
2687*9a0e4156SSadaf Ebrahimi 
d68010_moves_8(m68k_info * info)2688*9a0e4156SSadaf Ebrahimi static void d68010_moves_8(m68k_info *info)
2689*9a0e4156SSadaf Ebrahimi {
2690*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
2691*9a0e4156SSadaf Ebrahimi 	build_moves(info, 1);
2692*9a0e4156SSadaf Ebrahimi }
2693*9a0e4156SSadaf Ebrahimi 
d68010_moves_16(m68k_info * info)2694*9a0e4156SSadaf Ebrahimi static void d68010_moves_16(m68k_info *info)
2695*9a0e4156SSadaf Ebrahimi {
2696*9a0e4156SSadaf Ebrahimi 	//uint extension;
2697*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
2698*9a0e4156SSadaf Ebrahimi 	build_moves(info, 2);
2699*9a0e4156SSadaf Ebrahimi }
2700*9a0e4156SSadaf Ebrahimi 
d68010_moves_32(m68k_info * info)2701*9a0e4156SSadaf Ebrahimi static void d68010_moves_32(m68k_info *info)
2702*9a0e4156SSadaf Ebrahimi {
2703*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
2704*9a0e4156SSadaf Ebrahimi 	build_moves(info, 4);
2705*9a0e4156SSadaf Ebrahimi }
2706*9a0e4156SSadaf Ebrahimi 
d68000_moveq(m68k_info * info)2707*9a0e4156SSadaf Ebrahimi static void d68000_moveq(m68k_info *info)
2708*9a0e4156SSadaf Ebrahimi {
2709*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2710*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2711*9a0e4156SSadaf Ebrahimi 
2712*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_MOVEQ, 2, 0);
2713*9a0e4156SSadaf Ebrahimi 
2714*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2715*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2716*9a0e4156SSadaf Ebrahimi 
2717*9a0e4156SSadaf Ebrahimi 	op0->type = M68K_OP_IMM;
2718*9a0e4156SSadaf Ebrahimi 	op0->address_mode = M68K_AM_IMMEDIATE;
2719*9a0e4156SSadaf Ebrahimi 	op0->imm = (info->ir & 0xff);
2720*9a0e4156SSadaf Ebrahimi 
2721*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_REG_DIRECT_DATA;
2722*9a0e4156SSadaf Ebrahimi 	op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7);
2723*9a0e4156SSadaf Ebrahimi }
2724*9a0e4156SSadaf Ebrahimi 
d68040_move16_pi_pi(m68k_info * info)2725*9a0e4156SSadaf Ebrahimi static void d68040_move16_pi_pi(m68k_info *info)
2726*9a0e4156SSadaf Ebrahimi {
2727*9a0e4156SSadaf Ebrahimi 	int data[] = { info->ir & 7, (read_imm_16(info) >> 12) & 7 };
2728*9a0e4156SSadaf Ebrahimi 	int modes[] = { M68K_AM_REGI_ADDR_POST_INC, M68K_AM_REGI_ADDR_POST_INC };
2729*9a0e4156SSadaf Ebrahimi 
2730*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2731*9a0e4156SSadaf Ebrahimi 
2732*9a0e4156SSadaf Ebrahimi 	build_move16(info, data, modes);
2733*9a0e4156SSadaf Ebrahimi }
2734*9a0e4156SSadaf Ebrahimi 
d68040_move16_pi_al(m68k_info * info)2735*9a0e4156SSadaf Ebrahimi static void d68040_move16_pi_al(m68k_info *info)
2736*9a0e4156SSadaf Ebrahimi {
2737*9a0e4156SSadaf Ebrahimi 	int data[] = { info->ir & 7, read_imm_32(info) };
2738*9a0e4156SSadaf Ebrahimi 	int modes[] = { M68K_AM_REGI_ADDR_POST_INC, M68K_AM_ABSOLUTE_DATA_LONG };
2739*9a0e4156SSadaf Ebrahimi 
2740*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2741*9a0e4156SSadaf Ebrahimi 
2742*9a0e4156SSadaf Ebrahimi 	build_move16(info, data, modes);
2743*9a0e4156SSadaf Ebrahimi }
2744*9a0e4156SSadaf Ebrahimi 
d68040_move16_al_pi(m68k_info * info)2745*9a0e4156SSadaf Ebrahimi static void d68040_move16_al_pi(m68k_info *info)
2746*9a0e4156SSadaf Ebrahimi {
2747*9a0e4156SSadaf Ebrahimi 	int data[] = { read_imm_32(info), info->ir & 7 };
2748*9a0e4156SSadaf Ebrahimi 	int modes[] = { M68K_AM_ABSOLUTE_DATA_LONG, M68K_AM_REGI_ADDR_POST_INC };
2749*9a0e4156SSadaf Ebrahimi 
2750*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2751*9a0e4156SSadaf Ebrahimi 
2752*9a0e4156SSadaf Ebrahimi 	build_move16(info, data, modes);
2753*9a0e4156SSadaf Ebrahimi }
2754*9a0e4156SSadaf Ebrahimi 
d68040_move16_ai_al(m68k_info * info)2755*9a0e4156SSadaf Ebrahimi static void d68040_move16_ai_al(m68k_info *info)
2756*9a0e4156SSadaf Ebrahimi {
2757*9a0e4156SSadaf Ebrahimi 	int data[] = { info->ir & 7, read_imm_32(info) };
2758*9a0e4156SSadaf Ebrahimi 	int modes[] = { M68K_AM_REG_DIRECT_ADDR, M68K_AM_ABSOLUTE_DATA_LONG };
2759*9a0e4156SSadaf Ebrahimi 
2760*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2761*9a0e4156SSadaf Ebrahimi 
2762*9a0e4156SSadaf Ebrahimi 	build_move16(info, data, modes);
2763*9a0e4156SSadaf Ebrahimi }
2764*9a0e4156SSadaf Ebrahimi 
d68040_move16_al_ai(m68k_info * info)2765*9a0e4156SSadaf Ebrahimi static void d68040_move16_al_ai(m68k_info *info)
2766*9a0e4156SSadaf Ebrahimi {
2767*9a0e4156SSadaf Ebrahimi 	int data[] = { read_imm_32(info), info->ir & 7 };
2768*9a0e4156SSadaf Ebrahimi 	int modes[] = { M68K_AM_ABSOLUTE_DATA_LONG, M68K_AM_REG_DIRECT_ADDR };
2769*9a0e4156SSadaf Ebrahimi 
2770*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68040_PLUS);
2771*9a0e4156SSadaf Ebrahimi 
2772*9a0e4156SSadaf Ebrahimi 	build_move16(info, data, modes);
2773*9a0e4156SSadaf Ebrahimi }
2774*9a0e4156SSadaf Ebrahimi 
d68000_muls(m68k_info * info)2775*9a0e4156SSadaf Ebrahimi static void d68000_muls(m68k_info *info)
2776*9a0e4156SSadaf Ebrahimi {
2777*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_MULS, 2);
2778*9a0e4156SSadaf Ebrahimi }
2779*9a0e4156SSadaf Ebrahimi 
d68000_mulu(m68k_info * info)2780*9a0e4156SSadaf Ebrahimi static void d68000_mulu(m68k_info *info)
2781*9a0e4156SSadaf Ebrahimi {
2782*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_MULU, 2);
2783*9a0e4156SSadaf Ebrahimi }
2784*9a0e4156SSadaf Ebrahimi 
d68020_mull(m68k_info * info)2785*9a0e4156SSadaf Ebrahimi static void d68020_mull(m68k_info *info)
2786*9a0e4156SSadaf Ebrahimi {
2787*9a0e4156SSadaf Ebrahimi 	uint extension, insn_signed;
2788*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
2789*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op0;
2790*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op1;
2791*9a0e4156SSadaf Ebrahimi 	uint reg_0, reg_1;
2792*9a0e4156SSadaf Ebrahimi 
2793*9a0e4156SSadaf Ebrahimi 
2794*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2795*9a0e4156SSadaf Ebrahimi 
2796*9a0e4156SSadaf Ebrahimi 	extension = read_imm_16(info);
2797*9a0e4156SSadaf Ebrahimi 	insn_signed = 0;
2798*9a0e4156SSadaf Ebrahimi 
2799*9a0e4156SSadaf Ebrahimi 	if (BIT_B((extension)))
2800*9a0e4156SSadaf Ebrahimi 		insn_signed = 1;
2801*9a0e4156SSadaf Ebrahimi 
2802*9a0e4156SSadaf Ebrahimi 	ext = build_init_op(info, insn_signed ? M68K_INS_MULS : M68K_INS_MULU, 2, 4);
2803*9a0e4156SSadaf Ebrahimi 
2804*9a0e4156SSadaf Ebrahimi 	op0 = &ext->operands[0];
2805*9a0e4156SSadaf Ebrahimi 	op1 = &ext->operands[1];
2806*9a0e4156SSadaf Ebrahimi 
2807*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, op0, info->ir, 4);
2808*9a0e4156SSadaf Ebrahimi 
2809*9a0e4156SSadaf Ebrahimi 	reg_0 = extension & 7;
2810*9a0e4156SSadaf Ebrahimi 	reg_1 = (extension >> 12) & 7;
2811*9a0e4156SSadaf Ebrahimi 
2812*9a0e4156SSadaf Ebrahimi 	op1->address_mode = M68K_AM_NONE;
2813*9a0e4156SSadaf Ebrahimi 	op1->type = M68K_OP_REG_PAIR;
2814*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_0 = reg_0;
2815*9a0e4156SSadaf Ebrahimi 	op1->reg_pair.reg_1 = reg_1;
2816*9a0e4156SSadaf Ebrahimi 
2817*9a0e4156SSadaf Ebrahimi 	if (!BIT_A(extension)) {
2818*9a0e4156SSadaf Ebrahimi 		op1->type = M68K_OP_REG;
2819*9a0e4156SSadaf Ebrahimi 		op1->reg = M68K_REG_D0 + reg_1;
2820*9a0e4156SSadaf Ebrahimi 	}
2821*9a0e4156SSadaf Ebrahimi }
2822*9a0e4156SSadaf Ebrahimi 
d68000_nbcd(m68k_info * info)2823*9a0e4156SSadaf Ebrahimi static void d68000_nbcd(m68k_info *info)
2824*9a0e4156SSadaf Ebrahimi {
2825*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NBCD, 1);
2826*9a0e4156SSadaf Ebrahimi }
2827*9a0e4156SSadaf Ebrahimi 
d68000_neg_8(m68k_info * info)2828*9a0e4156SSadaf Ebrahimi static void d68000_neg_8(m68k_info *info)
2829*9a0e4156SSadaf Ebrahimi {
2830*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEG, 1);
2831*9a0e4156SSadaf Ebrahimi }
2832*9a0e4156SSadaf Ebrahimi 
d68000_neg_16(m68k_info * info)2833*9a0e4156SSadaf Ebrahimi static void d68000_neg_16(m68k_info *info)
2834*9a0e4156SSadaf Ebrahimi {
2835*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEG, 2);
2836*9a0e4156SSadaf Ebrahimi }
2837*9a0e4156SSadaf Ebrahimi 
d68000_neg_32(m68k_info * info)2838*9a0e4156SSadaf Ebrahimi static void d68000_neg_32(m68k_info *info)
2839*9a0e4156SSadaf Ebrahimi {
2840*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEG, 4);
2841*9a0e4156SSadaf Ebrahimi }
2842*9a0e4156SSadaf Ebrahimi 
d68000_negx_8(m68k_info * info)2843*9a0e4156SSadaf Ebrahimi static void d68000_negx_8(m68k_info *info)
2844*9a0e4156SSadaf Ebrahimi {
2845*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEGX, 1);
2846*9a0e4156SSadaf Ebrahimi }
2847*9a0e4156SSadaf Ebrahimi 
d68000_negx_16(m68k_info * info)2848*9a0e4156SSadaf Ebrahimi static void d68000_negx_16(m68k_info *info)
2849*9a0e4156SSadaf Ebrahimi {
2850*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEGX, 2);
2851*9a0e4156SSadaf Ebrahimi }
2852*9a0e4156SSadaf Ebrahimi 
d68000_negx_32(m68k_info * info)2853*9a0e4156SSadaf Ebrahimi static void d68000_negx_32(m68k_info *info)
2854*9a0e4156SSadaf Ebrahimi {
2855*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NEGX, 4);
2856*9a0e4156SSadaf Ebrahimi }
2857*9a0e4156SSadaf Ebrahimi 
d68000_nop(m68k_info * info)2858*9a0e4156SSadaf Ebrahimi static void d68000_nop(m68k_info *info)
2859*9a0e4156SSadaf Ebrahimi {
2860*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_NOP);
2861*9a0e4156SSadaf Ebrahimi }
2862*9a0e4156SSadaf Ebrahimi 
d68000_not_8(m68k_info * info)2863*9a0e4156SSadaf Ebrahimi static void d68000_not_8(m68k_info *info)
2864*9a0e4156SSadaf Ebrahimi {
2865*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NOT, 1);
2866*9a0e4156SSadaf Ebrahimi }
2867*9a0e4156SSadaf Ebrahimi 
d68000_not_16(m68k_info * info)2868*9a0e4156SSadaf Ebrahimi static void d68000_not_16(m68k_info *info)
2869*9a0e4156SSadaf Ebrahimi {
2870*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NOT, 2);
2871*9a0e4156SSadaf Ebrahimi }
2872*9a0e4156SSadaf Ebrahimi 
d68000_not_32(m68k_info * info)2873*9a0e4156SSadaf Ebrahimi static void d68000_not_32(m68k_info *info)
2874*9a0e4156SSadaf Ebrahimi {
2875*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_NOT, 4);
2876*9a0e4156SSadaf Ebrahimi }
2877*9a0e4156SSadaf Ebrahimi 
d68000_or_er_8(m68k_info * info)2878*9a0e4156SSadaf Ebrahimi static void d68000_or_er_8(m68k_info *info)
2879*9a0e4156SSadaf Ebrahimi {
2880*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_OR, 1);
2881*9a0e4156SSadaf Ebrahimi }
2882*9a0e4156SSadaf Ebrahimi 
d68000_or_er_16(m68k_info * info)2883*9a0e4156SSadaf Ebrahimi static void d68000_or_er_16(m68k_info *info)
2884*9a0e4156SSadaf Ebrahimi {
2885*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_OR, 2);
2886*9a0e4156SSadaf Ebrahimi }
2887*9a0e4156SSadaf Ebrahimi 
d68000_or_er_32(m68k_info * info)2888*9a0e4156SSadaf Ebrahimi static void d68000_or_er_32(m68k_info *info)
2889*9a0e4156SSadaf Ebrahimi {
2890*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_OR, 4);
2891*9a0e4156SSadaf Ebrahimi }
2892*9a0e4156SSadaf Ebrahimi 
d68000_or_re_8(m68k_info * info)2893*9a0e4156SSadaf Ebrahimi static void d68000_or_re_8(m68k_info *info)
2894*9a0e4156SSadaf Ebrahimi {
2895*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_OR, 1);
2896*9a0e4156SSadaf Ebrahimi }
2897*9a0e4156SSadaf Ebrahimi 
d68000_or_re_16(m68k_info * info)2898*9a0e4156SSadaf Ebrahimi static void d68000_or_re_16(m68k_info *info)
2899*9a0e4156SSadaf Ebrahimi {
2900*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_OR, 2);
2901*9a0e4156SSadaf Ebrahimi }
2902*9a0e4156SSadaf Ebrahimi 
d68000_or_re_32(m68k_info * info)2903*9a0e4156SSadaf Ebrahimi static void d68000_or_re_32(m68k_info *info)
2904*9a0e4156SSadaf Ebrahimi {
2905*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_OR, 4);
2906*9a0e4156SSadaf Ebrahimi }
2907*9a0e4156SSadaf Ebrahimi 
d68000_ori_8(m68k_info * info)2908*9a0e4156SSadaf Ebrahimi static void d68000_ori_8(m68k_info *info)
2909*9a0e4156SSadaf Ebrahimi {
2910*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ORI, 1, read_imm_8(info));
2911*9a0e4156SSadaf Ebrahimi }
2912*9a0e4156SSadaf Ebrahimi 
d68000_ori_16(m68k_info * info)2913*9a0e4156SSadaf Ebrahimi static void d68000_ori_16(m68k_info *info)
2914*9a0e4156SSadaf Ebrahimi {
2915*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ORI, 2, read_imm_16(info));
2916*9a0e4156SSadaf Ebrahimi }
2917*9a0e4156SSadaf Ebrahimi 
d68000_ori_32(m68k_info * info)2918*9a0e4156SSadaf Ebrahimi static void d68000_ori_32(m68k_info *info)
2919*9a0e4156SSadaf Ebrahimi {
2920*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_ORI, 4, read_imm_32(info));
2921*9a0e4156SSadaf Ebrahimi }
2922*9a0e4156SSadaf Ebrahimi 
d68000_ori_to_ccr(m68k_info * info)2923*9a0e4156SSadaf Ebrahimi static void d68000_ori_to_ccr(m68k_info *info)
2924*9a0e4156SSadaf Ebrahimi {
2925*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_ORI, read_imm_8(info), 1, M68K_REG_CCR);
2926*9a0e4156SSadaf Ebrahimi }
2927*9a0e4156SSadaf Ebrahimi 
d68000_ori_to_sr(m68k_info * info)2928*9a0e4156SSadaf Ebrahimi static void d68000_ori_to_sr(m68k_info *info)
2929*9a0e4156SSadaf Ebrahimi {
2930*9a0e4156SSadaf Ebrahimi 	build_imm_special_reg(info, M68K_INS_ORI, read_imm_16(info), 2, M68K_REG_SR);
2931*9a0e4156SSadaf Ebrahimi }
2932*9a0e4156SSadaf Ebrahimi 
d68020_pack_rr(m68k_info * info)2933*9a0e4156SSadaf Ebrahimi static void d68020_pack_rr(m68k_info *info)
2934*9a0e4156SSadaf Ebrahimi {
2935*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2936*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_PACK, 0, read_imm_16(info));
2937*9a0e4156SSadaf Ebrahimi }
2938*9a0e4156SSadaf Ebrahimi 
d68020_pack_mm(m68k_info * info)2939*9a0e4156SSadaf Ebrahimi static void d68020_pack_mm(m68k_info *info)
2940*9a0e4156SSadaf Ebrahimi {
2941*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
2942*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_PACK, 0, read_imm_16(info));
2943*9a0e4156SSadaf Ebrahimi }
2944*9a0e4156SSadaf Ebrahimi 
d68000_pea(m68k_info * info)2945*9a0e4156SSadaf Ebrahimi static void d68000_pea(m68k_info *info)
2946*9a0e4156SSadaf Ebrahimi {
2947*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_PEA, 4);
2948*9a0e4156SSadaf Ebrahimi }
2949*9a0e4156SSadaf Ebrahimi 
d68000_reset(m68k_info * info)2950*9a0e4156SSadaf Ebrahimi static void d68000_reset(m68k_info *info)
2951*9a0e4156SSadaf Ebrahimi {
2952*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_RESET);
2953*9a0e4156SSadaf Ebrahimi }
2954*9a0e4156SSadaf Ebrahimi 
d68000_ror_s_8(m68k_info * info)2955*9a0e4156SSadaf Ebrahimi static void d68000_ror_s_8(m68k_info *info)
2956*9a0e4156SSadaf Ebrahimi {
2957*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROR, 1);
2958*9a0e4156SSadaf Ebrahimi }
2959*9a0e4156SSadaf Ebrahimi 
d68000_ror_s_16(m68k_info * info)2960*9a0e4156SSadaf Ebrahimi static void d68000_ror_s_16(m68k_info *info)
2961*9a0e4156SSadaf Ebrahimi {
2962*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROR, 2);
2963*9a0e4156SSadaf Ebrahimi }
2964*9a0e4156SSadaf Ebrahimi 
d68000_ror_s_32(m68k_info * info)2965*9a0e4156SSadaf Ebrahimi static void d68000_ror_s_32(m68k_info *info)
2966*9a0e4156SSadaf Ebrahimi {
2967*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROR, 4);
2968*9a0e4156SSadaf Ebrahimi }
2969*9a0e4156SSadaf Ebrahimi 
d68000_ror_r_8(m68k_info * info)2970*9a0e4156SSadaf Ebrahimi static void d68000_ror_r_8(m68k_info *info)
2971*9a0e4156SSadaf Ebrahimi {
2972*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROR, 1);
2973*9a0e4156SSadaf Ebrahimi }
2974*9a0e4156SSadaf Ebrahimi 
d68000_ror_r_16(m68k_info * info)2975*9a0e4156SSadaf Ebrahimi static void d68000_ror_r_16(m68k_info *info)
2976*9a0e4156SSadaf Ebrahimi {
2977*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROR, 2);
2978*9a0e4156SSadaf Ebrahimi }
2979*9a0e4156SSadaf Ebrahimi 
d68000_ror_r_32(m68k_info * info)2980*9a0e4156SSadaf Ebrahimi static void d68000_ror_r_32(m68k_info *info)
2981*9a0e4156SSadaf Ebrahimi {
2982*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROR, 4);
2983*9a0e4156SSadaf Ebrahimi }
2984*9a0e4156SSadaf Ebrahimi 
d68000_ror_ea(m68k_info * info)2985*9a0e4156SSadaf Ebrahimi static void d68000_ror_ea(m68k_info *info)
2986*9a0e4156SSadaf Ebrahimi {
2987*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ROR, 2);
2988*9a0e4156SSadaf Ebrahimi }
2989*9a0e4156SSadaf Ebrahimi 
d68000_rol_s_8(m68k_info * info)2990*9a0e4156SSadaf Ebrahimi static void d68000_rol_s_8(m68k_info *info)
2991*9a0e4156SSadaf Ebrahimi {
2992*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROL, 1);
2993*9a0e4156SSadaf Ebrahimi }
2994*9a0e4156SSadaf Ebrahimi 
d68000_rol_s_16(m68k_info * info)2995*9a0e4156SSadaf Ebrahimi static void d68000_rol_s_16(m68k_info *info)
2996*9a0e4156SSadaf Ebrahimi {
2997*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROL, 2);
2998*9a0e4156SSadaf Ebrahimi }
2999*9a0e4156SSadaf Ebrahimi 
d68000_rol_s_32(m68k_info * info)3000*9a0e4156SSadaf Ebrahimi static void d68000_rol_s_32(m68k_info *info)
3001*9a0e4156SSadaf Ebrahimi {
3002*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROL, 4);
3003*9a0e4156SSadaf Ebrahimi }
3004*9a0e4156SSadaf Ebrahimi 
d68000_rol_r_8(m68k_info * info)3005*9a0e4156SSadaf Ebrahimi static void d68000_rol_r_8(m68k_info *info)
3006*9a0e4156SSadaf Ebrahimi {
3007*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROL, 1);
3008*9a0e4156SSadaf Ebrahimi }
3009*9a0e4156SSadaf Ebrahimi 
d68000_rol_r_16(m68k_info * info)3010*9a0e4156SSadaf Ebrahimi static void d68000_rol_r_16(m68k_info *info)
3011*9a0e4156SSadaf Ebrahimi {
3012*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROL, 2);
3013*9a0e4156SSadaf Ebrahimi }
3014*9a0e4156SSadaf Ebrahimi 
d68000_rol_r_32(m68k_info * info)3015*9a0e4156SSadaf Ebrahimi static void d68000_rol_r_32(m68k_info *info)
3016*9a0e4156SSadaf Ebrahimi {
3017*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROL, 4);
3018*9a0e4156SSadaf Ebrahimi }
3019*9a0e4156SSadaf Ebrahimi 
d68000_rol_ea(m68k_info * info)3020*9a0e4156SSadaf Ebrahimi static void d68000_rol_ea(m68k_info *info)
3021*9a0e4156SSadaf Ebrahimi {
3022*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ROL, 2);
3023*9a0e4156SSadaf Ebrahimi }
3024*9a0e4156SSadaf Ebrahimi 
d68000_roxr_s_8(m68k_info * info)3025*9a0e4156SSadaf Ebrahimi static void d68000_roxr_s_8(m68k_info *info)
3026*9a0e4156SSadaf Ebrahimi {
3027*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXR, 1);
3028*9a0e4156SSadaf Ebrahimi }
3029*9a0e4156SSadaf Ebrahimi 
d68000_roxr_s_16(m68k_info * info)3030*9a0e4156SSadaf Ebrahimi static void d68000_roxr_s_16(m68k_info *info)
3031*9a0e4156SSadaf Ebrahimi {
3032*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXR, 2);
3033*9a0e4156SSadaf Ebrahimi }
3034*9a0e4156SSadaf Ebrahimi 
d68000_roxr_s_32(m68k_info * info)3035*9a0e4156SSadaf Ebrahimi static void d68000_roxr_s_32(m68k_info *info)
3036*9a0e4156SSadaf Ebrahimi {
3037*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXR, 4);
3038*9a0e4156SSadaf Ebrahimi }
3039*9a0e4156SSadaf Ebrahimi 
d68000_roxr_r_8(m68k_info * info)3040*9a0e4156SSadaf Ebrahimi static void d68000_roxr_r_8(m68k_info *info)
3041*9a0e4156SSadaf Ebrahimi {
3042*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXR, 4);
3043*9a0e4156SSadaf Ebrahimi }
3044*9a0e4156SSadaf Ebrahimi 
d68000_roxr_r_16(m68k_info * info)3045*9a0e4156SSadaf Ebrahimi static void d68000_roxr_r_16(m68k_info *info)
3046*9a0e4156SSadaf Ebrahimi {
3047*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROXR, 2);
3048*9a0e4156SSadaf Ebrahimi }
3049*9a0e4156SSadaf Ebrahimi 
d68000_roxr_r_32(m68k_info * info)3050*9a0e4156SSadaf Ebrahimi static void d68000_roxr_r_32(m68k_info *info)
3051*9a0e4156SSadaf Ebrahimi {
3052*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROXR, 4);
3053*9a0e4156SSadaf Ebrahimi }
3054*9a0e4156SSadaf Ebrahimi 
d68000_roxr_ea(m68k_info * info)3055*9a0e4156SSadaf Ebrahimi static void d68000_roxr_ea(m68k_info *info)
3056*9a0e4156SSadaf Ebrahimi {
3057*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ROXR, 2);
3058*9a0e4156SSadaf Ebrahimi }
3059*9a0e4156SSadaf Ebrahimi 
d68000_roxl_s_8(m68k_info * info)3060*9a0e4156SSadaf Ebrahimi static void d68000_roxl_s_8(m68k_info *info)
3061*9a0e4156SSadaf Ebrahimi {
3062*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXL, 1);
3063*9a0e4156SSadaf Ebrahimi }
3064*9a0e4156SSadaf Ebrahimi 
d68000_roxl_s_16(m68k_info * info)3065*9a0e4156SSadaf Ebrahimi static void d68000_roxl_s_16(m68k_info *info)
3066*9a0e4156SSadaf Ebrahimi {
3067*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXL, 2);
3068*9a0e4156SSadaf Ebrahimi }
3069*9a0e4156SSadaf Ebrahimi 
d68000_roxl_s_32(m68k_info * info)3070*9a0e4156SSadaf Ebrahimi static void d68000_roxl_s_32(m68k_info *info)
3071*9a0e4156SSadaf Ebrahimi {
3072*9a0e4156SSadaf Ebrahimi 	build_3bit_d(info, M68K_INS_ROXL, 4);
3073*9a0e4156SSadaf Ebrahimi }
3074*9a0e4156SSadaf Ebrahimi 
d68000_roxl_r_8(m68k_info * info)3075*9a0e4156SSadaf Ebrahimi static void d68000_roxl_r_8(m68k_info *info)
3076*9a0e4156SSadaf Ebrahimi {
3077*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROXL, 1);
3078*9a0e4156SSadaf Ebrahimi }
3079*9a0e4156SSadaf Ebrahimi 
d68000_roxl_r_16(m68k_info * info)3080*9a0e4156SSadaf Ebrahimi static void d68000_roxl_r_16(m68k_info *info)
3081*9a0e4156SSadaf Ebrahimi {
3082*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROXL, 2);
3083*9a0e4156SSadaf Ebrahimi }
3084*9a0e4156SSadaf Ebrahimi 
d68000_roxl_r_32(m68k_info * info)3085*9a0e4156SSadaf Ebrahimi static void d68000_roxl_r_32(m68k_info *info)
3086*9a0e4156SSadaf Ebrahimi {
3087*9a0e4156SSadaf Ebrahimi 	build_r(info, M68K_INS_ROXL, 4);
3088*9a0e4156SSadaf Ebrahimi }
3089*9a0e4156SSadaf Ebrahimi 
d68000_roxl_ea(m68k_info * info)3090*9a0e4156SSadaf Ebrahimi static void d68000_roxl_ea(m68k_info *info)
3091*9a0e4156SSadaf Ebrahimi {
3092*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_ROXL, 2);
3093*9a0e4156SSadaf Ebrahimi }
3094*9a0e4156SSadaf Ebrahimi 
d68010_rtd(m68k_info * info)3095*9a0e4156SSadaf Ebrahimi static void d68010_rtd(m68k_info *info)
3096*9a0e4156SSadaf Ebrahimi {
3097*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_RET);
3098*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68010_PLUS);
3099*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, M68K_INS_RTD, 0, read_imm_16(info));
3100*9a0e4156SSadaf Ebrahimi }
3101*9a0e4156SSadaf Ebrahimi 
d68000_rte(m68k_info * info)3102*9a0e4156SSadaf Ebrahimi static void d68000_rte(m68k_info *info)
3103*9a0e4156SSadaf Ebrahimi {
3104*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_IRET);
3105*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_RTE);
3106*9a0e4156SSadaf Ebrahimi }
3107*9a0e4156SSadaf Ebrahimi 
d68020_rtm(m68k_info * info)3108*9a0e4156SSadaf Ebrahimi static void d68020_rtm(m68k_info *info)
3109*9a0e4156SSadaf Ebrahimi {
3110*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext;
3111*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
3112*9a0e4156SSadaf Ebrahimi 
3113*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_RET);
3114*9a0e4156SSadaf Ebrahimi 
3115*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_ONLY);
3116*9a0e4156SSadaf Ebrahimi 
3117*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, M68K_INS_RTM, 0, 0);
3118*9a0e4156SSadaf Ebrahimi 
3119*9a0e4156SSadaf Ebrahimi 	ext = &info->extension;
3120*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
3121*9a0e4156SSadaf Ebrahimi 
3122*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_NONE;
3123*9a0e4156SSadaf Ebrahimi 	op->type = M68K_OP_REG;
3124*9a0e4156SSadaf Ebrahimi 
3125*9a0e4156SSadaf Ebrahimi 	if (BIT_3(info->ir)) {
3126*9a0e4156SSadaf Ebrahimi 		op->reg = M68K_REG_A0 + (info->ir & 7);
3127*9a0e4156SSadaf Ebrahimi 	} else {
3128*9a0e4156SSadaf Ebrahimi 		op->reg = M68K_REG_D0 + (info->ir & 7);
3129*9a0e4156SSadaf Ebrahimi 	}
3130*9a0e4156SSadaf Ebrahimi }
3131*9a0e4156SSadaf Ebrahimi 
d68000_rtr(m68k_info * info)3132*9a0e4156SSadaf Ebrahimi static void d68000_rtr(m68k_info *info)
3133*9a0e4156SSadaf Ebrahimi {
3134*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_RET);
3135*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_RTR);
3136*9a0e4156SSadaf Ebrahimi }
3137*9a0e4156SSadaf Ebrahimi 
d68000_rts(m68k_info * info)3138*9a0e4156SSadaf Ebrahimi static void d68000_rts(m68k_info *info)
3139*9a0e4156SSadaf Ebrahimi {
3140*9a0e4156SSadaf Ebrahimi 	set_insn_group(info, M68K_GRP_RET);
3141*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_RTS);
3142*9a0e4156SSadaf Ebrahimi }
3143*9a0e4156SSadaf Ebrahimi 
d68000_sbcd_rr(m68k_info * info)3144*9a0e4156SSadaf Ebrahimi static void d68000_sbcd_rr(m68k_info *info)
3145*9a0e4156SSadaf Ebrahimi {
3146*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_SBCD, 1, 0);
3147*9a0e4156SSadaf Ebrahimi }
3148*9a0e4156SSadaf Ebrahimi 
d68000_sbcd_mm(m68k_info * info)3149*9a0e4156SSadaf Ebrahimi static void d68000_sbcd_mm(m68k_info *info)
3150*9a0e4156SSadaf Ebrahimi {
3151*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_SBCD, 0, read_imm_16(info));
3152*9a0e4156SSadaf Ebrahimi }
3153*9a0e4156SSadaf Ebrahimi 
d68000_scc(m68k_info * info)3154*9a0e4156SSadaf Ebrahimi static void d68000_scc(m68k_info *info)
3155*9a0e4156SSadaf Ebrahimi {
3156*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, s_scc_lut[(info->ir >> 8) & 0xf], 1, 1);
3157*9a0e4156SSadaf Ebrahimi 	get_ea_mode_op(info, &ext->operands[0], info->ir, 1);
3158*9a0e4156SSadaf Ebrahimi }
3159*9a0e4156SSadaf Ebrahimi 
d68000_stop(m68k_info * info)3160*9a0e4156SSadaf Ebrahimi static void d68000_stop(m68k_info *info)
3161*9a0e4156SSadaf Ebrahimi {
3162*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, M68K_INS_STOP, 0, read_imm_16(info));
3163*9a0e4156SSadaf Ebrahimi }
3164*9a0e4156SSadaf Ebrahimi 
d68000_sub_er_8(m68k_info * info)3165*9a0e4156SSadaf Ebrahimi static void d68000_sub_er_8(m68k_info *info)
3166*9a0e4156SSadaf Ebrahimi {
3167*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_SUB, 1);
3168*9a0e4156SSadaf Ebrahimi }
3169*9a0e4156SSadaf Ebrahimi 
d68000_sub_er_16(m68k_info * info)3170*9a0e4156SSadaf Ebrahimi static void d68000_sub_er_16(m68k_info *info)
3171*9a0e4156SSadaf Ebrahimi {
3172*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_SUB, 2);
3173*9a0e4156SSadaf Ebrahimi }
3174*9a0e4156SSadaf Ebrahimi 
d68000_sub_er_32(m68k_info * info)3175*9a0e4156SSadaf Ebrahimi static void d68000_sub_er_32(m68k_info *info)
3176*9a0e4156SSadaf Ebrahimi {
3177*9a0e4156SSadaf Ebrahimi 	build_er_1(info, M68K_INS_SUB, 4);
3178*9a0e4156SSadaf Ebrahimi }
3179*9a0e4156SSadaf Ebrahimi 
d68000_sub_re_8(m68k_info * info)3180*9a0e4156SSadaf Ebrahimi static void d68000_sub_re_8(m68k_info *info)
3181*9a0e4156SSadaf Ebrahimi {
3182*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_SUB, 1);
3183*9a0e4156SSadaf Ebrahimi }
3184*9a0e4156SSadaf Ebrahimi 
d68000_sub_re_16(m68k_info * info)3185*9a0e4156SSadaf Ebrahimi static void d68000_sub_re_16(m68k_info *info)
3186*9a0e4156SSadaf Ebrahimi {
3187*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_SUB, 2);
3188*9a0e4156SSadaf Ebrahimi }
3189*9a0e4156SSadaf Ebrahimi 
d68000_sub_re_32(m68k_info * info)3190*9a0e4156SSadaf Ebrahimi static void d68000_sub_re_32(m68k_info *info)
3191*9a0e4156SSadaf Ebrahimi {
3192*9a0e4156SSadaf Ebrahimi 	build_re_1(info, M68K_INS_SUB, 4);
3193*9a0e4156SSadaf Ebrahimi }
3194*9a0e4156SSadaf Ebrahimi 
d68000_suba_16(m68k_info * info)3195*9a0e4156SSadaf Ebrahimi static void d68000_suba_16(m68k_info *info)
3196*9a0e4156SSadaf Ebrahimi {
3197*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_SUBA, 2);
3198*9a0e4156SSadaf Ebrahimi }
3199*9a0e4156SSadaf Ebrahimi 
d68000_suba_32(m68k_info * info)3200*9a0e4156SSadaf Ebrahimi static void d68000_suba_32(m68k_info *info)
3201*9a0e4156SSadaf Ebrahimi {
3202*9a0e4156SSadaf Ebrahimi 	build_ea_a(info, M68K_INS_SUBA, 4);
3203*9a0e4156SSadaf Ebrahimi }
3204*9a0e4156SSadaf Ebrahimi 
d68000_subi_8(m68k_info * info)3205*9a0e4156SSadaf Ebrahimi static void d68000_subi_8(m68k_info *info)
3206*9a0e4156SSadaf Ebrahimi {
3207*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_SUBI, 1, read_imm_8(info));
3208*9a0e4156SSadaf Ebrahimi }
3209*9a0e4156SSadaf Ebrahimi 
d68000_subi_16(m68k_info * info)3210*9a0e4156SSadaf Ebrahimi static void d68000_subi_16(m68k_info *info)
3211*9a0e4156SSadaf Ebrahimi {
3212*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_SUBI, 2, read_imm_16(info));
3213*9a0e4156SSadaf Ebrahimi }
3214*9a0e4156SSadaf Ebrahimi 
d68000_subi_32(m68k_info * info)3215*9a0e4156SSadaf Ebrahimi static void d68000_subi_32(m68k_info *info)
3216*9a0e4156SSadaf Ebrahimi {
3217*9a0e4156SSadaf Ebrahimi 	build_imm_ea(info, M68K_INS_SUBI, 4, read_imm_32(info));
3218*9a0e4156SSadaf Ebrahimi }
3219*9a0e4156SSadaf Ebrahimi 
d68000_subq_8(m68k_info * info)3220*9a0e4156SSadaf Ebrahimi static void d68000_subq_8(m68k_info *info)
3221*9a0e4156SSadaf Ebrahimi {
3222*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_SUBQ, 1);
3223*9a0e4156SSadaf Ebrahimi }
3224*9a0e4156SSadaf Ebrahimi 
d68000_subq_16(m68k_info * info)3225*9a0e4156SSadaf Ebrahimi static void d68000_subq_16(m68k_info *info)
3226*9a0e4156SSadaf Ebrahimi {
3227*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_SUBQ, 2);
3228*9a0e4156SSadaf Ebrahimi }
3229*9a0e4156SSadaf Ebrahimi 
d68000_subq_32(m68k_info * info)3230*9a0e4156SSadaf Ebrahimi static void d68000_subq_32(m68k_info *info)
3231*9a0e4156SSadaf Ebrahimi {
3232*9a0e4156SSadaf Ebrahimi 	build_3bit_ea(info, M68K_INS_SUBQ, 4);
3233*9a0e4156SSadaf Ebrahimi }
3234*9a0e4156SSadaf Ebrahimi 
d68000_subx_rr_8(m68k_info * info)3235*9a0e4156SSadaf Ebrahimi static void d68000_subx_rr_8(m68k_info *info)
3236*9a0e4156SSadaf Ebrahimi {
3237*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_SUBX, 1, 0);
3238*9a0e4156SSadaf Ebrahimi }
3239*9a0e4156SSadaf Ebrahimi 
d68000_subx_rr_16(m68k_info * info)3240*9a0e4156SSadaf Ebrahimi static void d68000_subx_rr_16(m68k_info *info)
3241*9a0e4156SSadaf Ebrahimi {
3242*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_SUBX, 2, 0);
3243*9a0e4156SSadaf Ebrahimi }
3244*9a0e4156SSadaf Ebrahimi 
d68000_subx_rr_32(m68k_info * info)3245*9a0e4156SSadaf Ebrahimi static void d68000_subx_rr_32(m68k_info *info)
3246*9a0e4156SSadaf Ebrahimi {
3247*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_SUBX, 4, 0);
3248*9a0e4156SSadaf Ebrahimi }
3249*9a0e4156SSadaf Ebrahimi 
d68000_subx_mm_8(m68k_info * info)3250*9a0e4156SSadaf Ebrahimi static void d68000_subx_mm_8(m68k_info *info)
3251*9a0e4156SSadaf Ebrahimi {
3252*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_SUBX, 1, 0);
3253*9a0e4156SSadaf Ebrahimi }
3254*9a0e4156SSadaf Ebrahimi 
d68000_subx_mm_16(m68k_info * info)3255*9a0e4156SSadaf Ebrahimi static void d68000_subx_mm_16(m68k_info *info)
3256*9a0e4156SSadaf Ebrahimi {
3257*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_SUBX, 2, 0);
3258*9a0e4156SSadaf Ebrahimi }
3259*9a0e4156SSadaf Ebrahimi 
d68000_subx_mm_32(m68k_info * info)3260*9a0e4156SSadaf Ebrahimi static void d68000_subx_mm_32(m68k_info *info)
3261*9a0e4156SSadaf Ebrahimi {
3262*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_SUBX, 4, 0);
3263*9a0e4156SSadaf Ebrahimi }
3264*9a0e4156SSadaf Ebrahimi 
d68000_swap(m68k_info * info)3265*9a0e4156SSadaf Ebrahimi static void d68000_swap(m68k_info *info)
3266*9a0e4156SSadaf Ebrahimi {
3267*9a0e4156SSadaf Ebrahimi 	build_d(info, M68K_INS_SWAP, 0);
3268*9a0e4156SSadaf Ebrahimi }
3269*9a0e4156SSadaf Ebrahimi 
d68000_tas(m68k_info * info)3270*9a0e4156SSadaf Ebrahimi static void d68000_tas(m68k_info *info)
3271*9a0e4156SSadaf Ebrahimi {
3272*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TAS, 1);
3273*9a0e4156SSadaf Ebrahimi }
3274*9a0e4156SSadaf Ebrahimi 
d68000_trap(m68k_info * info)3275*9a0e4156SSadaf Ebrahimi static void d68000_trap(m68k_info *info)
3276*9a0e4156SSadaf Ebrahimi {
3277*9a0e4156SSadaf Ebrahimi 	build_absolute_jump_with_immediate(info, M68K_INS_TRAP, 0, info->ir&0xf);
3278*9a0e4156SSadaf Ebrahimi }
3279*9a0e4156SSadaf Ebrahimi 
d68020_trapcc_0(m68k_info * info)3280*9a0e4156SSadaf Ebrahimi static void d68020_trapcc_0(m68k_info *info)
3281*9a0e4156SSadaf Ebrahimi {
3282*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3283*9a0e4156SSadaf Ebrahimi 	build_trap(info, 0, 0);
3284*9a0e4156SSadaf Ebrahimi 
3285*9a0e4156SSadaf Ebrahimi 	info->extension.op_count = 0;
3286*9a0e4156SSadaf Ebrahimi }
3287*9a0e4156SSadaf Ebrahimi 
d68020_trapcc_16(m68k_info * info)3288*9a0e4156SSadaf Ebrahimi static void d68020_trapcc_16(m68k_info *info)
3289*9a0e4156SSadaf Ebrahimi {
3290*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3291*9a0e4156SSadaf Ebrahimi 	build_trap(info, 2, read_imm_16(info));
3292*9a0e4156SSadaf Ebrahimi }
3293*9a0e4156SSadaf Ebrahimi 
d68020_trapcc_32(m68k_info * info)3294*9a0e4156SSadaf Ebrahimi static void d68020_trapcc_32(m68k_info *info)
3295*9a0e4156SSadaf Ebrahimi {
3296*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3297*9a0e4156SSadaf Ebrahimi 	build_trap(info, 4, read_imm_32(info));
3298*9a0e4156SSadaf Ebrahimi }
3299*9a0e4156SSadaf Ebrahimi 
d68000_trapv(m68k_info * info)3300*9a0e4156SSadaf Ebrahimi static void d68000_trapv(m68k_info *info)
3301*9a0e4156SSadaf Ebrahimi {
3302*9a0e4156SSadaf Ebrahimi 	MCInst_setOpcode(info->inst, M68K_INS_TRAPV);
3303*9a0e4156SSadaf Ebrahimi }
3304*9a0e4156SSadaf Ebrahimi 
d68000_tst_8(m68k_info * info)3305*9a0e4156SSadaf Ebrahimi static void d68000_tst_8(m68k_info *info)
3306*9a0e4156SSadaf Ebrahimi {
3307*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 1);
3308*9a0e4156SSadaf Ebrahimi }
3309*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcdi_8(m68k_info * info)3310*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcdi_8(m68k_info *info)
3311*9a0e4156SSadaf Ebrahimi {
3312*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3313*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 1);
3314*9a0e4156SSadaf Ebrahimi }
3315*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcix_8(m68k_info * info)3316*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcix_8(m68k_info *info)
3317*9a0e4156SSadaf Ebrahimi {
3318*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3319*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 1);
3320*9a0e4156SSadaf Ebrahimi }
3321*9a0e4156SSadaf Ebrahimi 
d68020_tst_i_8(m68k_info * info)3322*9a0e4156SSadaf Ebrahimi static void d68020_tst_i_8(m68k_info *info)
3323*9a0e4156SSadaf Ebrahimi {
3324*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3325*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 1);
3326*9a0e4156SSadaf Ebrahimi }
3327*9a0e4156SSadaf Ebrahimi 
d68000_tst_16(m68k_info * info)3328*9a0e4156SSadaf Ebrahimi static void d68000_tst_16(m68k_info *info)
3329*9a0e4156SSadaf Ebrahimi {
3330*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 2);
3331*9a0e4156SSadaf Ebrahimi }
3332*9a0e4156SSadaf Ebrahimi 
d68020_tst_a_16(m68k_info * info)3333*9a0e4156SSadaf Ebrahimi static void d68020_tst_a_16(m68k_info *info)
3334*9a0e4156SSadaf Ebrahimi {
3335*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3336*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 2);
3337*9a0e4156SSadaf Ebrahimi }
3338*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcdi_16(m68k_info * info)3339*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcdi_16(m68k_info *info)
3340*9a0e4156SSadaf Ebrahimi {
3341*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3342*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 2);
3343*9a0e4156SSadaf Ebrahimi }
3344*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcix_16(m68k_info * info)3345*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcix_16(m68k_info *info)
3346*9a0e4156SSadaf Ebrahimi {
3347*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3348*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 2);
3349*9a0e4156SSadaf Ebrahimi }
3350*9a0e4156SSadaf Ebrahimi 
d68020_tst_i_16(m68k_info * info)3351*9a0e4156SSadaf Ebrahimi static void d68020_tst_i_16(m68k_info *info)
3352*9a0e4156SSadaf Ebrahimi {
3353*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3354*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 2);
3355*9a0e4156SSadaf Ebrahimi }
3356*9a0e4156SSadaf Ebrahimi 
d68000_tst_32(m68k_info * info)3357*9a0e4156SSadaf Ebrahimi static void d68000_tst_32(m68k_info *info)
3358*9a0e4156SSadaf Ebrahimi {
3359*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 4);
3360*9a0e4156SSadaf Ebrahimi }
3361*9a0e4156SSadaf Ebrahimi 
d68020_tst_a_32(m68k_info * info)3362*9a0e4156SSadaf Ebrahimi static void d68020_tst_a_32(m68k_info *info)
3363*9a0e4156SSadaf Ebrahimi {
3364*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3365*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 4);
3366*9a0e4156SSadaf Ebrahimi }
3367*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcdi_32(m68k_info * info)3368*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcdi_32(m68k_info *info)
3369*9a0e4156SSadaf Ebrahimi {
3370*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3371*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 4);
3372*9a0e4156SSadaf Ebrahimi }
3373*9a0e4156SSadaf Ebrahimi 
d68020_tst_pcix_32(m68k_info * info)3374*9a0e4156SSadaf Ebrahimi static void d68020_tst_pcix_32(m68k_info *info)
3375*9a0e4156SSadaf Ebrahimi {
3376*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3377*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 4);
3378*9a0e4156SSadaf Ebrahimi }
3379*9a0e4156SSadaf Ebrahimi 
d68020_tst_i_32(m68k_info * info)3380*9a0e4156SSadaf Ebrahimi static void d68020_tst_i_32(m68k_info *info)
3381*9a0e4156SSadaf Ebrahimi {
3382*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3383*9a0e4156SSadaf Ebrahimi 	build_ea(info, M68K_INS_TST, 4);
3384*9a0e4156SSadaf Ebrahimi }
3385*9a0e4156SSadaf Ebrahimi 
d68000_unlk(m68k_info * info)3386*9a0e4156SSadaf Ebrahimi static void d68000_unlk(m68k_info *info)
3387*9a0e4156SSadaf Ebrahimi {
3388*9a0e4156SSadaf Ebrahimi 	cs_m68k_op* op;
3389*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = build_init_op(info, M68K_INS_UNLK, 1, 0);
3390*9a0e4156SSadaf Ebrahimi 
3391*9a0e4156SSadaf Ebrahimi 	op = &ext->operands[0];
3392*9a0e4156SSadaf Ebrahimi 
3393*9a0e4156SSadaf Ebrahimi 	op->address_mode = M68K_AM_REG_DIRECT_ADDR;
3394*9a0e4156SSadaf Ebrahimi 	op->reg = M68K_REG_A0 + (info->ir & 7);
3395*9a0e4156SSadaf Ebrahimi }
3396*9a0e4156SSadaf Ebrahimi 
d68020_unpk_rr(m68k_info * info)3397*9a0e4156SSadaf Ebrahimi static void d68020_unpk_rr(m68k_info *info)
3398*9a0e4156SSadaf Ebrahimi {
3399*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3400*9a0e4156SSadaf Ebrahimi 	build_rr(info, M68K_INS_UNPK, 0, read_imm_16(info));
3401*9a0e4156SSadaf Ebrahimi }
3402*9a0e4156SSadaf Ebrahimi 
d68020_unpk_mm(m68k_info * info)3403*9a0e4156SSadaf Ebrahimi static void d68020_unpk_mm(m68k_info *info)
3404*9a0e4156SSadaf Ebrahimi {
3405*9a0e4156SSadaf Ebrahimi 	LIMIT_CPU_TYPES(info, M68020_PLUS);
3406*9a0e4156SSadaf Ebrahimi 	build_mm(info, M68K_INS_UNPK, 0, read_imm_16(info));
3407*9a0e4156SSadaf Ebrahimi }
3408*9a0e4156SSadaf Ebrahimi 
3409*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
3410*9a0e4156SSadaf Ebrahimi /* ======================= INSTRUCTION TABLE BUILDER ====================== */
3411*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
3412*9a0e4156SSadaf Ebrahimi 
3413*9a0e4156SSadaf Ebrahimi /* EA Masks:
3414*9a0e4156SSadaf Ebrahimi    800 = data register direct
3415*9a0e4156SSadaf Ebrahimi    400 = address register direct
3416*9a0e4156SSadaf Ebrahimi    200 = address register indirect
3417*9a0e4156SSadaf Ebrahimi    100 = ARI postincrement
3418*9a0e4156SSadaf Ebrahimi    80 = ARI pre-decrement
3419*9a0e4156SSadaf Ebrahimi    40 = ARI displacement
3420*9a0e4156SSadaf Ebrahimi    20 = ARI index
3421*9a0e4156SSadaf Ebrahimi    10 = absolute short
3422*9a0e4156SSadaf Ebrahimi    8 = absolute long
3423*9a0e4156SSadaf Ebrahimi    4 = immediate / sr
3424*9a0e4156SSadaf Ebrahimi    2 = pc displacement
3425*9a0e4156SSadaf Ebrahimi    1 = pc idx
3426*9a0e4156SSadaf Ebrahimi  */
3427*9a0e4156SSadaf Ebrahimi 
3428*9a0e4156SSadaf Ebrahimi static opcode_struct g_opcode_info[] = {
3429*9a0e4156SSadaf Ebrahimi 	/*  opcode handler         mask    match   ea_mask   mask2   match2*/
3430*9a0e4156SSadaf Ebrahimi 	{d68000_1010         , 0xf000, 0xa000, 0x000},
3431*9a0e4156SSadaf Ebrahimi 	{d68000_1111         , 0xf000, 0xf000, 0x000},
3432*9a0e4156SSadaf Ebrahimi 	{d68000_abcd_rr      , 0xf1f8, 0xc100, 0x000},
3433*9a0e4156SSadaf Ebrahimi 	{d68000_abcd_mm      , 0xf1f8, 0xc108, 0x000},
3434*9a0e4156SSadaf Ebrahimi 	{d68000_add_er_8     , 0xf1c0, 0xd000, 0xbff},
3435*9a0e4156SSadaf Ebrahimi 	{d68000_add_er_16    , 0xf1c0, 0xd040, 0xfff},
3436*9a0e4156SSadaf Ebrahimi 	{d68000_add_er_32    , 0xf1c0, 0xd080, 0xfff},
3437*9a0e4156SSadaf Ebrahimi 	{d68000_add_re_8     , 0xf1c0, 0xd100, 0x3f8},
3438*9a0e4156SSadaf Ebrahimi 	{d68000_add_re_16    , 0xf1c0, 0xd140, 0x3f8},
3439*9a0e4156SSadaf Ebrahimi 	{d68000_add_re_32    , 0xf1c0, 0xd180, 0x3f8},
3440*9a0e4156SSadaf Ebrahimi 	{d68000_adda_16      , 0xf1c0, 0xd0c0, 0xfff},
3441*9a0e4156SSadaf Ebrahimi 	{d68000_adda_32      , 0xf1c0, 0xd1c0, 0xfff},
3442*9a0e4156SSadaf Ebrahimi 	{d68000_addi_8       , 0xffc0, 0x0600, 0xbf8},
3443*9a0e4156SSadaf Ebrahimi 	{d68000_addi_16      , 0xffc0, 0x0640, 0xbf8},
3444*9a0e4156SSadaf Ebrahimi 	{d68000_addi_32      , 0xffc0, 0x0680, 0xbf8},
3445*9a0e4156SSadaf Ebrahimi 	{d68000_addq_8       , 0xf1c0, 0x5000, 0xbf8},
3446*9a0e4156SSadaf Ebrahimi 	{d68000_addq_16      , 0xf1c0, 0x5040, 0xff8},
3447*9a0e4156SSadaf Ebrahimi 	{d68000_addq_32      , 0xf1c0, 0x5080, 0xff8},
3448*9a0e4156SSadaf Ebrahimi 	{d68000_addx_rr_8    , 0xf1f8, 0xd100, 0x000},
3449*9a0e4156SSadaf Ebrahimi 	{d68000_addx_rr_16   , 0xf1f8, 0xd140, 0x000},
3450*9a0e4156SSadaf Ebrahimi 	{d68000_addx_rr_32   , 0xf1f8, 0xd180, 0x000},
3451*9a0e4156SSadaf Ebrahimi 	{d68000_addx_mm_8    , 0xf1f8, 0xd108, 0x000},
3452*9a0e4156SSadaf Ebrahimi 	{d68000_addx_mm_16   , 0xf1f8, 0xd148, 0x000},
3453*9a0e4156SSadaf Ebrahimi 	{d68000_addx_mm_32   , 0xf1f8, 0xd188, 0x000},
3454*9a0e4156SSadaf Ebrahimi 	{d68000_and_er_8     , 0xf1c0, 0xc000, 0xbff},
3455*9a0e4156SSadaf Ebrahimi 	{d68000_and_er_16    , 0xf1c0, 0xc040, 0xbff},
3456*9a0e4156SSadaf Ebrahimi 	{d68000_and_er_32    , 0xf1c0, 0xc080, 0xbff},
3457*9a0e4156SSadaf Ebrahimi 	{d68000_and_re_8     , 0xf1c0, 0xc100, 0x3f8},
3458*9a0e4156SSadaf Ebrahimi 	{d68000_and_re_16    , 0xf1c0, 0xc140, 0x3f8},
3459*9a0e4156SSadaf Ebrahimi 	{d68000_and_re_32    , 0xf1c0, 0xc180, 0x3f8},
3460*9a0e4156SSadaf Ebrahimi 	{d68000_andi_to_ccr  , 0xffff, 0x023c, 0x000, 0xff00, 0x0000},
3461*9a0e4156SSadaf Ebrahimi 	{d68000_andi_to_sr   , 0xffff, 0x027c, 0x000},
3462*9a0e4156SSadaf Ebrahimi 	{d68000_andi_8       , 0xffc0, 0x0200, 0xbf8},
3463*9a0e4156SSadaf Ebrahimi 	{d68000_andi_16      , 0xffc0, 0x0240, 0xbf8},
3464*9a0e4156SSadaf Ebrahimi 	{d68000_andi_32      , 0xffc0, 0x0280, 0xbf8},
3465*9a0e4156SSadaf Ebrahimi 	{d68000_asr_s_8      , 0xf1f8, 0xe000, 0x000},
3466*9a0e4156SSadaf Ebrahimi 	{d68000_asr_s_16     , 0xf1f8, 0xe040, 0x000},
3467*9a0e4156SSadaf Ebrahimi 	{d68000_asr_s_32     , 0xf1f8, 0xe080, 0x000},
3468*9a0e4156SSadaf Ebrahimi 	{d68000_asr_r_8      , 0xf1f8, 0xe020, 0x000},
3469*9a0e4156SSadaf Ebrahimi 	{d68000_asr_r_16     , 0xf1f8, 0xe060, 0x000},
3470*9a0e4156SSadaf Ebrahimi 	{d68000_asr_r_32     , 0xf1f8, 0xe0a0, 0x000},
3471*9a0e4156SSadaf Ebrahimi 	{d68000_asr_ea       , 0xffc0, 0xe0c0, 0x3f8},
3472*9a0e4156SSadaf Ebrahimi 	{d68000_asl_s_8      , 0xf1f8, 0xe100, 0x000},
3473*9a0e4156SSadaf Ebrahimi 	{d68000_asl_s_16     , 0xf1f8, 0xe140, 0x000},
3474*9a0e4156SSadaf Ebrahimi 	{d68000_asl_s_32     , 0xf1f8, 0xe180, 0x000},
3475*9a0e4156SSadaf Ebrahimi 	{d68000_asl_r_8      , 0xf1f8, 0xe120, 0x000},
3476*9a0e4156SSadaf Ebrahimi 	{d68000_asl_r_16     , 0xf1f8, 0xe160, 0x000},
3477*9a0e4156SSadaf Ebrahimi 	{d68000_asl_r_32     , 0xf1f8, 0xe1a0, 0x000},
3478*9a0e4156SSadaf Ebrahimi 	{d68000_asl_ea       , 0xffc0, 0xe1c0, 0x3f8},
3479*9a0e4156SSadaf Ebrahimi 	{d68000_bcc_8        , 0xf000, 0x6000, 0x000},
3480*9a0e4156SSadaf Ebrahimi 	{d68000_bcc_16       , 0xf0ff, 0x6000, 0x000},
3481*9a0e4156SSadaf Ebrahimi 	{d68020_bcc_32       , 0xf0ff, 0x60ff, 0x000},
3482*9a0e4156SSadaf Ebrahimi 	{d68000_bchg_r       , 0xf1c0, 0x0140, 0xbf8},
3483*9a0e4156SSadaf Ebrahimi 	{d68000_bchg_s       , 0xffc0, 0x0840, 0xbf8, 0xff00, 0x0000},
3484*9a0e4156SSadaf Ebrahimi 	{d68000_bclr_r       , 0xf1c0, 0x0180, 0xbf8},
3485*9a0e4156SSadaf Ebrahimi 	{d68000_bclr_s       , 0xffc0, 0x0880, 0xbf8, 0xff00, 0x0000},
3486*9a0e4156SSadaf Ebrahimi 	{d68020_bfchg        , 0xffc0, 0xeac0, 0xa78, 0xf000, 0x0000},
3487*9a0e4156SSadaf Ebrahimi 	{d68020_bfclr        , 0xffc0, 0xecc0, 0xa78, 0xf000, 0x0000},
3488*9a0e4156SSadaf Ebrahimi 	{d68020_bfexts       , 0xffc0, 0xebc0, 0xa7b, 0x8000, 0x0000},
3489*9a0e4156SSadaf Ebrahimi 	{d68020_bfextu       , 0xffc0, 0xe9c0, 0xa7b, 0x8000, 0x0000},
3490*9a0e4156SSadaf Ebrahimi 	{d68020_bfffo        , 0xffc0, 0xedc0, 0xa7b, 0x8000, 0x0000},
3491*9a0e4156SSadaf Ebrahimi 	{d68020_bfins        , 0xffc0, 0xefc0, 0xa78, 0x8000, 0x0000},
3492*9a0e4156SSadaf Ebrahimi 	{d68020_bfset        , 0xffc0, 0xeec0, 0xa78, 0xf000, 0x0000},
3493*9a0e4156SSadaf Ebrahimi 	{d68020_bftst        , 0xffc0, 0xe8c0, 0xa7b, 0xf000, 0x0000},
3494*9a0e4156SSadaf Ebrahimi 	{d68010_bkpt         , 0xfff8, 0x4848, 0x000},
3495*9a0e4156SSadaf Ebrahimi 	{d68000_bra_8        , 0xff00, 0x6000, 0x000},
3496*9a0e4156SSadaf Ebrahimi 	{d68000_bra_16       , 0xffff, 0x6000, 0x000},
3497*9a0e4156SSadaf Ebrahimi 	{d68020_bra_32       , 0xffff, 0x60ff, 0x000},
3498*9a0e4156SSadaf Ebrahimi 	{d68000_bset_r       , 0xf1c0, 0x01c0, 0xbf8},
3499*9a0e4156SSadaf Ebrahimi 	{d68000_bset_s       , 0xffc0, 0x08c0, 0xbf8, 0xfe00, 0x0000 },
3500*9a0e4156SSadaf Ebrahimi 	{d68000_bsr_8        , 0xff00, 0x6100, 0x000},
3501*9a0e4156SSadaf Ebrahimi 	{d68000_bsr_16       , 0xffff, 0x6100, 0x000},
3502*9a0e4156SSadaf Ebrahimi 	{d68020_bsr_32       , 0xffff, 0x61ff, 0x000},
3503*9a0e4156SSadaf Ebrahimi 	{d68000_btst_r       , 0xf1c0, 0x0100, 0xbff},
3504*9a0e4156SSadaf Ebrahimi 	{d68000_btst_s       , 0xffc0, 0x0800, 0xbfb, 0xff00, 0x0000},
3505*9a0e4156SSadaf Ebrahimi 	{d68020_callm        , 0xffc0, 0x06c0, 0x27b, 0xff00, 0x0000},
3506*9a0e4156SSadaf Ebrahimi 	{d68020_cas_8        , 0xffc0, 0x0ac0, 0x3f8, 0xfe38, 0x0000},
3507*9a0e4156SSadaf Ebrahimi 	{d68020_cas_16       , 0xffc0, 0x0cc0, 0x3f8, 0xfe38, 0x0000},
3508*9a0e4156SSadaf Ebrahimi 	{d68020_cas_32       , 0xffc0, 0x0ec0, 0x3f8, 0xfe38, 0x0000},
3509*9a0e4156SSadaf Ebrahimi 	{d68020_cas2_16      , 0xffff, 0x0cfc, 0x000, 0x0e38, 0x0000/*, 0x0e38, 0x0000 */},
3510*9a0e4156SSadaf Ebrahimi 	{d68020_cas2_32      , 0xffff, 0x0efc, 0x000, 0x0e38, 0x0000/*, 0x0e38, 0x0000 */},
3511*9a0e4156SSadaf Ebrahimi 	{d68000_chk_16       , 0xf1c0, 0x4180, 0xbff},
3512*9a0e4156SSadaf Ebrahimi 	{d68020_chk_32       , 0xf1c0, 0x4100, 0xbff},
3513*9a0e4156SSadaf Ebrahimi 	{d68020_chk2_cmp2_8  , 0xffc0, 0x00c0, 0x27b, 0x07ff, 0x0000},
3514*9a0e4156SSadaf Ebrahimi 	{d68020_chk2_cmp2_16 , 0xffc0, 0x02c0, 0x27b, 0x07ff, 0x0000},
3515*9a0e4156SSadaf Ebrahimi 	{d68020_chk2_cmp2_32 , 0xffc0, 0x04c0, 0x27b, 0x07ff, 0x0000},
3516*9a0e4156SSadaf Ebrahimi 	{d68040_cinv         , 0xff20, 0xf400, 0x000},
3517*9a0e4156SSadaf Ebrahimi 	{d68000_clr_8        , 0xffc0, 0x4200, 0xbf8},
3518*9a0e4156SSadaf Ebrahimi 	{d68000_clr_16       , 0xffc0, 0x4240, 0xbf8},
3519*9a0e4156SSadaf Ebrahimi 	{d68000_clr_32       , 0xffc0, 0x4280, 0xbf8},
3520*9a0e4156SSadaf Ebrahimi 	{d68000_cmp_8        , 0xf1c0, 0xb000, 0xbff},
3521*9a0e4156SSadaf Ebrahimi 	{d68000_cmp_16       , 0xf1c0, 0xb040, 0xfff},
3522*9a0e4156SSadaf Ebrahimi 	{d68000_cmp_32       , 0xf1c0, 0xb080, 0xfff},
3523*9a0e4156SSadaf Ebrahimi 	{d68000_cmpa_16      , 0xf1c0, 0xb0c0, 0xfff},
3524*9a0e4156SSadaf Ebrahimi 	{d68000_cmpa_32      , 0xf1c0, 0xb1c0, 0xfff},
3525*9a0e4156SSadaf Ebrahimi 	{d68000_cmpi_8       , 0xffc0, 0x0c00, 0xbf8},
3526*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcdi_8  , 0xffff, 0x0c3a, 0x000},
3527*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcix_8  , 0xffff, 0x0c3b, 0x000},
3528*9a0e4156SSadaf Ebrahimi 	{d68000_cmpi_16      , 0xffc0, 0x0c40, 0xbf8},
3529*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcdi_16 , 0xffff, 0x0c7a, 0x000},
3530*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcix_16 , 0xffff, 0x0c7b, 0x000},
3531*9a0e4156SSadaf Ebrahimi 	{d68000_cmpi_32      , 0xffc0, 0x0c80, 0xbf8},
3532*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcdi_32 , 0xffff, 0x0cba, 0x000},
3533*9a0e4156SSadaf Ebrahimi 	{d68020_cmpi_pcix_32 , 0xffff, 0x0cbb, 0x000},
3534*9a0e4156SSadaf Ebrahimi 	{d68000_cmpm_8       , 0xf1f8, 0xb108, 0x000},
3535*9a0e4156SSadaf Ebrahimi 	{d68000_cmpm_16      , 0xf1f8, 0xb148, 0x000},
3536*9a0e4156SSadaf Ebrahimi 	{d68000_cmpm_32      , 0xf1f8, 0xb188, 0x000},
3537*9a0e4156SSadaf Ebrahimi 	{d68020_cpbcc_16     , 0xf1c0, 0xf080, 0x000},
3538*9a0e4156SSadaf Ebrahimi 	{d68020_cpbcc_32     , 0xf1c0, 0xf0c0, 0x000},
3539*9a0e4156SSadaf Ebrahimi 	{d68020_cpdbcc       , 0xf1f8, 0xf048, 0x000},
3540*9a0e4156SSadaf Ebrahimi 	{d68020_cpgen        , 0xf1c0, 0xf000, 0x000},
3541*9a0e4156SSadaf Ebrahimi 	{d68020_cprestore    , 0xf1c0, 0xf140, 0x37f},
3542*9a0e4156SSadaf Ebrahimi 	{d68020_cpsave       , 0xf1c0, 0xf100, 0x2f8},
3543*9a0e4156SSadaf Ebrahimi 	{d68020_cpscc        , 0xf1c0, 0xf040, 0xbf8},
3544*9a0e4156SSadaf Ebrahimi 	{d68020_cptrapcc_0   , 0xf1ff, 0xf07c, 0x000},
3545*9a0e4156SSadaf Ebrahimi 	{d68020_cptrapcc_16  , 0xf1ff, 0xf07a, 0x000},
3546*9a0e4156SSadaf Ebrahimi 	{d68020_cptrapcc_32  , 0xf1ff, 0xf07b, 0x000},
3547*9a0e4156SSadaf Ebrahimi 	{d68040_cpush        , 0xff20, 0xf420, 0x000},
3548*9a0e4156SSadaf Ebrahimi 	{d68000_dbcc         , 0xf0f8, 0x50c8, 0x000},
3549*9a0e4156SSadaf Ebrahimi 	{d68000_dbra         , 0xfff8, 0x51c8, 0x000},
3550*9a0e4156SSadaf Ebrahimi 	{d68000_divs         , 0xf1c0, 0x81c0, 0xbff},
3551*9a0e4156SSadaf Ebrahimi 	{d68000_divu         , 0xf1c0, 0x80c0, 0xbff},
3552*9a0e4156SSadaf Ebrahimi 	{d68020_divl         , 0xff80, 0x4c00, 0xbff, 0x83f8, 0x0000},
3553*9a0e4156SSadaf Ebrahimi 	{d68000_eor_8        , 0xf1c0, 0xb100, 0xbf8},
3554*9a0e4156SSadaf Ebrahimi 	{d68000_eor_16       , 0xf1c0, 0xb140, 0xbf8},
3555*9a0e4156SSadaf Ebrahimi 	{d68000_eor_32       , 0xf1c0, 0xb180, 0xbf8},
3556*9a0e4156SSadaf Ebrahimi 	{d68000_eori_to_ccr  , 0xffff, 0x0a3c, 0x000, 0xff00, 0x0000},
3557*9a0e4156SSadaf Ebrahimi 	{d68000_eori_to_sr   , 0xffff, 0x0a7c, 0x000},
3558*9a0e4156SSadaf Ebrahimi 	{d68000_eori_8       , 0xffc0, 0x0a00, 0xbf8},
3559*9a0e4156SSadaf Ebrahimi 	{d68000_eori_16      , 0xffc0, 0x0a40, 0xbf8},
3560*9a0e4156SSadaf Ebrahimi 	{d68000_eori_32      , 0xffc0, 0x0a80, 0xbf8},
3561*9a0e4156SSadaf Ebrahimi 	{d68000_exg_dd       , 0xf1f8, 0xc140, 0x000},
3562*9a0e4156SSadaf Ebrahimi 	{d68000_exg_aa       , 0xf1f8, 0xc148, 0x000},
3563*9a0e4156SSadaf Ebrahimi 	{d68000_exg_da       , 0xf1f8, 0xc188, 0x000},
3564*9a0e4156SSadaf Ebrahimi 	{d68020_extb_32      , 0xfff8, 0x49c0, 0x000},
3565*9a0e4156SSadaf Ebrahimi 	{d68000_ext_16       , 0xfff8, 0x4880, 0x000},
3566*9a0e4156SSadaf Ebrahimi 	{d68000_ext_32       , 0xfff8, 0x48c0, 0x000},
3567*9a0e4156SSadaf Ebrahimi 	{d68000_illegal      , 0xffff, 0x4afc, 0x000},
3568*9a0e4156SSadaf Ebrahimi 	{d68000_jmp          , 0xffc0, 0x4ec0, 0x27b},
3569*9a0e4156SSadaf Ebrahimi 	{d68000_jsr          , 0xffc0, 0x4e80, 0x27b},
3570*9a0e4156SSadaf Ebrahimi 	{d68000_lea          , 0xf1c0, 0x41c0, 0x27b},
3571*9a0e4156SSadaf Ebrahimi 	{d68000_link_16      , 0xfff8, 0x4e50, 0x000},
3572*9a0e4156SSadaf Ebrahimi 	{d68020_link_32      , 0xfff8, 0x4808, 0x000},
3573*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_s_8      , 0xf1f8, 0xe008, 0x000},
3574*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_s_16     , 0xf1f8, 0xe048, 0x000},
3575*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_s_32     , 0xf1f8, 0xe088, 0x000},
3576*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_r_8      , 0xf1f8, 0xe028, 0x000},
3577*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_r_16     , 0xf1f8, 0xe068, 0x000},
3578*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_r_32     , 0xf1f8, 0xe0a8, 0x000},
3579*9a0e4156SSadaf Ebrahimi 	{d68000_lsr_ea       , 0xffc0, 0xe2c0, 0x3f8},
3580*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_s_8      , 0xf1f8, 0xe108, 0x000},
3581*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_s_16     , 0xf1f8, 0xe148, 0x000},
3582*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_s_32     , 0xf1f8, 0xe188, 0x000},
3583*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_r_8      , 0xf1f8, 0xe128, 0x000},
3584*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_r_16     , 0xf1f8, 0xe168, 0x000},
3585*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_r_32     , 0xf1f8, 0xe1a8, 0x000},
3586*9a0e4156SSadaf Ebrahimi 	{d68000_lsl_ea       , 0xffc0, 0xe3c0, 0x3f8},
3587*9a0e4156SSadaf Ebrahimi 	{d68000_move_8       , 0xf000, 0x1000, 0xbff},
3588*9a0e4156SSadaf Ebrahimi 	{d68000_move_16      , 0xf000, 0x3000, 0xfff},
3589*9a0e4156SSadaf Ebrahimi 	{d68000_move_32      , 0xf000, 0x2000, 0xfff},
3590*9a0e4156SSadaf Ebrahimi 	{d68000_movea_16     , 0xf1c0, 0x3040, 0xfff},
3591*9a0e4156SSadaf Ebrahimi 	{d68000_movea_32     , 0xf1c0, 0x2040, 0xfff},
3592*9a0e4156SSadaf Ebrahimi 	{d68000_move_to_ccr  , 0xffc0, 0x44c0, 0xbff},
3593*9a0e4156SSadaf Ebrahimi 	{d68010_move_fr_ccr  , 0xffc0, 0x42c0, 0xbf8},
3594*9a0e4156SSadaf Ebrahimi 	{d68000_move_to_sr   , 0xffc0, 0x46c0, 0xbff},
3595*9a0e4156SSadaf Ebrahimi 	{d68000_move_fr_sr   , 0xffc0, 0x40c0, 0xbf8},
3596*9a0e4156SSadaf Ebrahimi 	{d68000_move_to_usp  , 0xfff8, 0x4e60, 0x000},
3597*9a0e4156SSadaf Ebrahimi 	{d68000_move_fr_usp  , 0xfff8, 0x4e68, 0x000},
3598*9a0e4156SSadaf Ebrahimi 	{d68010_movec        , 0xfffe, 0x4e7a, 0x000},
3599*9a0e4156SSadaf Ebrahimi 	{d68000_movem_pd_16  , 0xfff8, 0x48a0, 0x000},
3600*9a0e4156SSadaf Ebrahimi 	{d68000_movem_pd_32  , 0xfff8, 0x48e0, 0x000},
3601*9a0e4156SSadaf Ebrahimi 	{d68000_movem_re_16  , 0xffc0, 0x4880, 0x2f8},
3602*9a0e4156SSadaf Ebrahimi 	{d68000_movem_re_32  , 0xffc0, 0x48c0, 0x2f8},
3603*9a0e4156SSadaf Ebrahimi 	{d68000_movem_er_16  , 0xffc0, 0x4c80, 0x37b},
3604*9a0e4156SSadaf Ebrahimi 	{d68000_movem_er_32  , 0xffc0, 0x4cc0, 0x37b},
3605*9a0e4156SSadaf Ebrahimi 	{d68000_movep_er_16  , 0xf1f8, 0x0108, 0x000},
3606*9a0e4156SSadaf Ebrahimi 	{d68000_movep_er_32  , 0xf1f8, 0x0148, 0x000},
3607*9a0e4156SSadaf Ebrahimi 	{d68000_movep_re_16  , 0xf1f8, 0x0188, 0x000},
3608*9a0e4156SSadaf Ebrahimi 	{d68000_movep_re_32  , 0xf1f8, 0x01c8, 0x000},
3609*9a0e4156SSadaf Ebrahimi 	{d68010_moves_8      , 0xffc0, 0x0e00, 0x3f8, 0x07ff, 0x0000},
3610*9a0e4156SSadaf Ebrahimi 	{d68010_moves_16     , 0xffc0, 0x0e40, 0x3f8, 0x07ff, 0x0000},
3611*9a0e4156SSadaf Ebrahimi 	{d68010_moves_32     , 0xffc0, 0x0e80, 0x3f8, 0x07ff, 0x0000},
3612*9a0e4156SSadaf Ebrahimi 	{d68000_moveq        , 0xf100, 0x7000, 0x000},
3613*9a0e4156SSadaf Ebrahimi 	{d68040_move16_pi_pi , 0xfff8, 0xf620, 0x000, 0x8fff, 0x8000},
3614*9a0e4156SSadaf Ebrahimi 	{d68040_move16_pi_al , 0xfff8, 0xf600, 0x000},
3615*9a0e4156SSadaf Ebrahimi 	{d68040_move16_al_pi , 0xfff8, 0xf608, 0x000},
3616*9a0e4156SSadaf Ebrahimi 	{d68040_move16_ai_al , 0xfff8, 0xf610, 0x000},
3617*9a0e4156SSadaf Ebrahimi 	{d68040_move16_al_ai , 0xfff8, 0xf618, 0x000},
3618*9a0e4156SSadaf Ebrahimi 	{d68000_muls         , 0xf1c0, 0xc1c0, 0xbff},
3619*9a0e4156SSadaf Ebrahimi 	{d68000_mulu         , 0xf1c0, 0xc0c0, 0xbff},
3620*9a0e4156SSadaf Ebrahimi 	{d68020_mull         , 0xffc0, 0x4c00, 0xbff, 0x83f8, 0x0000},
3621*9a0e4156SSadaf Ebrahimi 	{d68000_nbcd         , 0xffc0, 0x4800, 0xbf8},
3622*9a0e4156SSadaf Ebrahimi 	{d68000_neg_8        , 0xffc0, 0x4400, 0xbf8},
3623*9a0e4156SSadaf Ebrahimi 	{d68000_neg_16       , 0xffc0, 0x4440, 0xbf8},
3624*9a0e4156SSadaf Ebrahimi 	{d68000_neg_32       , 0xffc0, 0x4480, 0xbf8},
3625*9a0e4156SSadaf Ebrahimi 	{d68000_negx_8       , 0xffc0, 0x4000, 0xbf8},
3626*9a0e4156SSadaf Ebrahimi 	{d68000_negx_16      , 0xffc0, 0x4040, 0xbf8},
3627*9a0e4156SSadaf Ebrahimi 	{d68000_negx_32      , 0xffc0, 0x4080, 0xbf8},
3628*9a0e4156SSadaf Ebrahimi 	{d68000_nop          , 0xffff, 0x4e71, 0x000},
3629*9a0e4156SSadaf Ebrahimi 	{d68000_not_8        , 0xffc0, 0x4600, 0xbf8},
3630*9a0e4156SSadaf Ebrahimi 	{d68000_not_16       , 0xffc0, 0x4640, 0xbf8},
3631*9a0e4156SSadaf Ebrahimi 	{d68000_not_32       , 0xffc0, 0x4680, 0xbf8},
3632*9a0e4156SSadaf Ebrahimi 	{d68000_or_er_8      , 0xf1c0, 0x8000, 0xbff},
3633*9a0e4156SSadaf Ebrahimi 	{d68000_or_er_16     , 0xf1c0, 0x8040, 0xbff},
3634*9a0e4156SSadaf Ebrahimi 	{d68000_or_er_32     , 0xf1c0, 0x8080, 0xbff},
3635*9a0e4156SSadaf Ebrahimi 	{d68000_or_re_8      , 0xf1c0, 0x8100, 0x3f8},
3636*9a0e4156SSadaf Ebrahimi 	{d68000_or_re_16     , 0xf1c0, 0x8140, 0x3f8},
3637*9a0e4156SSadaf Ebrahimi 	{d68000_or_re_32     , 0xf1c0, 0x8180, 0x3f8},
3638*9a0e4156SSadaf Ebrahimi 	{d68000_ori_to_ccr   , 0xffff, 0x003c, 0x000, 0xff00, 0x0000},
3639*9a0e4156SSadaf Ebrahimi 	{d68000_ori_to_sr    , 0xffff, 0x007c, 0x000},
3640*9a0e4156SSadaf Ebrahimi 	{d68000_ori_8        , 0xffc0, 0x0000, 0xbf8},
3641*9a0e4156SSadaf Ebrahimi 	{d68000_ori_16       , 0xffc0, 0x0040, 0xbf8},
3642*9a0e4156SSadaf Ebrahimi 	{d68000_ori_32       , 0xffc0, 0x0080, 0xbf8},
3643*9a0e4156SSadaf Ebrahimi 	{d68020_pack_rr      , 0xf1f8, 0x8140, 0x000},
3644*9a0e4156SSadaf Ebrahimi 	{d68020_pack_mm      , 0xf1f8, 0x8148, 0x000},
3645*9a0e4156SSadaf Ebrahimi 	{d68000_pea          , 0xffc0, 0x4840, 0x27b},
3646*9a0e4156SSadaf Ebrahimi 	{d68000_reset        , 0xffff, 0x4e70, 0x000},
3647*9a0e4156SSadaf Ebrahimi 	{d68000_ror_s_8      , 0xf1f8, 0xe018, 0x000},
3648*9a0e4156SSadaf Ebrahimi 	{d68000_ror_s_16     , 0xf1f8, 0xe058, 0x000},
3649*9a0e4156SSadaf Ebrahimi 	{d68000_ror_s_32     , 0xf1f8, 0xe098, 0x000},
3650*9a0e4156SSadaf Ebrahimi 	{d68000_ror_r_8      , 0xf1f8, 0xe038, 0x000},
3651*9a0e4156SSadaf Ebrahimi 	{d68000_ror_r_16     , 0xf1f8, 0xe078, 0x000},
3652*9a0e4156SSadaf Ebrahimi 	{d68000_ror_r_32     , 0xf1f8, 0xe0b8, 0x000},
3653*9a0e4156SSadaf Ebrahimi 	{d68000_ror_ea       , 0xffc0, 0xe6c0, 0x3f8},
3654*9a0e4156SSadaf Ebrahimi 	{d68000_rol_s_8      , 0xf1f8, 0xe118, 0x000},
3655*9a0e4156SSadaf Ebrahimi 	{d68000_rol_s_16     , 0xf1f8, 0xe158, 0x000},
3656*9a0e4156SSadaf Ebrahimi 	{d68000_rol_s_32     , 0xf1f8, 0xe198, 0x000},
3657*9a0e4156SSadaf Ebrahimi 	{d68000_rol_r_8      , 0xf1f8, 0xe138, 0x000},
3658*9a0e4156SSadaf Ebrahimi 	{d68000_rol_r_16     , 0xf1f8, 0xe178, 0x000},
3659*9a0e4156SSadaf Ebrahimi 	{d68000_rol_r_32     , 0xf1f8, 0xe1b8, 0x000},
3660*9a0e4156SSadaf Ebrahimi 	{d68000_rol_ea       , 0xffc0, 0xe7c0, 0x3f8},
3661*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_s_8     , 0xf1f8, 0xe010, 0x000},
3662*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_s_16    , 0xf1f8, 0xe050, 0x000},
3663*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_s_32    , 0xf1f8, 0xe090, 0x000},
3664*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_r_8     , 0xf1f8, 0xe030, 0x000},
3665*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_r_16    , 0xf1f8, 0xe070, 0x000},
3666*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_r_32    , 0xf1f8, 0xe0b0, 0x000},
3667*9a0e4156SSadaf Ebrahimi 	{d68000_roxr_ea      , 0xffc0, 0xe4c0, 0x3f8},
3668*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_s_8     , 0xf1f8, 0xe110, 0x000},
3669*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_s_16    , 0xf1f8, 0xe150, 0x000},
3670*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_s_32    , 0xf1f8, 0xe190, 0x000},
3671*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_r_8     , 0xf1f8, 0xe130, 0x000},
3672*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_r_16    , 0xf1f8, 0xe170, 0x000},
3673*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_r_32    , 0xf1f8, 0xe1b0, 0x000},
3674*9a0e4156SSadaf Ebrahimi 	{d68000_roxl_ea      , 0xffc0, 0xe5c0, 0x3f8},
3675*9a0e4156SSadaf Ebrahimi 	{d68010_rtd          , 0xffff, 0x4e74, 0x000},
3676*9a0e4156SSadaf Ebrahimi 	{d68000_rte          , 0xffff, 0x4e73, 0x000},
3677*9a0e4156SSadaf Ebrahimi 	{d68020_rtm          , 0xfff0, 0x06c0, 0x000},
3678*9a0e4156SSadaf Ebrahimi 	{d68000_rtr          , 0xffff, 0x4e77, 0x000},
3679*9a0e4156SSadaf Ebrahimi 	{d68000_rts          , 0xffff, 0x4e75, 0x000},
3680*9a0e4156SSadaf Ebrahimi 	{d68000_sbcd_rr      , 0xf1f8, 0x8100, 0x000},
3681*9a0e4156SSadaf Ebrahimi 	{d68000_sbcd_mm      , 0xf1f8, 0x8108, 0x000},
3682*9a0e4156SSadaf Ebrahimi 	{d68000_scc          , 0xf0c0, 0x50c0, 0xbf8},
3683*9a0e4156SSadaf Ebrahimi 	{d68000_stop         , 0xffff, 0x4e72, 0x000},
3684*9a0e4156SSadaf Ebrahimi 	{d68000_sub_er_8     , 0xf1c0, 0x9000, 0xbff},
3685*9a0e4156SSadaf Ebrahimi 	{d68000_sub_er_16    , 0xf1c0, 0x9040, 0xfff},
3686*9a0e4156SSadaf Ebrahimi 	{d68000_sub_er_32    , 0xf1c0, 0x9080, 0xfff},
3687*9a0e4156SSadaf Ebrahimi 	{d68000_sub_re_8     , 0xf1c0, 0x9100, 0x3f8},
3688*9a0e4156SSadaf Ebrahimi 	{d68000_sub_re_16    , 0xf1c0, 0x9140, 0x3f8},
3689*9a0e4156SSadaf Ebrahimi 	{d68000_sub_re_32    , 0xf1c0, 0x9180, 0x3f8},
3690*9a0e4156SSadaf Ebrahimi 	{d68000_suba_16      , 0xf1c0, 0x90c0, 0xfff},
3691*9a0e4156SSadaf Ebrahimi 	{d68000_suba_32      , 0xf1c0, 0x91c0, 0xfff},
3692*9a0e4156SSadaf Ebrahimi 	{d68000_subi_8       , 0xffc0, 0x0400, 0xbf8},
3693*9a0e4156SSadaf Ebrahimi 	{d68000_subi_16      , 0xffc0, 0x0440, 0xbf8},
3694*9a0e4156SSadaf Ebrahimi 	{d68000_subi_32      , 0xffc0, 0x0480, 0xbf8},
3695*9a0e4156SSadaf Ebrahimi 	{d68000_subq_8       , 0xf1c0, 0x5100, 0xbf8},
3696*9a0e4156SSadaf Ebrahimi 	{d68000_subq_16      , 0xf1c0, 0x5140, 0xff8},
3697*9a0e4156SSadaf Ebrahimi 	{d68000_subq_32      , 0xf1c0, 0x5180, 0xff8},
3698*9a0e4156SSadaf Ebrahimi 	{d68000_subx_rr_8    , 0xf1f8, 0x9100, 0x000},
3699*9a0e4156SSadaf Ebrahimi 	{d68000_subx_rr_16   , 0xf1f8, 0x9140, 0x000},
3700*9a0e4156SSadaf Ebrahimi 	{d68000_subx_rr_32   , 0xf1f8, 0x9180, 0x000},
3701*9a0e4156SSadaf Ebrahimi 	{d68000_subx_mm_8    , 0xf1f8, 0x9108, 0x000},
3702*9a0e4156SSadaf Ebrahimi 	{d68000_subx_mm_16   , 0xf1f8, 0x9148, 0x000},
3703*9a0e4156SSadaf Ebrahimi 	{d68000_subx_mm_32   , 0xf1f8, 0x9188, 0x000},
3704*9a0e4156SSadaf Ebrahimi 	{d68000_swap         , 0xfff8, 0x4840, 0x000},
3705*9a0e4156SSadaf Ebrahimi 	{d68000_tas          , 0xffc0, 0x4ac0, 0xbf8},
3706*9a0e4156SSadaf Ebrahimi 	{d68000_trap         , 0xfff0, 0x4e40, 0x000},
3707*9a0e4156SSadaf Ebrahimi 	{d68020_trapcc_0     , 0xf0ff, 0x50fc, 0x000},
3708*9a0e4156SSadaf Ebrahimi 	{d68020_trapcc_16    , 0xf0ff, 0x50fa, 0x000},
3709*9a0e4156SSadaf Ebrahimi 	{d68020_trapcc_32    , 0xf0ff, 0x50fb, 0x000},
3710*9a0e4156SSadaf Ebrahimi 	{d68000_trapv        , 0xffff, 0x4e76, 0x000},
3711*9a0e4156SSadaf Ebrahimi 	{d68000_tst_8        , 0xffc0, 0x4a00, 0xbf8},
3712*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcdi_8   , 0xffff, 0x4a3a, 0x000},
3713*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcix_8   , 0xffff, 0x4a3b, 0x000},
3714*9a0e4156SSadaf Ebrahimi 	{d68020_tst_i_8      , 0xffff, 0x4a3c, 0x000},
3715*9a0e4156SSadaf Ebrahimi 	{d68000_tst_16       , 0xffc0, 0x4a40, 0xbf8},
3716*9a0e4156SSadaf Ebrahimi 	{d68020_tst_a_16     , 0xfff8, 0x4a48, 0x000},
3717*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcdi_16  , 0xffff, 0x4a7a, 0x000},
3718*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcix_16  , 0xffff, 0x4a7b, 0x000},
3719*9a0e4156SSadaf Ebrahimi 	{d68020_tst_i_16     , 0xffff, 0x4a7c, 0x000},
3720*9a0e4156SSadaf Ebrahimi 	{d68000_tst_32       , 0xffc0, 0x4a80, 0xbf8},
3721*9a0e4156SSadaf Ebrahimi 	{d68020_tst_a_32     , 0xfff8, 0x4a88, 0x000},
3722*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcdi_32  , 0xffff, 0x4aba, 0x000},
3723*9a0e4156SSadaf Ebrahimi 	{d68020_tst_pcix_32  , 0xffff, 0x4abb, 0x000},
3724*9a0e4156SSadaf Ebrahimi 	{d68020_tst_i_32     , 0xffff, 0x4abc, 0x000},
3725*9a0e4156SSadaf Ebrahimi 	{d68000_unlk         , 0xfff8, 0x4e58, 0x000},
3726*9a0e4156SSadaf Ebrahimi 	{d68020_unpk_rr      , 0xf1f8, 0x8180, 0x000},
3727*9a0e4156SSadaf Ebrahimi 	{d68020_unpk_mm      , 0xf1f8, 0x8188, 0x000},
3728*9a0e4156SSadaf Ebrahimi 	{0, 0, 0, 0}
3729*9a0e4156SSadaf Ebrahimi };
3730*9a0e4156SSadaf Ebrahimi 
3731*9a0e4156SSadaf Ebrahimi /* Check if opcode is using a valid ea mode */
valid_ea(uint opcode,uint mask)3732*9a0e4156SSadaf Ebrahimi static int valid_ea(uint opcode, uint mask)
3733*9a0e4156SSadaf Ebrahimi {
3734*9a0e4156SSadaf Ebrahimi 	if (mask == 0)
3735*9a0e4156SSadaf Ebrahimi 		return 1;
3736*9a0e4156SSadaf Ebrahimi 
3737*9a0e4156SSadaf Ebrahimi 	switch(opcode & 0x3f) {
3738*9a0e4156SSadaf Ebrahimi 		case 0x00: case 0x01: case 0x02: case 0x03:
3739*9a0e4156SSadaf Ebrahimi 		case 0x04: case 0x05: case 0x06: case 0x07:
3740*9a0e4156SSadaf Ebrahimi 			return (mask & 0x800) != 0;
3741*9a0e4156SSadaf Ebrahimi 		case 0x08: case 0x09: case 0x0a: case 0x0b:
3742*9a0e4156SSadaf Ebrahimi 		case 0x0c: case 0x0d: case 0x0e: case 0x0f:
3743*9a0e4156SSadaf Ebrahimi 			return (mask & 0x400) != 0;
3744*9a0e4156SSadaf Ebrahimi 		case 0x10: case 0x11: case 0x12: case 0x13:
3745*9a0e4156SSadaf Ebrahimi 		case 0x14: case 0x15: case 0x16: case 0x17:
3746*9a0e4156SSadaf Ebrahimi 			return (mask & 0x200) != 0;
3747*9a0e4156SSadaf Ebrahimi 		case 0x18: case 0x19: case 0x1a: case 0x1b:
3748*9a0e4156SSadaf Ebrahimi 		case 0x1c: case 0x1d: case 0x1e: case 0x1f:
3749*9a0e4156SSadaf Ebrahimi 			return (mask & 0x100) != 0;
3750*9a0e4156SSadaf Ebrahimi 		case 0x20: case 0x21: case 0x22: case 0x23:
3751*9a0e4156SSadaf Ebrahimi 		case 0x24: case 0x25: case 0x26: case 0x27:
3752*9a0e4156SSadaf Ebrahimi 			return (mask & 0x080) != 0;
3753*9a0e4156SSadaf Ebrahimi 		case 0x28: case 0x29: case 0x2a: case 0x2b:
3754*9a0e4156SSadaf Ebrahimi 		case 0x2c: case 0x2d: case 0x2e: case 0x2f:
3755*9a0e4156SSadaf Ebrahimi 			return (mask & 0x040) != 0;
3756*9a0e4156SSadaf Ebrahimi 		case 0x30: case 0x31: case 0x32: case 0x33:
3757*9a0e4156SSadaf Ebrahimi 		case 0x34: case 0x35: case 0x36: case 0x37:
3758*9a0e4156SSadaf Ebrahimi 			return (mask & 0x020) != 0;
3759*9a0e4156SSadaf Ebrahimi 		case 0x38:
3760*9a0e4156SSadaf Ebrahimi 			return (mask & 0x010) != 0;
3761*9a0e4156SSadaf Ebrahimi 		case 0x39:
3762*9a0e4156SSadaf Ebrahimi 			return (mask & 0x008) != 0;
3763*9a0e4156SSadaf Ebrahimi 		case 0x3a:
3764*9a0e4156SSadaf Ebrahimi 			return (mask & 0x002) != 0;
3765*9a0e4156SSadaf Ebrahimi 		case 0x3b:
3766*9a0e4156SSadaf Ebrahimi 			return (mask & 0x001) != 0;
3767*9a0e4156SSadaf Ebrahimi 		case 0x3c:
3768*9a0e4156SSadaf Ebrahimi 			return (mask & 0x004) != 0;
3769*9a0e4156SSadaf Ebrahimi 	}
3770*9a0e4156SSadaf Ebrahimi 	return 0;
3771*9a0e4156SSadaf Ebrahimi 
3772*9a0e4156SSadaf Ebrahimi }
3773*9a0e4156SSadaf Ebrahimi 
3774*9a0e4156SSadaf Ebrahimi /* Used by qsort */
compare_nof_true_bits(const void * aptr,const void * bptr)3775*9a0e4156SSadaf Ebrahimi static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr)
3776*9a0e4156SSadaf Ebrahimi {
3777*9a0e4156SSadaf Ebrahimi 	uint a = ((const opcode_struct*)aptr)->mask;
3778*9a0e4156SSadaf Ebrahimi 	uint b = ((const opcode_struct*)bptr)->mask;
3779*9a0e4156SSadaf Ebrahimi 
3780*9a0e4156SSadaf Ebrahimi 	a = ((a & 0xAAAA) >> 1) + (a & 0x5555);
3781*9a0e4156SSadaf Ebrahimi 	a = ((a & 0xCCCC) >> 2) + (a & 0x3333);
3782*9a0e4156SSadaf Ebrahimi 	a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);
3783*9a0e4156SSadaf Ebrahimi 	a = ((a & 0xFF00) >> 8) + (a & 0x00FF);
3784*9a0e4156SSadaf Ebrahimi 
3785*9a0e4156SSadaf Ebrahimi 	b = ((b & 0xAAAA) >> 1) + (b & 0x5555);
3786*9a0e4156SSadaf Ebrahimi 	b = ((b & 0xCCCC) >> 2) + (b & 0x3333);
3787*9a0e4156SSadaf Ebrahimi 	b = ((b & 0xF0F0) >> 4) + (b & 0x0F0F);
3788*9a0e4156SSadaf Ebrahimi 	b = ((b & 0xFF00) >> 8) + (b & 0x00FF);
3789*9a0e4156SSadaf Ebrahimi 
3790*9a0e4156SSadaf Ebrahimi 	return b - a; /* reversed to get greatest to least sorting */
3791*9a0e4156SSadaf Ebrahimi }
3792*9a0e4156SSadaf Ebrahimi 
3793*9a0e4156SSadaf Ebrahimi /* build the opcode handler jump table */
build_opcode_table(void)3794*9a0e4156SSadaf Ebrahimi static void build_opcode_table(void)
3795*9a0e4156SSadaf Ebrahimi {
3796*9a0e4156SSadaf Ebrahimi 	uint i;
3797*9a0e4156SSadaf Ebrahimi 	uint opcode;
3798*9a0e4156SSadaf Ebrahimi 	opcode_struct* ostruct;
3799*9a0e4156SSadaf Ebrahimi 	uint opcode_info_length = 0;
3800*9a0e4156SSadaf Ebrahimi 
3801*9a0e4156SSadaf Ebrahimi 	/* Already initialized ? */
3802*9a0e4156SSadaf Ebrahimi 	if (g_instruction_table[0].instruction != NULL) {
3803*9a0e4156SSadaf Ebrahimi 		return;
3804*9a0e4156SSadaf Ebrahimi 	}
3805*9a0e4156SSadaf Ebrahimi 
3806*9a0e4156SSadaf Ebrahimi 	for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)
3807*9a0e4156SSadaf Ebrahimi 		opcode_info_length++;
3808*9a0e4156SSadaf Ebrahimi 
3809*9a0e4156SSadaf Ebrahimi 	qsort((void *)g_opcode_info, opcode_info_length, sizeof(g_opcode_info[0]), compare_nof_true_bits);
3810*9a0e4156SSadaf Ebrahimi 
3811*9a0e4156SSadaf Ebrahimi 	for(i=0;i<0x10000;i++) {
3812*9a0e4156SSadaf Ebrahimi 		g_instruction_table[i].instruction = d68000_invalid; /* default to invalid, undecoded opcode */
3813*9a0e4156SSadaf Ebrahimi 		opcode = i;
3814*9a0e4156SSadaf Ebrahimi 		/* search through opcode info for a match */
3815*9a0e4156SSadaf Ebrahimi 		for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++) {
3816*9a0e4156SSadaf Ebrahimi 			/* match opcode mask and allowed ea modes */
3817*9a0e4156SSadaf Ebrahimi 			if ((opcode & ostruct->mask) == ostruct->match) {
3818*9a0e4156SSadaf Ebrahimi 				/* Handle destination ea for move instructions */
3819*9a0e4156SSadaf Ebrahimi 				if ((ostruct->opcode_handler == d68000_move_8 ||
3820*9a0e4156SSadaf Ebrahimi 							ostruct->opcode_handler == d68000_move_16 ||
3821*9a0e4156SSadaf Ebrahimi 							ostruct->opcode_handler == d68000_move_32) &&
3822*9a0e4156SSadaf Ebrahimi 						!valid_ea(((opcode>>9)&7) | ((opcode>>3)&0x38), 0xbf8))
3823*9a0e4156SSadaf Ebrahimi 					continue;
3824*9a0e4156SSadaf Ebrahimi 				if (valid_ea(opcode, ostruct->ea_mask)) {
3825*9a0e4156SSadaf Ebrahimi 					g_instruction_table[i].instruction = ostruct->opcode_handler;
3826*9a0e4156SSadaf Ebrahimi 					g_instruction_table[i].word2_mask = ostruct->mask2;
3827*9a0e4156SSadaf Ebrahimi 					g_instruction_table[i].word2_match = ostruct->match2;
3828*9a0e4156SSadaf Ebrahimi 					break;
3829*9a0e4156SSadaf Ebrahimi 				}
3830*9a0e4156SSadaf Ebrahimi 			}
3831*9a0e4156SSadaf Ebrahimi 		}
3832*9a0e4156SSadaf Ebrahimi 	}
3833*9a0e4156SSadaf Ebrahimi }
3834*9a0e4156SSadaf Ebrahimi 
instruction_is_valid(m68k_info * info,const unsigned int word_check)3835*9a0e4156SSadaf Ebrahimi static int instruction_is_valid(m68k_info *info, const unsigned int word_check)
3836*9a0e4156SSadaf Ebrahimi {
3837*9a0e4156SSadaf Ebrahimi 	const unsigned int instruction = info->ir;
3838*9a0e4156SSadaf Ebrahimi 	instruction_struct *i = &g_instruction_table[instruction];
3839*9a0e4156SSadaf Ebrahimi 
3840*9a0e4156SSadaf Ebrahimi 	if ( (i->word2_mask && ((word_check & i->word2_mask) != i->word2_match)) ||
3841*9a0e4156SSadaf Ebrahimi 		(i->instruction == d68000_invalid) ) {
3842*9a0e4156SSadaf Ebrahimi 		d68000_invalid(info);
3843*9a0e4156SSadaf Ebrahimi 		return 0;
3844*9a0e4156SSadaf Ebrahimi 	}
3845*9a0e4156SSadaf Ebrahimi 
3846*9a0e4156SSadaf Ebrahimi 	return 1;
3847*9a0e4156SSadaf Ebrahimi }
3848*9a0e4156SSadaf Ebrahimi 
exists_reg_list(uint16_t * regs,uint8_t count,m68k_reg reg)3849*9a0e4156SSadaf Ebrahimi static int exists_reg_list(uint16_t *regs, uint8_t count, m68k_reg reg)
3850*9a0e4156SSadaf Ebrahimi {
3851*9a0e4156SSadaf Ebrahimi 	uint8_t i;
3852*9a0e4156SSadaf Ebrahimi 
3853*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < count; ++i) {
3854*9a0e4156SSadaf Ebrahimi 		if (regs[i] == (uint16_t)reg)
3855*9a0e4156SSadaf Ebrahimi 			return 1;
3856*9a0e4156SSadaf Ebrahimi 	}
3857*9a0e4156SSadaf Ebrahimi 
3858*9a0e4156SSadaf Ebrahimi 	return 0;
3859*9a0e4156SSadaf Ebrahimi }
3860*9a0e4156SSadaf Ebrahimi 
add_reg_to_rw_list(m68k_info * info,m68k_reg reg,int write)3861*9a0e4156SSadaf Ebrahimi static void add_reg_to_rw_list(m68k_info *info, m68k_reg reg, int write)
3862*9a0e4156SSadaf Ebrahimi {
3863*9a0e4156SSadaf Ebrahimi 	if (reg == M68K_REG_INVALID)
3864*9a0e4156SSadaf Ebrahimi 		return;
3865*9a0e4156SSadaf Ebrahimi 
3866*9a0e4156SSadaf Ebrahimi 	if (write)
3867*9a0e4156SSadaf Ebrahimi 	{
3868*9a0e4156SSadaf Ebrahimi 		if (exists_reg_list(info->regs_write, info->regs_write_count, reg))
3869*9a0e4156SSadaf Ebrahimi 			return;
3870*9a0e4156SSadaf Ebrahimi 
3871*9a0e4156SSadaf Ebrahimi 		info->regs_write[info->regs_write_count] = (uint16_t)reg;
3872*9a0e4156SSadaf Ebrahimi 		info->regs_write_count++;
3873*9a0e4156SSadaf Ebrahimi 	}
3874*9a0e4156SSadaf Ebrahimi 	else
3875*9a0e4156SSadaf Ebrahimi 	{
3876*9a0e4156SSadaf Ebrahimi 		if (exists_reg_list(info->regs_read, info->regs_read_count, reg))
3877*9a0e4156SSadaf Ebrahimi 			return;
3878*9a0e4156SSadaf Ebrahimi 
3879*9a0e4156SSadaf Ebrahimi 		info->regs_read[info->regs_read_count] = (uint16_t)reg;
3880*9a0e4156SSadaf Ebrahimi 		info->regs_read_count++;
3881*9a0e4156SSadaf Ebrahimi 	}
3882*9a0e4156SSadaf Ebrahimi }
3883*9a0e4156SSadaf Ebrahimi 
update_am_reg_list(m68k_info * info,cs_m68k_op * op,int write)3884*9a0e4156SSadaf Ebrahimi static void update_am_reg_list(m68k_info *info, cs_m68k_op *op, int write)
3885*9a0e4156SSadaf Ebrahimi {
3886*9a0e4156SSadaf Ebrahimi 	switch (op->address_mode) {
3887*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REG_DIRECT_ADDR:
3888*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REG_DIRECT_DATA:
3889*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->reg, write);
3890*9a0e4156SSadaf Ebrahimi 			break;
3891*9a0e4156SSadaf Ebrahimi 
3892*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REGI_ADDR_POST_INC:
3893*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REGI_ADDR_PRE_DEC:
3894*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->reg, 1);
3895*9a0e4156SSadaf Ebrahimi 			break;
3896*9a0e4156SSadaf Ebrahimi 
3897*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REGI_ADDR:
3898*9a0e4156SSadaf Ebrahimi 		case M68K_AM_REGI_ADDR_DISP:
3899*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->reg, 0);
3900*9a0e4156SSadaf Ebrahimi 			break;
3901*9a0e4156SSadaf Ebrahimi 
3902*9a0e4156SSadaf Ebrahimi 		case M68K_AM_AREGI_INDEX_8_BIT_DISP:
3903*9a0e4156SSadaf Ebrahimi 		case M68K_AM_AREGI_INDEX_BASE_DISP:
3904*9a0e4156SSadaf Ebrahimi 		case M68K_AM_MEMI_POST_INDEX:
3905*9a0e4156SSadaf Ebrahimi 		case M68K_AM_MEMI_PRE_INDEX:
3906*9a0e4156SSadaf Ebrahimi 		case M68K_AM_PCI_INDEX_8_BIT_DISP:
3907*9a0e4156SSadaf Ebrahimi 		case M68K_AM_PCI_INDEX_BASE_DISP:
3908*9a0e4156SSadaf Ebrahimi 		case M68K_AM_PC_MEMI_PRE_INDEX:
3909*9a0e4156SSadaf Ebrahimi 		case M68K_AM_PC_MEMI_POST_INDEX:
3910*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->mem.index_reg, 0);
3911*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->mem.base_reg, 0);
3912*9a0e4156SSadaf Ebrahimi 			break;
3913*9a0e4156SSadaf Ebrahimi 
3914*9a0e4156SSadaf Ebrahimi 		// no register(s) in the other addressing modes
3915*9a0e4156SSadaf Ebrahimi 		default:
3916*9a0e4156SSadaf Ebrahimi 			break;
3917*9a0e4156SSadaf Ebrahimi 	}
3918*9a0e4156SSadaf Ebrahimi }
3919*9a0e4156SSadaf Ebrahimi 
update_bits_range(m68k_info * info,m68k_reg reg_start,uint8_t bits,int write)3920*9a0e4156SSadaf Ebrahimi static void update_bits_range(m68k_info *info, m68k_reg reg_start, uint8_t bits, int write)
3921*9a0e4156SSadaf Ebrahimi {
3922*9a0e4156SSadaf Ebrahimi 	int i;
3923*9a0e4156SSadaf Ebrahimi 
3924*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < 8; ++i) {
3925*9a0e4156SSadaf Ebrahimi 		if (bits & (1 << i)) {
3926*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, reg_start + i, write);
3927*9a0e4156SSadaf Ebrahimi 		}
3928*9a0e4156SSadaf Ebrahimi 	}
3929*9a0e4156SSadaf Ebrahimi }
3930*9a0e4156SSadaf Ebrahimi 
update_reg_list_regbits(m68k_info * info,cs_m68k_op * op,int write)3931*9a0e4156SSadaf Ebrahimi static void update_reg_list_regbits(m68k_info *info, cs_m68k_op *op, int write)
3932*9a0e4156SSadaf Ebrahimi {
3933*9a0e4156SSadaf Ebrahimi 	uint32_t bits = op->register_bits;
3934*9a0e4156SSadaf Ebrahimi 	update_bits_range(info, M68K_REG_D0, bits & 0xff, write);
3935*9a0e4156SSadaf Ebrahimi 	update_bits_range(info, M68K_REG_A0, (bits >> 8) & 0xff, write);
3936*9a0e4156SSadaf Ebrahimi 	update_bits_range(info, M68K_REG_FP0, (bits >> 16) & 0xff, write);
3937*9a0e4156SSadaf Ebrahimi }
3938*9a0e4156SSadaf Ebrahimi 
update_op_reg_list(m68k_info * info,cs_m68k_op * op,int write)3939*9a0e4156SSadaf Ebrahimi static void update_op_reg_list(m68k_info *info, cs_m68k_op *op, int write)
3940*9a0e4156SSadaf Ebrahimi {
3941*9a0e4156SSadaf Ebrahimi 	switch ((int)op->type) {
3942*9a0e4156SSadaf Ebrahimi 		case M68K_OP_REG:
3943*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, op->reg, write);
3944*9a0e4156SSadaf Ebrahimi 			break;
3945*9a0e4156SSadaf Ebrahimi 
3946*9a0e4156SSadaf Ebrahimi 		case M68K_OP_MEM:
3947*9a0e4156SSadaf Ebrahimi 			update_am_reg_list(info, op, write);
3948*9a0e4156SSadaf Ebrahimi 			break;
3949*9a0e4156SSadaf Ebrahimi 
3950*9a0e4156SSadaf Ebrahimi 		case M68K_OP_REG_BITS:
3951*9a0e4156SSadaf Ebrahimi 			update_reg_list_regbits(info, op, write);
3952*9a0e4156SSadaf Ebrahimi 			break;
3953*9a0e4156SSadaf Ebrahimi 
3954*9a0e4156SSadaf Ebrahimi 		case M68K_OP_REG_PAIR:
3955*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, M68K_REG_D0 + op->reg_pair.reg_0, write);
3956*9a0e4156SSadaf Ebrahimi 			add_reg_to_rw_list(info, M68K_REG_D0 + op->reg_pair.reg_1, write);
3957*9a0e4156SSadaf Ebrahimi 			break;
3958*9a0e4156SSadaf Ebrahimi 	}
3959*9a0e4156SSadaf Ebrahimi }
3960*9a0e4156SSadaf Ebrahimi 
build_regs_read_write_counts(m68k_info * info)3961*9a0e4156SSadaf Ebrahimi static void build_regs_read_write_counts(m68k_info *info)
3962*9a0e4156SSadaf Ebrahimi {
3963*9a0e4156SSadaf Ebrahimi 	int i;
3964*9a0e4156SSadaf Ebrahimi 
3965*9a0e4156SSadaf Ebrahimi 	if (!info->extension.op_count)
3966*9a0e4156SSadaf Ebrahimi 		return;
3967*9a0e4156SSadaf Ebrahimi 
3968*9a0e4156SSadaf Ebrahimi 	if (info->extension.op_count == 1) {
3969*9a0e4156SSadaf Ebrahimi 		update_op_reg_list(info, &info->extension.operands[0], 1);
3970*9a0e4156SSadaf Ebrahimi 	} else {
3971*9a0e4156SSadaf Ebrahimi 		// first operand is always read
3972*9a0e4156SSadaf Ebrahimi 		update_op_reg_list(info, &info->extension.operands[0], 0);
3973*9a0e4156SSadaf Ebrahimi 
3974*9a0e4156SSadaf Ebrahimi 		// remaning write
3975*9a0e4156SSadaf Ebrahimi 		for (i = 1; i < info->extension.op_count; ++i)
3976*9a0e4156SSadaf Ebrahimi 			update_op_reg_list(info, &info->extension.operands[i], 1);
3977*9a0e4156SSadaf Ebrahimi 	}
3978*9a0e4156SSadaf Ebrahimi }
3979*9a0e4156SSadaf Ebrahimi 
m68k_setup_internals(m68k_info * info,MCInst * inst,unsigned int pc,unsigned int cpu_type)3980*9a0e4156SSadaf Ebrahimi static void m68k_setup_internals(m68k_info* info, MCInst* inst, unsigned int pc, unsigned int cpu_type)
3981*9a0e4156SSadaf Ebrahimi {
3982*9a0e4156SSadaf Ebrahimi 	info->inst = inst;
3983*9a0e4156SSadaf Ebrahimi 	info->pc = pc;
3984*9a0e4156SSadaf Ebrahimi 	info->ir = 0;
3985*9a0e4156SSadaf Ebrahimi 	info->type = cpu_type;
3986*9a0e4156SSadaf Ebrahimi 	info->address_mask = 0xffffffff;
3987*9a0e4156SSadaf Ebrahimi 
3988*9a0e4156SSadaf Ebrahimi 	switch(info->type) {
3989*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68000:
3990*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68000;
3991*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0x00ffffff;
3992*9a0e4156SSadaf Ebrahimi 			break;
3993*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68010:
3994*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68010;
3995*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0x00ffffff;
3996*9a0e4156SSadaf Ebrahimi 			break;
3997*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68EC020:
3998*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68020;
3999*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0x00ffffff;
4000*9a0e4156SSadaf Ebrahimi 			break;
4001*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68020:
4002*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68020;
4003*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0xffffffff;
4004*9a0e4156SSadaf Ebrahimi 			break;
4005*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68030:
4006*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68030;
4007*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0xffffffff;
4008*9a0e4156SSadaf Ebrahimi 			break;
4009*9a0e4156SSadaf Ebrahimi 		case M68K_CPU_TYPE_68040:
4010*9a0e4156SSadaf Ebrahimi 			info->type = TYPE_68040;
4011*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0xffffffff;
4012*9a0e4156SSadaf Ebrahimi 			break;
4013*9a0e4156SSadaf Ebrahimi 		default:
4014*9a0e4156SSadaf Ebrahimi 			info->address_mask = 0;
4015*9a0e4156SSadaf Ebrahimi 			return;
4016*9a0e4156SSadaf Ebrahimi 	}
4017*9a0e4156SSadaf Ebrahimi }
4018*9a0e4156SSadaf Ebrahimi 
4019*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
4020*9a0e4156SSadaf Ebrahimi /* ================================= API ================================== */
4021*9a0e4156SSadaf Ebrahimi /* ======================================================================== */
4022*9a0e4156SSadaf Ebrahimi 
4023*9a0e4156SSadaf Ebrahimi /* Disasemble one instruction at pc and store in str_buff */
m68k_disassemble(m68k_info * info,uint64_t pc)4024*9a0e4156SSadaf Ebrahimi static unsigned int m68k_disassemble(m68k_info *info, uint64_t pc)
4025*9a0e4156SSadaf Ebrahimi {
4026*9a0e4156SSadaf Ebrahimi 	MCInst *inst = info->inst;
4027*9a0e4156SSadaf Ebrahimi 	cs_m68k* ext = &info->extension;
4028*9a0e4156SSadaf Ebrahimi 	int i;
4029*9a0e4156SSadaf Ebrahimi 	unsigned int size;
4030*9a0e4156SSadaf Ebrahimi 
4031*9a0e4156SSadaf Ebrahimi 	inst->Opcode = M68K_INS_INVALID;
4032*9a0e4156SSadaf Ebrahimi 
4033*9a0e4156SSadaf Ebrahimi 	build_opcode_table();
4034*9a0e4156SSadaf Ebrahimi 
4035*9a0e4156SSadaf Ebrahimi 	memset(ext, 0, sizeof(cs_m68k));
4036*9a0e4156SSadaf Ebrahimi 	ext->op_size.type = M68K_SIZE_TYPE_CPU;
4037*9a0e4156SSadaf Ebrahimi 
4038*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < M68K_OPERAND_COUNT; ++i)
4039*9a0e4156SSadaf Ebrahimi 		ext->operands[i].type = M68K_OP_REG;
4040*9a0e4156SSadaf Ebrahimi 
4041*9a0e4156SSadaf Ebrahimi 	info->ir = peek_imm_16(info);
4042*9a0e4156SSadaf Ebrahimi 	if (instruction_is_valid(info, peek_imm_32(info) & 0xffff)) {
4043*9a0e4156SSadaf Ebrahimi 		info->ir = read_imm_16(info);
4044*9a0e4156SSadaf Ebrahimi 		g_instruction_table[info->ir].instruction(info);
4045*9a0e4156SSadaf Ebrahimi 	}
4046*9a0e4156SSadaf Ebrahimi 
4047*9a0e4156SSadaf Ebrahimi 	size = info->pc - (unsigned int)pc;
4048*9a0e4156SSadaf Ebrahimi 	info->pc = (unsigned int)pc;
4049*9a0e4156SSadaf Ebrahimi 
4050*9a0e4156SSadaf Ebrahimi 	return size;
4051*9a0e4156SSadaf Ebrahimi }
4052*9a0e4156SSadaf Ebrahimi 
M68K_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * instr,uint16_t * size,uint64_t address,void * inst_info)4053*9a0e4156SSadaf Ebrahimi bool M68K_getInstruction(csh ud, const uint8_t* code, size_t code_len, MCInst* instr, uint16_t* size, uint64_t address, void* inst_info)
4054*9a0e4156SSadaf Ebrahimi {
4055*9a0e4156SSadaf Ebrahimi #ifdef M68K_DEBUG
4056*9a0e4156SSadaf Ebrahimi 	SStream ss;
4057*9a0e4156SSadaf Ebrahimi #endif
4058*9a0e4156SSadaf Ebrahimi 	int s;
4059*9a0e4156SSadaf Ebrahimi 	int cpu_type = M68K_CPU_TYPE_68000;
4060*9a0e4156SSadaf Ebrahimi 	cs_struct* handle = instr->csh;
4061*9a0e4156SSadaf Ebrahimi 	m68k_info *info = (m68k_info*)handle->printer_info;
4062*9a0e4156SSadaf Ebrahimi 
4063*9a0e4156SSadaf Ebrahimi 	// code len has to be at least 2 bytes to be valid m68k
4064*9a0e4156SSadaf Ebrahimi 
4065*9a0e4156SSadaf Ebrahimi 	if (code_len < 2) {
4066*9a0e4156SSadaf Ebrahimi 		*size = 0;
4067*9a0e4156SSadaf Ebrahimi 		return false;
4068*9a0e4156SSadaf Ebrahimi 	}
4069*9a0e4156SSadaf Ebrahimi 
4070*9a0e4156SSadaf Ebrahimi 	if (instr->flat_insn->detail) {
4071*9a0e4156SSadaf Ebrahimi 		memset(instr->flat_insn->detail, 0, offsetof(cs_detail, m68k)+sizeof(cs_m68k));
4072*9a0e4156SSadaf Ebrahimi 	}
4073*9a0e4156SSadaf Ebrahimi 
4074*9a0e4156SSadaf Ebrahimi 	info->groups_count = 0;
4075*9a0e4156SSadaf Ebrahimi 	info->regs_read_count = 0;
4076*9a0e4156SSadaf Ebrahimi 	info->regs_write_count = 0;
4077*9a0e4156SSadaf Ebrahimi 	info->code = code;
4078*9a0e4156SSadaf Ebrahimi 	info->code_len = code_len;
4079*9a0e4156SSadaf Ebrahimi 	info->baseAddress = address;
4080*9a0e4156SSadaf Ebrahimi 
4081*9a0e4156SSadaf Ebrahimi 	if (handle->mode & CS_MODE_M68K_010)
4082*9a0e4156SSadaf Ebrahimi 		cpu_type = M68K_CPU_TYPE_68010;
4083*9a0e4156SSadaf Ebrahimi 	if (handle->mode & CS_MODE_M68K_020)
4084*9a0e4156SSadaf Ebrahimi 		cpu_type = M68K_CPU_TYPE_68020;
4085*9a0e4156SSadaf Ebrahimi 	if (handle->mode & CS_MODE_M68K_030)
4086*9a0e4156SSadaf Ebrahimi 		cpu_type = M68K_CPU_TYPE_68030;
4087*9a0e4156SSadaf Ebrahimi 	if (handle->mode & CS_MODE_M68K_040)
4088*9a0e4156SSadaf Ebrahimi 		cpu_type = M68K_CPU_TYPE_68040;
4089*9a0e4156SSadaf Ebrahimi 	if (handle->mode & CS_MODE_M68K_060)
4090*9a0e4156SSadaf Ebrahimi 		cpu_type = M68K_CPU_TYPE_68040;	// 060 = 040 for now
4091*9a0e4156SSadaf Ebrahimi 
4092*9a0e4156SSadaf Ebrahimi 	m68k_setup_internals(info, instr, (unsigned int)address, cpu_type);
4093*9a0e4156SSadaf Ebrahimi 	s = m68k_disassemble(info, address);
4094*9a0e4156SSadaf Ebrahimi 
4095*9a0e4156SSadaf Ebrahimi 	if (s == 0) {
4096*9a0e4156SSadaf Ebrahimi 		*size = 2;
4097*9a0e4156SSadaf Ebrahimi 		return false;
4098*9a0e4156SSadaf Ebrahimi 	}
4099*9a0e4156SSadaf Ebrahimi 
4100*9a0e4156SSadaf Ebrahimi 	build_regs_read_write_counts(info);
4101*9a0e4156SSadaf Ebrahimi 
4102*9a0e4156SSadaf Ebrahimi #ifdef M68K_DEBUG
4103*9a0e4156SSadaf Ebrahimi 	SStream_Init(&ss);
4104*9a0e4156SSadaf Ebrahimi 	M68K_printInst(instr, &ss, info);
4105*9a0e4156SSadaf Ebrahimi #endif
4106*9a0e4156SSadaf Ebrahimi 
4107*9a0e4156SSadaf Ebrahimi 	// Make sure we always stay within range
4108*9a0e4156SSadaf Ebrahimi 	if (s > (int)code_len)
4109*9a0e4156SSadaf Ebrahimi 		*size = (uint16_t)code_len;
4110*9a0e4156SSadaf Ebrahimi 	else
4111*9a0e4156SSadaf Ebrahimi 		*size = (uint16_t)s;
4112*9a0e4156SSadaf Ebrahimi 
4113*9a0e4156SSadaf Ebrahimi 	return true;
4114*9a0e4156SSadaf Ebrahimi }
4115*9a0e4156SSadaf Ebrahimi 
4116