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