/src/capstonenext/arch/Xtensa/XtensaInstPrinter.c
Line  | Count  | Source  | 
1  |  | /* Capstone Disassembly Engine, http://www.capstone-engine.org */  | 
2  |  | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */  | 
3  |  | /*    Rot127 <unisono@quyllur.org> 2022-2023 */  | 
4  |  | /* Automatically translated source file from LLVM. */  | 
5  |  |  | 
6  |  | /* LLVM-commit: <commit> */  | 
7  |  | /* LLVM-tag: <tag> */  | 
8  |  |  | 
9  |  | /* Only small edits allowed. */  | 
10  |  | /* For multiple similar edits, please create a Patch for the translator. */  | 
11  |  |  | 
12  |  | /* Capstone's C++ file translator: */  | 
13  |  | /* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */  | 
14  |  |  | 
15  |  | //===- XtensaInstPrinter.cpp - Convert Xtensa MCInst to asm syntax --------===//  | 
16  |  | //  | 
17  |  | //                     The LLVM Compiler Infrastructure  | 
18  |  | //  | 
19  |  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.  | 
20  |  | // See https://llvm.org/LICENSE.txt for license information.  | 
21  |  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  | 
22  |  | //  | 
23  |  | //===----------------------------------------------------------------------===//  | 
24  |  | //  | 
25  |  | // This class prints an Xtensa MCInst to a .s file.  | 
26  |  | //  | 
27  |  | //===----------------------------------------------------------------------===//  | 
28  |  |  | 
29  |  | #include <stdio.h>  | 
30  |  | #include <string.h>  | 
31  |  | #include <stdlib.h>  | 
32  |  | #include <capstone/platform.h>  | 
33  |  |  | 
34  |  | #include "../../MCInstPrinter.h"  | 
35  |  | #include "../../SStream.h"  | 
36  |  | #include "./priv.h"  | 
37  |  | #include "../../Mapping.h"  | 
38  |  |  | 
39  |  | #include "XtensaMapping.h"  | 
40  |  | #include "../../MathExtras.h"  | 
41  |  |  | 
42  |  | #define CONCAT(a, b) CONCAT_(a, b)  | 
43  |  | #define CONCAT_(a, b) a##_##b  | 
44  |  |  | 
45  |  | #define DEBUG_TYPE "asm-printer"  | 
46  |  | static MnemonicBitsInfo getMnemonic(MCInst *MI, SStream *O);  | 
47  |  | static const char *getRegisterName(unsigned RegNo);  | 
48  |  |  | 
49  |  | typedef MCRegister Register;  | 
50  |  |  | 
51  |  | static void printRegName(SStream *O, MCRegister Reg)  | 
52  | 78  | { | 
53  | 78  |   SStream_concat0(O, getRegisterName(Reg));  | 
54  | 78  | }  | 
55  |  |  | 
56  |  | static void printOp(MCInst *MI, MCOperand *MC, SStream *O)  | 
57  | 169k  | { | 
58  | 169k  |   if (MCOperand_isReg(MC))  | 
59  | 160k  |     SStream_concat0(O, getRegisterName(MCOperand_getReg(MC)));  | 
60  | 9.05k  |   else if (MCOperand_isImm(MC))  | 
61  | 9.05k  |     printInt64(O, MCOperand_getImm(MC));  | 
62  | 0  |   else if (MCOperand_isExpr(MC))  | 
63  | 0  |     printExpr(MCOperand_getExpr(MC), O);  | 
64  | 0  |   else  | 
65  | 0  |     CS_ASSERT("Invalid operand"); | 
66  | 169k  | }  | 
67  |  |  | 
68  |  | static void printOperand(MCInst *MI, const int op_num, SStream *O)  | 
69  | 160k  | { | 
70  | 160k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Operand, op_num);  | 
71  | 160k  |   printOp(MI, MCInst_getOperand(MI, op_num), O);  | 
72  | 160k  | }  | 
73  |  |  | 
74  |  | static inline void printMemOperand(MCInst *MI, int OpNum, SStream *OS)  | 
75  | 9.05k  | { | 
76  | 9.05k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_MemOperand, OpNum);  | 
77  | 9.05k  |   SStream_concat0(OS, getRegisterName(MCOperand_getReg(  | 
78  | 9.05k  |             MCInst_getOperand(MI, (OpNum)))));  | 
79  | 9.05k  |   SStream_concat0(OS, ", ");  | 
80  | 9.05k  |   printOp(MI, MCInst_getOperand(MI, OpNum + 1), OS);  | 
81  | 9.05k  | }  | 
82  |  |  | 
83  |  | static inline void printBranchTarget(MCInst *MI, int OpNum, SStream *OS)  | 
84  | 5.24k  | { | 
85  | 5.24k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_BranchTarget, OpNum);  | 
86  | 5.24k  |   MCOperand *MC = MCInst_getOperand(MI, (OpNum));  | 
87  | 5.24k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
88  | 5.24k  |     int64_t Val = MCOperand_getImm(MC) + 4;  | 
89  | 5.24k  |     SStream_concat0(OS, ". ");  | 
90  | 5.24k  |     if (Val > 0)  | 
91  | 2.78k  |       SStream_concat0(OS, "+");  | 
92  |  |  | 
93  | 5.24k  |     printInt64(OS, Val);  | 
94  | 5.24k  |   } else if (MCOperand_isExpr(MC))  | 
95  | 0  |     CS_ASSERT_RET(0 && "unimplemented expr printing");  | 
96  | 0  |   else  | 
97  | 0  |     CS_ASSERT(0 && "Invalid operand");  | 
98  | 5.24k  | }  | 
99  |  |  | 
100  |  | static inline void printLoopTarget(MCInst *MI, int OpNum, SStream *OS)  | 
101  | 212  | { | 
102  | 212  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_LoopTarget, OpNum);  | 
103  | 212  |   MCOperand *MC = MCInst_getOperand(MI, (OpNum));  | 
104  | 212  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
105  | 212  |     int64_t Val = MCOperand_getImm(MC) + 4;  | 
106  | 212  |     SStream_concat0(OS, ". ");  | 
107  | 212  |     if (Val > 0)  | 
108  | 212  |       SStream_concat0(OS, "+");  | 
109  |  |  | 
110  | 212  |     printInt64(OS, Val);  | 
111  | 212  |   } else if (MCOperand_isExpr(MC))  | 
112  | 0  |     CS_ASSERT_RET(0 && "unimplemented expr printing");  | 
113  | 0  |   else  | 
114  | 0  |     CS_ASSERT(0 && "Invalid operand");  | 
115  | 212  | }  | 
116  |  |  | 
117  |  | static inline void printJumpTarget(MCInst *MI, int OpNum, SStream *OS)  | 
118  | 1.56k  | { | 
119  | 1.56k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_JumpTarget, OpNum);  | 
120  | 1.56k  |   MCOperand *MC = MCInst_getOperand(MI, (OpNum));  | 
121  | 1.56k  |   if (MCOperand_isImm(MC)) { | 
122  | 1.56k  |     int64_t Val = MCOperand_getImm(MC) + 4;  | 
123  | 1.56k  |     SStream_concat0(OS, ". ");  | 
124  | 1.56k  |     if (Val > 0)  | 
125  | 1.02k  |       SStream_concat0(OS, "+");  | 
126  |  |  | 
127  | 1.56k  |     printInt64(OS, Val);  | 
128  | 1.56k  |   } else if (MCOperand_isExpr(MC))  | 
129  | 0  |     CS_ASSERT_RET(0 && "unimplemented expr printing");  | 
130  | 0  |   else  | 
131  | 0  |     CS_ASSERT(0 && "Invalid operand");  | 
132  | 1.56k  |   ;  | 
133  | 1.56k  | }  | 
134  |  |  | 
135  |  | static inline void printCallOperand(MCInst *MI, int OpNum, SStream *OS)  | 
136  | 2.50k  | { | 
137  | 2.50k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_CallOperand, OpNum);  | 
138  | 2.50k  |   MCOperand *MC = MCInst_getOperand(MI, (OpNum));  | 
139  | 2.50k  |   if (MCOperand_isImm(MC)) { | 
140  | 2.50k  |     int64_t Val = MCOperand_getImm(MC) + 4;  | 
141  | 2.50k  |     SStream_concat0(OS, ". ");  | 
142  | 2.50k  |     if (Val > 0)  | 
143  | 1.49k  |       SStream_concat0(OS, "+");  | 
144  |  |  | 
145  | 2.50k  |     printInt64(OS, Val);  | 
146  | 2.50k  |   } else if (MCOperand_isExpr(MC))  | 
147  | 0  |     CS_ASSERT_RET(0 && "unimplemented expr printing");  | 
148  | 0  |   else  | 
149  | 0  |     CS_ASSERT(0 && "Invalid operand");  | 
150  | 2.50k  | }  | 
151  |  |  | 
152  |  | static inline void printL32RTarget(MCInst *MI, int OpNum, SStream *O)  | 
153  | 5.77k  | { | 
154  | 5.77k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_L32RTarget, OpNum);  | 
155  | 5.77k  |   MCOperand *MC = MCInst_getOperand(MI, (OpNum));  | 
156  | 5.77k  |   if (MCOperand_isImm(MC)) { | 
157  | 5.77k  |     SStream_concat0(O, ". ");  | 
158  | 5.77k  |     printInt64(O, Xtensa_L32R_Value(MI, OpNum));  | 
159  | 5.77k  |   } else if (MCOperand_isExpr(MC))  | 
160  | 0  |     CS_ASSERT_RET(0 && "unimplemented expr printing");  | 
161  | 0  |   else  | 
162  | 0  |     CS_ASSERT(0 && "Invalid operand");  | 
163  | 5.77k  | }  | 
164  |  |  | 
165  |  | static inline void printImm8_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
166  | 334  | { | 
167  | 334  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8_AsmOperand, OpNum);  | 
168  | 334  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
169  | 334  |     int64_t Value =  | 
170  | 334  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
171  | 334  |     CS_ASSERT(  | 
172  | 334  |       isIntN(8, Value) &&  | 
173  | 334  |       "Invalid argument, value must be in ranges [-128,127]");  | 
174  | 334  |     printInt64(O, Value);  | 
175  | 334  |   } else { | 
176  | 0  |     printOperand(MI, OpNum, O);  | 
177  | 0  |   }  | 
178  | 334  | }  | 
179  |  |  | 
180  |  | static inline void printImm8_sh8_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
181  | 230  | { | 
182  | 230  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8_sh8_AsmOperand, OpNum);  | 
183  | 230  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
184  | 230  |     int64_t Value =  | 
185  | 230  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
186  | 230  |     CS_ASSERT(  | 
187  | 230  |       (isIntN(16, Value) && ((Value & 0xFF) == 0)) &&  | 
188  | 230  |       "Invalid argument, value must be multiples of 256 in range "  | 
189  | 230  |       "[-32768,32512]");  | 
190  | 230  |     printInt64(O, Value);  | 
191  | 230  |   } else  | 
192  | 0  |     printOperand(MI, OpNum, O);  | 
193  | 230  | }  | 
194  |  |  | 
195  |  | static inline void printImm12_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
196  | 0  | { | 
197  | 0  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm12_AsmOperand, OpNum);  | 
198  | 0  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
199  | 0  |     int64_t Value =  | 
200  | 0  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
201  | 0  |     CS_ASSERT(  | 
202  | 0  |       (Value >= -2048 && Value <= 2047) &&  | 
203  | 0  |       "Invalid argument, value must be in ranges [-2048,2047]");  | 
204  | 0  |     printInt64(O, Value);  | 
205  | 0  |   } else  | 
206  | 0  |     printOperand(MI, OpNum, O);  | 
207  | 0  | }  | 
208  |  |  | 
209  |  | static inline void printImm12m_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
210  | 888  | { | 
211  | 888  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm12m_AsmOperand, OpNum);  | 
212  | 888  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
213  | 888  |     int64_t Value =  | 
214  | 888  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
215  | 888  |     CS_ASSERT(  | 
216  | 888  |       (Value >= -2048 && Value <= 2047) &&  | 
217  | 888  |       "Invalid argument, value must be in ranges [-2048,2047]");  | 
218  | 888  |     printInt64(O, Value);  | 
219  | 888  |   } else  | 
220  | 0  |     printOperand(MI, OpNum, O);  | 
221  | 888  | }  | 
222  |  |  | 
223  |  | static inline void printUimm4_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
224  | 1.91k  | { | 
225  | 1.91k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Uimm4_AsmOperand, OpNum);  | 
226  | 1.91k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
227  | 1.91k  |     int64_t Value =  | 
228  | 1.91k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
229  | 1.91k  |     CS_ASSERT((Value >= 0 && Value <= 15) && "Invalid argument");  | 
230  | 1.91k  |     printInt64(O, Value);  | 
231  | 1.91k  |   } else  | 
232  | 0  |     printOperand(MI, OpNum, O);  | 
233  | 1.91k  | }  | 
234  |  |  | 
235  |  | static inline void printUimm5_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
236  | 3.34k  | { | 
237  | 3.34k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Uimm5_AsmOperand, OpNum);  | 
238  | 3.34k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
239  | 3.34k  |     int64_t Value =  | 
240  | 3.34k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
241  | 3.34k  |     CS_ASSERT((Value >= 0 && Value <= 31) && "Invalid argument");  | 
242  | 3.34k  |     printInt64(O, Value);  | 
243  | 3.34k  |   } else  | 
244  | 0  |     printOperand(MI, OpNum, O);  | 
245  | 3.34k  | }  | 
246  |  |  | 
247  |  | static inline void printShimm1_31_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
248  | 0  | { | 
249  | 0  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Shimm1_31_AsmOperand, OpNum);  | 
250  | 0  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
251  | 0  |     int64_t Value =  | 
252  | 0  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
253  | 0  |     CS_ASSERT((Value >= 1 && Value <= 31) &&  | 
254  | 0  |         "Invalid argument, value must be in range [1,31]");  | 
255  | 0  |     printInt64(O, Value);  | 
256  | 0  |   } else  | 
257  | 0  |     printOperand(MI, OpNum, O);  | 
258  | 0  | }  | 
259  |  |  | 
260  |  | static inline void printShimm0_31_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
261  | 892  | { | 
262  | 892  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Shimm0_31_AsmOperand, OpNum);  | 
263  | 892  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
264  | 892  |     int64_t Value =  | 
265  | 892  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
266  | 892  |     CS_ASSERT((Value >= 0 && Value <= 31) &&  | 
267  | 892  |         "Invalid argument, value must be in range [0,31]");  | 
268  | 892  |     printInt64(O, Value);  | 
269  | 892  |   } else  | 
270  | 0  |     printOperand(MI, OpNum, O);  | 
271  | 892  | }  | 
272  |  |  | 
273  |  | static inline void printImm1_16_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
274  | 1.07k  | { | 
275  | 1.07k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm1_16_AsmOperand, OpNum);  | 
276  | 1.07k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
277  | 1.07k  |     int64_t Value =  | 
278  | 1.07k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
279  | 1.07k  |     CS_ASSERT((Value >= 1 && Value <= 16) &&  | 
280  | 1.07k  |         "Invalid argument, value must be in range [1,16]");  | 
281  | 1.07k  |     printInt64(O, Value);  | 
282  | 1.07k  |   } else  | 
283  | 0  |     printOperand(MI, OpNum, O);  | 
284  | 1.07k  | }  | 
285  |  |  | 
286  |  | static inline void printImm1n_15_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
287  | 2.44k  | { | 
288  | 2.44k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm1n_15_AsmOperand, OpNum);  | 
289  | 2.44k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
290  | 2.44k  |     int64_t Value =  | 
291  | 2.44k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
292  | 2.44k  |     CS_ASSERT(  | 
293  | 2.44k  |       (Value >= -1 && (Value != 0) && Value <= 15) &&  | 
294  | 2.44k  |       "Invalid argument, value must be in ranges <-1,-1> or <1,15>");  | 
295  | 2.44k  |     printInt64(O, Value);  | 
296  | 2.44k  |   } else  | 
297  | 0  |     printOperand(MI, OpNum, O);  | 
298  | 2.44k  | }  | 
299  |  |  | 
300  |  | static inline void printImm32n_95_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
301  | 2.18k  | { | 
302  | 2.18k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm32n_95_AsmOperand, OpNum);  | 
303  | 2.18k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
304  | 2.18k  |     int64_t Value =  | 
305  | 2.18k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
306  | 2.18k  |     CS_ASSERT((Value >= -32 && Value <= 95) &&  | 
307  | 2.18k  |         "Invalid argument, value must be in ranges <-32,95>");  | 
308  | 2.18k  |     printInt64(O, Value);  | 
309  | 2.18k  |   } else  | 
310  | 0  |     printOperand(MI, OpNum, O);  | 
311  | 2.18k  | }  | 
312  |  |  | 
313  |  | static inline void printImm8n_7_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
314  | 295  | { | 
315  | 295  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8n_7_AsmOperand, OpNum);  | 
316  | 295  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
317  | 295  |     int64_t Value =  | 
318  | 295  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
319  | 295  |     CS_ASSERT((Value >= -8 && Value <= 7) &&  | 
320  | 295  |         "Invalid argument, value must be in ranges <-8,7>");  | 
321  | 295  |     printInt64(O, Value);  | 
322  | 295  |   } else  | 
323  | 0  |     printOperand(MI, OpNum, O);  | 
324  | 295  | }  | 
325  |  |  | 
326  |  | static inline void printImm64n_4n_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
327  | 202  | { | 
328  | 202  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm64n_4n_AsmOperand, OpNum);  | 
329  | 202  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
330  | 202  |     int64_t Value =  | 
331  | 202  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
332  | 202  |     CS_ASSERT((Value >= -64 && Value <= -4) &  | 
333  | 202  |           ((Value & 0x3) == 0) &&  | 
334  | 202  |         "Invalid argument, value must be in ranges <-64,-4>");  | 
335  | 202  |     printInt64(O, Value);  | 
336  | 202  |   } else  | 
337  | 0  |     printOperand(MI, OpNum, O);  | 
338  | 202  | }  | 
339  |  |  | 
340  |  | static inline void printOffset8m32_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
341  | 899  | { | 
342  | 899  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset8m32_AsmOperand,  | 
343  | 899  |              OpNum);  | 
344  | 899  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
345  | 899  |     int64_t Value =  | 
346  | 899  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
347  | 899  |     CS_ASSERT(  | 
348  | 899  |       (Value >= 0 && Value <= 1020 && ((Value & 0x3) == 0)) &&  | 
349  | 899  |       "Invalid argument, value must be multiples of four in range [0,1020]");  | 
350  | 899  |     printInt64(O, Value);  | 
351  | 899  |   } else  | 
352  | 0  |     printOperand(MI, OpNum, O);  | 
353  | 899  | }  | 
354  |  |  | 
355  |  | static inline void printEntry_Imm12_AsmOperand(MCInst *MI, int OpNum,  | 
356  |  |                  SStream *O)  | 
357  | 292  | { | 
358  | 292  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Entry_Imm12_AsmOperand,  | 
359  | 292  |              OpNum);  | 
360  | 292  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
361  | 292  |     int64_t Value =  | 
362  | 292  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
363  | 292  |     CS_ASSERT(  | 
364  | 292  |       (Value >= 0 && Value <= 32760) &&  | 
365  | 292  |       "Invalid argument, value must be multiples of eight in range "  | 
366  | 292  |       "<0,32760>");  | 
367  | 292  |     printInt64(O, Value);  | 
368  | 292  |   } else  | 
369  | 0  |     printOperand(MI, OpNum, O);  | 
370  | 292  | }  | 
371  |  |  | 
372  |  | static inline void printB4const_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
373  | 757  | { | 
374  | 757  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_B4const_AsmOperand, OpNum);  | 
375  | 757  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
376  | 757  |     int64_t Value =  | 
377  | 757  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
378  |  |  | 
379  | 757  |     switch (Value) { | 
380  | 76  |     case -1:  | 
381  | 93  |     case 1:  | 
382  | 154  |     case 2:  | 
383  | 317  |     case 3:  | 
384  | 323  |     case 4:  | 
385  | 333  |     case 5:  | 
386  | 466  |     case 6:  | 
387  | 591  |     case 7:  | 
388  | 593  |     case 8:  | 
389  | 602  |     case 10:  | 
390  | 649  |     case 12:  | 
391  | 718  |     case 16:  | 
392  | 719  |     case 32:  | 
393  | 720  |     case 64:  | 
394  | 751  |     case 128:  | 
395  | 757  |     case 256:  | 
396  | 757  |       break;  | 
397  | 0  |     default:  | 
398  | 0  |       CS_ASSERT((0) && "Invalid B4const argument");  | 
399  | 757  |     }  | 
400  | 757  |     printInt64(O, Value);  | 
401  | 757  |   } else  | 
402  | 0  |     printOperand(MI, OpNum, O);  | 
403  | 757  | }  | 
404  |  |  | 
405  |  | static inline void printB4constu_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
406  | 378  | { | 
407  | 378  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_B4constu_AsmOperand, OpNum);  | 
408  | 378  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
409  | 378  |     int64_t Value =  | 
410  | 378  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
411  |  |  | 
412  | 378  |     switch (Value) { | 
413  | 41  |     case 32768:  | 
414  | 50  |     case 65536:  | 
415  | 56  |     case 2:  | 
416  | 56  |     case 3:  | 
417  | 57  |     case 4:  | 
418  | 57  |     case 5:  | 
419  | 125  |     case 6:  | 
420  | 126  |     case 7:  | 
421  | 128  |     case 8:  | 
422  | 130  |     case 10:  | 
423  | 131  |     case 12:  | 
424  | 210  |     case 16:  | 
425  | 210  |     case 32:  | 
426  | 211  |     case 64:  | 
427  | 212  |     case 128:  | 
428  | 378  |     case 256:  | 
429  | 378  |       break;  | 
430  | 0  |     default:  | 
431  | 0  |       CS_ASSERT((0) && "Invalid B4constu argument");  | 
432  | 378  |     }  | 
433  | 378  |     printInt64(O, Value);  | 
434  | 378  |   } else  | 
435  | 0  |     printOperand(MI, OpNum, O);  | 
436  | 378  | }  | 
437  |  |  | 
438  |  | static inline void printImm7_22_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
439  | 107  | { | 
440  | 107  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm7_22_AsmOperand, OpNum);  | 
441  | 107  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
442  | 107  |     int64_t Value =  | 
443  | 107  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
444  | 107  |     CS_ASSERT((Value >= 7 && Value <= 22) &&  | 
445  | 107  |         "Invalid argument, value must be in range <7,22>");  | 
446  | 107  |     printInt64(O, Value);  | 
447  | 107  |   } else  | 
448  | 0  |     printOperand(MI, OpNum, O);  | 
449  | 107  | }  | 
450  |  |  | 
451  |  | static inline void printSelect_2_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
452  | 1.26k  | { | 
453  | 1.26k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_2_AsmOperand, OpNum);  | 
454  | 1.26k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
455  | 1.26k  |     int64_t Value =  | 
456  | 1.26k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
457  | 1.26k  |     CS_ASSERT((Value >= 0 && Value <= 1) &&  | 
458  | 1.26k  |         "Invalid argument, value must be in range [0,1]");  | 
459  | 1.26k  |     printInt64(O, Value);  | 
460  | 1.26k  |   } else  | 
461  | 0  |     printOperand(MI, OpNum, O);  | 
462  | 1.26k  | }  | 
463  |  |  | 
464  |  | static inline void printSelect_4_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
465  | 2.02k  | { | 
466  | 2.02k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_4_AsmOperand, OpNum);  | 
467  | 2.02k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
468  | 2.02k  |     int64_t Value =  | 
469  | 2.02k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
470  | 2.02k  |     CS_ASSERT((Value >= 0 && Value <= 3) &&  | 
471  | 2.02k  |         "Invalid argument, value must be in range [0,3]");  | 
472  | 2.02k  |     printInt64(O, Value);  | 
473  | 2.02k  |   } else  | 
474  | 0  |     printOperand(MI, OpNum, O);  | 
475  | 2.02k  | }  | 
476  |  |  | 
477  |  | static inline void printSelect_8_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
478  | 1.33k  | { | 
479  | 1.33k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_8_AsmOperand, OpNum);  | 
480  | 1.33k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
481  | 1.33k  |     int64_t Value =  | 
482  | 1.33k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
483  | 1.33k  |     CS_ASSERT((Value >= 0 && Value <= 7) &&  | 
484  | 1.33k  |         "Invalid argument, value must be in range [0,7]");  | 
485  | 1.33k  |     printInt64(O, Value);  | 
486  | 1.33k  |   } else  | 
487  | 0  |     printOperand(MI, OpNum, O);  | 
488  | 1.33k  | }  | 
489  |  |  | 
490  |  | static inline void printSelect_16_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
491  | 625  | { | 
492  | 625  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_16_AsmOperand, OpNum);  | 
493  | 625  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
494  | 625  |     int64_t Value =  | 
495  | 625  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
496  | 625  |     CS_ASSERT((Value >= 0 && Value <= 15) &&  | 
497  | 625  |         "Invalid argument, value must be in range [0,15]");  | 
498  | 625  |     printInt64(O, Value);  | 
499  | 625  |   } else  | 
500  | 0  |     printOperand(MI, OpNum, O);  | 
501  | 625  | }  | 
502  |  |  | 
503  |  | static inline void printSelect_256_AsmOperand(MCInst *MI, int OpNum, SStream *O)  | 
504  | 198  | { | 
505  | 198  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_256_AsmOperand,  | 
506  | 198  |              OpNum);  | 
507  | 198  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
508  | 198  |     int64_t Value =  | 
509  | 198  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
510  | 198  |     CS_ASSERT((Value >= 0 && Value <= 255) &&  | 
511  | 198  |         "Invalid argument, value must be in range [0,255]");  | 
512  | 198  |     printInt64(O, Value);  | 
513  | 198  |   } else  | 
514  | 0  |     printOperand(MI, OpNum, O);  | 
515  | 198  | }  | 
516  |  |  | 
517  |  | static inline void printOffset_16_16_AsmOperand(MCInst *MI, int OpNum,  | 
518  |  |             SStream *O)  | 
519  | 712  | { | 
520  | 712  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_16_16_AsmOperand,  | 
521  | 712  |              OpNum);  | 
522  | 712  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
523  | 712  |     int64_t Value =  | 
524  | 712  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
525  | 712  |     CS_ASSERT(  | 
526  | 712  |       (Value >= -128 && Value <= 112 && (Value & 0xf) == 0) &&  | 
527  | 712  |       "Invalid argument, value must be in range [-128,112], first 4 bits "  | 
528  | 712  |       "should be zero");  | 
529  | 712  |     printInt64(O, Value);  | 
530  | 712  |   } else { | 
531  | 0  |     printOperand(MI, OpNum, O);  | 
532  | 0  |   }  | 
533  | 712  | }  | 
534  |  |  | 
535  |  | static inline void printOffset_256_8_AsmOperand(MCInst *MI, int OpNum,  | 
536  |  |             SStream *O)  | 
537  | 2.06k  | { | 
538  | 2.06k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_8_AsmOperand,  | 
539  | 2.06k  |              OpNum);  | 
540  | 2.06k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
541  | 2.06k  |     int64_t Value =  | 
542  | 2.06k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
543  | 2.06k  |     CS_ASSERT(  | 
544  | 2.06k  |       (Value >= -1024 && Value <= 1016 &&  | 
545  | 2.06k  |        (Value & 0x7) == 0) &&  | 
546  | 2.06k  |       "Invalid argument, value must be in range [-1024,1016], first 3 "  | 
547  | 2.06k  |       "bits should be zero");  | 
548  | 2.06k  |     printInt64(O, Value);  | 
549  | 2.06k  |   } else  | 
550  | 0  |     printOperand(MI, OpNum, O);  | 
551  | 2.06k  | }  | 
552  |  |  | 
553  |  | static inline void printOffset_256_16_AsmOperand(MCInst *MI, int OpNum,  | 
554  |  |              SStream *O)  | 
555  | 1.72k  | { | 
556  | 1.72k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_16_AsmOperand,  | 
557  | 1.72k  |              OpNum);  | 
558  | 1.72k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
559  | 1.72k  |     int64_t Value =  | 
560  | 1.72k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
561  | 1.72k  |     CS_ASSERT(  | 
562  | 1.72k  |       (Value >= -2048 && Value <= 2032 &&  | 
563  | 1.72k  |        (Value & 0xf) == 0) &&  | 
564  | 1.72k  |       "Invalid argument, value must be in range [-2048,2032], first 4 "  | 
565  | 1.72k  |       "bits should be zero");  | 
566  | 1.72k  |     printInt64(O, Value);  | 
567  | 1.72k  |   } else { | 
568  | 0  |     printOperand(MI, OpNum, O);  | 
569  | 0  |   }  | 
570  | 1.72k  | }  | 
571  |  |  | 
572  |  | static inline void printOffset_256_4_AsmOperand(MCInst *MI, int OpNum,  | 
573  |  |             SStream *O)  | 
574  | 261  | { | 
575  | 261  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_4_AsmOperand,  | 
576  | 261  |              OpNum);  | 
577  | 261  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
578  | 261  |     int64_t Value =  | 
579  | 261  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
580  | 261  |     CS_ASSERT(  | 
581  | 261  |       (Value >= -512 && Value <= 508 && (Value & 0x3) == 0) &&  | 
582  | 261  |       "Invalid argument, value must be in range [-512,508], first 2 bits "  | 
583  | 261  |       "should be zero");  | 
584  | 261  |     printInt64(O, Value);  | 
585  | 261  |   } else  | 
586  | 0  |     printOperand(MI, OpNum, O);  | 
587  | 261  | }  | 
588  |  |  | 
589  |  | static inline void printOffset_128_2_AsmOperand(MCInst *MI, int OpNum,  | 
590  |  |             SStream *O)  | 
591  | 829  | { | 
592  | 829  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_128_2_AsmOperand,  | 
593  | 829  |              OpNum);  | 
594  | 829  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
595  | 829  |     int64_t Value =  | 
596  | 829  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
597  | 829  |     CS_ASSERT(  | 
598  | 829  |       (Value >= 0 && Value <= 254 && (Value & 0x1) == 0) &&  | 
599  | 829  |       "Invalid argument, value must be in range [0,254], first bit should "  | 
600  | 829  |       "be zero");  | 
601  | 829  |     printInt64(O, Value);  | 
602  | 829  |   } else  | 
603  | 0  |     printOperand(MI, OpNum, O);  | 
604  | 829  | }  | 
605  |  |  | 
606  |  | static inline void printOffset_128_1_AsmOperand(MCInst *MI, int OpNum,  | 
607  |  |             SStream *O)  | 
608  | 69  | { | 
609  | 69  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_128_1_AsmOperand,  | 
610  | 69  |              OpNum);  | 
611  | 69  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
612  | 69  |     int64_t Value =  | 
613  | 69  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
614  | 69  |     CS_ASSERT((Value >= 0 && Value <= 127) &&  | 
615  | 69  |         "Invalid argument, value must be in range [0,127]");  | 
616  | 69  |     printInt64(O, Value);  | 
617  | 69  |   } else  | 
618  | 0  |     printOperand(MI, OpNum, O);  | 
619  | 69  | }  | 
620  |  |  | 
621  |  | static inline void printOffset_64_16_AsmOperand(MCInst *MI, int OpNum,  | 
622  |  |             SStream *O)  | 
623  | 2.84k  | { | 
624  | 2.84k  |   Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_64_16_AsmOperand,  | 
625  | 2.84k  |              OpNum);  | 
626  | 2.84k  |   if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) { | 
627  | 2.84k  |     int64_t Value =  | 
628  | 2.84k  |       MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));  | 
629  | 2.84k  |     CS_ASSERT(  | 
630  | 2.84k  |       (Value >= -512 && Value <= 496 && (Value & 0xf) == 0) &&  | 
631  | 2.84k  |       "Invalid argument, value must be in range [-512,496], first 4 bits "  | 
632  | 2.84k  |       "should be zero");  | 
633  | 2.84k  |     printInt64(O, Value);  | 
634  | 2.84k  |   } else  | 
635  | 0  |     printOperand(MI, OpNum, O);  | 
636  | 2.84k  | }  | 
637  |  |  | 
638  |  | #define IMPL_printImmOperand(N, L, H, S) \  | 
639  |  |   static void printImmOperand_##N(MCInst *MI, int OpNum, SStream *O) \  | 
640  | 42  |   { \ | 
641  | 42  |     Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \  | 
642  | 42  |                OpNum); \  | 
643  | 42  |     MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \  | 
644  | 42  |     if (MCOperand_isImm(MC)) { \ | 
645  | 42  |       int64_t Value = MCOperand_getImm(MC); \  | 
646  | 42  |       CS_ASSERT((Value >= L && Value <= H && \  | 
647  | 42  |            ((Value % S) == 0)) && \  | 
648  | 42  |           "Invalid argument"); \  | 
649  | 42  |       printInt64(O, Value); \  | 
650  | 42  |     } else { \ | 
651  | 0  |       printOperand(MI, OpNum, O); \  | 
652  | 0  |     } \  | 
653  | 42  |   } Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_minus16_47_1 Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_minus16_14_2 XtensaInstPrinter.c:printImmOperand_minus32_28_4 Line  | Count  | Source  |  640  | 32  |   { \ |  641  | 32  |     Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \  |  642  | 32  |                OpNum); \  |  643  | 32  |     MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \  |  644  | 32  |     if (MCOperand_isImm(MC)) { \ |  645  | 32  |       int64_t Value = MCOperand_getImm(MC); \  |  646  | 32  |       CS_ASSERT((Value >= L && Value <= H && \  |  647  | 32  |            ((Value % S) == 0)) && \  |  648  | 32  |           "Invalid argument"); \  |  649  | 32  |       printInt64(O, Value); \  |  650  | 32  |     } else { \ |  651  | 0  |       printOperand(MI, OpNum, O); \  |  652  | 0  |     } \  |  653  | 32  |   }  |  
 XtensaInstPrinter.c:printImmOperand_minus64_56_8 Line  | Count  | Source  |  640  | 10  |   { \ |  641  | 10  |     Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \  |  642  | 10  |                OpNum); \  |  643  | 10  |     MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \  |  644  | 10  |     if (MCOperand_isImm(MC)) { \ |  645  | 10  |       int64_t Value = MCOperand_getImm(MC); \  |  646  | 10  |       CS_ASSERT((Value >= L && Value <= H && \  |  647  | 10  |            ((Value % S) == 0)) && \  |  648  | 10  |           "Invalid argument"); \  |  649  | 10  |       printInt64(O, Value); \  |  650  | 10  |     } else { \ |  651  | 0  |       printOperand(MI, OpNum, O); \  |  652  | 0  |     } \  |  653  | 10  |   }  |  
 Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_56_8 Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_3_1 Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_63_1  | 
654  |  |  | 
655  |  | IMPL_printImmOperand(minus64_56_8, -64, 56, 8);  | 
656  |  | IMPL_printImmOperand(minus32_28_4, -32, 28, 4);  | 
657  |  | IMPL_printImmOperand(minus16_47_1, -16, 47, 1);  | 
658  |  | IMPL_printImmOperand(minus16_14_2, -16, 14, 2);  | 
659  |  | IMPL_printImmOperand(0_56_8, 0, 56, 8);  | 
660  |  | IMPL_printImmOperand(0_3_1, 0, 3, 1);  | 
661  |  | IMPL_printImmOperand(0_63_1, 0, 63, 1);  | 
662  |  |  | 
663  |  | #include "XtensaGenAsmWriter.inc"  | 
664  |  |  | 
665  |  | static void printInst(MCInst *MI, uint64_t Address, const char *Annot,  | 
666  |  |           SStream *O)  | 
667  | 78.8k  | { | 
668  | 78.8k  |   unsigned Opcode = MCInst_getOpcode(MI);  | 
669  |  |  | 
670  | 78.8k  |   switch (Opcode) { | 
671  | 1.08k  |   case Xtensa_WSR: { | 
672  |  |     // INTERRUPT mnemonic is read-only, so use INTSET mnemonic instead  | 
673  | 1.08k  |     Register SR = MCOperand_getReg(MCInst_getOperand(MI, (0)));  | 
674  | 1.08k  |     if (SR == Xtensa_INTERRUPT) { | 
675  | 78  |       Register Reg =  | 
676  | 78  |         MCOperand_getReg(MCInst_getOperand(MI, (1)));  | 
677  | 78  |       SStream_concat1(O, '\t');  | 
678  | 78  |       SStream_concat(O, "%s", "wsr");  | 
679  | 78  |       SStream_concat0(O, "\t");  | 
680  |  |  | 
681  | 78  |       printRegName(O, Reg);  | 
682  | 78  |       SStream_concat(O, "%s", ", ");  | 
683  | 78  |       SStream_concat0(O, "intset");  | 
684  | 78  |       ;  | 
685  | 78  |       return;  | 
686  | 78  |     }  | 
687  | 1.08k  |   }  | 
688  | 78.8k  |   }  | 
689  | 78.7k  |   printInstruction(MI, Address, O);  | 
690  | 78.7k  | }  | 
691  |  |  | 
692  |  | void Xtensa_LLVM_printInstruction(MCInst *MI, uint64_t Address, SStream *O)  | 
693  | 78.8k  | { | 
694  | 78.8k  |   printInst(MI, Address, NULL, O);  | 
695  | 78.8k  | }  | 
696  |  |  | 
697  |  | const char *Xtensa_LLVM_getRegisterName(unsigned RegNo)  | 
698  | 9.16k  | { | 
699  | 9.16k  |   return getRegisterName(RegNo);  | 
700  | 9.16k  | }  |