OLD | NEW |
1 /* Declarations for Intel 80386 opcode table | 1 /* Declarations for Intel 80386 opcode table |
2 Copyright 2007, 2008, 2009, 2010 | 2 Copyright 2007, 2008, 2009, 2010, 2012 |
3 Free Software Foundation, Inc. | 3 Free Software Foundation, Inc. |
4 | 4 |
5 This file is part of the GNU opcodes library. | 5 This file is part of the GNU opcodes library. |
6 | 6 |
7 This library is free software; you can redistribute it and/or modify | 7 This library is free software; you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation; either version 3, or (at your option) | 9 the Free Software Foundation; either version 3, or (at your option) |
10 any later version. | 10 any later version. |
11 | 11 |
12 It is distributed in the hope that it will be useful, but WITHOUT | 12 It is distributed in the hope that it will be useful, but WITHOUT |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 /* FSGSBASE Instructions required */ | 127 /* FSGSBASE Instructions required */ |
128 CpuFSGSBase, | 128 CpuFSGSBase, |
129 /* RDRND Instructions required */ | 129 /* RDRND Instructions required */ |
130 CpuRdRnd, | 130 CpuRdRnd, |
131 /* F16C Instructions required */ | 131 /* F16C Instructions required */ |
132 CpuF16C, | 132 CpuF16C, |
133 /* Intel BMI2 support required */ | 133 /* Intel BMI2 support required */ |
134 CpuBMI2, | 134 CpuBMI2, |
135 /* LZCNT support required */ | 135 /* LZCNT support required */ |
136 CpuLZCNT, | 136 CpuLZCNT, |
| 137 /* HLE support required */ |
| 138 CpuHLE, |
| 139 /* RTM support required */ |
| 140 CpuRTM, |
137 /* INVPCID Instructions required */ | 141 /* INVPCID Instructions required */ |
138 CpuINVPCID, | 142 CpuINVPCID, |
| 143 /* VMFUNC Instruction required */ |
| 144 CpuVMFUNC, |
139 /* 64bit support available, used by -march= in assembler. */ | 145 /* 64bit support available, used by -march= in assembler. */ |
140 CpuLM, | 146 CpuLM, |
| 147 /* RDRSEED instruction required. */ |
| 148 CpuRDSEED, |
| 149 /* Multi-presisionn add-carry instructions are required. */ |
| 150 CpuADX, |
| 151 /* Supports prefetchw instruction. */ |
| 152 CpuPRFCHW, |
141 /* 64bit support required */ | 153 /* 64bit support required */ |
142 Cpu64, | 154 Cpu64, |
143 /* Not supported in the 64bit mode */ | 155 /* Not supported in the 64bit mode */ |
144 CpuNo64, | 156 CpuNo64, |
145 /* The last bitfield in i386_cpu_flags. */ | 157 /* The last bitfield in i386_cpu_flags. */ |
146 CpuMax = CpuNo64 | 158 CpuMax = CpuNo64 |
147 }; | 159 }; |
148 | 160 |
149 #define CpuNumOfUints \ | 161 #define CpuNumOfUints \ |
150 (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1) | 162 (CpuMax / sizeof (unsigned int) / CHAR_BIT + 1) |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 unsigned int cpubmi:1; | 217 unsigned int cpubmi:1; |
206 unsigned int cputbm:1; | 218 unsigned int cputbm:1; |
207 unsigned int cpumovbe:1; | 219 unsigned int cpumovbe:1; |
208 unsigned int cpuept:1; | 220 unsigned int cpuept:1; |
209 unsigned int cpurdtscp:1; | 221 unsigned int cpurdtscp:1; |
210 unsigned int cpufsgsbase:1; | 222 unsigned int cpufsgsbase:1; |
211 unsigned int cpurdrnd:1; | 223 unsigned int cpurdrnd:1; |
212 unsigned int cpuf16c:1; | 224 unsigned int cpuf16c:1; |
213 unsigned int cpubmi2:1; | 225 unsigned int cpubmi2:1; |
214 unsigned int cpulzcnt:1; | 226 unsigned int cpulzcnt:1; |
| 227 unsigned int cpuhle:1; |
| 228 unsigned int cpurtm:1; |
215 unsigned int cpuinvpcid:1; | 229 unsigned int cpuinvpcid:1; |
| 230 unsigned int cpuvmfunc:1; |
216 unsigned int cpulm:1; | 231 unsigned int cpulm:1; |
| 232 unsigned int cpurdseed:1; |
| 233 unsigned int cpuadx:1; |
| 234 unsigned int cpuprfchw:1; |
217 unsigned int cpu64:1; | 235 unsigned int cpu64:1; |
218 unsigned int cpuno64:1; | 236 unsigned int cpuno64:1; |
219 #ifdef CpuUnused | 237 #ifdef CpuUnused |
220 unsigned int unused:(CpuNumOfBits - CpuUnused); | 238 unsigned int unused:(CpuNumOfBits - CpuUnused); |
221 #endif | 239 #endif |
222 } bitfield; | 240 } bitfield; |
223 unsigned int array[CpuNumOfUints]; | 241 unsigned int array[CpuNumOfUints]; |
224 } i386_cpu_flags; | 242 } i386_cpu_flags; |
225 | 243 |
226 /* Position of opcode_modifier bits. */ | 244 /* Position of opcode_modifier bits. */ |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 IsString, | 301 IsString, |
284 /* quick test for lockable instructions */ | 302 /* quick test for lockable instructions */ |
285 IsLockable, | 303 IsLockable, |
286 /* fake an extra reg operand for clr, imul and special register | 304 /* fake an extra reg operand for clr, imul and special register |
287 processing for some instructions. */ | 305 processing for some instructions. */ |
288 RegKludge, | 306 RegKludge, |
289 /* The first operand must be xmm0 */ | 307 /* The first operand must be xmm0 */ |
290 FirstXmm0, | 308 FirstXmm0, |
291 /* An implicit xmm0 as the first operand */ | 309 /* An implicit xmm0 as the first operand */ |
292 Implicit1stXmm0, | 310 Implicit1stXmm0, |
| 311 /* The HLE prefix is OK: |
| 312 1. With a LOCK prefix. |
| 313 2. With or without a LOCK prefix. |
| 314 3. With a RELEASE (0xf3) prefix. |
| 315 */ |
| 316 #define HLEPrefixNone 0 |
| 317 #define HLEPrefixLock 1 |
| 318 #define HLEPrefixAny 2 |
| 319 #define HLEPrefixRelease 3 |
| 320 HLEPrefixOk, |
| 321 /* An instruction on which a "rep" prefix is acceptable. */ |
| 322 RepPrefixOk, |
293 /* Convert to DWORD */ | 323 /* Convert to DWORD */ |
294 ToDword, | 324 ToDword, |
295 /* Convert to QWORD */ | 325 /* Convert to QWORD */ |
296 ToQword, | 326 ToQword, |
297 /* Address prefix changes operand 0 */ | 327 /* Address prefix changes operand 0 */ |
298 AddrPrefixOp0, | 328 AddrPrefixOp0, |
299 /* opcode is a prefix */ | 329 /* opcode is a prefix */ |
300 IsPrefix, | 330 IsPrefix, |
301 /* instruction has extension in 8 bit imm */ | 331 /* instruction has extension in 8 bit imm */ |
302 ImmExt, | 332 ImmExt, |
303 /* instruction don't need Rex64 prefix. */ | 333 /* instruction don't need Rex64 prefix. */ |
304 NoRex64, | 334 NoRex64, |
305 /* instruction require Rex64 prefix. */ | 335 /* instruction require Rex64 prefix. */ |
306 Rex64, | 336 Rex64, |
307 /* deprecated fp insn, gets a warning */ | 337 /* deprecated fp insn, gets a warning */ |
308 Ugh, | 338 Ugh, |
309 /* insn has VEX prefix: | 339 /* insn has VEX prefix: |
310 1: 128bit VEX prefix. | 340 1: 128bit VEX prefix. |
311 2: 256bit VEX prefix. | 341 2: 256bit VEX prefix. |
312 3: Scalar VEX prefix. | 342 3: Scalar VEX prefix. |
313 */ | 343 */ |
314 #define VEX128 1 | 344 #define VEX128 1 |
315 #define VEX256 2 | 345 #define VEX256 2 |
316 #define VEXScalar 3 | 346 #define VEXScalar 3 |
317 Vex, | 347 Vex, |
318 /* How to encode VEX.vvvv: | 348 /* How to encode VEX.vvvv: |
319 0: VEX.vvvv must be 1111b. | 349 0: VEX.vvvv must be 1111b. |
320 1: VEX.NDS. Register-only source is encoded in VEX.vvvv where | 350 1: VEX.NDS. Register-only source is encoded in VEX.vvvv where |
321 the content of source registers will be preserved. | 351 the content of source registers will be preserved. |
322 » VEX.DDS. The second register operand is encoded in VEX.vvvv | 352 » VEX.DDS. The second register operand is encoded in VEX.vvvv |
323 where the content of first source register will be overwritten | 353 where the content of first source register will be overwritten |
324 by the result. | 354 by the result. |
325 VEX.NDD2. The second destination register operand is encoded in | 355 VEX.NDD2. The second destination register operand is encoded in |
326 VEX.vvvv for instructions with 2 destination register operands. | 356 VEX.vvvv for instructions with 2 destination register operands. |
327 For assembler, there are no difference between VEX.NDS, VEX.DDS | 357 For assembler, there are no difference between VEX.NDS, VEX.DDS |
328 and VEX.NDD2. | 358 and VEX.NDD2. |
329 2. VEX.NDD. Register destination is encoded in VEX.vvvv for | 359 2. VEX.NDD. Register destination is encoded in VEX.vvvv for |
330 instructions with 1 destination register operand. | 360 instructions with 1 destination register operand. |
331 3. VEX.LWP. Register destination is encoded in VEX.vvvv and one | 361 3. VEX.LWP. Register destination is encoded in VEX.vvvv and one |
332 of the operands can access a memory location. | 362 of the operands can access a memory location. |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 unsigned int no_lsuf:1; | 446 unsigned int no_lsuf:1; |
417 unsigned int no_ssuf:1; | 447 unsigned int no_ssuf:1; |
418 unsigned int no_qsuf:1; | 448 unsigned int no_qsuf:1; |
419 unsigned int no_ldsuf:1; | 449 unsigned int no_ldsuf:1; |
420 unsigned int fwait:1; | 450 unsigned int fwait:1; |
421 unsigned int isstring:1; | 451 unsigned int isstring:1; |
422 unsigned int islockable:1; | 452 unsigned int islockable:1; |
423 unsigned int regkludge:1; | 453 unsigned int regkludge:1; |
424 unsigned int firstxmm0:1; | 454 unsigned int firstxmm0:1; |
425 unsigned int implicit1stxmm0:1; | 455 unsigned int implicit1stxmm0:1; |
| 456 unsigned int hleprefixok:2; |
| 457 unsigned int repprefixok:1; |
426 unsigned int todword:1; | 458 unsigned int todword:1; |
427 unsigned int toqword:1; | 459 unsigned int toqword:1; |
428 unsigned int addrprefixop0:1; | 460 unsigned int addrprefixop0:1; |
429 unsigned int isprefix:1; | 461 unsigned int isprefix:1; |
430 unsigned int immext:1; | 462 unsigned int immext:1; |
431 unsigned int norex64:1; | 463 unsigned int norex64:1; |
432 unsigned int rex64:1; | 464 unsigned int rex64:1; |
433 unsigned int ugh:1; | 465 unsigned int ugh:1; |
434 unsigned int vex:2; | 466 unsigned int vex:2; |
435 unsigned int vexvvvv:2; | 467 unsigned int vexvvvv:2; |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
635 unsigned int base_opcode; | 667 unsigned int base_opcode; |
636 #define Opcode_D 0x2 /* Direction bit: | 668 #define Opcode_D 0x2 /* Direction bit: |
637 set if Reg --> Regmem; | 669 set if Reg --> Regmem; |
638 unset if Regmem --> Reg. */ | 670 unset if Regmem --> Reg. */ |
639 #define Opcode_FloatR 0x8 /* Bit to swap src/dest for float insns. */ | 671 #define Opcode_FloatR 0x8 /* Bit to swap src/dest for float insns. */ |
640 #define Opcode_FloatD 0x400 /* Direction bit for float insns. */ | 672 #define Opcode_FloatD 0x400 /* Direction bit for float insns. */ |
641 | 673 |
642 /* extension_opcode is the 3 bit extension for group <n> insns. | 674 /* extension_opcode is the 3 bit extension for group <n> insns. |
643 This field is also used to store the 8-bit opcode suffix for the | 675 This field is also used to store the 8-bit opcode suffix for the |
644 AMD 3DNow! instructions. | 676 AMD 3DNow! instructions. |
645 If this template has no extension opcode (the usual case) use None | 677 If this template has no extension opcode (the usual case) use None |
646 Instructions */ | 678 Instructions */ |
647 unsigned int extension_opcode; | 679 unsigned int extension_opcode; |
648 #define None 0xffff /* If no extension_opcode is possible. */ | 680 #define None 0xffff /* If no extension_opcode is possible. */ |
649 | 681 |
650 /* Opcode length. */ | 682 /* Opcode length. */ |
651 unsigned char opcode_length; | 683 unsigned char opcode_length; |
652 | 684 |
653 /* cpu feature flags */ | 685 /* cpu feature flags */ |
654 i386_cpu_flags cpu_flags; | 686 i386_cpu_flags cpu_flags; |
655 | 687 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 unsigned int seg_prefix; | 735 unsigned int seg_prefix; |
704 } | 736 } |
705 seg_entry; | 737 seg_entry; |
706 | 738 |
707 extern const seg_entry cs; | 739 extern const seg_entry cs; |
708 extern const seg_entry ds; | 740 extern const seg_entry ds; |
709 extern const seg_entry ss; | 741 extern const seg_entry ss; |
710 extern const seg_entry es; | 742 extern const seg_entry es; |
711 extern const seg_entry fs; | 743 extern const seg_entry fs; |
712 extern const seg_entry gs; | 744 extern const seg_entry gs; |
OLD | NEW |