diff options
| -rw-r--r-- | arch/x86/lib/x86-opcode-map.txt | 8 | ||||
| -rw-r--r-- | arch/x86/tools/gen-insn-attr-x86.awk | 14 |
2 files changed, 13 insertions, 9 deletions
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt index 819137904428..5d7e51f3fd28 100644 --- a/arch/x86/lib/x86-opcode-map.txt +++ b/arch/x86/lib/x86-opcode-map.txt | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | # - (66): the last prefix is 0x66 | 28 | # - (66): the last prefix is 0x66 |
| 29 | # - (F3): the last prefix is 0xF3 | 29 | # - (F3): the last prefix is 0xF3 |
| 30 | # - (F2): the last prefix is 0xF2 | 30 | # - (F2): the last prefix is 0xF2 |
| 31 | # | 31 | # - (!F3) : the last prefix is not 0xF3 (including non-last prefix case) |
| 32 | 32 | ||
| 33 | Table: one byte opcode | 33 | Table: one byte opcode |
| 34 | Referrer: | 34 | Referrer: |
| @@ -515,12 +515,12 @@ b4: LFS Gv,Mp | |||
| 515 | b5: LGS Gv,Mp | 515 | b5: LGS Gv,Mp |
| 516 | b6: MOVZX Gv,Eb | 516 | b6: MOVZX Gv,Eb |
| 517 | b7: MOVZX Gv,Ew | 517 | b7: MOVZX Gv,Ew |
| 518 | b8: JMPE | POPCNT Gv,Ev (F3) | 518 | b8: JMPE (!F3) | POPCNT Gv,Ev (F3) |
| 519 | b9: Grp10 (1A) | 519 | b9: Grp10 (1A) |
| 520 | ba: Grp8 Ev,Ib (1A) | 520 | ba: Grp8 Ev,Ib (1A) |
| 521 | bb: BTC Ev,Gv | 521 | bb: BTC Ev,Gv |
| 522 | bc: BSF Gv,Ev | TZCNT Gv,Ev (F3) | 522 | bc: BSF Gv,Ev (!F3) | TZCNT Gv,Ev (F3) |
| 523 | bd: BSR Gv,Ev | LZCNT Gv,Ev (F3) | 523 | bd: BSR Gv,Ev (!F3) | LZCNT Gv,Ev (F3) |
| 524 | be: MOVSX Gv,Eb | 524 | be: MOVSX Gv,Eb |
| 525 | bf: MOVSX Gv,Ew | 525 | bf: MOVSX Gv,Ew |
| 526 | # 0x0f 0xc0-0xcf | 526 | # 0x0f 0xc0-0xcf |
diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk index 5f6a5b6c3a15..ddcf39b1a18d 100644 --- a/arch/x86/tools/gen-insn-attr-x86.awk +++ b/arch/x86/tools/gen-insn-attr-x86.awk | |||
| @@ -66,9 +66,10 @@ BEGIN { | |||
| 66 | rex_expr = "^REX(\\.[XRWB]+)*" | 66 | rex_expr = "^REX(\\.[XRWB]+)*" |
| 67 | fpu_expr = "^ESC" # TODO | 67 | fpu_expr = "^ESC" # TODO |
| 68 | 68 | ||
| 69 | lprefix1_expr = "\\(66\\)" | 69 | lprefix1_expr = "\\((66|!F3)\\)" |
| 70 | lprefix2_expr = "\\(F3\\)" | 70 | lprefix2_expr = "\\(F3\\)" |
| 71 | lprefix3_expr = "\\(F2\\)" | 71 | lprefix3_expr = "\\((F2|!F3)\\)" |
| 72 | lprefix_expr = "\\((66|F2|F3)\\)" | ||
| 72 | max_lprefix = 4 | 73 | max_lprefix = 4 |
| 73 | 74 | ||
| 74 | # All opcodes starting with lower-case 'v' or with (v1) superscript | 75 | # All opcodes starting with lower-case 'v' or with (v1) superscript |
| @@ -333,13 +334,16 @@ function convert_operands(count,opnd, i,j,imm,mod) | |||
| 333 | if (match(ext, lprefix1_expr)) { | 334 | if (match(ext, lprefix1_expr)) { |
| 334 | lptable1[idx] = add_flags(lptable1[idx],flags) | 335 | lptable1[idx] = add_flags(lptable1[idx],flags) |
| 335 | variant = "INAT_VARIANT" | 336 | variant = "INAT_VARIANT" |
| 336 | } else if (match(ext, lprefix2_expr)) { | 337 | } |
| 338 | if (match(ext, lprefix2_expr)) { | ||
| 337 | lptable2[idx] = add_flags(lptable2[idx],flags) | 339 | lptable2[idx] = add_flags(lptable2[idx],flags) |
| 338 | variant = "INAT_VARIANT" | 340 | variant = "INAT_VARIANT" |
| 339 | } else if (match(ext, lprefix3_expr)) { | 341 | } |
| 342 | if (match(ext, lprefix3_expr)) { | ||
| 340 | lptable3[idx] = add_flags(lptable3[idx],flags) | 343 | lptable3[idx] = add_flags(lptable3[idx],flags) |
| 341 | variant = "INAT_VARIANT" | 344 | variant = "INAT_VARIANT" |
| 342 | } else { | 345 | } |
| 346 | if (!match(ext, lprefix_expr)){ | ||
| 343 | table[idx] = add_flags(table[idx],flags) | 347 | table[idx] = add_flags(table[idx],flags) |
| 344 | } | 348 | } |
| 345 | } | 349 | } |
