1//===------ XCoreDisassembler.cpp - Disassembler for PowerPC ------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10/* Capstone Disassembly Engine */
11/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */
12
13#ifdef CAPSTONE_HAS_XCORE
14
15#include <stdio.h>	// DEBUG
16#include <stdlib.h>
17#include <string.h>
18
19#include "../../cs_priv.h"
20#include "../../utils.h"
21
22#include "../../MCInst.h"
23#include "../../MCInstrDesc.h"
24#include "../../MCFixedLenDisassembler.h"
25#include "../../MCRegisterInfo.h"
26#include "../../MCDisassembler.h"
27#include "../../MathExtras.h"
28
29static uint64_t getFeatureBits(int mode)
30{
31	// support everything
32	return (uint64_t)-1;
33}
34
35static bool readInstruction16(const uint8_t *code, size_t code_len, uint16_t *insn)
36{
37	if (code_len < 2)
38		// insufficient data
39		return false;
40
41	// Encoded as a little-endian 16-bit word in the stream.
42	*insn = (code[0] <<  0) | (code[1] <<  8);
43	return true;
44}
45
46static bool readInstruction32(const uint8_t *code, size_t code_len, uint32_t *insn)
47{
48	if (code_len < 4)
49		// insufficient data
50		return false;
51
52	// Encoded as a little-endian 32-bit word in the stream.
53	*insn = (code[0] << 0) | (code[1] << 8) | (code[2] << 16) | (code[3] << 24);
54	return true;
55}
56
57static unsigned getReg(MCRegisterInfo *MRI, unsigned RC, unsigned RegNo)
58{
59	MCRegisterClass *rc = MCRegisterInfo_getRegClass(MRI, RC);
60	return rc->RegsBegin[RegNo];
61}
62
63static DecodeStatus DecodeGRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
64		uint64_t Address, void *Decoder);
65
66static DecodeStatus DecodeRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
67		uint64_t Address, void *Decoder);
68
69static DecodeStatus DecodeBitpOperand(MCInst *Inst, unsigned Val,
70		uint64_t Address, void *Decoder);
71
72static DecodeStatus DecodeNegImmOperand(MCInst *Inst, unsigned Val,
73		uint64_t Address, void *Decoder);
74
75static DecodeStatus Decode2RInstruction(MCInst *Inst, unsigned Insn,
76		uint64_t Address, void *Decoder);
77
78static DecodeStatus Decode2RImmInstruction(MCInst *Inst, unsigned Insn,
79		uint64_t Address, void *Decoder);
80
81static DecodeStatus DecodeR2RInstruction(MCInst *Inst, unsigned Insn,
82		uint64_t Address, void *Decoder);
83
84static DecodeStatus Decode2RSrcDstInstruction(MCInst *Inst, unsigned Insn,
85		uint64_t Address, void *Decoder);
86
87static DecodeStatus DecodeRUSInstruction(MCInst *Inst, unsigned Insn,
88		uint64_t Address, void *Decoder);
89
90static DecodeStatus DecodeRUSBitpInstruction(MCInst *Inst, unsigned Insn,
91		uint64_t Address, void *Decoder);
92
93static DecodeStatus DecodeRUSSrcDstBitpInstruction(MCInst *Inst, unsigned Insn,
94		uint64_t Address, void *Decoder);
95
96static DecodeStatus DecodeL2RInstruction(MCInst *Inst, unsigned Insn,
97		uint64_t Address, void *Decoder);
98
99static DecodeStatus DecodeLR2RInstruction(MCInst *Inst, unsigned Insn,
100		uint64_t Address, void *Decoder);
101
102static DecodeStatus Decode3RInstruction(MCInst *Inst, unsigned Insn,
103		uint64_t Address, void *Decoder);
104
105static DecodeStatus Decode3RImmInstruction(MCInst *Inst, unsigned Insn,
106		uint64_t Address, void *Decoder);
107
108static DecodeStatus Decode2RUSInstruction(MCInst *Inst, unsigned Insn,
109		uint64_t Address, void *Decoder);
110
111static DecodeStatus Decode2RUSBitpInstruction(MCInst *Inst, unsigned Insn,
112		uint64_t Address, void *Decoder);
113
114static DecodeStatus DecodeL3RInstruction(MCInst *Inst, unsigned Insn,
115		uint64_t Address, void *Decoder);
116
117static DecodeStatus DecodeL3RSrcDstInstruction(MCInst *Inst, unsigned Insn,
118		uint64_t Address, void *Decoder);
119
120static DecodeStatus DecodeL2RUSInstruction(MCInst *Inst, unsigned Insn,
121		uint64_t Address, void *Decoder);
122
123static DecodeStatus DecodeL2RUSBitpInstruction(MCInst *Inst, unsigned Insn,
124		uint64_t Address, void *Decoder);
125
126static DecodeStatus DecodeL6RInstruction(MCInst *Inst, unsigned Insn,
127		uint64_t Address, void *Decoder);
128
129static DecodeStatus DecodeL5RInstruction(MCInst *Inst, unsigned Insn,
130		uint64_t Address, void *Decoder);
131
132static DecodeStatus DecodeL4RSrcDstInstruction(MCInst *Inst, unsigned Insn,
133		uint64_t Address, void *Decoder);
134
135static DecodeStatus DecodeL4RSrcDstSrcDstInstruction(MCInst *Inst, unsigned Insn,
136		uint64_t Address, void *Decoder);
137
138#include "XCoreGenDisassemblerTables.inc"
139
140#define GET_REGINFO_ENUM
141#define GET_REGINFO_MC_DESC
142#include "XCoreGenRegisterInfo.inc"
143
144static DecodeStatus DecodeGRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
145		uint64_t Address, void *Decoder)
146{
147	unsigned Reg;
148
149	if (RegNo > 11)
150		return MCDisassembler_Fail;
151
152	Reg = getReg(Decoder, XCore_GRRegsRegClassID, RegNo);
153	MCOperand_CreateReg0(Inst, Reg);
154
155	return MCDisassembler_Success;
156}
157
158static DecodeStatus DecodeRRegsRegisterClass(MCInst *Inst, unsigned RegNo,
159		uint64_t Address, void *Decoder)
160{
161	unsigned Reg;
162	if (RegNo > 15)
163		return MCDisassembler_Fail;
164
165	Reg = getReg(Decoder, XCore_RRegsRegClassID, RegNo);
166	MCOperand_CreateReg0(Inst, Reg);
167
168	return MCDisassembler_Success;
169}
170
171static DecodeStatus DecodeBitpOperand(MCInst *Inst, unsigned Val,
172		uint64_t Address, void *Decoder)
173{
174	static unsigned Values[] = {
175		32 /*bpw*/, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32
176	};
177
178	if (Val > 11)
179		return MCDisassembler_Fail;
180
181	MCOperand_CreateImm0(Inst, Values[Val]);
182	return MCDisassembler_Success;
183}
184
185static DecodeStatus DecodeNegImmOperand(MCInst *Inst, unsigned Val,
186		uint64_t Address, void *Decoder)
187{
188	MCOperand_CreateImm0(Inst, -(int64_t)Val);
189	return MCDisassembler_Success;
190}
191
192static DecodeStatus Decode2OpInstruction(unsigned Insn, unsigned *Op1, unsigned *Op2)
193{
194	unsigned Op1High, Op2High;
195	unsigned Combined = fieldFromInstruction_4(Insn, 6, 5);
196
197	if (Combined < 27)
198		return MCDisassembler_Fail;
199
200	if (fieldFromInstruction_4(Insn, 5, 1)) {
201		if (Combined == 31)
202			return MCDisassembler_Fail;
203		Combined += 5;
204	}
205
206	Combined -= 27;
207	Op1High = Combined % 3;
208	Op2High = Combined / 3;
209	*Op1 = (Op1High << 2) | fieldFromInstruction_4(Insn, 2, 2);
210	*Op2 = (Op2High << 2) | fieldFromInstruction_4(Insn, 0, 2);
211
212	return MCDisassembler_Success;
213}
214
215static DecodeStatus Decode3OpInstruction(unsigned Insn,
216		unsigned *Op1, unsigned *Op2, unsigned *Op3)
217{
218	unsigned Op1High, Op2High, Op3High;
219	unsigned Combined = fieldFromInstruction_4(Insn, 6, 5);
220	if (Combined >= 27)
221		return MCDisassembler_Fail;
222
223	Op1High = Combined % 3;
224	Op2High = (Combined / 3) % 3;
225	Op3High = Combined / 9;
226	*Op1 = (Op1High << 2) | fieldFromInstruction_4(Insn, 4, 2);
227	*Op2 = (Op2High << 2) | fieldFromInstruction_4(Insn, 2, 2);
228	*Op3 = (Op3High << 2) | fieldFromInstruction_4(Insn, 0, 2);
229
230	return MCDisassembler_Success;
231}
232
233#define GET_INSTRINFO_ENUM
234#include "XCoreGenInstrInfo.inc"
235static DecodeStatus Decode2OpInstructionFail(MCInst *Inst, unsigned Insn, uint64_t Address,
236		void *Decoder)
237{
238	// Try and decode as a 3R instruction.
239	unsigned Opcode = fieldFromInstruction_4(Insn, 11, 5);
240	switch (Opcode) {
241		case 0x0:
242			MCInst_setOpcode(Inst, XCore_STW_2rus);
243			return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
244		case 0x1:
245			MCInst_setOpcode(Inst, XCore_LDW_2rus);
246			return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
247		case 0x2:
248			MCInst_setOpcode(Inst, XCore_ADD_3r);
249			return Decode3RInstruction(Inst, Insn, Address, Decoder);
250		case 0x3:
251			MCInst_setOpcode(Inst, XCore_SUB_3r);
252			return Decode3RInstruction(Inst, Insn, Address, Decoder);
253		case 0x4:
254			MCInst_setOpcode(Inst, XCore_SHL_3r);
255			return Decode3RInstruction(Inst, Insn, Address, Decoder);
256		case 0x5:
257			MCInst_setOpcode(Inst, XCore_SHR_3r);
258			return Decode3RInstruction(Inst, Insn, Address, Decoder);
259		case 0x6:
260			MCInst_setOpcode(Inst, XCore_EQ_3r);
261			return Decode3RInstruction(Inst, Insn, Address, Decoder);
262		case 0x7:
263			MCInst_setOpcode(Inst, XCore_AND_3r);
264			return Decode3RInstruction(Inst, Insn, Address, Decoder);
265		case 0x8:
266			MCInst_setOpcode(Inst, XCore_OR_3r);
267			return Decode3RInstruction(Inst, Insn, Address, Decoder);
268		case 0x9:
269			MCInst_setOpcode(Inst, XCore_LDW_3r);
270			return Decode3RInstruction(Inst, Insn, Address, Decoder);
271		case 0x10:
272			MCInst_setOpcode(Inst, XCore_LD16S_3r);
273			return Decode3RInstruction(Inst, Insn, Address, Decoder);
274		case 0x11:
275			MCInst_setOpcode(Inst, XCore_LD8U_3r);
276			return Decode3RInstruction(Inst, Insn, Address, Decoder);
277		case 0x12:
278			MCInst_setOpcode(Inst, XCore_ADD_2rus);
279			return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
280		case 0x13:
281			MCInst_setOpcode(Inst, XCore_SUB_2rus);
282			return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
283		case 0x14:
284			MCInst_setOpcode(Inst, XCore_SHL_2rus);
285			return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
286		case 0x15:
287			MCInst_setOpcode(Inst, XCore_SHR_2rus);
288			return Decode2RUSBitpInstruction(Inst, Insn, Address, Decoder);
289		case 0x16:
290			MCInst_setOpcode(Inst, XCore_EQ_2rus);
291			return Decode2RUSInstruction(Inst, Insn, Address, Decoder);
292		case 0x17:
293			MCInst_setOpcode(Inst, XCore_TSETR_3r);
294			return Decode3RImmInstruction(Inst, Insn, Address, Decoder);
295		case 0x18:
296			MCInst_setOpcode(Inst, XCore_LSS_3r);
297			return Decode3RInstruction(Inst, Insn, Address, Decoder);
298		case 0x19:
299			MCInst_setOpcode(Inst, XCore_LSU_3r);
300			return Decode3RInstruction(Inst, Insn, Address, Decoder);
301	}
302
303	return MCDisassembler_Fail;
304}
305
306static DecodeStatus Decode2RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
307		void *Decoder)
308{
309	unsigned Op1, Op2;
310	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
311	if (S != MCDisassembler_Success)
312		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
313
314	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
315	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
316
317	return S;
318}
319
320static DecodeStatus Decode2RImmInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
321		void *Decoder)
322{
323	unsigned Op1, Op2;
324	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
325	if (S != MCDisassembler_Success)
326		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
327
328	MCOperand_CreateImm0(Inst, Op1);
329	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
330
331	return S;
332}
333
334static DecodeStatus DecodeR2RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
335		void *Decoder)
336{
337	unsigned Op1, Op2;
338	DecodeStatus S = Decode2OpInstruction(Insn, &Op2, &Op1);
339	if (S != MCDisassembler_Success)
340		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
341
342	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
343	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
344
345	return S;
346}
347
348static DecodeStatus Decode2RSrcDstInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
349		void *Decoder)
350{
351	unsigned Op1, Op2;
352	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
353	if (S != MCDisassembler_Success)
354		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
355
356	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
357	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
358	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
359
360	return S;
361}
362
363static DecodeStatus DecodeRUSInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
364		void *Decoder)
365{
366	unsigned Op1, Op2;
367	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
368	if (S != MCDisassembler_Success)
369		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
370
371	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
372	MCOperand_CreateImm0(Inst, Op2);
373
374	return S;
375}
376
377static DecodeStatus DecodeRUSBitpInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
378		void *Decoder)
379{
380	unsigned Op1, Op2;
381	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
382	if (S != MCDisassembler_Success)
383		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
384
385	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
386	DecodeBitpOperand(Inst, Op2, Address, Decoder);
387
388	return S;
389}
390
391static DecodeStatus DecodeRUSSrcDstBitpInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
392		void *Decoder)
393{
394	unsigned Op1, Op2;
395	DecodeStatus S = Decode2OpInstruction(Insn, &Op1, &Op2);
396	if (S != MCDisassembler_Success)
397		return Decode2OpInstructionFail(Inst, Insn, Address, Decoder);
398
399	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
400	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
401	DecodeBitpOperand(Inst, Op2, Address, Decoder);
402
403	return S;
404}
405
406static DecodeStatus DecodeL2OpInstructionFail(MCInst *Inst, unsigned Insn, uint64_t Address,
407		void *Decoder)
408{
409	// Try and decode as a L3R / L2RUS instruction.
410	unsigned Opcode = fieldFromInstruction_4(Insn, 16, 4) |
411		fieldFromInstruction_4(Insn, 27, 5) << 4;
412	switch (Opcode) {
413		case 0x0c:
414			MCInst_setOpcode(Inst, XCore_STW_l3r);
415			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
416		case 0x1c:
417			MCInst_setOpcode(Inst, XCore_XOR_l3r);
418			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
419		case 0x2c:
420			MCInst_setOpcode(Inst, XCore_ASHR_l3r);
421			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
422		case 0x3c:
423			MCInst_setOpcode(Inst, XCore_LDAWF_l3r);
424			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
425		case 0x4c:
426			MCInst_setOpcode(Inst, XCore_LDAWB_l3r);
427			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
428		case 0x5c:
429			MCInst_setOpcode(Inst, XCore_LDA16F_l3r);
430			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
431		case 0x6c:
432			MCInst_setOpcode(Inst, XCore_LDA16B_l3r);
433			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
434		case 0x7c:
435			MCInst_setOpcode(Inst, XCore_MUL_l3r);
436			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
437		case 0x8c:
438			MCInst_setOpcode(Inst, XCore_DIVS_l3r);
439			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
440		case 0x9c:
441			MCInst_setOpcode(Inst, XCore_DIVU_l3r);
442			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
443		case 0x10c:
444			MCInst_setOpcode(Inst, XCore_ST16_l3r);
445			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
446		case 0x11c:
447			MCInst_setOpcode(Inst, XCore_ST8_l3r);
448			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
449		case 0x12c:
450			MCInst_setOpcode(Inst, XCore_ASHR_l2rus);
451			return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
452		case 0x12d:
453			MCInst_setOpcode(Inst, XCore_OUTPW_l2rus);
454			return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
455		case 0x12e:
456			MCInst_setOpcode(Inst, XCore_INPW_l2rus);
457			return DecodeL2RUSBitpInstruction(Inst, Insn, Address, Decoder);
458		case 0x13c:
459			MCInst_setOpcode(Inst, XCore_LDAWF_l2rus);
460			return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
461		case 0x14c:
462			MCInst_setOpcode(Inst, XCore_LDAWB_l2rus);
463			return DecodeL2RUSInstruction(Inst, Insn, Address, Decoder);
464		case 0x15c:
465			MCInst_setOpcode(Inst, XCore_CRC_l3r);
466			return DecodeL3RSrcDstInstruction(Inst, Insn, Address, Decoder);
467		case 0x18c:
468			MCInst_setOpcode(Inst, XCore_REMS_l3r);
469			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
470		case 0x19c:
471			MCInst_setOpcode(Inst, XCore_REMU_l3r);
472			return DecodeL3RInstruction(Inst, Insn, Address, Decoder);
473	}
474
475	return MCDisassembler_Fail;
476}
477
478static DecodeStatus DecodeL2RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
479		void *Decoder)
480{
481	unsigned Op1, Op2;
482	DecodeStatus S = Decode2OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2);
483	if (S != MCDisassembler_Success)
484		return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
485
486	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
487	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
488
489	return S;
490}
491
492static DecodeStatus DecodeLR2RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
493		void *Decoder)
494{
495	unsigned Op1, Op2;
496	DecodeStatus S = Decode2OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2);
497	if (S != MCDisassembler_Success)
498		return DecodeL2OpInstructionFail(Inst, Insn, Address, Decoder);
499
500	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
501	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
502
503	return S;
504}
505
506static DecodeStatus Decode3RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
507		void *Decoder)
508{
509	unsigned Op1, Op2, Op3;
510	DecodeStatus S = Decode3OpInstruction(Insn, &Op1, &Op2, &Op3);
511	if (S == MCDisassembler_Success) {
512		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
513		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
514		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
515	}
516
517	return S;
518}
519
520static DecodeStatus Decode3RImmInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
521		void *Decoder)
522{
523	unsigned Op1, Op2, Op3;
524	DecodeStatus S = Decode3OpInstruction(Insn, &Op1, &Op2, &Op3);
525	if (S == MCDisassembler_Success) {
526		MCOperand_CreateImm0(Inst, Op1);
527		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
528		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
529	}
530
531	return S;
532}
533
534static DecodeStatus Decode2RUSInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
535		void *Decoder)
536{
537	unsigned Op1, Op2, Op3;
538	DecodeStatus S = Decode3OpInstruction(Insn, &Op1, &Op2, &Op3);
539	if (S == MCDisassembler_Success) {
540		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
541		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
542		MCOperand_CreateImm0(Inst, Op3);
543	}
544
545	return S;
546}
547
548static DecodeStatus Decode2RUSBitpInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
549		void *Decoder)
550{
551	unsigned Op1, Op2, Op3;
552	DecodeStatus S = Decode3OpInstruction(Insn, &Op1, &Op2, &Op3);
553	if (S == MCDisassembler_Success) {
554		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
555		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
556		DecodeBitpOperand(Inst, Op3, Address, Decoder);
557	}
558
559	return S;
560}
561
562static DecodeStatus DecodeL3RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
563		void *Decoder)
564{
565	unsigned Op1, Op2, Op3;
566	DecodeStatus S =
567		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
568	if (S == MCDisassembler_Success) {
569		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
570		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
571		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
572	}
573
574	return S;
575}
576
577static DecodeStatus DecodeL3RSrcDstInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
578		void *Decoder)
579{
580	unsigned Op1, Op2, Op3;
581	DecodeStatus S =
582		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
583	if (S == MCDisassembler_Success) {
584		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
585		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
586		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
587		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
588	}
589
590	return S;
591}
592
593static DecodeStatus DecodeL2RUSInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
594		void *Decoder)
595{
596	unsigned Op1, Op2, Op3;
597	DecodeStatus S =
598		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
599	if (S == MCDisassembler_Success) {
600		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
601		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
602		MCOperand_CreateImm0(Inst, Op3);
603	}
604
605	return S;
606}
607
608static DecodeStatus DecodeL2RUSBitpInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
609		void *Decoder)
610{
611	unsigned Op1, Op2, Op3;
612	DecodeStatus S =
613		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
614	if (S == MCDisassembler_Success) {
615		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
616		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
617		DecodeBitpOperand(Inst, Op3, Address, Decoder);
618	}
619
620	return S;
621}
622
623static DecodeStatus DecodeL6RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
624		void *Decoder)
625{
626	unsigned Op1, Op2, Op3, Op4, Op5, Op6;
627	DecodeStatus S =
628		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
629	if (S != MCDisassembler_Success)
630		return S;
631
632	S = Decode3OpInstruction(fieldFromInstruction_4(Insn, 16, 16), &Op4, &Op5, &Op6);
633	if (S != MCDisassembler_Success)
634		return S;
635
636	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
637	DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
638	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
639	DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
640	DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
641	DecodeGRRegsRegisterClass(Inst, Op6, Address, Decoder);
642	return S;
643}
644
645static DecodeStatus DecodeL5RInstructionFail(MCInst *Inst, unsigned Insn, uint64_t Address,
646		void *Decoder)
647{
648	unsigned Opcode;
649
650	// Try and decode as a L6R instruction.
651	MCInst_clear(Inst);
652	Opcode = fieldFromInstruction_4(Insn, 27, 5);
653	switch (Opcode) {
654		default:
655			break;
656		case 0x00:
657			MCInst_setOpcode(Inst, XCore_LMUL_l6r);
658			return DecodeL6RInstruction(Inst, Insn, Address, Decoder);
659	}
660
661	return MCDisassembler_Fail;
662}
663
664static DecodeStatus DecodeL5RInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
665		void *Decoder)
666{
667	unsigned Op1, Op2, Op3, Op4, Op5;
668	DecodeStatus S =
669		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
670	if (S != MCDisassembler_Success)
671		return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
672
673	S = Decode2OpInstruction(fieldFromInstruction_4(Insn, 16, 16), &Op4, &Op5);
674	if (S != MCDisassembler_Success)
675		return DecodeL5RInstructionFail(Inst, Insn, Address, Decoder);
676
677	DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
678	DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
679	DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
680	DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
681	DecodeGRRegsRegisterClass(Inst, Op5, Address, Decoder);
682	return S;
683}
684
685static DecodeStatus DecodeL4RSrcDstInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
686		void *Decoder)
687{
688	unsigned Op1, Op2, Op3;
689	unsigned Op4 = fieldFromInstruction_4(Insn, 16, 4);
690	DecodeStatus S =
691		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
692	if (S == MCDisassembler_Success) {
693		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
694		S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
695	}
696
697	if (S == MCDisassembler_Success) {
698		DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
699		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
700		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
701	}
702	return S;
703}
704
705static DecodeStatus DecodeL4RSrcDstSrcDstInstruction(MCInst *Inst, unsigned Insn, uint64_t Address,
706		void *Decoder)
707{
708	unsigned Op1, Op2, Op3;
709	unsigned Op4 = fieldFromInstruction_4(Insn, 16, 4);
710	DecodeStatus S =
711		Decode3OpInstruction(fieldFromInstruction_4(Insn, 0, 16), &Op1, &Op2, &Op3);
712	if (S == MCDisassembler_Success) {
713		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
714		S = DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
715	}
716
717	if (S == MCDisassembler_Success) {
718		DecodeGRRegsRegisterClass(Inst, Op1, Address, Decoder);
719		DecodeGRRegsRegisterClass(Inst, Op4, Address, Decoder);
720		DecodeGRRegsRegisterClass(Inst, Op2, Address, Decoder);
721		DecodeGRRegsRegisterClass(Inst, Op3, Address, Decoder);
722	}
723
724	return S;
725}
726
727#define GET_SUBTARGETINFO_ENUM
728#include "XCoreGenInstrInfo.inc"
729bool XCore_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *MI,
730		uint16_t *size, uint64_t address, void *info)
731{
732	uint16_t insn16;
733	uint32_t insn32;
734	DecodeStatus Result;
735
736	if (!readInstruction16(code, code_len, &insn16)) {
737		return false;
738	}
739
740	if (MI->flat_insn->detail) {
741		memset(MI->flat_insn->detail, 0, sizeof(cs_detail));
742	}
743
744	// Calling the auto-generated decoder function.
745	Result = decodeInstruction_2(DecoderTable16, MI, insn16, address, info, 0);
746	if (Result != MCDisassembler_Fail) {
747		*size = 2;
748		return true;
749	}
750
751	if (!readInstruction32(code, code_len, &insn32)) {
752		return false;
753	}
754
755	// Calling the auto-generated decoder function.
756	Result = decodeInstruction_4(DecoderTable32, MI, insn32, address, info, 0);
757	if (Result != MCDisassembler_Fail) {
758		*size = 4;
759		return true;
760	}
761
762	return false;
763}
764
765void XCore_init(MCRegisterInfo *MRI)
766{
767	/*
768	InitMCRegisterInfo(XCoreRegDesc, 17, RA, PC,
769			XCoreMCRegisterClasses, 2,
770			XCoreRegUnitRoots,
771			16,
772			XCoreRegDiffLists,
773			XCoreRegStrings,
774			XCoreSubRegIdxLists,
775			1,
776			XCoreSubRegIdxRanges,
777			XCoreRegEncodingTable);
778	*/
779
780
781	MCRegisterInfo_InitMCRegisterInfo(MRI, XCoreRegDesc, 17,
782			0, 0,
783			XCoreMCRegisterClasses, 2,
784			0, 0,
785			XCoreRegDiffLists,
786			0,
787			XCoreSubRegIdxLists, 1,
788			0);
789}
790
791#endif
792