1c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh//===-- XCoreInstPrinter.cpp - Convert XCore MCInst to assembly syntax --------===// 2c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// 3c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// The LLVM Compiler Infrastructure 4c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// 5c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// This file is distributed under the University of Illinois Open Source 6c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// License. See LICENSE.TXT for details. 7c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// 8c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh//===----------------------------------------------------------------------===// 9c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// 10c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// This class prints an XCore MCInst to a .s file. 11c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh// 12c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh//===----------------------------------------------------------------------===// 13c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 14c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh/* Capstone Disassembly Engine */ 15c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2014 */ 16c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 17c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#ifdef CAPSTONE_HAS_XCORE 18c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 19f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64) 20f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#pragma warning(disable : 4996) // disable MSVC's warning on strcpy() 21f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#pragma warning(disable : 28719) // disable MSVC's warning on strcpy() 22f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda#endif 23f177f92a7c9bea2dd7259577175cfa13579ec425Satoshi Tanda 24c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include <stdio.h> 25c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include <stdlib.h> 26c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include <string.h> 27b158b93a7d941a52bedd64ca6b78ff18de9b6ca3Nguyen Anh Quynh#include <platform.h> 28c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 29c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "XCoreInstPrinter.h" 30c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "../../MCInst.h" 31c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "../../utils.h" 32c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "../../SStream.h" 33c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "../../MCRegisterInfo.h" 34c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "../../MathExtras.h" 35c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "XCoreMapping.h" 36c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 3788fca42a5f7221710f2492595a1062459da2127aNguyen Anh Quynhstatic char *getRegisterName(unsigned RegNo); 38c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 39c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhvoid XCore_post_printer(csh ud, cs_insn *insn, char *insn_asm, MCInst *mci) 40c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 41c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh /* 42c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (((cs_struct *)ud)->detail != CS_OPT_ON) 43c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh return; 44c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh */ 45c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 46c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 47be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh// stw sed, sp[3] 483a5965eb05b53714597ab187f46504e8bc487b63Nguyen Anh Quynhvoid XCore_insn_extract(MCInst *MI, const char *code) 49be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh{ 50be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh int id; 51be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh char *p, *p2; 52be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh char tmp[128]; 53be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh 54b2e566ac88f4965faccee20592b8a4bdbcafc459Nguyen Anh Quynh strcpy(tmp, code); // safe because code is way shorter than 128 bytes 552a33afe6e822a36a21402be0df0719bde5a7469fNguyen Anh Quynh 56be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // find the first space 57be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p = strchr(tmp, ' '); 58be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (p) { 59be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p++; 60be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // find the next ',' 61be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p2 = strchr(p, ','); 62be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (p2) { 63be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh *p2 = '\0'; 64be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh id = XCore_reg_id(p); 65be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (id) { 66be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // register 67b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 68b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_REG; 69b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].reg = id; 70b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 71b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 72be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 73be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // next should be register, or memory? 74be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // skip space 75be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p2++; 76be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh while(*p2 && *p2 == ' ') 77be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p2++; 78be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (*p2) { 79be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // find '[' 80be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p = p2; 81be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh while(*p && *p != '[') 82be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p++; 83be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (*p) { 84be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // this is '[' 85be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh *p = '\0'; 86be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh id = XCore_reg_id(p2); 87be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (id) { 88be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // base register 89b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 90b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_MEM; 91a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base = (uint8_t)id; 92b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = XCORE_REG_INVALID; 93b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.disp = 0; 94b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.direct = 1; 95b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 96be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh 97be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p++; 98be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p2 = p; 99be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // until ']' 100be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh while(*p && *p != ']') 101be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh p++; 102be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (*p) { 103be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh *p = '\0'; 104be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // p2 is either index, or disp 105be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh id = XCore_reg_id(p2); 106be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (id) { 107be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // index register 108b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 109a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = (uint8_t)id; 110b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 111be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } else { 112be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // a number means disp 113b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 114b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.disp = atoi(p2); 115b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 116be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 117be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 118be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh 119b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 120b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 121b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 122be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 123be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } else { 124be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // a register? 125be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh id = XCore_reg_id(p2); 126be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (id) { 127be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // register 128b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 129b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_REG; 130b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].reg = id; 131b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 132b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 133be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 134be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 135be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 136be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } else { 137be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh id = XCore_reg_id(p); 138be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (id) { 139be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh // register 140b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh if (MI->csh->detail) { 141b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_REG; 142b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].reg = id; 143b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 144b95647d2c164d6d4549bef8129da6a82b164cce9Nguyen Anh Quynh } 145be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 146be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 147be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 148be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh} 149be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh 150c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhstatic void set_mem_access(MCInst *MI, bool status, int reg) 151c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 152c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MI->csh->detail != CS_OPT_ON) 153c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh return; 154c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 155c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh MI->csh->doing_mem = status; 156c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (status) { 157c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (reg != 0xffff && reg != -0xffff) { 15829fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_MEM; 159c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (reg) { 160a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base = (uint8_t)reg; 161c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 16229fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base = XCORE_REG_INVALID; 163c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 16429fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = XCORE_REG_INVALID; 16529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.disp = 0; 16629fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.direct = 1; 167c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 168c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh // the last op should be the memory base 16929fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count--; 17029fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_MEM; 171a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base = (uint8_t)MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].reg; 17229fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = XCORE_REG_INVALID; 17329fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.disp = 0; 174c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (reg > 0) 17529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.direct = 1; 176c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh else 17729fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.direct = -1; 178c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 179c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 180be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh if (reg) { 181a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = (uint8_t)reg; 1822a8091beb4ab52dbf61fd0bee4bbf6230ffcb383Nguyen Anh Quynh // done, create the next operand slot 1832a8091beb4ab52dbf61fd0bee4bbf6230ffcb383Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 184be2b788dc11eac143dd9cfa5075522fd263ec2c9Nguyen Anh Quynh } 185c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 186c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 187c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 188c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhstatic void _printOperand(MCInst *MI, MCOperand *MO, SStream *O) 189c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 190c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MCOperand_isReg(MO)) { 191c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh unsigned reg; 192c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 193c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh reg = MCOperand_getReg(MO); 19488fca42a5f7221710f2492595a1062459da2127aNguyen Anh Quynh SStream_concat0(O, getRegisterName(reg)); 195c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 196c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MI->csh->detail) { 197c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MI->csh->doing_mem) { 19829fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh if (MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base == ARM_REG_INVALID) 199a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.base = (uint8_t)reg; 200c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh else 201a6609fede895063c62b2ef5710dbc4e473924347tandasat MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.index = (uint8_t)reg; 202c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 20329fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_REG; 20429fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].reg = reg; 20529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 206c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 207c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 208c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else if (MCOperand_isImm(MO)) { 209c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh int32_t Imm = (int32_t)MCOperand_getImm(MO); 210c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 211c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (Imm >= 0) { 212c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (Imm > HEX_THRESHOLD) 213c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh SStream_concat(O, "0x%x", Imm); 214c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh else 215c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh SStream_concat(O, "%u", Imm); 216c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 217c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (Imm < -HEX_THRESHOLD) 218c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh SStream_concat(O, "-0x%x", -Imm); 219c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh else 220c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh SStream_concat(O, "-%u", -Imm); 221c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 222c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 223c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MI->csh->detail) { 224c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh if (MI->csh->doing_mem) { 22529fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].mem.disp = Imm; 226c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } else { 22729fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].type = XCORE_OP_IMM; 22829fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.operands[MI->flat_insn->detail->xcore.op_count].imm = Imm; 22929fd0f640567d3db5e1deacd2f78da75aedb2628Nguyen Anh Quynh MI->flat_insn->detail->xcore.op_count++; 230c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 231c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 232c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh } 233c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 234c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 235c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhstatic void printOperand(MCInst *MI, int OpNum, SStream *O) 236c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 23722278ec937103e3bac09599436e827d309018cb2Nguyen Anh Quynh if (OpNum >= MI->size) 23822278ec937103e3bac09599436e827d309018cb2Nguyen Anh Quynh return; 23922278ec937103e3bac09599436e827d309018cb2Nguyen Anh Quynh 240c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh _printOperand(MI, MCInst_getOperand(MI, OpNum), O); 241c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 242c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 243c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhstatic void printInlineJT(MCInst *MI, int OpNum, SStream *O) 244c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 245c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 246c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 247c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhstatic void printInlineJT32(MCInst *MI, int OpNum, SStream *O) 248c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 249c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 250c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 251c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#define PRINT_ALIAS_INSTR 252c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#include "XCoreGenAsmWriter.inc" 253c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 254c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynhvoid XCore_printInst(MCInst *MI, SStream *O, void *Info) 255c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh{ 256c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh printInstruction(MI, O, Info); 2577c2f5b615a34513865455d779bb4a47c61476d66Nguyen Anh Quynh set_mem_access(MI, false, 0); 258c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh} 259c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh 260c80d840ffce9f9bcb1ab0aeb9e890884cad7ebbfNguyen Anh Quynh#endif 261