1/* 2 * 3 * CDDL HEADER START 4 * 5 * The contents of this file are subject to the terms of the 6 * Common Development and Distribution License (the "License"). 7 * You may not use this file except in compliance with the License. 8 * --- 7 unchanged lines hidden (view full) --- 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22/* 23 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. |
24 * Copyright (c) 2012, Joyent, Inc. All rights reserved. |
25 */ 26 27/* 28 * Copyright (c) 2010, Intel Corporation. 29 * All rights reserved. 30 */ 31 32/* Copyright (c) 1988 AT&T */ 33/* All Rights Reserved */ 34 35/* |
36 * $FreeBSD: stable/10/sys/cddl/dev/dtrace/x86/dis_tables.c 270186 2014-08-19 23:15:47Z grehan $ |
37 */ 38 39#include "dis_tables.h" 40 41/* BEGIN CSTYLED */ 42 43/* 44 * Disassembly begins in dis_distable, which is equivalent to the One-byte --- 55 unchanged lines hidden (view full) --- 100 IR, 101 OA, 102 AO, 103 MS, 104 SM, 105 Mv, 106 Mw, 107 M, /* register or memory */ |
108 MG9, /* register or memory in group 9 (prefix optional) */ |
109 Mb, /* register or memory, always byte sized */ 110 MO, /* memory only (no registers) */ 111 PREF, |
112 SWAPGS_RDTSCP, |
113 MONITOR_MWAIT, 114 R, 115 RA, 116 SEG, 117 MR, 118 RM, |
119 RM_66r, /* RM, but with a required 0x66 prefix */ |
120 IA, 121 MA, 122 SD, 123 AD, 124 SA, 125 D, 126 INM, 127 SO, --- 98 unchanged lines hidden (view full) --- 226 VEX_XXI, /* VEX mod_rm, imm8 -> VEX.vvvv */ 227 VEX_MR, /* VEX mod_rm -> mod_reg */ 228 VEX_RRI, /* VEX mod_reg, mod_rm -> implicit(eflags/r32) */ 229 VEX_RX, /* VEX mod_reg -> mod_rm */ 230 VEX_RR, /* VEX mod_rm -> mod_reg */ 231 VEX_RRi, /* VEX mod_rm, imm8 -> mod_reg */ 232 VEX_RM, /* VEX mod_reg -> mod_rm */ 233 VEX_RRM, /* VEX VEX.vvvv, mod_reg -> mod_rm */ |
234 VEX_RMX, /* VEX VEX.vvvv, mod_rm -> mod_reg */ 235 VMx, /* vmcall/vmlaunch/vmresume/vmxoff */ 236 VMxo, /* VMx instruction with optional prefix */ 237 SVM /* AMD SVM instructions */ |
238}; 239 240/* 241 * VEX prefixes 242 */ 243#define VEX_2bytes 0xC5 /* the first byte of two-byte form */ 244#define VEX_3bytes 0xC4 /* the first byte of three-byte form */ 245 --- 251 unchanged lines hidden (view full) --- 497}; 498 499 500/* 501 * Decode table for 0x0F01 opcodes 502 */ 503const instable_t dis_op0F01[8] = { 504 |
505/* [0] */ TNSZ("sgdt",VMx,6), TNSZ("sidt",MONITOR_MWAIT,6), TNSZ("lgdt",XGETBV_XSETBV,6), TNSZ("lidt",SVM,6), 506/* [4] */ TNSZ("smsw",M,2), INVALID, TNSZ("lmsw",M,2), TNS("invlpg",SWAPGS_RDTSCP), |
507}; 508 509/* 510 * Decode table for 0x0F18 opcodes -- SIMD prefetch 511 */ 512const instable_t dis_op0F18[8] = { 513 514/* [0] */ TNS("prefetchnta",PREF),TNS("prefetcht0",PREF), TNS("prefetcht1",PREF), TNS("prefetcht2",PREF), --- 14 unchanged lines hidden (view full) --- 529 530const instable_t dis_op0FBA[8] = { 531 532/* [0] */ INVALID, INVALID, INVALID, INVALID, 533/* [4] */ TS("bt",MIb), TS("bts",MIb), TS("btr",MIb), TS("btc",MIb), 534}; 535 536/* |
537 * Decode table for 0x0FC7 opcode (group 9) |
538 */ 539 540const instable_t dis_op0FC7[8] = { 541 542/* [0] */ INVALID, TNS("cmpxchg8b",M), INVALID, INVALID, |
543/* [4] */ INVALID, INVALID, TNS("vmptrld",MG9), TNS("vmptrst",MG9), |
544}; 545 |
546/* 547 * Decode table for 0x0FC7 opcode (group 9) mode 3 548 */ |
549 |
550const instable_t dis_op0FC7m3[8] = { 551 552/* [0] */ INVALID, INVALID, INVALID, INVALID, 553/* [4] */ INVALID, INVALID, TNS("rdrand",MG9), INVALID, 554}; 555 |
556/* |
557 * Decode table for 0x0FC7 opcode with 0x66 prefix 558 */ 559 560const instable_t dis_op660FC7[8] = { 561 562/* [0] */ INVALID, INVALID, INVALID, INVALID, 563/* [4] */ INVALID, INVALID, TNS("vmclear",M), INVALID, 564}; 565 566/* 567 * Decode table for 0x0FC7 opcode with 0xF3 prefix 568 */ 569 570const instable_t dis_opF30FC7[8] = { 571 572/* [0] */ INVALID, INVALID, INVALID, INVALID, 573/* [4] */ INVALID, INVALID, TNS("vmxon",M), INVALID, 574}; 575 576/* |
577 * Decode table for 0x0FC8 opcode -- 486 bswap instruction 578 * 579 *bit pattern: 0000 1111 1100 1reg 580 */ 581const instable_t dis_op0FC8[4] = { 582/* [0] */ TNS("bswap",R), INVALID, INVALID, INVALID, 583}; 584 --- 592 unchanged lines hidden (view full) --- 1177/* [68] */ INVALID, INVALID, INVALID, INVALID, 1178/* [6C] */ INVALID, INVALID, INVALID, INVALID, 1179 1180/* [70] */ INVALID, INVALID, INVALID, INVALID, 1181/* [74] */ INVALID, INVALID, INVALID, INVALID, 1182/* [78] */ INVALID, INVALID, INVALID, INVALID, 1183/* [7C] */ INVALID, INVALID, INVALID, INVALID, 1184 |
1185/* [80] */ TNSy("invept", RM_66r), TNSy("invvpid", RM_66r),INVALID, INVALID, |
1186/* [84] */ INVALID, INVALID, INVALID, INVALID, 1187/* [88] */ INVALID, INVALID, INVALID, INVALID, 1188/* [8C] */ INVALID, INVALID, INVALID, INVALID, 1189 1190/* [90] */ INVALID, INVALID, INVALID, INVALID, 1191/* [94] */ INVALID, INVALID, INVALID, INVALID, 1192/* [98] */ INVALID, INVALID, INVALID, INVALID, 1193/* [9C] */ INVALID, INVALID, INVALID, INVALID, --- 29 unchanged lines hidden (view full) --- 1223}; 1224 1225const instable_t dis_opAVX660F38[256] = { 1226/* [00] */ TNSZ("vpshufb",VEX_RMrX,16),TNSZ("vphaddw",VEX_RMrX,16),TNSZ("vphaddd",VEX_RMrX,16),TNSZ("vphaddsw",VEX_RMrX,16), 1227/* [04] */ TNSZ("vpmaddubsw",VEX_RMrX,16),TNSZ("vphsubw",VEX_RMrX,16), TNSZ("vphsubd",VEX_RMrX,16),TNSZ("vphsubsw",VEX_RMrX,16), 1228/* [08] */ TNSZ("vpsignb",VEX_RMrX,16),TNSZ("vpsignw",VEX_RMrX,16),TNSZ("vpsignd",VEX_RMrX,16),TNSZ("vpmulhrsw",VEX_RMrX,16), 1229/* [0C] */ TNSZ("vpermilps",VEX_RMrX,8),TNSZ("vpermilpd",VEX_RMrX,16),TNSZ("vtestps",VEX_RRI,8), TNSZ("vtestpd",VEX_RRI,16), 1230 |
1231/* [10] */ INVALID, INVALID, INVALID, TNSZ("vcvtph2ps",VEX_MX,16), |
1232/* [14] */ INVALID, INVALID, INVALID, TNSZ("vptest",VEX_RRI,16), 1233/* [18] */ TNSZ("vbroadcastss",VEX_MX,4),TNSZ("vbroadcastsd",VEX_MX,8),TNSZ("vbroadcastf128",VEX_MX,16),INVALID, 1234/* [1C] */ TNSZ("vpabsb",VEX_MX,16),TNSZ("vpabsw",VEX_MX,16),TNSZ("vpabsd",VEX_MX,16),INVALID, 1235 1236/* [20] */ TNSZ("vpmovsxbw",VEX_MX,16),TNSZ("vpmovsxbd",VEX_MX,16),TNSZ("vpmovsxbq",VEX_MX,16),TNSZ("vpmovsxwd",VEX_MX,16), 1237/* [24] */ TNSZ("vpmovsxwq",VEX_MX,16),TNSZ("vpmovsxdq",VEX_MX,16),INVALID, INVALID, 1238/* [28] */ TNSZ("vpmuldq",VEX_RMrX,16),TNSZ("vpcmpeqq",VEX_RMrX,16),TNSZ("vmovntdqa",VEX_MX,16),TNSZ("vpackusdw",VEX_RMrX,16), 1239/* [2C] */ TNSZ("vmaskmovps",VEX_RMrX,8),TNSZ("vmaskmovpd",VEX_RMrX,16),TNSZ("vmaskmovps",VEX_RRM,8),TNSZ("vmaskmovpd",VEX_RRM,16), --- 149 unchanged lines hidden (view full) --- 1389/* [00] */ INVALID, INVALID, INVALID, INVALID, 1390/* [04] */ TNSZ("vpermilps",VEX_MXI,8),TNSZ("vpermilpd",VEX_MXI,16),TNSZ("vperm2f128",VEX_RMRX,16),INVALID, 1391/* [08] */ TNSZ("vroundps",VEX_MXI,16),TNSZ("vroundpd",VEX_MXI,16),TNSZ("vroundss",VEX_RMRX,16),TNSZ("vroundsd",VEX_RMRX,16), 1392/* [0C] */ TNSZ("vblendps",VEX_RMRX,16),TNSZ("vblendpd",VEX_RMRX,16),TNSZ("vpblendw",VEX_RMRX,16),TNSZ("vpalignr",VEX_RMRX,16), 1393 1394/* [10] */ INVALID, INVALID, INVALID, INVALID, 1395/* [14] */ TNSZ("vpextrb",VEX_RRi,8),TNSZ("vpextrw",VEX_RRi,16),TNSZ("vpextrd",VEX_RRi,16),TNSZ("vextractps",VEX_RM,16), 1396/* [18] */ TNSZ("vinsertf128",VEX_RMRX,16),TNSZ("vextractf128",VEX_RX,16),INVALID, INVALID, |
1397/* [1C] */ INVALID, TNSZ("vcvtps2ph",VEX_RX,16), INVALID, INVALID, |
1398 1399/* [20] */ TNSZ("vpinsrb",VEX_RMRX,8),TNSZ("vinsertps",VEX_RMRX,16),TNSZ("vpinsrd",VEX_RMRX,16),INVALID, 1400/* [24] */ INVALID, INVALID, INVALID, INVALID, 1401/* [28] */ INVALID, INVALID, INVALID, INVALID, 1402/* [2C] */ INVALID, INVALID, INVALID, INVALID, 1403 1404/* [30] */ INVALID, INVALID, INVALID, INVALID, 1405/* [34] */ INVALID, INVALID, INVALID, INVALID, --- 70 unchanged lines hidden (view full) --- 1476/* [00] */ IND(dis_op0F00), IND(dis_op0F01), TNS("lar",MR), TNS("lsl",MR), 1477/* [04] */ INVALID, TNS("syscall",NORM), TNS("clts",NORM), TNS("sysret",NORM), 1478/* [08] */ TNS("invd",NORM), TNS("wbinvd",NORM), INVALID, TNS("ud2",NORM), 1479/* [0C] */ INVALID, INVALID, INVALID, INVALID, 1480}, { 1481/* [10] */ TNSZ("movups",XMMO,16), TNSZ("movups",XMMOS,16),TNSZ("movlps",XMMO,8), TNSZ("movlps",XMMOS,8), 1482/* [14] */ TNSZ("unpcklps",XMMO,16),TNSZ("unpckhps",XMMO,16),TNSZ("movhps",XMMOM,8),TNSZ("movhps",XMMOMS,8), 1483/* [18] */ IND(dis_op0F18), INVALID, INVALID, INVALID, |
1484/* [1C] */ INVALID, INVALID, INVALID, TS("nop",Mw), |
1485}, { 1486/* [20] */ TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), TSy("mov",SREG), 1487/* [24] */ TSx("mov",SREG), INVALID, TSx("mov",SREG), INVALID, 1488/* [28] */ TNSZ("movaps",XMMO,16), TNSZ("movaps",XMMOS,16),TNSZ("cvtpi2ps",XMMOMX,8),TNSZ("movntps",XMMOS,16), 1489/* [2C] */ TNSZ("cvttps2pi",XMMOXMM,8),TNSZ("cvtps2pi",XMMOXMM,8),TNSZ("ucomiss",XMMO,4),TNSZ("comiss",XMMO,4), 1490}, { 1491/* [30] */ TNS("wrmsr",NORM), TNS("rdtsc",NORM), TNS("rdmsr",NORM), TNS("rdpmc",NORM), 1492/* [34] */ TNSx("sysenter",NORM), TNSx("sysexit",NORM), INVALID, INVALID, --- 12 unchanged lines hidden (view full) --- 1505}, { 1506/* [60] */ TNSZ("punpcklbw",MMO,4),TNSZ("punpcklwd",MMO,4),TNSZ("punpckldq",MMO,4),TNSZ("packsswb",MMO,8), 1507/* [64] */ TNSZ("pcmpgtb",MMO,8), TNSZ("pcmpgtw",MMO,8), TNSZ("pcmpgtd",MMO,8), TNSZ("packuswb",MMO,8), 1508/* [68] */ TNSZ("punpckhbw",MMO,8),TNSZ("punpckhwd",MMO,8),TNSZ("punpckhdq",MMO,8),TNSZ("packssdw",MMO,8), 1509/* [6C] */ TNSZ("INVALID",MMO,0), TNSZ("INVALID",MMO,0), TNSZ("movd",MMO,4), TNSZ("movq",MMO,8), 1510}, { 1511/* [70] */ TNSZ("pshufw",MMOPM,8), TNS("psrXXX",MR), TNS("psrXXX",MR), TNS("psrXXX",MR), 1512/* [74] */ TNSZ("pcmpeqb",MMO,8), TNSZ("pcmpeqw",MMO,8), TNSZ("pcmpeqd",MMO,8), TNS("emms",NORM), |
1513/* [78] */ TNSy("vmread",RM), TNSy("vmwrite",MR), INVALID, INVALID, |
1514/* [7C] */ INVALID, INVALID, TNSZ("movd",MMOS,4), TNSZ("movq",MMOS,8), 1515}, { 1516/* [80] */ TNS("jo",D), TNS("jno",D), TNS("jb",D), TNS("jae",D), 1517/* [84] */ TNS("je",D), TNS("jne",D), TNS("jbe",D), TNS("ja",D), 1518/* [88] */ TNS("js",D), TNS("jns",D), TNS("jp",D), TNS("jnp",D), 1519/* [8C] */ TNS("jl",D), TNS("jge",D), TNS("jle",D), TNS("jg",D), 1520}, { 1521/* [90] */ TNS("seto",Mb), TNS("setno",Mb), TNS("setb",Mb), TNS("setae",Mb), --- 367 unchanged lines hidden (view full) --- 1889/* [0,C] */ TNS("orb",IA), TS("or",IA), TSx("push",SEG), IND(dis_op0F), 1890}, { 1891/* [1,0] */ TNS("adcb",RMw), TS("adc",RMw), TNS("adcb",MRw), TS("adc",MRw), 1892/* [1,4] */ TNS("adcb",IA), TS("adc",IA), TSx("push",SEG), TSx("pop",SEG), 1893/* [1,8] */ TNS("sbbb",RMw), TS("sbb",RMw), TNS("sbbb",MRw), TS("sbb",MRw), 1894/* [1,C] */ TNS("sbbb",IA), TS("sbb",IA), TSx("push",SEG), TSx("pop",SEG), 1895}, { 1896/* [2,0] */ TNS("andb",RMw), TS("and",RMw), TNS("andb",MRw), TS("and",MRw), |
1897/* [2,4] */ TNS("andb",IA), TS("and",IA), TNSx("%es:",OVERRIDE), TNSx("daa",NORM), |
1898/* [2,8] */ TNS("subb",RMw), TS("sub",RMw), TNS("subb",MRw), TS("sub",MRw), 1899/* [2,C] */ TNS("subb",IA), TS("sub",IA), TNS("%cs:",OVERRIDE), TNSx("das",NORM), 1900}, { 1901/* [3,0] */ TNS("xorb",RMw), TS("xor",RMw), TNS("xorb",MRw), TS("xor",MRw), |
1902/* [3,4] */ TNS("xorb",IA), TS("xor",IA), TNSx("%ss:",OVERRIDE), TNSx("aaa",NORM), |
1903/* [3,8] */ TNS("cmpb",RMw), TS("cmp",RMw), TNS("cmpb",MRw), TS("cmp",MRw), |
1904/* [3,C] */ TNS("cmpb",IA), TS("cmp",IA), TNSx("%ds:",OVERRIDE), TNSx("aas",NORM), |
1905}, { 1906/* [4,0] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), 1907/* [4,4] */ TSx("inc",R), TSx("inc",R), TSx("inc",R), TSx("inc",R), 1908/* [4,8] */ TSx("dec",R), TSx("dec",R), TSx("dec",R), TSx("dec",R), 1909/* [4,C] */ TSx("dec",R), TSx("dec",R), TSx("dec",R), TSx("dec",R), 1910}, { 1911/* [5,0] */ TSp("push",R), TSp("push",R), TSp("push",R), TSp("push",R), 1912/* [5,4] */ TSp("push",R), TSp("push",R), TSp("push",R), TSp("push",R), --- 1022 unchanged lines hidden (view full) --- 2935 dp++; 2936 } 2937 } 2938#ifdef DIS_TEXT 2939 if (strcmp(dp->it_name, "INVALID") == 0) 2940 goto error; 2941#endif 2942 switch (dp->it_adrmode) { |
2943 case RM_66r: |
2944 case XMM_66r: 2945 case XMMM_66r: 2946 if (opnd_size_prefix == 0) { 2947 goto error; 2948 } 2949 break; 2950 case XMM_66o: 2951 if (opnd_size_prefix == 0) { --- 133 unchanged lines hidden (view full) --- 3085 } else if (opnd_size_prefix) { 3086 dp = (instable_t *)&dis_opSIMDdata16[off]; 3087 opnd_size_prefix = 0; 3088 if (opnd_size == SIZE16) 3089 opnd_size = SIZE32; 3090 } 3091 break; 3092 |
3093 case MG9: 3094 /* 3095 * More horribleness: the group 9 (0xF0 0xC7) instructions are 3096 * allowed an optional prefix of 0x66 or 0xF3. This is similar 3097 * to the SIMD business described above, but with a different 3098 * addressing mode (and an indirect table), so we deal with it 3099 * separately (if similarly). 3100 * 3101 * Intel further complicated this with the release of Ivy Bridge 3102 * where they overloaded these instructions based on the ModR/M 3103 * bytes. The VMX instructions have a mode of 0 since they are 3104 * memory instructions but rdrand instructions have a mode of 3105 * 0b11 (REG_ONLY) because they only operate on registers. While 3106 * there are different prefix formats, for now it is sufficient 3107 * to use a single different table. 3108 */ 3109 3110 /* 3111 * Calculate our offset in dis_op0FC7 (the group 9 table) 3112 */ 3113 if ((uintptr_t)dp - (uintptr_t)dis_op0FC7 > sizeof (dis_op0FC7)) 3114 goto error; 3115 3116 off = ((uintptr_t)dp - (uintptr_t)dis_op0FC7) / 3117 sizeof (instable_t); 3118 3119 /* 3120 * If we have a mode of 0b11 then we have to rewrite this. 3121 */ 3122 dtrace_get_modrm(x, &mode, ®, &r_m); 3123 if (mode == REG_ONLY) { 3124 dp = (instable_t *)&dis_op0FC7m3[off]; 3125 break; 3126 } 3127 3128 /* 3129 * Rewrite if this instruction used one of the magic prefixes. 3130 */ 3131 if (rep_prefix) { 3132 if (rep_prefix == 0xf3) 3133 dp = (instable_t *)&dis_opF30FC7[off]; 3134 else 3135 goto error; 3136 rep_prefix = 0; 3137 } else if (opnd_size_prefix) { 3138 dp = (instable_t *)&dis_op660FC7[off]; 3139 opnd_size_prefix = 0; 3140 if (opnd_size == SIZE16) 3141 opnd_size = SIZE32; 3142 } 3143 break; 3144 3145 |
3146 case MMOSH: 3147 /* 3148 * As with the "normal" SIMD instructions, the MMX 3149 * shuffle instructions are overloaded. These 3150 * instructions, however, are special in that they use 3151 * an extra byte, and thus an extra table. As of this 3152 * writing, they only use the opnd_size prefix. 3153 */ --- 364 unchanged lines hidden (view full) --- 3518 case Mw: 3519 wbit = WBIT(opcode2); 3520just_mem: 3521 dtrace_get_modrm(x, &mode, ®, &r_m); 3522 dtrace_rex_adjust(rex_prefix, mode, NULL, &r_m); 3523 dtrace_get_operand(x, mode, r_m, wbit, 0); 3524 break; 3525 |
3526 case SWAPGS_RDTSCP: |
3527 if (cpu_mode == SIZE64 && mode == 3 && r_m == 0) { 3528#ifdef DIS_TEXT 3529 (void) strncpy(x->d86_mnem, "swapgs", OPLEN); 3530#endif 3531 NOMEM; 3532 break; |
3533 } else if (mode == 3 && r_m == 1) { 3534#ifdef DIS_TEXT 3535 (void) strncpy(x->d86_mnem, "rdtscp", OPLEN); 3536#endif 3537 NOMEM; 3538 break; |
3539 } |
3540 |
3541 /*FALLTHROUGH*/ 3542 3543 /* prefetch instruction - memory operand, but no memory acess */ 3544 case PREF: 3545 NOMEM; 3546 /*FALLTHROUGH*/ 3547 3548 /* single memory or register operand */ 3549 case M: |
3550 case MG9: |
3551 wbit = LONG_OPND; 3552 goto just_mem; 3553 3554 /* single memory or register byte operand */ 3555 case Mb: 3556 wbit = BYTE_OPND; 3557 goto just_mem; 3558 |
3559 case VMx: 3560 if (mode == 3) { 3561#ifdef DIS_TEXT 3562 char *vminstr; 3563 3564 switch (r_m) { 3565 case 1: 3566 vminstr = "vmcall"; 3567 break; 3568 case 2: 3569 vminstr = "vmlaunch"; 3570 break; 3571 case 3: 3572 vminstr = "vmresume"; 3573 break; 3574 case 4: 3575 vminstr = "vmxoff"; 3576 break; 3577 default: 3578 goto error; 3579 } 3580 3581 (void) strncpy(x->d86_mnem, vminstr, OPLEN); 3582#else 3583 if (r_m < 1 || r_m > 4) 3584 goto error; 3585#endif 3586 3587 NOMEM; 3588 break; 3589 } 3590 /*FALLTHROUGH*/ 3591 case SVM: 3592 if (mode == 3) { 3593#ifdef DIS_TEXT 3594 char *vinstr; 3595 3596 switch (r_m) { 3597 case 0: 3598 vinstr = "vmrun"; 3599 break; 3600 case 1: 3601 vinstr = "vmmcall"; 3602 break; 3603 case 2: 3604 vinstr = "vmload"; 3605 break; 3606 case 3: 3607 vinstr = "vmsave"; 3608 break; 3609 case 4: 3610 vinstr = "stgi"; 3611 break; 3612 case 5: 3613 vinstr = "clgi"; 3614 break; 3615 case 6: 3616 vinstr = "skinit"; 3617 break; 3618 case 7: 3619 vinstr = "invlpga"; 3620 break; 3621 } 3622 3623 (void) strncpy(x->d86_mnem, vinstr, OPLEN); 3624#endif 3625 NOMEM; 3626 break; 3627 } 3628 /*FALLTHROUGH*/ |
3629 case MONITOR_MWAIT: 3630 if (mode == 3) { 3631 if (r_m == 0) { 3632#ifdef DIS_TEXT 3633 (void) strncpy(x->d86_mnem, "monitor", OPLEN); 3634#endif 3635 NOMEM; 3636 break; --- 122 unchanged lines hidden (view full) --- 3759 case MR: 3760 if (vex_prefetch) 3761 x->d86_got_modrm = 1; 3762 wbit = LONG_OPND; 3763 STANDARD_MODRM(x, mode, reg, r_m, rex_prefix, wbit, 0); 3764 break; 3765 3766 case RM: |
3767 case RM_66r: |
3768 wbit = LONG_OPND; 3769 STANDARD_MODRM(x, mode, reg, r_m, rex_prefix, wbit, 1); 3770 break; 3771 3772 /* MMX/SIMD-Int memory or mm reg to mm reg */ 3773 case MM: 3774 case MMO: 3775#ifdef DIS_TEXT --- 687 unchanged lines hidden (view full) --- 4463 (dp == &dis_opAVX660F[0x5A]) || 4464 (dp == &dis_opAVX660F[0xE6])) { 4465 /* vcvtpd2dq <ymm>, <xmm> */ 4466 /* or vcvtpd2ps <ymm>, <xmm> */ 4467 /* or vcvttpd2dq <ymm>, <xmm> */ 4468 dtrace_get_operand(x, REG_ONLY, reg, XMM_OPND, 1); 4469 dtrace_get_operand(x, mode, r_m, wbit, 0); 4470 } else if ((dp == &dis_opAVXF30F[0xE6]) || |
4471 (dp == &dis_opAVX0F[0x5][0xA]) || 4472 (dp == &dis_opAVX660F38[0x13])) { |
4473 /* vcvtdq2pd <xmm>, <ymm> */ 4474 /* or vcvtps2pd <xmm>, <ymm> */ 4475 dtrace_get_operand(x, REG_ONLY, reg, wbit, 1); 4476 dtrace_get_operand(x, mode, r_m, XMM_OPND, 0); 4477 } else if (dp == &dis_opAVX660F[0x6E]) { 4478 /* vmovd/q <reg/mem 32/64>, <xmm> */ 4479#ifdef DIS_TEXT 4480 if (vex_W) --- 68 unchanged lines hidden (view full) --- 4549 dtrace_get_modrm(x, &mode, ®, &r_m); 4550 dtrace_vex_adjust(vex_byte1, mode, ®, &r_m); 4551 dtrace_get_operand(x, REG_ONLY, reg, wbit, 1); 4552 dtrace_get_operand(x, mode, r_m, wbit, 0); 4553 break; 4554 4555 case VEX_RX: 4556 /* ModR/M.rm := op(ModR/M.reg) */ |
4557 /* vextractf128 || vcvtps2ph */ 4558 if (dp == &dis_opAVX660F3A[0x19] || 4559 dp == &dis_opAVX660F3A[0x1d]) { |
4560 x->d86_numopnds = 3; 4561 4562 dtrace_get_modrm(x, &mode, ®, &r_m); 4563 dtrace_vex_adjust(vex_byte1, mode, ®, &r_m); 4564 4565 dtrace_get_operand(x, mode, r_m, XMM_OPND, 2); 4566 dtrace_get_operand(x, REG_ONLY, reg, wbit, 1); 4567 --- 445 unchanged lines hidden --- |