xref: /aosp_15_r20/external/capstone/arch/Sparc/SparcDisassembler.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi //===------ SparcDisassembler.cpp - Disassembler for PowerPC ------*- C++ -*-===//
2*9a0e4156SSadaf Ebrahimi //
3*9a0e4156SSadaf Ebrahimi //                     The LLVM Compiler Infrastructure
4*9a0e4156SSadaf Ebrahimi //
5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source
6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details.
7*9a0e4156SSadaf Ebrahimi //
8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
9*9a0e4156SSadaf Ebrahimi 
10*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
11*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
12*9a0e4156SSadaf Ebrahimi 
13*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_SPARC
14*9a0e4156SSadaf Ebrahimi 
15*9a0e4156SSadaf Ebrahimi #include <stdio.h>	// DEBUG
16*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
17*9a0e4156SSadaf Ebrahimi #include <string.h>
18*9a0e4156SSadaf Ebrahimi 
19*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h"
20*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi #include "SparcDisassembler.h"
23*9a0e4156SSadaf Ebrahimi 
24*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
25*9a0e4156SSadaf Ebrahimi #include "../../MCInstrDesc.h"
26*9a0e4156SSadaf Ebrahimi #include "../../MCFixedLenDisassembler.h"
27*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
28*9a0e4156SSadaf Ebrahimi #include "../../MCDisassembler.h"
29*9a0e4156SSadaf Ebrahimi #include "../../MathExtras.h"
30*9a0e4156SSadaf Ebrahimi 
31*9a0e4156SSadaf Ebrahimi 
32*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_MC_DESC
33*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
34*9a0e4156SSadaf Ebrahimi #include "SparcGenRegisterInfo.inc"
35*9a0e4156SSadaf Ebrahimi static const unsigned IntRegDecoderTable[] = {
36*9a0e4156SSadaf Ebrahimi 	SP_G0,  SP_G1,  SP_G2,  SP_G3,
37*9a0e4156SSadaf Ebrahimi 	SP_G4,  SP_G5,  SP_G6,  SP_G7,
38*9a0e4156SSadaf Ebrahimi 	SP_O0,  SP_O1,  SP_O2,  SP_O3,
39*9a0e4156SSadaf Ebrahimi 	SP_O4,  SP_O5,  SP_O6,  SP_O7,
40*9a0e4156SSadaf Ebrahimi 	SP_L0,  SP_L1,  SP_L2,  SP_L3,
41*9a0e4156SSadaf Ebrahimi 	SP_L4,  SP_L5,  SP_L6,  SP_L7,
42*9a0e4156SSadaf Ebrahimi 	SP_I0,  SP_I1,  SP_I2,  SP_I3,
43*9a0e4156SSadaf Ebrahimi 	SP_I4,  SP_I5,  SP_I6,  SP_I7
44*9a0e4156SSadaf Ebrahimi };
45*9a0e4156SSadaf Ebrahimi 
46*9a0e4156SSadaf Ebrahimi static const unsigned FPRegDecoderTable[] = {
47*9a0e4156SSadaf Ebrahimi 	SP_F0,   SP_F1,   SP_F2,   SP_F3,
48*9a0e4156SSadaf Ebrahimi 	SP_F4,   SP_F5,   SP_F6,   SP_F7,
49*9a0e4156SSadaf Ebrahimi 	SP_F8,   SP_F9,   SP_F10,  SP_F11,
50*9a0e4156SSadaf Ebrahimi 	SP_F12,  SP_F13,  SP_F14,  SP_F15,
51*9a0e4156SSadaf Ebrahimi 	SP_F16,  SP_F17,  SP_F18,  SP_F19,
52*9a0e4156SSadaf Ebrahimi 	SP_F20,  SP_F21,  SP_F22,  SP_F23,
53*9a0e4156SSadaf Ebrahimi 	SP_F24,  SP_F25,  SP_F26,  SP_F27,
54*9a0e4156SSadaf Ebrahimi 	SP_F28,  SP_F29,  SP_F30,  SP_F31
55*9a0e4156SSadaf Ebrahimi };
56*9a0e4156SSadaf Ebrahimi 
57*9a0e4156SSadaf Ebrahimi static const unsigned DFPRegDecoderTable[] = {
58*9a0e4156SSadaf Ebrahimi 	SP_D0,   SP_D16,  SP_D1,   SP_D17,
59*9a0e4156SSadaf Ebrahimi 	SP_D2,   SP_D18,  SP_D3,   SP_D19,
60*9a0e4156SSadaf Ebrahimi 	SP_D4,   SP_D20,  SP_D5,   SP_D21,
61*9a0e4156SSadaf Ebrahimi 	SP_D6,   SP_D22,  SP_D7,   SP_D23,
62*9a0e4156SSadaf Ebrahimi 	SP_D8,   SP_D24,  SP_D9,   SP_D25,
63*9a0e4156SSadaf Ebrahimi 	SP_D10,  SP_D26,  SP_D11,  SP_D27,
64*9a0e4156SSadaf Ebrahimi 	SP_D12,  SP_D28,  SP_D13,  SP_D29,
65*9a0e4156SSadaf Ebrahimi 	SP_D14,  SP_D30,  SP_D15,  SP_D31
66*9a0e4156SSadaf Ebrahimi };
67*9a0e4156SSadaf Ebrahimi 
68*9a0e4156SSadaf Ebrahimi static const unsigned QFPRegDecoderTable[] = {
69*9a0e4156SSadaf Ebrahimi 	SP_Q0,  SP_Q8,   ~0U,  ~0U,
70*9a0e4156SSadaf Ebrahimi 	SP_Q1,  SP_Q9,   ~0U,  ~0U,
71*9a0e4156SSadaf Ebrahimi 	SP_Q2,  SP_Q10,  ~0U,  ~0U,
72*9a0e4156SSadaf Ebrahimi 	SP_Q3,  SP_Q11,  ~0U,  ~0U,
73*9a0e4156SSadaf Ebrahimi 	SP_Q4,  SP_Q12,  ~0U,  ~0U,
74*9a0e4156SSadaf Ebrahimi 	SP_Q5,  SP_Q13,  ~0U,  ~0U,
75*9a0e4156SSadaf Ebrahimi 	SP_Q6,  SP_Q14,  ~0U,  ~0U,
76*9a0e4156SSadaf Ebrahimi 	SP_Q7,  SP_Q15,  ~0U,  ~0U
77*9a0e4156SSadaf Ebrahimi };
78*9a0e4156SSadaf Ebrahimi 
79*9a0e4156SSadaf Ebrahimi static const unsigned FCCRegDecoderTable[] = {
80*9a0e4156SSadaf Ebrahimi 	SP_FCC0, SP_FCC1, SP_FCC2, SP_FCC3
81*9a0e4156SSadaf Ebrahimi };
82*9a0e4156SSadaf Ebrahimi 
getFeatureBits(int mode)83*9a0e4156SSadaf Ebrahimi static uint64_t getFeatureBits(int mode)
84*9a0e4156SSadaf Ebrahimi {
85*9a0e4156SSadaf Ebrahimi 	// support everything
86*9a0e4156SSadaf Ebrahimi 	return (uint64_t)-1;
87*9a0e4156SSadaf Ebrahimi }
88*9a0e4156SSadaf Ebrahimi 
DecodeIntRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)89*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeIntRegsRegisterClass(MCInst *Inst, unsigned RegNo,
90*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
91*9a0e4156SSadaf Ebrahimi {
92*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
93*9a0e4156SSadaf Ebrahimi 
94*9a0e4156SSadaf Ebrahimi 	if (RegNo > 31)
95*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
96*9a0e4156SSadaf Ebrahimi 
97*9a0e4156SSadaf Ebrahimi 	Reg = IntRegDecoderTable[RegNo];
98*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
99*9a0e4156SSadaf Ebrahimi 
100*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
101*9a0e4156SSadaf Ebrahimi }
102*9a0e4156SSadaf Ebrahimi 
DecodeI64RegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)103*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeI64RegsRegisterClass(MCInst *Inst, unsigned RegNo,
104*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
105*9a0e4156SSadaf Ebrahimi {
106*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
107*9a0e4156SSadaf Ebrahimi 
108*9a0e4156SSadaf Ebrahimi 	if (RegNo > 31)
109*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
110*9a0e4156SSadaf Ebrahimi 
111*9a0e4156SSadaf Ebrahimi 	Reg = IntRegDecoderTable[RegNo];
112*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
113*9a0e4156SSadaf Ebrahimi 
114*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
115*9a0e4156SSadaf Ebrahimi }
116*9a0e4156SSadaf Ebrahimi 
DecodeFPRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)117*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
118*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
119*9a0e4156SSadaf Ebrahimi {
120*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
121*9a0e4156SSadaf Ebrahimi 
122*9a0e4156SSadaf Ebrahimi 	if (RegNo > 31)
123*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
124*9a0e4156SSadaf Ebrahimi 
125*9a0e4156SSadaf Ebrahimi 	Reg = FPRegDecoderTable[RegNo];
126*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
127*9a0e4156SSadaf Ebrahimi 
128*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
129*9a0e4156SSadaf Ebrahimi }
130*9a0e4156SSadaf Ebrahimi 
DecodeDFPRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)131*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
132*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
133*9a0e4156SSadaf Ebrahimi {
134*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
135*9a0e4156SSadaf Ebrahimi 
136*9a0e4156SSadaf Ebrahimi 	if (RegNo > 31)
137*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
138*9a0e4156SSadaf Ebrahimi 
139*9a0e4156SSadaf Ebrahimi 	Reg = DFPRegDecoderTable[RegNo];
140*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
141*9a0e4156SSadaf Ebrahimi 
142*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
143*9a0e4156SSadaf Ebrahimi }
144*9a0e4156SSadaf Ebrahimi 
DecodeQFPRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)145*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQFPRegsRegisterClass(MCInst *Inst, unsigned RegNo,
146*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
147*9a0e4156SSadaf Ebrahimi {
148*9a0e4156SSadaf Ebrahimi 	unsigned Reg;
149*9a0e4156SSadaf Ebrahimi 
150*9a0e4156SSadaf Ebrahimi 	if (RegNo > 31)
151*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
152*9a0e4156SSadaf Ebrahimi 
153*9a0e4156SSadaf Ebrahimi 	Reg = QFPRegDecoderTable[RegNo];
154*9a0e4156SSadaf Ebrahimi 	if (Reg == ~0U)
155*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
156*9a0e4156SSadaf Ebrahimi 
157*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Reg);
158*9a0e4156SSadaf Ebrahimi 
159*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
160*9a0e4156SSadaf Ebrahimi }
161*9a0e4156SSadaf Ebrahimi 
DecodeFCCRegsRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Address,const void * Decoder)162*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFCCRegsRegisterClass(MCInst *Inst, unsigned RegNo,
163*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
164*9a0e4156SSadaf Ebrahimi {
165*9a0e4156SSadaf Ebrahimi 	if (RegNo > 3)
166*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
167*9a0e4156SSadaf Ebrahimi 
168*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, FCCRegDecoderTable[RegNo]);
169*9a0e4156SSadaf Ebrahimi 
170*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
171*9a0e4156SSadaf Ebrahimi }
172*9a0e4156SSadaf Ebrahimi 
173*9a0e4156SSadaf Ebrahimi 
174*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadInt(MCInst *Inst, unsigned insn, uint64_t Address,
175*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
176*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadFP(MCInst *Inst, unsigned insn, uint64_t Address,
177*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
178*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadDFP(MCInst *Inst, unsigned insn, uint64_t Address,
179*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
180*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadQFP(MCInst *Inst, unsigned insn, uint64_t Address,
181*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
182*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreInt(MCInst *Inst, unsigned insn,
183*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
184*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreFP(MCInst *Inst, unsigned insn,
185*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
186*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreDFP(MCInst *Inst, unsigned insn,
187*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
188*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreQFP(MCInst *Inst, unsigned insn,
189*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
190*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCall(MCInst *Inst, unsigned insn,
191*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
192*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSIMM13(MCInst *Inst, unsigned insn,
193*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder);
194*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeJMPL(MCInst *Inst, unsigned insn, uint64_t Address,
195*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
196*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeReturn(MCInst *MI, unsigned insn, uint64_t Address,
197*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
198*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSWAP(MCInst *Inst, unsigned insn, uint64_t Address,
199*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
200*9a0e4156SSadaf Ebrahimi 
201*9a0e4156SSadaf Ebrahimi 
202*9a0e4156SSadaf Ebrahimi #define GET_SUBTARGETINFO_ENUM
203*9a0e4156SSadaf Ebrahimi #include "SparcGenSubtargetInfo.inc"
204*9a0e4156SSadaf Ebrahimi #include "SparcGenDisassemblerTables.inc"
205*9a0e4156SSadaf Ebrahimi 
206*9a0e4156SSadaf Ebrahimi /// readInstruction - read four bytes and return 32 bit word.
readInstruction32(const uint8_t * code,size_t len,uint32_t * Insn)207*9a0e4156SSadaf Ebrahimi static DecodeStatus readInstruction32(const uint8_t *code, size_t len, uint32_t *Insn)
208*9a0e4156SSadaf Ebrahimi {
209*9a0e4156SSadaf Ebrahimi 	if (len < 4)
210*9a0e4156SSadaf Ebrahimi 		// not enough data
211*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
212*9a0e4156SSadaf Ebrahimi 
213*9a0e4156SSadaf Ebrahimi 	// Encoded as a big-endian 32-bit word in the stream.
214*9a0e4156SSadaf Ebrahimi 	*Insn = (code[3] <<  0) |
215*9a0e4156SSadaf Ebrahimi 		(code[2] <<  8) |
216*9a0e4156SSadaf Ebrahimi 		(code[1] << 16) |
217*9a0e4156SSadaf Ebrahimi 		((uint32_t) code[0] << 24);
218*9a0e4156SSadaf Ebrahimi 
219*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
220*9a0e4156SSadaf Ebrahimi }
221*9a0e4156SSadaf Ebrahimi 
Sparc_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * MI,uint16_t * size,uint64_t address,void * info)222*9a0e4156SSadaf Ebrahimi bool Sparc_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *MI,
223*9a0e4156SSadaf Ebrahimi 		uint16_t *size, uint64_t address, void *info)
224*9a0e4156SSadaf Ebrahimi {
225*9a0e4156SSadaf Ebrahimi 	uint32_t Insn;
226*9a0e4156SSadaf Ebrahimi 	DecodeStatus Result;
227*9a0e4156SSadaf Ebrahimi 
228*9a0e4156SSadaf Ebrahimi 	Result = readInstruction32(code, code_len, &Insn);
229*9a0e4156SSadaf Ebrahimi 	if (Result == MCDisassembler_Fail)
230*9a0e4156SSadaf Ebrahimi 		return false;
231*9a0e4156SSadaf Ebrahimi 
232*9a0e4156SSadaf Ebrahimi 	if (MI->flat_insn->detail) {
233*9a0e4156SSadaf Ebrahimi 		memset(MI->flat_insn->detail, 0, offsetof(cs_detail, sparc)+sizeof(cs_sparc));
234*9a0e4156SSadaf Ebrahimi 	}
235*9a0e4156SSadaf Ebrahimi 
236*9a0e4156SSadaf Ebrahimi 	Result = decodeInstruction_4(DecoderTableSparc32, MI, Insn, address,
237*9a0e4156SSadaf Ebrahimi 			(MCRegisterInfo *)info, 0);
238*9a0e4156SSadaf Ebrahimi 	if (Result != MCDisassembler_Fail) {
239*9a0e4156SSadaf Ebrahimi 		*size = 4;
240*9a0e4156SSadaf Ebrahimi 		return true;
241*9a0e4156SSadaf Ebrahimi 	}
242*9a0e4156SSadaf Ebrahimi 
243*9a0e4156SSadaf Ebrahimi 	return false;
244*9a0e4156SSadaf Ebrahimi }
245*9a0e4156SSadaf Ebrahimi 
246*9a0e4156SSadaf Ebrahimi typedef DecodeStatus (*DecodeFunc)(MCInst *MI, unsigned insn, uint64_t Address,
247*9a0e4156SSadaf Ebrahimi 		const void *Decoder);
248*9a0e4156SSadaf Ebrahimi 
DecodeMem(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder,bool isLoad,DecodeFunc DecodeRD)249*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMem(MCInst *MI, unsigned insn, uint64_t Address,
250*9a0e4156SSadaf Ebrahimi 		const void *Decoder,
251*9a0e4156SSadaf Ebrahimi 		bool isLoad, DecodeFunc DecodeRD)
252*9a0e4156SSadaf Ebrahimi {
253*9a0e4156SSadaf Ebrahimi 	DecodeStatus status;
254*9a0e4156SSadaf Ebrahimi 	unsigned rd = fieldFromInstruction_4(insn, 25, 5);
255*9a0e4156SSadaf Ebrahimi 	unsigned rs1 = fieldFromInstruction_4(insn, 14, 5);
256*9a0e4156SSadaf Ebrahimi 	bool isImm = fieldFromInstruction_4(insn, 13, 1) != 0;
257*9a0e4156SSadaf Ebrahimi 	unsigned rs2 = 0;
258*9a0e4156SSadaf Ebrahimi 	unsigned simm13 = 0;
259*9a0e4156SSadaf Ebrahimi 
260*9a0e4156SSadaf Ebrahimi 	if (isImm)
261*9a0e4156SSadaf Ebrahimi 		simm13 = SignExtend32(fieldFromInstruction_4(insn, 0, 13), 13);
262*9a0e4156SSadaf Ebrahimi 	else
263*9a0e4156SSadaf Ebrahimi 		rs2 = fieldFromInstruction_4(insn, 0, 5);
264*9a0e4156SSadaf Ebrahimi 
265*9a0e4156SSadaf Ebrahimi 	if (isLoad) {
266*9a0e4156SSadaf Ebrahimi 		status = DecodeRD(MI, rd, Address, Decoder);
267*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
268*9a0e4156SSadaf Ebrahimi 			return status;
269*9a0e4156SSadaf Ebrahimi 	}
270*9a0e4156SSadaf Ebrahimi 
271*9a0e4156SSadaf Ebrahimi 	// Decode rs1.
272*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
273*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
274*9a0e4156SSadaf Ebrahimi 		return status;
275*9a0e4156SSadaf Ebrahimi 
276*9a0e4156SSadaf Ebrahimi 	// Decode imm|rs2.
277*9a0e4156SSadaf Ebrahimi 	if (isImm)
278*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, simm13);
279*9a0e4156SSadaf Ebrahimi 	else {
280*9a0e4156SSadaf Ebrahimi 		status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
281*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
282*9a0e4156SSadaf Ebrahimi 			return status;
283*9a0e4156SSadaf Ebrahimi 	}
284*9a0e4156SSadaf Ebrahimi 
285*9a0e4156SSadaf Ebrahimi 	if (!isLoad) {
286*9a0e4156SSadaf Ebrahimi 		status = DecodeRD(MI, rd, Address, Decoder);
287*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
288*9a0e4156SSadaf Ebrahimi 			return status;
289*9a0e4156SSadaf Ebrahimi 	}
290*9a0e4156SSadaf Ebrahimi 
291*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
292*9a0e4156SSadaf Ebrahimi }
293*9a0e4156SSadaf Ebrahimi 
DecodeLoadInt(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)294*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadInt(MCInst *Inst, unsigned insn, uint64_t Address,
295*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
296*9a0e4156SSadaf Ebrahimi {
297*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, true,
298*9a0e4156SSadaf Ebrahimi 			DecodeIntRegsRegisterClass);
299*9a0e4156SSadaf Ebrahimi }
300*9a0e4156SSadaf Ebrahimi 
DecodeLoadFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)301*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadFP(MCInst *Inst, unsigned insn, uint64_t Address,
302*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
303*9a0e4156SSadaf Ebrahimi {
304*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, true,
305*9a0e4156SSadaf Ebrahimi 			DecodeFPRegsRegisterClass);
306*9a0e4156SSadaf Ebrahimi }
307*9a0e4156SSadaf Ebrahimi 
DecodeLoadDFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)308*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadDFP(MCInst *Inst, unsigned insn, uint64_t Address,
309*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
310*9a0e4156SSadaf Ebrahimi {
311*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, true,
312*9a0e4156SSadaf Ebrahimi 			DecodeDFPRegsRegisterClass);
313*9a0e4156SSadaf Ebrahimi }
314*9a0e4156SSadaf Ebrahimi 
DecodeLoadQFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)315*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLoadQFP(MCInst *Inst, unsigned insn, uint64_t Address,
316*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
317*9a0e4156SSadaf Ebrahimi {
318*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, true,
319*9a0e4156SSadaf Ebrahimi 			DecodeQFPRegsRegisterClass);
320*9a0e4156SSadaf Ebrahimi }
321*9a0e4156SSadaf Ebrahimi 
DecodeStoreInt(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)322*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreInt(MCInst *Inst, unsigned insn,
323*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
324*9a0e4156SSadaf Ebrahimi {
325*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, false,
326*9a0e4156SSadaf Ebrahimi 			DecodeIntRegsRegisterClass);
327*9a0e4156SSadaf Ebrahimi }
328*9a0e4156SSadaf Ebrahimi 
DecodeStoreFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)329*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreFP(MCInst *Inst, unsigned insn, uint64_t Address,
330*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
331*9a0e4156SSadaf Ebrahimi {
332*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, false,
333*9a0e4156SSadaf Ebrahimi 			DecodeFPRegsRegisterClass);
334*9a0e4156SSadaf Ebrahimi }
335*9a0e4156SSadaf Ebrahimi 
DecodeStoreDFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)336*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreDFP(MCInst *Inst, unsigned insn,
337*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
338*9a0e4156SSadaf Ebrahimi {
339*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, false,
340*9a0e4156SSadaf Ebrahimi 			DecodeDFPRegsRegisterClass);
341*9a0e4156SSadaf Ebrahimi }
342*9a0e4156SSadaf Ebrahimi 
DecodeStoreQFP(MCInst * Inst,unsigned insn,uint64_t Address,const void * Decoder)343*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeStoreQFP(MCInst *Inst, unsigned insn,
344*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
345*9a0e4156SSadaf Ebrahimi {
346*9a0e4156SSadaf Ebrahimi 	return DecodeMem(Inst, insn, Address, Decoder, false,
347*9a0e4156SSadaf Ebrahimi 			DecodeQFPRegsRegisterClass);
348*9a0e4156SSadaf Ebrahimi }
349*9a0e4156SSadaf Ebrahimi 
DecodeCall(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder)350*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCall(MCInst *MI, unsigned insn,
351*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
352*9a0e4156SSadaf Ebrahimi {
353*9a0e4156SSadaf Ebrahimi 	unsigned tgt = fieldFromInstruction_4(insn, 0, 30);
354*9a0e4156SSadaf Ebrahimi 	tgt <<= 2;
355*9a0e4156SSadaf Ebrahimi 
356*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(MI, tgt);
357*9a0e4156SSadaf Ebrahimi 
358*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
359*9a0e4156SSadaf Ebrahimi }
360*9a0e4156SSadaf Ebrahimi 
DecodeSIMM13(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder)361*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSIMM13(MCInst *MI, unsigned insn,
362*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
363*9a0e4156SSadaf Ebrahimi {
364*9a0e4156SSadaf Ebrahimi 	unsigned tgt = SignExtend32(fieldFromInstruction_4(insn, 0, 13), 13);
365*9a0e4156SSadaf Ebrahimi 
366*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(MI, tgt);
367*9a0e4156SSadaf Ebrahimi 
368*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
369*9a0e4156SSadaf Ebrahimi }
370*9a0e4156SSadaf Ebrahimi 
DecodeJMPL(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder)371*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeJMPL(MCInst *MI, unsigned insn, uint64_t Address,
372*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
373*9a0e4156SSadaf Ebrahimi {
374*9a0e4156SSadaf Ebrahimi 	DecodeStatus status;
375*9a0e4156SSadaf Ebrahimi 	unsigned rd = fieldFromInstruction_4(insn, 25, 5);
376*9a0e4156SSadaf Ebrahimi 	unsigned rs1 = fieldFromInstruction_4(insn, 14, 5);
377*9a0e4156SSadaf Ebrahimi 	unsigned isImm = fieldFromInstruction_4(insn, 13, 1);
378*9a0e4156SSadaf Ebrahimi 	unsigned rs2 = 0;
379*9a0e4156SSadaf Ebrahimi 	unsigned simm13 = 0;
380*9a0e4156SSadaf Ebrahimi 
381*9a0e4156SSadaf Ebrahimi 	if (isImm)
382*9a0e4156SSadaf Ebrahimi 		simm13 = SignExtend32(fieldFromInstruction_4(insn, 0, 13), 13);
383*9a0e4156SSadaf Ebrahimi 	else
384*9a0e4156SSadaf Ebrahimi 		rs2 = fieldFromInstruction_4(insn, 0, 5);
385*9a0e4156SSadaf Ebrahimi 
386*9a0e4156SSadaf Ebrahimi 	// Decode RD.
387*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder);
388*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
389*9a0e4156SSadaf Ebrahimi 		return status;
390*9a0e4156SSadaf Ebrahimi 
391*9a0e4156SSadaf Ebrahimi 	// Decode RS1.
392*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
393*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
394*9a0e4156SSadaf Ebrahimi 		return status;
395*9a0e4156SSadaf Ebrahimi 
396*9a0e4156SSadaf Ebrahimi 	// Decode RS1 | SIMM13.
397*9a0e4156SSadaf Ebrahimi 	if (isImm)
398*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, simm13);
399*9a0e4156SSadaf Ebrahimi 	else {
400*9a0e4156SSadaf Ebrahimi 		status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
401*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
402*9a0e4156SSadaf Ebrahimi 			return status;
403*9a0e4156SSadaf Ebrahimi 	}
404*9a0e4156SSadaf Ebrahimi 
405*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
406*9a0e4156SSadaf Ebrahimi }
407*9a0e4156SSadaf Ebrahimi 
DecodeReturn(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder)408*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeReturn(MCInst *MI, unsigned insn, uint64_t Address,
409*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
410*9a0e4156SSadaf Ebrahimi {
411*9a0e4156SSadaf Ebrahimi 	DecodeStatus status;
412*9a0e4156SSadaf Ebrahimi 	unsigned rs1 = fieldFromInstruction_4(insn, 14, 5);
413*9a0e4156SSadaf Ebrahimi 	unsigned isImm = fieldFromInstruction_4(insn, 13, 1);
414*9a0e4156SSadaf Ebrahimi 	unsigned rs2 = 0;
415*9a0e4156SSadaf Ebrahimi 	unsigned simm13 = 0;
416*9a0e4156SSadaf Ebrahimi 	if (isImm)
417*9a0e4156SSadaf Ebrahimi 		simm13 = SignExtend32(fieldFromInstruction_4(insn, 0, 13), 13);
418*9a0e4156SSadaf Ebrahimi 	else
419*9a0e4156SSadaf Ebrahimi 		rs2 = fieldFromInstruction_4(insn, 0, 5);
420*9a0e4156SSadaf Ebrahimi 
421*9a0e4156SSadaf Ebrahimi 	// Decode RS1.
422*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
423*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
424*9a0e4156SSadaf Ebrahimi 		return status;
425*9a0e4156SSadaf Ebrahimi 
426*9a0e4156SSadaf Ebrahimi 	// Decode RS2 | SIMM13.
427*9a0e4156SSadaf Ebrahimi 	if (isImm)
428*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, simm13);
429*9a0e4156SSadaf Ebrahimi 	else {
430*9a0e4156SSadaf Ebrahimi 		status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
431*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
432*9a0e4156SSadaf Ebrahimi 			return status;
433*9a0e4156SSadaf Ebrahimi 	}
434*9a0e4156SSadaf Ebrahimi 
435*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
436*9a0e4156SSadaf Ebrahimi }
437*9a0e4156SSadaf Ebrahimi 
DecodeSWAP(MCInst * MI,unsigned insn,uint64_t Address,const void * Decoder)438*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSWAP(MCInst *MI, unsigned insn, uint64_t Address,
439*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
440*9a0e4156SSadaf Ebrahimi {
441*9a0e4156SSadaf Ebrahimi 	DecodeStatus status;
442*9a0e4156SSadaf Ebrahimi 	unsigned rd = fieldFromInstruction_4(insn, 25, 5);
443*9a0e4156SSadaf Ebrahimi 	unsigned rs1 = fieldFromInstruction_4(insn, 14, 5);
444*9a0e4156SSadaf Ebrahimi 	unsigned isImm = fieldFromInstruction_4(insn, 13, 1);
445*9a0e4156SSadaf Ebrahimi 	unsigned rs2 = 0;
446*9a0e4156SSadaf Ebrahimi 	unsigned simm13 = 0;
447*9a0e4156SSadaf Ebrahimi 
448*9a0e4156SSadaf Ebrahimi 	if (isImm)
449*9a0e4156SSadaf Ebrahimi 		simm13 = SignExtend32(fieldFromInstruction_4(insn, 0, 13), 13);
450*9a0e4156SSadaf Ebrahimi 	else
451*9a0e4156SSadaf Ebrahimi 		rs2 = fieldFromInstruction_4(insn, 0, 5);
452*9a0e4156SSadaf Ebrahimi 
453*9a0e4156SSadaf Ebrahimi 	// Decode RD.
454*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rd, Address, Decoder);
455*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
456*9a0e4156SSadaf Ebrahimi 		return status;
457*9a0e4156SSadaf Ebrahimi 
458*9a0e4156SSadaf Ebrahimi 	// Decode RS1.
459*9a0e4156SSadaf Ebrahimi 	status = DecodeIntRegsRegisterClass(MI, rs1, Address, Decoder);
460*9a0e4156SSadaf Ebrahimi 	if (status != MCDisassembler_Success)
461*9a0e4156SSadaf Ebrahimi 		return status;
462*9a0e4156SSadaf Ebrahimi 
463*9a0e4156SSadaf Ebrahimi 	// Decode RS1 | SIMM13.
464*9a0e4156SSadaf Ebrahimi 	if (isImm)
465*9a0e4156SSadaf Ebrahimi 		MCOperand_CreateImm0(MI, simm13);
466*9a0e4156SSadaf Ebrahimi 	else {
467*9a0e4156SSadaf Ebrahimi 		status = DecodeIntRegsRegisterClass(MI, rs2, Address, Decoder);
468*9a0e4156SSadaf Ebrahimi 		if (status != MCDisassembler_Success)
469*9a0e4156SSadaf Ebrahimi 			return status;
470*9a0e4156SSadaf Ebrahimi 	}
471*9a0e4156SSadaf Ebrahimi 
472*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
473*9a0e4156SSadaf Ebrahimi }
474*9a0e4156SSadaf Ebrahimi 
Sparc_init(MCRegisterInfo * MRI)475*9a0e4156SSadaf Ebrahimi void Sparc_init(MCRegisterInfo *MRI)
476*9a0e4156SSadaf Ebrahimi {
477*9a0e4156SSadaf Ebrahimi 	/*
478*9a0e4156SSadaf Ebrahimi 	InitMCRegisterInfo(SparcRegDesc, 119, RA, PC,
479*9a0e4156SSadaf Ebrahimi 			SparcMCRegisterClasses, 8,
480*9a0e4156SSadaf Ebrahimi 			SparcRegUnitRoots,
481*9a0e4156SSadaf Ebrahimi 			86,
482*9a0e4156SSadaf Ebrahimi 			SparcRegDiffLists,
483*9a0e4156SSadaf Ebrahimi 			SparcRegStrings,
484*9a0e4156SSadaf Ebrahimi 			SparcSubRegIdxLists,
485*9a0e4156SSadaf Ebrahimi 			7,
486*9a0e4156SSadaf Ebrahimi 			SparcSubRegIdxRanges,
487*9a0e4156SSadaf Ebrahimi 			SparcRegEncodingTable);
488*9a0e4156SSadaf Ebrahimi 	*/
489*9a0e4156SSadaf Ebrahimi 
490*9a0e4156SSadaf Ebrahimi 	MCRegisterInfo_InitMCRegisterInfo(MRI, SparcRegDesc, 119,
491*9a0e4156SSadaf Ebrahimi 			0, 0,
492*9a0e4156SSadaf Ebrahimi 			SparcMCRegisterClasses, 8,
493*9a0e4156SSadaf Ebrahimi 			0, 0,
494*9a0e4156SSadaf Ebrahimi 			SparcRegDiffLists,
495*9a0e4156SSadaf Ebrahimi 			0,
496*9a0e4156SSadaf Ebrahimi 			SparcSubRegIdxLists, 7,
497*9a0e4156SSadaf Ebrahimi 			0);
498*9a0e4156SSadaf Ebrahimi }
499*9a0e4156SSadaf Ebrahimi 
500*9a0e4156SSadaf Ebrahimi #endif
501