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