/src/capstonenext/arch/X86/X86InstPrinterCommon.c
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- X86InstPrinterCommon.cpp - X86 assembly instruction printing -----===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | // |
10 | | // This file includes common code for rendering MCInst instances as Intel-style |
11 | | // and Intel-style assembly. |
12 | | // |
13 | | //===----------------------------------------------------------------------===// |
14 | | |
15 | | /* Capstone Disassembly Engine */ |
16 | | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */ |
17 | | |
18 | | #ifdef _MSC_VER |
19 | | // disable MSVC's warning on strncpy() |
20 | | #pragma warning(disable : 4996) |
21 | | // disable MSVC's warning on strncpy() |
22 | | #pragma warning(disable : 28719) |
23 | | #endif |
24 | | |
25 | | #if !defined(CAPSTONE_HAS_OSXKERNEL) |
26 | | #include <ctype.h> |
27 | | #endif |
28 | | #include <capstone/platform.h> |
29 | | |
30 | | #if defined(CAPSTONE_HAS_OSXKERNEL) |
31 | | #include <Availability.h> |
32 | | #include <libkern/libkern.h> |
33 | | #else |
34 | | #include <stdio.h> |
35 | | #include <stdlib.h> |
36 | | #endif |
37 | | |
38 | | #include <string.h> |
39 | | |
40 | | #include "../../utils.h" |
41 | | #include "../../MCInst.h" |
42 | | #include "../../SStream.h" |
43 | | |
44 | | #include "X86InstPrinterCommon.h" |
45 | | #include "X86Mapping.h" |
46 | | |
47 | | #ifndef CAPSTONE_X86_REDUCE |
48 | | void printSSEAVXCC(MCInst *MI, unsigned Op, SStream *O) |
49 | 20.2k | { |
50 | 20.2k | uint8_t Imm = |
51 | 20.2k | (uint8_t)(MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x1f); |
52 | 20.2k | switch (Imm) { |
53 | 0 | default: |
54 | 0 | break; //printf("Invalid avxcc argument!\n"); break; |
55 | 10.0k | case 0: |
56 | 10.0k | SStream_concat0(O, "eq"); |
57 | 10.0k | op_addAvxCC(MI, X86_AVX_CC_EQ); |
58 | 10.0k | break; |
59 | 1.35k | case 1: |
60 | 1.35k | SStream_concat0(O, "lt"); |
61 | 1.35k | op_addAvxCC(MI, X86_AVX_CC_LT); |
62 | 1.35k | break; |
63 | 913 | case 2: |
64 | 913 | SStream_concat0(O, "le"); |
65 | 913 | op_addAvxCC(MI, X86_AVX_CC_LE); |
66 | 913 | break; |
67 | 678 | case 3: |
68 | 678 | SStream_concat0(O, "unord"); |
69 | 678 | op_addAvxCC(MI, X86_AVX_CC_UNORD); |
70 | 678 | break; |
71 | 299 | case 4: |
72 | 299 | SStream_concat0(O, "neq"); |
73 | 299 | op_addAvxCC(MI, X86_AVX_CC_NEQ); |
74 | 299 | break; |
75 | 104 | case 5: |
76 | 104 | SStream_concat0(O, "nlt"); |
77 | 104 | op_addAvxCC(MI, X86_AVX_CC_NLT); |
78 | 104 | break; |
79 | 325 | case 6: |
80 | 325 | SStream_concat0(O, "nle"); |
81 | 325 | op_addAvxCC(MI, X86_AVX_CC_NLE); |
82 | 325 | break; |
83 | 316 | case 7: |
84 | 316 | SStream_concat0(O, "ord"); |
85 | 316 | op_addAvxCC(MI, X86_AVX_CC_ORD); |
86 | 316 | break; |
87 | 214 | case 8: |
88 | 214 | SStream_concat0(O, "eq_uq"); |
89 | 214 | op_addAvxCC(MI, X86_AVX_CC_EQ_UQ); |
90 | 214 | break; |
91 | 167 | case 9: |
92 | 167 | SStream_concat0(O, "nge"); |
93 | 167 | op_addAvxCC(MI, X86_AVX_CC_NGE); |
94 | 167 | break; |
95 | 212 | case 0xa: |
96 | 212 | SStream_concat0(O, "ngt"); |
97 | 212 | op_addAvxCC(MI, X86_AVX_CC_NGT); |
98 | 212 | break; |
99 | 485 | case 0xb: |
100 | 485 | SStream_concat0(O, "false"); |
101 | 485 | op_addAvxCC(MI, X86_AVX_CC_FALSE); |
102 | 485 | break; |
103 | 119 | case 0xc: |
104 | 119 | SStream_concat0(O, "neq_oq"); |
105 | 119 | op_addAvxCC(MI, X86_AVX_CC_NEQ_OQ); |
106 | 119 | break; |
107 | 202 | case 0xd: |
108 | 202 | SStream_concat0(O, "ge"); |
109 | 202 | op_addAvxCC(MI, X86_AVX_CC_GE); |
110 | 202 | break; |
111 | 46 | case 0xe: |
112 | 46 | SStream_concat0(O, "gt"); |
113 | 46 | op_addAvxCC(MI, X86_AVX_CC_GT); |
114 | 46 | break; |
115 | 313 | case 0xf: |
116 | 313 | SStream_concat0(O, "true"); |
117 | 313 | op_addAvxCC(MI, X86_AVX_CC_TRUE); |
118 | 313 | break; |
119 | 177 | case 0x10: |
120 | 177 | SStream_concat0(O, "eq_os"); |
121 | 177 | op_addAvxCC(MI, X86_AVX_CC_EQ_OS); |
122 | 177 | break; |
123 | 250 | case 0x11: |
124 | 250 | SStream_concat0(O, "lt_oq"); |
125 | 250 | op_addAvxCC(MI, X86_AVX_CC_LT_OQ); |
126 | 250 | break; |
127 | 224 | case 0x12: |
128 | 224 | SStream_concat0(O, "le_oq"); |
129 | 224 | op_addAvxCC(MI, X86_AVX_CC_LE_OQ); |
130 | 224 | break; |
131 | 195 | case 0x13: |
132 | 195 | SStream_concat0(O, "unord_s"); |
133 | 195 | op_addAvxCC(MI, X86_AVX_CC_UNORD_S); |
134 | 195 | break; |
135 | 56 | case 0x14: |
136 | 56 | SStream_concat0(O, "neq_us"); |
137 | 56 | op_addAvxCC(MI, X86_AVX_CC_NEQ_US); |
138 | 56 | break; |
139 | 414 | case 0x15: |
140 | 414 | SStream_concat0(O, "nlt_uq"); |
141 | 414 | op_addAvxCC(MI, X86_AVX_CC_NLT_UQ); |
142 | 414 | break; |
143 | 279 | case 0x16: |
144 | 279 | SStream_concat0(O, "nle_uq"); |
145 | 279 | op_addAvxCC(MI, X86_AVX_CC_NLE_UQ); |
146 | 279 | break; |
147 | 376 | case 0x17: |
148 | 376 | SStream_concat0(O, "ord_s"); |
149 | 376 | op_addAvxCC(MI, X86_AVX_CC_ORD_S); |
150 | 376 | break; |
151 | 194 | case 0x18: |
152 | 194 | SStream_concat0(O, "eq_us"); |
153 | 194 | op_addAvxCC(MI, X86_AVX_CC_EQ_US); |
154 | 194 | break; |
155 | 207 | case 0x19: |
156 | 207 | SStream_concat0(O, "nge_uq"); |
157 | 207 | op_addAvxCC(MI, X86_AVX_CC_NGE_UQ); |
158 | 207 | break; |
159 | 249 | case 0x1a: |
160 | 249 | SStream_concat0(O, "ngt_uq"); |
161 | 249 | op_addAvxCC(MI, X86_AVX_CC_NGT_UQ); |
162 | 249 | break; |
163 | 603 | case 0x1b: |
164 | 603 | SStream_concat0(O, "false_os"); |
165 | 603 | op_addAvxCC(MI, X86_AVX_CC_FALSE_OS); |
166 | 603 | break; |
167 | 749 | case 0x1c: |
168 | 749 | SStream_concat0(O, "neq_os"); |
169 | 749 | op_addAvxCC(MI, X86_AVX_CC_NEQ_OS); |
170 | 749 | break; |
171 | 305 | case 0x1d: |
172 | 305 | SStream_concat0(O, "ge_oq"); |
173 | 305 | op_addAvxCC(MI, X86_AVX_CC_GE_OQ); |
174 | 305 | break; |
175 | 18 | case 0x1e: |
176 | 18 | SStream_concat0(O, "gt_oq"); |
177 | 18 | op_addAvxCC(MI, X86_AVX_CC_GT_OQ); |
178 | 18 | break; |
179 | 114 | case 0x1f: |
180 | 114 | SStream_concat0(O, "true_us"); |
181 | 114 | op_addAvxCC(MI, X86_AVX_CC_TRUE_US); |
182 | 114 | break; |
183 | 20.2k | } |
184 | | |
185 | 20.2k | MI->popcode_adjust = Imm + 1; |
186 | 20.2k | } |
187 | | |
188 | | void printXOPCC(MCInst *MI, unsigned Op, SStream *O) |
189 | 4.00k | { |
190 | 4.00k | int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op)); |
191 | | |
192 | 4.00k | switch (Imm) { |
193 | 0 | default: // llvm_unreachable("Invalid xopcc argument!"); |
194 | 1.36k | case 0: |
195 | 1.36k | SStream_concat0(O, "lt"); |
196 | 1.36k | op_addXopCC(MI, X86_XOP_CC_LT); |
197 | 1.36k | break; |
198 | 718 | case 1: |
199 | 718 | SStream_concat0(O, "le"); |
200 | 718 | op_addXopCC(MI, X86_XOP_CC_LE); |
201 | 718 | break; |
202 | 490 | case 2: |
203 | 490 | SStream_concat0(O, "gt"); |
204 | 490 | op_addXopCC(MI, X86_XOP_CC_GT); |
205 | 490 | break; |
206 | 764 | case 3: |
207 | 764 | SStream_concat0(O, "ge"); |
208 | 764 | op_addXopCC(MI, X86_XOP_CC_GE); |
209 | 764 | break; |
210 | 180 | case 4: |
211 | 180 | SStream_concat0(O, "eq"); |
212 | 180 | op_addXopCC(MI, X86_XOP_CC_EQ); |
213 | 180 | break; |
214 | 309 | case 5: |
215 | 309 | SStream_concat0(O, "neq"); |
216 | 309 | op_addXopCC(MI, X86_XOP_CC_NEQ); |
217 | 309 | break; |
218 | 36 | case 6: |
219 | 36 | SStream_concat0(O, "false"); |
220 | 36 | op_addXopCC(MI, X86_XOP_CC_FALSE); |
221 | 36 | break; |
222 | 142 | case 7: |
223 | 142 | SStream_concat0(O, "true"); |
224 | 142 | op_addXopCC(MI, X86_XOP_CC_TRUE); |
225 | 142 | break; |
226 | 4.00k | } |
227 | 4.00k | } |
228 | | |
229 | | void printRoundingControl(MCInst *MI, unsigned Op, SStream *O) |
230 | 4.79k | { |
231 | 4.79k | int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x3; |
232 | 4.79k | switch (Imm) { |
233 | 1.54k | case 0: |
234 | 1.54k | SStream_concat0(O, "{rn-sae}"); |
235 | 1.54k | op_addAvxSae(MI); |
236 | 1.54k | op_addAvxRoundingMode(MI, X86_AVX_RM_RN); |
237 | 1.54k | break; |
238 | 754 | case 1: |
239 | 754 | SStream_concat0(O, "{rd-sae}"); |
240 | 754 | op_addAvxSae(MI); |
241 | 754 | op_addAvxRoundingMode(MI, X86_AVX_RM_RD); |
242 | 754 | break; |
243 | 1.87k | case 2: |
244 | 1.87k | SStream_concat0(O, "{ru-sae}"); |
245 | 1.87k | op_addAvxSae(MI); |
246 | 1.87k | op_addAvxRoundingMode(MI, X86_AVX_RM_RU); |
247 | 1.87k | break; |
248 | 631 | case 3: |
249 | 631 | SStream_concat0(O, "{rz-sae}"); |
250 | 631 | op_addAvxSae(MI); |
251 | 631 | op_addAvxRoundingMode(MI, X86_AVX_RM_RZ); |
252 | 631 | break; |
253 | 0 | default: |
254 | 0 | break; // never reach |
255 | 4.79k | } |
256 | 4.79k | } |
257 | | #endif |