xref: /aosp_15_r20/external/capstone/arch/SystemZ/SystemZDisassembler.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi //===------ SystemZDisassembler.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_SYSZ
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 "SystemZDisassembler.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 #include "SystemZMCTargetDesc.h"
32*9a0e4156SSadaf Ebrahimi 
getFeatureBits(int mode)33*9a0e4156SSadaf Ebrahimi static uint64_t getFeatureBits(int mode)
34*9a0e4156SSadaf Ebrahimi {
35*9a0e4156SSadaf Ebrahimi 	// support everything
36*9a0e4156SSadaf Ebrahimi 	return (uint64_t)-1;
37*9a0e4156SSadaf Ebrahimi }
38*9a0e4156SSadaf Ebrahimi 
decodeRegisterClass(MCInst * Inst,uint64_t RegNo,const unsigned * Regs)39*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeRegisterClass(MCInst *Inst, uint64_t RegNo, const unsigned *Regs)
40*9a0e4156SSadaf Ebrahimi {
41*9a0e4156SSadaf Ebrahimi 	//assert(RegNo < 16 && "Invalid register");
42*9a0e4156SSadaf Ebrahimi 	RegNo = Regs[RegNo];
43*9a0e4156SSadaf Ebrahimi 	if (RegNo == 0)
44*9a0e4156SSadaf Ebrahimi 		return MCDisassembler_Fail;
45*9a0e4156SSadaf Ebrahimi 
46*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, (unsigned)RegNo);
47*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
48*9a0e4156SSadaf Ebrahimi }
49*9a0e4156SSadaf Ebrahimi 
DecodeGR32BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)50*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
51*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
52*9a0e4156SSadaf Ebrahimi {
53*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_GR32Regs);
54*9a0e4156SSadaf Ebrahimi }
55*9a0e4156SSadaf Ebrahimi 
DecodeGRH32BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)56*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGRH32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
57*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
58*9a0e4156SSadaf Ebrahimi {
59*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_GRH32Regs);
60*9a0e4156SSadaf Ebrahimi }
61*9a0e4156SSadaf Ebrahimi 
DecodeGR64BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)62*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
63*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
64*9a0e4156SSadaf Ebrahimi {
65*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs);
66*9a0e4156SSadaf Ebrahimi }
67*9a0e4156SSadaf Ebrahimi 
DecodeGR128BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)68*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
69*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
70*9a0e4156SSadaf Ebrahimi {
71*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_GR128Regs);
72*9a0e4156SSadaf Ebrahimi }
73*9a0e4156SSadaf Ebrahimi 
DecodeADDR64BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)74*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeADDR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
75*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
76*9a0e4156SSadaf Ebrahimi {
77*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs);
78*9a0e4156SSadaf Ebrahimi }
79*9a0e4156SSadaf Ebrahimi 
DecodeFP32BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)80*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFP32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
81*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
82*9a0e4156SSadaf Ebrahimi {
83*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_FP32Regs);
84*9a0e4156SSadaf Ebrahimi }
85*9a0e4156SSadaf Ebrahimi 
DecodeFP64BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)86*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFP64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
87*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
88*9a0e4156SSadaf Ebrahimi {
89*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_FP64Regs);
90*9a0e4156SSadaf Ebrahimi }
91*9a0e4156SSadaf Ebrahimi 
DecodeFP128BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)92*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFP128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
93*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
94*9a0e4156SSadaf Ebrahimi {
95*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_FP128Regs);
96*9a0e4156SSadaf Ebrahimi }
97*9a0e4156SSadaf Ebrahimi 
DecodeVR32BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)98*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
99*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
100*9a0e4156SSadaf Ebrahimi {
101*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_VR32Regs);
102*9a0e4156SSadaf Ebrahimi }
103*9a0e4156SSadaf Ebrahimi 
DecodeVR64BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)104*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
105*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
106*9a0e4156SSadaf Ebrahimi {
107*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_VR64Regs);
108*9a0e4156SSadaf Ebrahimi }
109*9a0e4156SSadaf Ebrahimi 
DecodeVR128BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)110*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
111*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
112*9a0e4156SSadaf Ebrahimi {
113*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_VR128Regs);
114*9a0e4156SSadaf Ebrahimi }
115*9a0e4156SSadaf Ebrahimi 
DecodeAR32BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)116*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeAR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
117*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
118*9a0e4156SSadaf Ebrahimi {
119*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_AR32Regs);
120*9a0e4156SSadaf Ebrahimi }
121*9a0e4156SSadaf Ebrahimi 
DecodeCR64BitRegisterClass(MCInst * Inst,uint64_t RegNo,uint64_t Address,const void * Decoder)122*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeCR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
123*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
124*9a0e4156SSadaf Ebrahimi {
125*9a0e4156SSadaf Ebrahimi 	return decodeRegisterClass(Inst, RegNo, SystemZMC_CR64Regs);
126*9a0e4156SSadaf Ebrahimi }
127*9a0e4156SSadaf Ebrahimi 
decodeUImmOperand(MCInst * Inst,uint64_t Imm)128*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeUImmOperand(MCInst *Inst, uint64_t Imm)
129*9a0e4156SSadaf Ebrahimi {
130*9a0e4156SSadaf Ebrahimi 	//assert(isUInt<N>(Imm) && "Invalid immediate");
131*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Imm);
132*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
133*9a0e4156SSadaf Ebrahimi }
134*9a0e4156SSadaf Ebrahimi 
decodeSImmOperand(MCInst * Inst,uint64_t Imm,unsigned N)135*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeSImmOperand(MCInst *Inst, uint64_t Imm, unsigned N)
136*9a0e4156SSadaf Ebrahimi {
137*9a0e4156SSadaf Ebrahimi 	//assert(isUInt<N>(Imm) && "Invalid immediate");
138*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, SignExtend64(Imm, N));
139*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
140*9a0e4156SSadaf Ebrahimi }
141*9a0e4156SSadaf Ebrahimi 
decodeU1ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)142*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU1ImmOperand(MCInst *Inst, uint64_t Imm,
143*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
144*9a0e4156SSadaf Ebrahimi {
145*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
146*9a0e4156SSadaf Ebrahimi }
147*9a0e4156SSadaf Ebrahimi 
decodeU2ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)148*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU2ImmOperand(MCInst *Inst, uint64_t Imm,
149*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
150*9a0e4156SSadaf Ebrahimi {
151*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
152*9a0e4156SSadaf Ebrahimi }
153*9a0e4156SSadaf Ebrahimi 
decodeU3ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)154*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU3ImmOperand(MCInst *Inst, uint64_t Imm,
155*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
156*9a0e4156SSadaf Ebrahimi {
157*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
158*9a0e4156SSadaf Ebrahimi }
159*9a0e4156SSadaf Ebrahimi 
decodeU4ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)160*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU4ImmOperand(MCInst *Inst, uint64_t Imm,
161*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
162*9a0e4156SSadaf Ebrahimi {
163*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
164*9a0e4156SSadaf Ebrahimi }
165*9a0e4156SSadaf Ebrahimi 
decodeU6ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)166*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU6ImmOperand(MCInst *Inst, uint64_t Imm,
167*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
168*9a0e4156SSadaf Ebrahimi {
169*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
170*9a0e4156SSadaf Ebrahimi }
171*9a0e4156SSadaf Ebrahimi 
decodeU8ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)172*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU8ImmOperand(MCInst *Inst, uint64_t Imm,
173*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
174*9a0e4156SSadaf Ebrahimi {
175*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
176*9a0e4156SSadaf Ebrahimi }
177*9a0e4156SSadaf Ebrahimi 
decodeU12ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)178*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU12ImmOperand(MCInst *Inst, uint64_t Imm,
179*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
180*9a0e4156SSadaf Ebrahimi {
181*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
182*9a0e4156SSadaf Ebrahimi }
183*9a0e4156SSadaf Ebrahimi 
decodeU16ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)184*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU16ImmOperand(MCInst *Inst, uint64_t Imm,
185*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
186*9a0e4156SSadaf Ebrahimi {
187*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
188*9a0e4156SSadaf Ebrahimi }
189*9a0e4156SSadaf Ebrahimi 
decodeU32ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)190*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeU32ImmOperand(MCInst *Inst, uint64_t Imm,
191*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
192*9a0e4156SSadaf Ebrahimi {
193*9a0e4156SSadaf Ebrahimi 	return decodeUImmOperand(Inst, Imm);
194*9a0e4156SSadaf Ebrahimi }
195*9a0e4156SSadaf Ebrahimi 
decodeS8ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)196*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeS8ImmOperand(MCInst *Inst, uint64_t Imm,
197*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
198*9a0e4156SSadaf Ebrahimi {
199*9a0e4156SSadaf Ebrahimi 	return decodeSImmOperand(Inst, Imm, 8);
200*9a0e4156SSadaf Ebrahimi }
201*9a0e4156SSadaf Ebrahimi 
decodeS16ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)202*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeS16ImmOperand(MCInst *Inst, uint64_t Imm,
203*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
204*9a0e4156SSadaf Ebrahimi {
205*9a0e4156SSadaf Ebrahimi 	return decodeSImmOperand(Inst, Imm, 16);
206*9a0e4156SSadaf Ebrahimi }
207*9a0e4156SSadaf Ebrahimi 
decodeS32ImmOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)208*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeS32ImmOperand(MCInst *Inst, uint64_t Imm,
209*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
210*9a0e4156SSadaf Ebrahimi {
211*9a0e4156SSadaf Ebrahimi 	return decodeSImmOperand(Inst, Imm, 32);
212*9a0e4156SSadaf Ebrahimi }
213*9a0e4156SSadaf Ebrahimi 
decodePCDBLOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,unsigned N)214*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePCDBLOperand(MCInst *Inst, uint64_t Imm,
215*9a0e4156SSadaf Ebrahimi 		uint64_t Address, unsigned N)
216*9a0e4156SSadaf Ebrahimi {
217*9a0e4156SSadaf Ebrahimi 	//assert(isUInt<N>(Imm) && "Invalid PC-relative offset");
218*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, SignExtend64(Imm, N) * 2 + Address);
219*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
220*9a0e4156SSadaf Ebrahimi }
221*9a0e4156SSadaf Ebrahimi 
decodePC12DBLBranchOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)222*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePC12DBLBranchOperand(MCInst *Inst, uint64_t Imm,
223*9a0e4156SSadaf Ebrahimi 		uint64_t Address,
224*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
225*9a0e4156SSadaf Ebrahimi {
226*9a0e4156SSadaf Ebrahimi 	return decodePCDBLOperand(Inst, Imm, Address, 12);
227*9a0e4156SSadaf Ebrahimi }
228*9a0e4156SSadaf Ebrahimi 
decodePC16DBLBranchOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)229*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePC16DBLBranchOperand(MCInst *Inst, uint64_t Imm,
230*9a0e4156SSadaf Ebrahimi 		uint64_t Address,
231*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
232*9a0e4156SSadaf Ebrahimi {
233*9a0e4156SSadaf Ebrahimi 	return decodePCDBLOperand(Inst, Imm, Address, 16);
234*9a0e4156SSadaf Ebrahimi }
235*9a0e4156SSadaf Ebrahimi 
decodePC24DBLBranchOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)236*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePC24DBLBranchOperand(MCInst *Inst, uint64_t Imm,
237*9a0e4156SSadaf Ebrahimi 		uint64_t Address,
238*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
239*9a0e4156SSadaf Ebrahimi {
240*9a0e4156SSadaf Ebrahimi 	return decodePCDBLOperand(Inst, Imm, Address, 24);
241*9a0e4156SSadaf Ebrahimi }
242*9a0e4156SSadaf Ebrahimi 
decodePC32DBLBranchOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)243*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePC32DBLBranchOperand(MCInst *Inst, uint64_t Imm,
244*9a0e4156SSadaf Ebrahimi 		uint64_t Address,
245*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
246*9a0e4156SSadaf Ebrahimi {
247*9a0e4156SSadaf Ebrahimi 	return decodePCDBLOperand(Inst, Imm, Address, 32);
248*9a0e4156SSadaf Ebrahimi }
249*9a0e4156SSadaf Ebrahimi 
decodePC32DBLOperand(MCInst * Inst,uint64_t Imm,uint64_t Address,const void * Decoder)250*9a0e4156SSadaf Ebrahimi static DecodeStatus decodePC32DBLOperand(MCInst *Inst, uint64_t Imm,
251*9a0e4156SSadaf Ebrahimi 		uint64_t Address,
252*9a0e4156SSadaf Ebrahimi 		const void *Decoder)
253*9a0e4156SSadaf Ebrahimi {
254*9a0e4156SSadaf Ebrahimi 	return decodePCDBLOperand(Inst, Imm, Address, 32);
255*9a0e4156SSadaf Ebrahimi }
256*9a0e4156SSadaf Ebrahimi 
decodeBDAddr12Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)257*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr12Operand(MCInst *Inst, uint64_t Field,
258*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
259*9a0e4156SSadaf Ebrahimi {
260*9a0e4156SSadaf Ebrahimi 	uint64_t Base = Field >> 12;
261*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = Field & 0xfff;
262*9a0e4156SSadaf Ebrahimi 	//assert(Base < 16 && "Invalid BDAddr12");
263*9a0e4156SSadaf Ebrahimi 
264*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
265*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Disp);
266*9a0e4156SSadaf Ebrahimi 
267*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
268*9a0e4156SSadaf Ebrahimi }
269*9a0e4156SSadaf Ebrahimi 
decodeBDAddr20Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)270*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr20Operand(MCInst *Inst, uint64_t Field,
271*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
272*9a0e4156SSadaf Ebrahimi {
273*9a0e4156SSadaf Ebrahimi 	uint64_t Base = Field >> 20;
274*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = ((Field << 12) & 0xff000) | ((Field >> 8) & 0xfff);
275*9a0e4156SSadaf Ebrahimi 	//assert(Base < 16 && "Invalid BDAddr20");
276*9a0e4156SSadaf Ebrahimi 
277*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
278*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, SignExtend64(Disp, 20));
279*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
280*9a0e4156SSadaf Ebrahimi }
281*9a0e4156SSadaf Ebrahimi 
decodeBDXAddr12Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)282*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDXAddr12Operand(MCInst *Inst, uint64_t Field,
283*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
284*9a0e4156SSadaf Ebrahimi {
285*9a0e4156SSadaf Ebrahimi 	uint64_t Index = Field >> 16;
286*9a0e4156SSadaf Ebrahimi 	uint64_t Base = (Field >> 12) & 0xf;
287*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = Field & 0xfff;
288*9a0e4156SSadaf Ebrahimi 
289*9a0e4156SSadaf Ebrahimi 	//assert(Index < 16 && "Invalid BDXAddr12");
290*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
291*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Disp);
292*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Index == 0 ? 0 : Regs[Index]);
293*9a0e4156SSadaf Ebrahimi 
294*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
295*9a0e4156SSadaf Ebrahimi }
296*9a0e4156SSadaf Ebrahimi 
decodeBDXAddr20Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)297*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDXAddr20Operand(MCInst *Inst, uint64_t Field,
298*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
299*9a0e4156SSadaf Ebrahimi {
300*9a0e4156SSadaf Ebrahimi 	uint64_t Index = Field >> 24;
301*9a0e4156SSadaf Ebrahimi 	uint64_t Base = (Field >> 20) & 0xf;
302*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = ((Field & 0xfff00) >> 8) | ((Field & 0xff) << 12);
303*9a0e4156SSadaf Ebrahimi 
304*9a0e4156SSadaf Ebrahimi 	//assert(Index < 16 && "Invalid BDXAddr20");
305*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
306*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, SignExtend64(Disp, 20));
307*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Index == 0 ? 0 : Regs[Index]);
308*9a0e4156SSadaf Ebrahimi 
309*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
310*9a0e4156SSadaf Ebrahimi }
311*9a0e4156SSadaf Ebrahimi 
decodeBDLAddr12Len8Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)312*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDLAddr12Len8Operand(MCInst *Inst, uint64_t Field,
313*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
314*9a0e4156SSadaf Ebrahimi {
315*9a0e4156SSadaf Ebrahimi 	uint64_t Length = Field >> 16;
316*9a0e4156SSadaf Ebrahimi 	uint64_t Base = (Field >> 12) & 0xf;
317*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = Field & 0xfff;
318*9a0e4156SSadaf Ebrahimi 	//assert(Length < 256 && "Invalid BDLAddr12Len8");
319*9a0e4156SSadaf Ebrahimi 
320*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
321*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Disp);
322*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Length + 1);
323*9a0e4156SSadaf Ebrahimi 
324*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
325*9a0e4156SSadaf Ebrahimi }
326*9a0e4156SSadaf Ebrahimi 
decodeBDRAddr12Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)327*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDRAddr12Operand(MCInst *Inst, uint64_t Field,
328*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
329*9a0e4156SSadaf Ebrahimi {
330*9a0e4156SSadaf Ebrahimi 	uint64_t Length = Field >> 16;
331*9a0e4156SSadaf Ebrahimi 	uint64_t Base = (Field >> 12) & 0xf;
332*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = Field & 0xfff;
333*9a0e4156SSadaf Ebrahimi 	//assert(Length < 16 && "Invalid BDRAddr12");
334*9a0e4156SSadaf Ebrahimi 
335*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
336*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Disp);
337*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Regs[Length]);
338*9a0e4156SSadaf Ebrahimi 
339*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
340*9a0e4156SSadaf Ebrahimi }
341*9a0e4156SSadaf Ebrahimi 
decodeBDVAddr12Operand(MCInst * Inst,uint64_t Field,const unsigned * Regs)342*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDVAddr12Operand(MCInst *Inst, uint64_t Field,
343*9a0e4156SSadaf Ebrahimi 		const unsigned *Regs)
344*9a0e4156SSadaf Ebrahimi {
345*9a0e4156SSadaf Ebrahimi 	uint64_t Index = Field >> 16;
346*9a0e4156SSadaf Ebrahimi 	uint64_t Base = (Field >> 12) & 0xf;
347*9a0e4156SSadaf Ebrahimi 	uint64_t Disp = Field & 0xfff;
348*9a0e4156SSadaf Ebrahimi 	//assert(Index < 32 && "Invalid BDVAddr12");
349*9a0e4156SSadaf Ebrahimi 
350*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
351*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateImm0(Inst, Disp);
352*9a0e4156SSadaf Ebrahimi 	MCOperand_CreateReg0(Inst, SystemZMC_VR128Regs[Index]);
353*9a0e4156SSadaf Ebrahimi 
354*9a0e4156SSadaf Ebrahimi 	return MCDisassembler_Success;
355*9a0e4156SSadaf Ebrahimi }
356*9a0e4156SSadaf Ebrahimi 
decodeBDAddr32Disp12Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)357*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr32Disp12Operand(MCInst *Inst, uint64_t Field,
358*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
359*9a0e4156SSadaf Ebrahimi {
360*9a0e4156SSadaf Ebrahimi 	return decodeBDAddr12Operand(Inst, Field, SystemZMC_GR32Regs);
361*9a0e4156SSadaf Ebrahimi }
362*9a0e4156SSadaf Ebrahimi 
decodeBDAddr32Disp20Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)363*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr32Disp20Operand(MCInst *Inst, uint64_t Field,
364*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
365*9a0e4156SSadaf Ebrahimi {
366*9a0e4156SSadaf Ebrahimi 	return decodeBDAddr20Operand(Inst, Field, SystemZMC_GR32Regs);
367*9a0e4156SSadaf Ebrahimi }
368*9a0e4156SSadaf Ebrahimi 
decodeBDAddr64Disp12Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)369*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
370*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
371*9a0e4156SSadaf Ebrahimi {
372*9a0e4156SSadaf Ebrahimi 	return decodeBDAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
373*9a0e4156SSadaf Ebrahimi }
374*9a0e4156SSadaf Ebrahimi 
decodeBDAddr64Disp20Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)375*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDAddr64Disp20Operand(MCInst *Inst, uint64_t Field,
376*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
377*9a0e4156SSadaf Ebrahimi {
378*9a0e4156SSadaf Ebrahimi 	return decodeBDAddr20Operand(Inst, Field, SystemZMC_GR64Regs);
379*9a0e4156SSadaf Ebrahimi }
380*9a0e4156SSadaf Ebrahimi 
decodeBDXAddr64Disp12Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)381*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDXAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
382*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
383*9a0e4156SSadaf Ebrahimi {
384*9a0e4156SSadaf Ebrahimi 	return decodeBDXAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
385*9a0e4156SSadaf Ebrahimi }
386*9a0e4156SSadaf Ebrahimi 
decodeBDXAddr64Disp20Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)387*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDXAddr64Disp20Operand(MCInst *Inst, uint64_t Field,
388*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
389*9a0e4156SSadaf Ebrahimi {
390*9a0e4156SSadaf Ebrahimi 	return decodeBDXAddr20Operand(Inst, Field, SystemZMC_GR64Regs);
391*9a0e4156SSadaf Ebrahimi }
392*9a0e4156SSadaf Ebrahimi 
decodeBDLAddr64Disp12Len4Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)393*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDLAddr64Disp12Len4Operand(MCInst *Inst, uint64_t Field,
394*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
395*9a0e4156SSadaf Ebrahimi {
396*9a0e4156SSadaf Ebrahimi 	return decodeBDLAddr12Len8Operand(Inst, Field, SystemZMC_GR64Regs);
397*9a0e4156SSadaf Ebrahimi }
398*9a0e4156SSadaf Ebrahimi 
decodeBDLAddr64Disp12Len8Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)399*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDLAddr64Disp12Len8Operand(MCInst *Inst, uint64_t Field,
400*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
401*9a0e4156SSadaf Ebrahimi {
402*9a0e4156SSadaf Ebrahimi 	return decodeBDLAddr12Len8Operand(Inst, Field, SystemZMC_GR64Regs);
403*9a0e4156SSadaf Ebrahimi }
404*9a0e4156SSadaf Ebrahimi 
decodeBDRAddr64Disp12Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)405*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDRAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
406*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
407*9a0e4156SSadaf Ebrahimi {
408*9a0e4156SSadaf Ebrahimi 	return decodeBDRAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
409*9a0e4156SSadaf Ebrahimi }
410*9a0e4156SSadaf Ebrahimi 
decodeBDVAddr64Disp12Operand(MCInst * Inst,uint64_t Field,uint64_t Address,const void * Decoder)411*9a0e4156SSadaf Ebrahimi static DecodeStatus decodeBDVAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
412*9a0e4156SSadaf Ebrahimi 		uint64_t Address, const void *Decoder)
413*9a0e4156SSadaf Ebrahimi {
414*9a0e4156SSadaf Ebrahimi 	return decodeBDVAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
415*9a0e4156SSadaf Ebrahimi }
416*9a0e4156SSadaf Ebrahimi 
417*9a0e4156SSadaf Ebrahimi 
418*9a0e4156SSadaf Ebrahimi #define GET_SUBTARGETINFO_ENUM
419*9a0e4156SSadaf Ebrahimi #include "SystemZGenSubtargetInfo.inc"
420*9a0e4156SSadaf Ebrahimi #include "SystemZGenDisassemblerTables.inc"
SystemZ_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * MI,uint16_t * size,uint64_t address,void * info)421*9a0e4156SSadaf Ebrahimi bool SystemZ_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *MI,
422*9a0e4156SSadaf Ebrahimi 		uint16_t *size, uint64_t address, void *info)
423*9a0e4156SSadaf Ebrahimi {
424*9a0e4156SSadaf Ebrahimi 	uint64_t Inst;
425*9a0e4156SSadaf Ebrahimi 	const uint8_t *Table;
426*9a0e4156SSadaf Ebrahimi 	uint16_t I;
427*9a0e4156SSadaf Ebrahimi 
428*9a0e4156SSadaf Ebrahimi 	// The top 2 bits of the first byte specify the size.
429*9a0e4156SSadaf Ebrahimi 	if (*code < 0x40) {
430*9a0e4156SSadaf Ebrahimi 		*size = 2;
431*9a0e4156SSadaf Ebrahimi 		Table = DecoderTable16;
432*9a0e4156SSadaf Ebrahimi 	} else if (*code < 0xc0) {
433*9a0e4156SSadaf Ebrahimi 		*size = 4;
434*9a0e4156SSadaf Ebrahimi 		Table = DecoderTable32;
435*9a0e4156SSadaf Ebrahimi 	} else {
436*9a0e4156SSadaf Ebrahimi 		*size = 6;
437*9a0e4156SSadaf Ebrahimi 		Table = DecoderTable48;
438*9a0e4156SSadaf Ebrahimi 	}
439*9a0e4156SSadaf Ebrahimi 
440*9a0e4156SSadaf Ebrahimi 	if (code_len < *size)
441*9a0e4156SSadaf Ebrahimi 		// short of input data
442*9a0e4156SSadaf Ebrahimi 		return false;
443*9a0e4156SSadaf Ebrahimi 
444*9a0e4156SSadaf Ebrahimi 	if (MI->flat_insn->detail) {
445*9a0e4156SSadaf Ebrahimi 		memset(MI->flat_insn->detail, 0, offsetof(cs_detail, sysz)+sizeof(cs_sysz));
446*9a0e4156SSadaf Ebrahimi 	}
447*9a0e4156SSadaf Ebrahimi 
448*9a0e4156SSadaf Ebrahimi 	// Construct the instruction.
449*9a0e4156SSadaf Ebrahimi 	Inst = 0;
450*9a0e4156SSadaf Ebrahimi 	for (I = 0; I < *size; ++I)
451*9a0e4156SSadaf Ebrahimi 		Inst = (Inst << 8) | code[I];
452*9a0e4156SSadaf Ebrahimi 
453*9a0e4156SSadaf Ebrahimi 	return decodeInstruction(Table, MI, Inst, address, info, 0);
454*9a0e4156SSadaf Ebrahimi }
455*9a0e4156SSadaf Ebrahimi 
456*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
457*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_MC_DESC
458*9a0e4156SSadaf Ebrahimi #include "SystemZGenRegisterInfo.inc"
SystemZ_init(MCRegisterInfo * MRI)459*9a0e4156SSadaf Ebrahimi void SystemZ_init(MCRegisterInfo *MRI)
460*9a0e4156SSadaf Ebrahimi {
461*9a0e4156SSadaf Ebrahimi 	/*
462*9a0e4156SSadaf Ebrahimi 	InitMCRegisterInfo(SystemZRegDesc, 98, RA, PC,
463*9a0e4156SSadaf Ebrahimi 			SystemZMCRegisterClasses, 12,
464*9a0e4156SSadaf Ebrahimi 			SystemZRegUnitRoots,
465*9a0e4156SSadaf Ebrahimi 			49,
466*9a0e4156SSadaf Ebrahimi 			SystemZRegDiffLists,
467*9a0e4156SSadaf Ebrahimi 			SystemZRegStrings,
468*9a0e4156SSadaf Ebrahimi 			SystemZSubRegIdxLists,
469*9a0e4156SSadaf Ebrahimi 			7,
470*9a0e4156SSadaf Ebrahimi 			SystemZSubRegIdxRanges,
471*9a0e4156SSadaf Ebrahimi 			SystemZRegEncodingTable);
472*9a0e4156SSadaf Ebrahimi 	*/
473*9a0e4156SSadaf Ebrahimi 
474*9a0e4156SSadaf Ebrahimi 	MCRegisterInfo_InitMCRegisterInfo(MRI, SystemZRegDesc, 194,
475*9a0e4156SSadaf Ebrahimi 			0, 0,
476*9a0e4156SSadaf Ebrahimi 			SystemZMCRegisterClasses, 21,
477*9a0e4156SSadaf Ebrahimi 			0, 0,
478*9a0e4156SSadaf Ebrahimi 			SystemZRegDiffLists,
479*9a0e4156SSadaf Ebrahimi 			0,
480*9a0e4156SSadaf Ebrahimi 			SystemZSubRegIdxLists, 7,
481*9a0e4156SSadaf Ebrahimi 			0);
482*9a0e4156SSadaf Ebrahimi }
483*9a0e4156SSadaf Ebrahimi 
484*9a0e4156SSadaf Ebrahimi #endif
485