105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//===-- SparcInstPrinter.cpp - Convert Sparc MCInst to assembly syntax --------===//
205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//
305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//                     The LLVM Compiler Infrastructure
405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//
505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh// This file is distributed under the University of Illinois Open Source
605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh// License. See LICENSE.TXT for details.
705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//
805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//===----------------------------------------------------------------------===//
905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//
1005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh// This class prints an Sparc MCInst to a .s file.
1105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//
1205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh//===----------------------------------------------------------------------===//
1305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
1405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh/* Capstone Disassembly Engine */
1505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */
1605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
178598a219f303802198439f9fc0884dffe19b3b11Nguyen Anh Quynh#ifdef CAPSTONE_HAS_SPARC
188598a219f303802198439f9fc0884dffe19b3b11Nguyen Anh Quynh
194b6b15fcb1e9824e1d298899882a61122286e282Nguyen Anh Quynh#ifdef _MSC_VER
204b6b15fcb1e9824e1d298899882a61122286e282Nguyen Anh Quynh#define _CRT_SECURE_NO_WARNINGS
214b6b15fcb1e9824e1d298899882a61122286e282Nguyen Anh Quynh#endif
224b6b15fcb1e9824e1d298899882a61122286e282Nguyen Anh Quynh
23f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)
24f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#pragma warning(disable:28719)		// disable MSVC's warning on strncpy()
25f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#endif
26f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda
2705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include <stdio.h>
2805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include <stdlib.h>
2905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include <string.h>
3005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
3105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "SparcInstPrinter.h"
3205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "../../MCInst.h"
3305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "../../utils.h"
3405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "../../SStream.h"
3505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "../../MCRegisterInfo.h"
3605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "../../MathExtras.h"
3705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "SparcMapping.h"
3805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
3905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "Sparc.h"
4005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
419b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynhstatic char *getRegisterName(unsigned RegNo);
4205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI);
4305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printMemOperand(MCInst *MI, int opNum, SStream *O, const char *Modifier);
4405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printOperand(MCInst *MI, int opNum, SStream *O);
4505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
461738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynhstatic void Sparc_add_hint(MCInst *MI, unsigned int hint)
471738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh{
481738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh	if (MI->csh->detail) {
491738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh		MI->flat_insn->detail->sparc.hint = hint;
501738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh	}
511738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh}
521738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh
531738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynhstatic void Sparc_add_reg(MCInst *MI, unsigned int reg)
541738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh{
551738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh	if (MI->csh->detail) {
561738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].type = SPARC_OP_REG;
571738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].reg = reg;
581738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh		MI->flat_insn->detail->sparc.op_count++;
591738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh	}
601738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh}
611738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh
6205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void set_mem_access(MCInst *MI, bool status)
6305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
6405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MI->csh->detail != CS_OPT_ON)
6505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;
6605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
6705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	MI->csh->doing_mem = status;
6805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
6905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (status) {
7029fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].type = SPARC_OP_MEM;
7129fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.base = SPARC_REG_INVALID;
7229fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.disp = 0;
7305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	} else {
7405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		// done, create the next operand slot
7529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh		MI->flat_insn->detail->sparc.op_count++;
7605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
7705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
7805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
7964564815081383385309135f6ae5b8502d28a9aaNguyen Anh Quynhvoid Sparc_post_printer(csh ud, cs_insn *insn, char *insn_asm, MCInst *mci)
8005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
8105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (((cs_struct *)ud)->detail != CS_OPT_ON)
8205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;
8305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
8405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	// fix up some instructions
8505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (insn->id == SPARC_INS_CASX) {
8605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		// first op is actually a memop, not regop
8705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		insn->detail->sparc.operands[0].type = SPARC_OP_MEM;
88a6609fede895063c62b2ef5710dbc4e473924347tandasat		insn->detail->sparc.operands[0].mem.base = (uint8_t)insn->detail->sparc.operands[0].reg;
8905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		insn->detail->sparc.operands[0].mem.disp = 0;
9005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
9105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
9205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
9305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printRegName(SStream *OS, unsigned RegNo)
9405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
959b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh	SStream_concat0(OS, "%");
969b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh	SStream_concat0(OS, getRegisterName(RegNo));
9705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
9805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
9905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#define GET_INSTRINFO_ENUM
10005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "SparcGenInstrInfo.inc"
10105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
10205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#define GET_REGINFO_ENUM
10305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "SparcGenRegisterInfo.inc"
10405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
10505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic bool printSparcAliasInstr(MCInst *MI, SStream *O)
10605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
10705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	switch (MCInst_getOpcode(MI)) {
10805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		default: return false;
10905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_JMPLrr:
11005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_JMPLri:
11105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 if (MCInst_getNumOperands(MI) != 3)
11205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 return false;
11305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 if (!MCOperand_isReg(MCInst_getOperand(MI, 0)))
11405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 return false;
11505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
11605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 switch (MCOperand_getReg(MCInst_getOperand(MI, 0))) {
11705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 default: return false;
11805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 case SP_G0: // jmp $addr | ret | retl
11905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  if (MCOperand_isImm(MCInst_getOperand(MI, 2)) &&
12005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh									MCOperand_getImm(MCInst_getOperand(MI, 2)) == 8) {
12105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh								  switch(MCOperand_getReg(MCInst_getOperand(MI, 1))) {
12205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh									  default: break;
1231738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh									  case SP_I7: SStream_concat0(O, "ret"); MCInst_setOpcodePub(MI, SPARC_INS_RET); return true;
1241738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh									  case SP_O7: SStream_concat0(O, "retl"); MCInst_setOpcodePub(MI, SPARC_INS_RETL); return true;
12505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh								  }
12605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  }
12705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
1289b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh							  SStream_concat0(O, "jmp\t");
1291738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh							  MCInst_setOpcodePub(MI, SPARC_INS_JMP);
13005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  printMemOperand(MI, 1, O, NULL);
13105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  return true;
13205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 case SP_O7: // call $addr
1339b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh							  SStream_concat0(O, "call ");
1341738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh							  MCInst_setOpcodePub(MI, SPARC_INS_CALL);
13505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  printMemOperand(MI, 1, O, NULL);
13605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh							  return true;
13705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 }
13805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPS:
13905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPD:
14005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPQ:
14105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPES:
14205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPED:
14305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_V9FCMPEQ:
14405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 if (MI->csh->mode & CS_MODE_V9 || (MCInst_getNumOperands(MI) != 3) ||
14505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh						 (!MCOperand_isReg(MCInst_getOperand(MI, 0))) ||
14605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh						 (MCOperand_getReg(MCInst_getOperand(MI, 0)) != SP_FCC0))
14705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh						 return false;
14805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 // if V8, skip printing %fcc0.
14905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 switch(MCInst_getOpcode(MI)) {
15005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh					 default:
1511738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPS:  SStream_concat0(O, "fcmps\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPS); break;
1521738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPD:  SStream_concat0(O, "fcmpd\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPD); break;
1531738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPQ:  SStream_concat0(O, "fcmpq\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPQ); break;
1541738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPES: SStream_concat0(O, "fcmpes\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPES); break;
1551738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPED: SStream_concat0(O, "fcmped\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPED); break;
1561738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh					 case SP_V9FCMPEQ: SStream_concat0(O, "fcmpeq\t"); MCInst_setOpcodePub(MI, SPARC_INS_FCMPEQ); break;
15705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 }
15805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 printOperand(MI, 1, O);
1599b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh				 SStream_concat0(O, ", ");
16005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 printOperand(MI, 2, O);
16105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 return true;
16205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
16305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
16405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
16505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printOperand(MCInst *MI, int opNum, SStream *O)
16605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
16740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan	int Imm;
16805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	unsigned reg;
16905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	MCOperand *MO = MCInst_getOperand(MI, opNum);
17005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
17105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MCOperand_isReg(MO)) {
17205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		reg = MCOperand_getReg(MO);
17305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		printRegName(O, reg);
17405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		reg = Sparc_map_register(reg);
17505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
17605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		if (MI->csh->detail) {
17705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			if (MI->csh->doing_mem) {
17829fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				if (MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.base)
179a6609fede895063c62b2ef5710dbc4e473924347tandasat					MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.index = (uint8_t)reg;
18005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				else
181a6609fede895063c62b2ef5710dbc4e473924347tandasat					MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.base = (uint8_t)reg;
18205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			} else {
18329fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].type = SPARC_OP_REG;
18429fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].reg = reg;
18529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.op_count++;
18605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			}
18705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		}
18805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
18905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;
19005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
19105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
19205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MCOperand_isImm(MO)) {
19305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		Imm = (int)MCOperand_getImm(MO);
194e16813d8e8357a5e42acbbc96048c213a971e3ceNguyen Anh Quynh
19527a22f8633178df25120782c936dceb5f08d4fd5NighterMan		// Conditional branches displacements needs to be signextended to be
19627a22f8633178df25120782c936dceb5f08d4fd5NighterMan		// able to jump backwards.
19727a22f8633178df25120782c936dceb5f08d4fd5NighterMan		//
19827a22f8633178df25120782c936dceb5f08d4fd5NighterMan		// Displacements are measured as the number of instructions forward or
19927a22f8633178df25120782c936dceb5f08d4fd5NighterMan		// backward, so they need to be multiplied by 4
20040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan		switch (MI->Opcode) {
20140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_CALL:
20240e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				Imm = SignExtend32(Imm, 30);
20340e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				Imm += (uint32_t)MI->address;
20440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				break;
20527a22f8633178df25120782c936dceb5f08d4fd5NighterMan
20640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			// Branch on integer condition with prediction (BPcc)
20740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			// Branch on floating point condition with prediction (FBPfcc)
20840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPICC:
20940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPICCA:
21040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPICCANT:
21140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPICCNT:
21240e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPXCC:
21340e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPXCCA:
21440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPXCCANT:
21540e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPXCCNT:
21640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPFCC:
21740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPFCCA:
21840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPFCCANT:
21940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPFCCNT:
22040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				Imm = SignExtend32(Imm, 19);
22140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				Imm = (uint32_t)MI->address + Imm * 4;
22240e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				break;
22327a22f8633178df25120782c936dceb5f08d4fd5NighterMan
22440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			// Branch on integer condition (Bicc)
22540e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			// Branch on floating point condition (FBfcc)
22640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BA:
22740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BCOND:
22840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BCONDA:
22940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_FBCOND:
23040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_FBCONDA:
23140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan				Imm = SignExtend32(Imm, 22);
23227a22f8633178df25120782c936dceb5f08d4fd5NighterMan				Imm = (uint32_t)MI->address + Imm * 4;
23327a22f8633178df25120782c936dceb5f08d4fd5NighterMan				break;
23440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan
23540e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			// Branch on integer register with prediction (BPr)
23640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGEZapn:
23740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGEZapt:
23840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGEZnapn:
23940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGEZnapt:
24040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGZapn:
24140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGZapt:
24240e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGZnapn:
24340e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPGZnapt:
24440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLEZapn:
24540e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLEZapt:
24640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLEZnapn:
24740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLEZnapt:
24840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLZapn:
24940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLZapt:
25040e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLZnapn:
25140e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPLZnapt:
25240e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPNZapn:
25340e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPNZapt:
25440e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPNZnapn:
25540e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPNZnapt:
25640e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPZapn:
25740e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPZapt:
25840e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPZnapn:
25940e6a999f0cfbcc381b061c90cf658e958348dd4NighterMan			case SP_BPZnapt:
26027a22f8633178df25120782c936dceb5f08d4fd5NighterMan				Imm = SignExtend32(Imm, 16);
26127a22f8633178df25120782c936dceb5f08d4fd5NighterMan				Imm = (uint32_t)MI->address + Imm * 4;
26227a22f8633178df25120782c936dceb5f08d4fd5NighterMan				break;
26327a22f8633178df25120782c936dceb5f08d4fd5NighterMan		}
264e16813d8e8357a5e42acbbc96048c213a971e3ceNguyen Anh Quynh
265a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh		if (Imm >= 0) {
266a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh			if (Imm > HEX_THRESHOLD)
267a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh				SStream_concat(O, "0x%x", Imm);
268a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh			else
269a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh				SStream_concat(O, "%u", Imm);
270a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh		} else {
271a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh			if (Imm < -HEX_THRESHOLD)
272a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh				SStream_concat(O, "-0x%x", -Imm);
273a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh			else
274a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh				SStream_concat(O, "-%u", -Imm);
275a3c9bd678faed15a0f8c3463933c79b541246317Nguyen Anh Quynh		}
27605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
27705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		if (MI->csh->detail) {
27805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			if (MI->csh->doing_mem) {
27929fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].mem.disp = Imm;
28005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			} else {
28129fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].type = SPARC_OP_IMM;
28229fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].imm = Imm;
28329fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh				MI->flat_insn->detail->sparc.op_count++;
28405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			}
28505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		}
28605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
28705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
28805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	return;
28905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
29005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
29105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printMemOperand(MCInst *MI, int opNum, SStream *O, const char *Modifier)
29205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
29305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	MCOperand *MO;
29405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
29505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	set_mem_access(MI, true);
29605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	printOperand(MI, opNum, O);
29705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
29805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	// If this is an ADD operand, emit it like normal operands.
29905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (Modifier && !strcmp(Modifier, "arith")) {
3009b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh		SStream_concat0(O, ", ");
30105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		printOperand(MI, opNum + 1, O);
30205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		set_mem_access(MI, false);
30305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;
30405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
30505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
30605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	MO = MCInst_getOperand(MI, opNum + 1);
30705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
30805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MCOperand_isReg(MO) && (MCOperand_getReg(MO) == SP_G0)) {
30905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		set_mem_access(MI, false);
31005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;   // don't print "+%g0"
31105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
31205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
31305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MCOperand_isImm(MO) && (MCOperand_getImm(MO) == 0)) {
31405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		set_mem_access(MI, false);
31505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		return;   // don't print "+0"
31605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
31705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
3181738a3e6bfefcae4efce3bbcf557702ac7a44843Nguyen Anh Quynh	SStream_concat0(O, "+");	// qq
31905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
32005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	printOperand(MI, opNum + 1, O);
32105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	set_mem_access(MI, false);
32205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
32305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
32405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic void printCCOperand(MCInst *MI, int opNum, SStream *O)
32505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
3265d6383e335bdc98b0f14c43e7221ad61b85f8d08Nguyen Anh Quynh	int CC = (int)MCOperand_getImm(MCInst_getOperand(MI, opNum)) + 256;
32705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
32805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	switch (MCInst_getOpcode(MI)) {
32905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		default: break;
33005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_FBCOND:
33105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_FBCONDA:
33205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_BPFCC:
33305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_BPFCCA:
33405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_BPFCCNT:
33505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_BPFCCANT:
33605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_MOVFCCrr:  case SP_V9MOVFCCrr:
33705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_MOVFCCri:  case SP_V9MOVFCCri:
33805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_FMOVS_FCC: case SP_V9FMOVS_FCC:
33905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_FMOVD_FCC: case SP_V9FMOVD_FCC:
34005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		case SP_FMOVQ_FCC: case SP_V9FMOVQ_FCC:
34105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 // Make sure CC is a fp conditional flag.
3425d6383e335bdc98b0f14c43e7221ad61b85f8d08Nguyen Anh Quynh				 CC = (CC < 16+256) ? (CC + 16) : CC;
34305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh				 break;
34405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
34505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
3469b91de0ae349c5e9be25c40dd5901483d76a0939Nguyen Anh Quynh	SStream_concat0(O, SPARCCondCodeToString((sparc_cc)CC));
34705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
34805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	if (MI->csh->detail)
34929fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh		MI->flat_insn->detail->sparc.cc = (sparc_cc)CC;
35005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
35105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
35205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
35305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhstatic bool printGetPCX(MCInst *MI, unsigned opNum, SStream *O)
35405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
35505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	return true;
35605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
35705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
35805e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
35905e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#define PRINT_ALIAS_INSTR
36005e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh#include "SparcGenAsmWriter.inc"
36105e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
36205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynhvoid Sparc_printInst(MCInst *MI, SStream *O, void *Info)
36305e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh{
364a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh	char *mnem, *p;
365a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh	char instr[64];	// Sparc has no instruction this long
36605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh
36705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	mnem = printAliasInstr(MI, O, Info);
368159ddbd99fae8c435f815aa5251bb6466160cb91Nguyen Anh Quynh	if (mnem) {
369159ddbd99fae8c435f815aa5251bb6466160cb91Nguyen Anh Quynh		// fixup instruction id due to the change in alias instruction
370a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		strncpy(instr, mnem, strlen(mnem));
371a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		instr[strlen(mnem)] = '\0';
372a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		// does this contains hint with a coma?
373a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		p = strchr(instr, ',');
374a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		if (p)
375a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			*p = '\0';	// now instr only has instruction mnemonic
376a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		MCInst_setOpcodePub(MI, Sparc_map_insn(instr));
377a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		switch(MCInst_getOpcode(MI)) {
378a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BCOND:
379a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BCONDA:
380a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPICCANT:
381a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPICCNT:
382a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPXCCANT:
383a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPXCCNT:
384a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_TXCCri:
385a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_TXCCrr:
386a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
387a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'b', 't'
388a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_ICC(instr + 1);
389a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
390a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
391a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
392a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPFCCANT:
393a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_BPFCCNT:
394a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
395a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'fb'
396a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_FCC(instr + 2);
397a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
398a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
399a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
400a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVD_ICC:
401a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVD_XCC:
402a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVQ_ICC:
403a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVQ_XCC:
404a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVS_ICC:
405a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_FMOVS_XCC:
406a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
407a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'fmovd', 'fmovq', 'fmovs'
408a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_ICC(instr + 5);
409a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
410a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
411a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
412a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_MOVICCri:
413a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_MOVICCrr:
414a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_MOVXCCri:
415a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_MOVXCCrr:
416a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
417a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'mov'
418a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_ICC(instr + 3);
419a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
420a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
421a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
422a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_V9FMOVD_FCC:
423a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_V9FMOVQ_FCC:
424a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_V9FMOVS_FCC:
425a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
426a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'fmovd', 'fmovq', 'fmovs'
427a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_FCC(instr + 5);
428a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
429a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
430a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
431a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_V9MOVFCCri:
432a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			case SP_V9MOVFCCrr:
433a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				if (MI->csh->detail) {
434a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					// skip 'mov'
435a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.cc = Sparc_map_FCC(instr + 3);
436a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh					MI->flat_insn->detail->sparc.hint = Sparc_map_hint(mnem);
437a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				}
438a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
439a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh			default:
440a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh				break;
441a726402513883fb8cec45958c457c788e128f353Nguyen Anh Quynh		}
44205e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		cs_mem_free(mnem);
443159ddbd99fae8c435f815aa5251bb6466160cb91Nguyen Anh Quynh	} else {
44405e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh		if (!printSparcAliasInstr(MI, O))
44505e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh			printInstruction(MI, O, NULL);
44605e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh	}
44705e27138aef5dea54576d2916d92d2f7bd1f3956Nguyen Anh Quynh}
4488598a219f303802198439f9fc0884dffe19b3b11Nguyen Anh Quynh
449b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynhvoid Sparc_addReg(MCInst *MI, int reg)
450b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh{
451b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh	if (MI->csh->detail) {
452b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].type = SPARC_OP_REG;
453b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh		MI->flat_insn->detail->sparc.operands[MI->flat_insn->detail->sparc.op_count].reg = reg;
454b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh		MI->flat_insn->detail->sparc.op_count++;
455b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh	}
456b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh}
457b6f4c1da05a76cc349ff3df850a990ea666bbb89Nguyen Anh Quynh
4588598a219f303802198439f9fc0884dffe19b3b11Nguyen Anh Quynh#endif
459