OLD | NEW |
1 /* $Id: x86arch.h 2181 2009-03-20 07:36:49Z peter $ | 1 /* $Id: x86arch.h 2346 2010-08-01 01:37:37Z peter $ |
2 * x86 Architecture header file | 2 * x86 Architecture header file |
3 * | 3 * |
4 * Copyright (C) 2001-2007 Peter Johnson | 4 * Copyright (C) 2001-2007 Peter Johnson |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
11 * 2. Redistributions in binary form must reproduce the above copyright | 11 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 #define CPU_Undoc 23 /* Undocumented instruction */ | 57 #define CPU_Undoc 23 /* Undocumented instruction */ |
58 #define CPU_Obs 24 /* Obsolete instruction */ | 58 #define CPU_Obs 24 /* Obsolete instruction */ |
59 #define CPU_Priv 25 /* Priveleged instruction */ | 59 #define CPU_Priv 25 /* Priveleged instruction */ |
60 #define CPU_SVM 26 /* Secure Virtual Machine instruction */ | 60 #define CPU_SVM 26 /* Secure Virtual Machine instruction */ |
61 #define CPU_PadLock 27 /* VIA PadLock instruction */ | 61 #define CPU_PadLock 27 /* VIA PadLock instruction */ |
62 #define CPU_EM64T 28 /* Intel EM64T or better */ | 62 #define CPU_EM64T 28 /* Intel EM64T or better */ |
63 #define CPU_SSSE3 29 /* Streaming SIMD extensions 3 required */ | 63 #define CPU_SSSE3 29 /* Streaming SIMD extensions 3 required */ |
64 #define CPU_SSE41 30 /* Streaming SIMD extensions 4.1 required */ | 64 #define CPU_SSE41 30 /* Streaming SIMD extensions 4.1 required */ |
65 #define CPU_SSE42 31 /* Streaming SIMD extensions 4.2 required */ | 65 #define CPU_SSE42 31 /* Streaming SIMD extensions 4.2 required */ |
66 #define CPU_SSE4a 32 /* AMD Streaming SIMD extensions 4a required */ | 66 #define CPU_SSE4a 32 /* AMD Streaming SIMD extensions 4a required */ |
67 #define CPU_SSE5 33 /* AMD Streaming SIMD extensions 5 required */ | 67 #define CPU_XSAVE 33 /* Intel XSAVE instructions */ |
68 #define CPU_XSAVE 34 /* Intel XSAVE instructions */ | 68 #define CPU_AVX 34 /* Intel Advanced Vector Extensions */ |
69 #define CPU_AVX 35 /* Intel Advanced Vector Extensions */ | 69 #define CPU_FMA 35 /* Intel Fused-Multiply-Add Extensions */ |
70 #define CPU_FMA 36 /* Intel Fused-Multiply-Add Extensions */ | 70 #define CPU_AES 36 /* AES instruction */ |
71 #define CPU_AES 37 /* AES instruction */ | 71 #define CPU_CLMUL 37 /* PCLMULQDQ instruction */ |
72 #define CPU_CLMUL 38 /* PCLMULQDQ instruction */ | 72 #define CPU_MOVBE 38 /* MOVBE instruction */ |
73 #define CPU_MOVBE 39 /* MOVBE instruction */ | 73 #define CPU_XOP 39 /* AMD XOP extensions */ |
| 74 #define CPU_FMA4 40 /* AMD Fused-Multiply-Add extensions */ |
| 75 #define CPU_F16C 41 /* Intel float-16 instructions */ |
| 76 #define CPU_FSGSBASE 42 /* Intel FSGSBASE instructions */ |
| 77 #define CPU_RDRAND 43 /* Intel RDRAND instruction */ |
| 78 #define CPU_XSAVEOPT 44 /* Intel XSAVEOPT instruction */ |
| 79 #define CPU_EPTVPID 45 /* Intel INVEPT, INVVPID instructions */ |
| 80 #define CPU_SMX 46 /* Intel SMX instruction (GETSEC) */ |
| 81 |
| 82 enum x86_parser_type { |
| 83 X86_PARSER_NASM = 0, |
| 84 X86_PARSER_TASM = 1, |
| 85 X86_PARSER_GAS = 2 |
| 86 }; |
| 87 |
| 88 #define PARSER(arch) (((arch)->parser == X86_PARSER_GAS && (arch)->gas_intel_mod
e) ? X86_PARSER_NASM : (arch)->parser) |
74 | 89 |
75 typedef struct yasm_arch_x86 { | 90 typedef struct yasm_arch_x86 { |
76 yasm_arch_base arch; /* base structure */ | 91 yasm_arch_base arch; /* base structure */ |
77 | 92 |
78 /* What instructions/features are enabled? */ | 93 /* What instructions/features are enabled? */ |
79 unsigned int active_cpu; /* active index into cpu_enables table */ | 94 unsigned int active_cpu; /* active index into cpu_enables table */ |
80 unsigned int cpu_enables_size; /* size of cpu_enables table */ | 95 unsigned int cpu_enables_size; /* size of cpu_enables table */ |
81 wordptr *cpu_enables; | 96 wordptr *cpu_enables; |
82 | 97 |
83 unsigned int amd64_machine; | 98 unsigned int amd64_machine; |
84 enum { | 99 enum x86_parser_type parser; |
85 X86_PARSER_NASM = 0, | |
86 X86_PARSER_TASM = 1, | |
87 X86_PARSER_GAS = 2 | |
88 } parser; | |
89 unsigned int mode_bits; | 100 unsigned int mode_bits; |
90 unsigned int force_strict; | 101 unsigned int force_strict; |
91 unsigned int default_rel; | 102 unsigned int default_rel; |
| 103 unsigned int gas_intel_mode; |
92 | 104 |
93 enum { | 105 enum { |
94 X86_NOP_BASIC = 0, | 106 X86_NOP_BASIC = 0, |
95 X86_NOP_INTEL = 1, | 107 X86_NOP_INTEL = 1, |
96 X86_NOP_AMD = 2 | 108 X86_NOP_AMD = 2 |
97 } nop; | 109 } nop; |
98 } yasm_arch_x86; | 110 } yasm_arch_x86; |
99 | 111 |
100 /* 0-15 (low 4 bits) used for register number, stored in same data area. | 112 /* 0-15 (low 4 bits) used for register number, stored in same data area. |
101 * Note 8-15 are only valid for some registers, and only in 64-bit mode. | 113 * Note 8-15 are only valid for some registers, and only in 64-bit mode. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 X86_REX_R = 2, | 157 X86_REX_R = 2, |
146 X86_REX_X = 1, | 158 X86_REX_X = 1, |
147 X86_REX_B = 0 | 159 X86_REX_B = 0 |
148 } x86_rex_bit_pos; | 160 } x86_rex_bit_pos; |
149 | 161 |
150 /* Sets REX (4th bit) and 3 LS bits from register size/number. Returns 1 if | 162 /* Sets REX (4th bit) and 3 LS bits from register size/number. Returns 1 if |
151 * impossible to fit reg into REX, otherwise returns 0. Input parameter rexbit | 163 * impossible to fit reg into REX, otherwise returns 0. Input parameter rexbit |
152 * indicates bit of REX to use if REX is needed. Will not modify REX if not | 164 * indicates bit of REX to use if REX is needed. Will not modify REX if not |
153 * in 64-bit mode or if it wasn't needed to express reg. | 165 * in 64-bit mode or if it wasn't needed to express reg. |
154 */ | 166 */ |
155 int yasm_x86__set_rex_from_reg(unsigned char *rex, unsigned char *drex, | 167 int yasm_x86__set_rex_from_reg(unsigned char *rex, unsigned char *low3, |
156 unsigned char *low3, uintptr_t reg, | 168 uintptr_t reg, unsigned int bits, |
157 unsigned int bits, x86_rex_bit_pos rexbit); | 169 x86_rex_bit_pos rexbit); |
158 | 170 |
159 /* Effective address type */ | 171 /* Effective address type */ |
160 typedef struct x86_effaddr { | 172 typedef struct x86_effaddr { |
161 yasm_effaddr ea; /* base structure */ | 173 yasm_effaddr ea; /* base structure */ |
162 | 174 |
163 /* How the spare (register) bits in Mod/RM are handled: | 175 /* How the spare (register) bits in Mod/RM are handled: |
164 * Even if valid_modrm=0, the spare bits are still valid (don't overwrite!) | 176 * Even if valid_modrm=0, the spare bits are still valid (don't overwrite!) |
165 * They're set in bytecode_create_insn(). | 177 * They're set in bytecode_create_insn(). |
166 */ | 178 */ |
167 unsigned char modrm; | 179 unsigned char modrm; |
168 unsigned char valid_modrm; /* 1 if Mod/RM byte currently valid, 0 if not */ | 180 unsigned char valid_modrm; /* 1 if Mod/RM byte currently valid, 0 if not */ |
169 unsigned char need_modrm; /* 1 if Mod/RM byte needed, 0 if not */ | 181 unsigned char need_modrm; /* 1 if Mod/RM byte needed, 0 if not */ |
170 | 182 |
171 unsigned char sib; | 183 unsigned char sib; |
172 unsigned char valid_sib; /* 1 if SIB byte currently valid, 0 if not */ | 184 unsigned char valid_sib; /* 1 if SIB byte currently valid, 0 if not */ |
173 unsigned char need_sib; /* 1 if SIB byte needed, 0 if not, | 185 unsigned char need_sib; /* 1 if SIB byte needed, 0 if not, |
174 0xff if unknown */ | 186 0xff if unknown */ |
175 | |
176 unsigned char drex; /* DREX SSE5 extension byte */ | |
177 unsigned char need_drex; /* 1 if DREX byte needed, 0 if not */ | |
178 } x86_effaddr; | 187 } x86_effaddr; |
179 | 188 |
180 void yasm_x86__ea_init(x86_effaddr *x86_ea, unsigned int spare, | 189 void yasm_x86__ea_init(x86_effaddr *x86_ea, unsigned int spare, |
181 unsigned int drex, unsigned int need_drex, | |
182 yasm_bytecode *precbc); | 190 yasm_bytecode *precbc); |
183 | 191 |
184 void yasm_x86__ea_set_disponly(x86_effaddr *x86_ea); | 192 void yasm_x86__ea_set_disponly(x86_effaddr *x86_ea); |
185 x86_effaddr *yasm_x86__ea_create_reg(x86_effaddr *x86_ea, unsigned long reg, | 193 x86_effaddr *yasm_x86__ea_create_reg(x86_effaddr *x86_ea, unsigned long reg, |
186 unsigned char *rex, unsigned char *drex, | 194 unsigned char *rex, unsigned int bits); |
187 unsigned int bits); | |
188 x86_effaddr *yasm_x86__ea_create_imm | 195 x86_effaddr *yasm_x86__ea_create_imm |
189 (x86_effaddr *x86_ea, /*@keep@*/ yasm_expr *imm, unsigned int im_len); | 196 (x86_effaddr *x86_ea, /*@keep@*/ yasm_expr *imm, unsigned int im_len); |
190 yasm_effaddr *yasm_x86__ea_create_expr(yasm_arch *arch, | 197 yasm_effaddr *yasm_x86__ea_create_expr(yasm_arch *arch, |
191 /*@keep@*/ yasm_expr *e); | 198 /*@keep@*/ yasm_expr *e); |
192 void yasm_x86__ea_destroy(yasm_effaddr *ea); | 199 void yasm_x86__ea_destroy(yasm_effaddr *ea); |
193 void yasm_x86__ea_print(const yasm_effaddr *ea, FILE *f, int indent_level); | 200 void yasm_x86__ea_print(const yasm_effaddr *ea, FILE *f, int indent_level); |
194 | 201 |
195 void yasm_x86__bc_insn_opersize_override(yasm_bytecode *bc, | 202 void yasm_x86__bc_insn_opersize_override(yasm_bytecode *bc, |
196 unsigned int opersize); | 203 unsigned int opersize); |
197 void yasm_x86__bc_insn_addrsize_override(yasm_bytecode *bc, | 204 void yasm_x86__bc_insn_addrsize_override(yasm_bytecode *bc, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 int yasm_x86__intnum_tobytes | 308 int yasm_x86__intnum_tobytes |
302 (yasm_arch *arch, const yasm_intnum *intn, unsigned char *buf, | 309 (yasm_arch *arch, const yasm_intnum *intn, unsigned char *buf, |
303 size_t destsize, size_t valsize, int shift, const yasm_bytecode *bc, | 310 size_t destsize, size_t valsize, int shift, const yasm_bytecode *bc, |
304 int warn); | 311 int warn); |
305 | 312 |
306 unsigned int yasm_x86__get_reg_size(uintptr_t reg); | 313 unsigned int yasm_x86__get_reg_size(uintptr_t reg); |
307 | 314 |
308 /*@only@*/ yasm_bytecode *yasm_x86__create_empty_insn(yasm_arch *arch, | 315 /*@only@*/ yasm_bytecode *yasm_x86__create_empty_insn(yasm_arch *arch, |
309 unsigned long line); | 316 unsigned long line); |
310 #endif | 317 #endif |
OLD | NEW |