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