17 #ifdef CAPSTONE_HAS_SPARC
20 #define _CRT_SECURE_NO_WARNINGS
23 #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)
24 #pragma warning(disable:28719) // disable MSVC's warning on strncpy()
33 #include "../../MCInst.h"
34 #include "../../utils.h"
35 #include "../../SStream.h"
36 #include "../../MCRegisterInfo.h"
37 #include "../../MathExtras.h"
42 static const char *getRegisterName(
unsigned RegNo);
44 static void printMemOperand(
MCInst *MI,
int opNum,
SStream *O,
const char *Modifier);
47 static void Sparc_add_hint(
MCInst *MI,
unsigned int hint)
54 static void Sparc_add_reg(
MCInst *MI,
unsigned int reg)
58 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].reg = reg;
73 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].mem.disp = 0;
89 insn->detail->sparc.operands[0].mem.base = (
uint8_t)insn->detail->sparc.operands[0].reg;
90 insn->detail->sparc.operands[0].mem.disp = 0;
94 static void printRegName(
SStream *
OS,
unsigned RegNo)
100 #define GET_INSTRINFO_ENUM
101 #include "SparcGenInstrInfo.inc"
103 #define GET_REGINFO_ENUM
104 #include "SparcGenRegisterInfo.inc"
109 default:
return false;
118 default:
return false;
131 printMemOperand(MI, 1, O, NULL);
136 printMemOperand(MI, 1, O, NULL);
159 printOperand(MI, 1, O);
161 printOperand(MI, 2, O);
174 printRegName(O, reg);
179 if (MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].mem.base)
185 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].reg = reg;
270 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].mem.disp = Imm;
273 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].imm = Imm;
282 static void printMemOperand(
MCInst *MI,
int opNum,
SStream *O,
const char *Modifier)
286 set_mem_access(MI,
true);
287 printOperand(MI, opNum, O);
290 if (Modifier && !strcmp(Modifier,
"arith")) {
292 printOperand(MI, opNum + 1, O);
293 set_mem_access(MI,
false);
300 set_mem_access(MI,
false);
305 set_mem_access(MI,
false);
311 printOperand(MI, opNum + 1, O);
312 set_mem_access(MI,
false);
315 static void printCCOperand(
MCInst *MI,
int opNum,
SStream *O)
327 case SP_MOVFCCrr:
case SP_V9MOVFCCrr:
328 case SP_MOVFCCri:
case SP_V9MOVFCCri:
329 case SP_FMOVS_FCC:
case SP_V9FMOVS_FCC:
330 case SP_FMOVD_FCC:
case SP_V9FMOVD_FCC:
331 case SP_FMOVQ_FCC:
case SP_V9FMOVQ_FCC:
333 CC = (
CC < 16+256) ? (
CC + 16) :
CC;
344 static bool printGetPCX(
MCInst *MI,
unsigned opNum,
SStream *O)
350 #define PRINT_ALIAS_INSTR
351 #include "SparcGenAsmWriter.inc"
358 mnem = printAliasInstr(MI, O, Info);
361 strncpy(instr, mnem,
sizeof(instr));
362 instr[
sizeof(instr) - 1] =
'\0';
364 p = strchr(instr,
',');
435 if (!printSparcAliasInstr(MI, O))
436 printInstruction(MI, O, NULL);
444 MI->
flat_insn->detail->sparc.operands[MI->
flat_insn->detail->sparc.op_count].reg = reg;