/src/capstonev5/arch/X86/X86InstPrinterCommon.c
Line  | Count  | Source  | 
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  |  | #if defined (WIN32) || defined (WIN64) || defined (_WIN32) || defined (_WIN64)  | 
19  |  | #pragma warning(disable:4996)     // disable MSVC's warning on strncpy()  | 
20  |  | #pragma warning(disable:28719)    // disable MSVC's warning on strncpy()  | 
21  |  | #endif  | 
22  |  |  | 
23  |  | #if !defined(CAPSTONE_HAS_OSXKERNEL)  | 
24  |  | #include <ctype.h>  | 
25  |  | #endif  | 
26  |  | #include <capstone/platform.h>  | 
27  |  |  | 
28  |  | #if defined(CAPSTONE_HAS_OSXKERNEL)  | 
29  |  | #include <Availability.h>  | 
30  |  | #include <libkern/libkern.h>  | 
31  |  | #else  | 
32  |  | #include <stdio.h>  | 
33  |  | #include <stdlib.h>  | 
34  |  | #endif  | 
35  |  |  | 
36  |  | #include <string.h>  | 
37  |  |  | 
38  |  | #include "../../utils.h"  | 
39  |  | #include "../../MCInst.h"  | 
40  |  | #include "../../SStream.h"  | 
41  |  |  | 
42  |  | #include "X86InstPrinterCommon.h"  | 
43  |  | #include "X86Mapping.h"  | 
44  |  |  | 
45  |  | #ifndef CAPSTONE_X86_REDUCE  | 
46  |  | void printSSEAVXCC(MCInst *MI, unsigned Op, SStream *O)  | 
47  | 24.9k  | { | 
48  | 24.9k  |   uint8_t Imm = (uint8_t)(MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x1f);  | 
49  | 24.9k  |   switch (Imm) { | 
50  | 0  |     default: break;//printf("Invalid avxcc argument!\n"); break; | 
51  | 10.4k  |     case    0: SStream_concat0(O, "eq"); op_addAvxCC(MI, X86_AVX_CC_EQ); break;  | 
52  | 2.31k  |     case    1: SStream_concat0(O, "lt"); op_addAvxCC(MI, X86_AVX_CC_LT); break;  | 
53  | 1.11k  |     case    2: SStream_concat0(O, "le"); op_addAvxCC(MI, X86_AVX_CC_LE); break;  | 
54  | 770  |     case    3: SStream_concat0(O, "unord"); op_addAvxCC(MI, X86_AVX_CC_UNORD); break;  | 
55  | 332  |     case    4: SStream_concat0(O, "neq"); op_addAvxCC(MI, X86_AVX_CC_NEQ); break;  | 
56  | 390  |     case    5: SStream_concat0(O, "nlt"); op_addAvxCC(MI, X86_AVX_CC_NLT); break;  | 
57  | 223  |     case    6: SStream_concat0(O, "nle"); op_addAvxCC(MI, X86_AVX_CC_NLE); break;  | 
58  | 442  |     case    7: SStream_concat0(O, "ord"); op_addAvxCC(MI, X86_AVX_CC_ORD); break;  | 
59  | 460  |     case    8: SStream_concat0(O, "eq_uq"); op_addAvxCC(MI, X86_AVX_CC_EQ_UQ); break;  | 
60  | 404  |     case    9: SStream_concat0(O, "nge"); op_addAvxCC(MI, X86_AVX_CC_NGE); break;  | 
61  | 105  |     case  0xa: SStream_concat0(O, "ngt"); op_addAvxCC(MI, X86_AVX_CC_NGT); break;  | 
62  | 590  |     case  0xb: SStream_concat0(O, "false"); op_addAvxCC(MI, X86_AVX_CC_FALSE); break;  | 
63  | 271  |     case  0xc: SStream_concat0(O, "neq_oq"); op_addAvxCC(MI, X86_AVX_CC_NEQ_OQ); break;  | 
64  | 112  |     case  0xd: SStream_concat0(O, "ge"); op_addAvxCC(MI, X86_AVX_CC_GE); break;  | 
65  | 112  |     case  0xe: SStream_concat0(O, "gt"); op_addAvxCC(MI, X86_AVX_CC_GT); break;  | 
66  | 208  |     case  0xf: SStream_concat0(O, "true"); op_addAvxCC(MI, X86_AVX_CC_TRUE); break;  | 
67  | 370  |     case 0x10: SStream_concat0(O, "eq_os"); op_addAvxCC(MI, X86_AVX_CC_EQ_OS); break;  | 
68  | 239  |     case 0x11: SStream_concat0(O, "lt_oq"); op_addAvxCC(MI, X86_AVX_CC_LT_OQ); break;  | 
69  | 354  |     case 0x12: SStream_concat0(O, "le_oq"); op_addAvxCC(MI, X86_AVX_CC_LE_OQ); break;  | 
70  | 269  |     case 0x13: SStream_concat0(O, "unord_s"); op_addAvxCC(MI, X86_AVX_CC_UNORD_S); break;  | 
71  | 447  |     case 0x14: SStream_concat0(O, "neq_us"); op_addAvxCC(MI, X86_AVX_CC_NEQ_US); break;  | 
72  | 992  |     case 0x15: SStream_concat0(O, "nlt_uq"); op_addAvxCC(MI, X86_AVX_CC_NLT_UQ); break;  | 
73  | 115  |     case 0x16: SStream_concat0(O, "nle_uq"); op_addAvxCC(MI, X86_AVX_CC_NLE_UQ); break;  | 
74  | 389  |     case 0x17: SStream_concat0(O, "ord_s"); op_addAvxCC(MI, X86_AVX_CC_ORD_S); break;  | 
75  | 291  |     case 0x18: SStream_concat0(O, "eq_us"); op_addAvxCC(MI, X86_AVX_CC_EQ_US); break;  | 
76  | 202  |     case 0x19: SStream_concat0(O, "nge_uq"); op_addAvxCC(MI, X86_AVX_CC_NGE_UQ); break;  | 
77  | 216  |     case 0x1a: SStream_concat0(O, "ngt_uq"); op_addAvxCC(MI, X86_AVX_CC_NGT_UQ); break;  | 
78  | 840  |     case 0x1b: SStream_concat0(O, "false_os"); op_addAvxCC(MI, X86_AVX_CC_FALSE_OS); break;  | 
79  | 1.12k  |     case 0x1c: SStream_concat0(O, "neq_os"); op_addAvxCC(MI, X86_AVX_CC_NEQ_OS); break;  | 
80  | 202  |     case 0x1d: SStream_concat0(O, "ge_oq"); op_addAvxCC(MI, X86_AVX_CC_GE_OQ); break;  | 
81  | 121  |     case 0x1e: SStream_concat0(O, "gt_oq"); op_addAvxCC(MI, X86_AVX_CC_GT_OQ); break;  | 
82  | 433  |     case 0x1f: SStream_concat0(O, "true_us"); op_addAvxCC(MI, X86_AVX_CC_TRUE_US); break;  | 
83  | 24.9k  |   }  | 
84  |  |  | 
85  | 24.9k  |   MI->popcode_adjust = Imm + 1;  | 
86  | 24.9k  | }  | 
87  |  |  | 
88  |  | void printXOPCC(MCInst *MI, unsigned Op, SStream *O)  | 
89  | 3.63k  | { | 
90  | 3.63k  |   int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op));  | 
91  |  |  | 
92  | 3.63k  |   switch (Imm) { | 
93  | 0  |     default: // llvm_unreachable("Invalid xopcc argument!"); | 
94  | 1.16k  |     case 0: SStream_concat0(O, "lt"); op_addXopCC(MI, X86_XOP_CC_LT); break;  | 
95  | 458  |     case 1: SStream_concat0(O, "le"); op_addXopCC(MI, X86_XOP_CC_LE); break;  | 
96  | 348  |     case 2: SStream_concat0(O, "gt"); op_addXopCC(MI, X86_XOP_CC_GT); break;  | 
97  | 492  |     case 3: SStream_concat0(O, "ge"); op_addXopCC(MI, X86_XOP_CC_GE); break;  | 
98  | 275  |     case 4: SStream_concat0(O, "eq"); op_addXopCC(MI, X86_XOP_CC_EQ); break;  | 
99  | 277  |     case 5: SStream_concat0(O, "neq"); op_addXopCC(MI, X86_XOP_CC_NEQ); break;  | 
100  | 267  |     case 6: SStream_concat0(O, "false"); op_addXopCC(MI, X86_XOP_CC_FALSE); break;  | 
101  | 347  |     case 7: SStream_concat0(O, "true"); op_addXopCC(MI, X86_XOP_CC_TRUE); break;  | 
102  | 3.63k  |   }  | 
103  | 3.63k  | }  | 
104  |  |  | 
105  |  | void printRoundingControl(MCInst *MI, unsigned Op, SStream *O)  | 
106  | 6.12k  | { | 
107  | 6.12k  |   int64_t Imm = MCOperand_getImm(MCInst_getOperand(MI, Op)) & 0x3;  | 
108  | 6.12k  |   switch (Imm) { | 
109  | 2.70k  |     case 0: SStream_concat0(O, "{rn-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RN); break; | 
110  | 1.62k  |     case 1: SStream_concat0(O, "{rd-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RD); break; | 
111  | 987  |     case 2: SStream_concat0(O, "{ru-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RU); break; | 
112  | 806  |     case 3: SStream_concat0(O, "{rz-sae}"); op_addAvxSae(MI); op_addAvxRoundingMode(MI, X86_AVX_RM_RZ); break; | 
113  | 0  |     default: break; // never reach  | 
114  | 6.12k  |   }  | 
115  | 6.12k  | }  | 
116  |  | #endif  |