two_byte_opcodes.isa revision 5291:5d38610cff05
1// Copyright (c) 2007 The Hewlett-Packard Development Company 2// All rights reserved. 3// 4// Redistribution and use of this software in source and binary forms, 5// with or without modification, are permitted provided that the 6// following conditions are met: 7// 8// The software must be used only for Non-Commercial Use which means any 9// use which is NOT directed to receiving any direct monetary 10// compensation for, or commercial advantage from such use. Illustrative 11// examples of non-commercial use are academic research, personal study, 12// teaching, education and corporate research & development. 13// Illustrative examples of commercial use are distributing products for 14// commercial advantage and providing services using the software for 15// commercial advantage. 16// 17// If you wish to use this software or functionality therein that may be 18// covered by patents for commercial use, please contact: 19// Director of Intellectual Property Licensing 20// Office of Strategy and Technology 21// Hewlett-Packard Company 22// 1501 Page Mill Road 23// Palo Alto, California 94304 24// 25// Redistributions of source code must retain the above copyright notice, 26// this list of conditions and the following disclaimer. Redistributions 27// in binary form must reproduce the above copyright notice, this list of 28// conditions and the following disclaimer in the documentation and/or 29// other materials provided with the distribution. Neither the name of 30// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 31// contributors may be used to endorse or promote products derived from 32// this software without specific prior written permission. No right of 33// sublicense is granted herewith. Derivatives of the software and 34// output created using the software may be prepared, but only for 35// Non-Commercial Uses. Derivatives of the software may be shared with 36// others provided: (i) the others agree to abide by the list of 37// conditions herein which includes the Non-Commercial Use restrictions; 38// and (ii) such Derivatives of the software include the above copyright 39// notice to acknowledge the contribution from this software where 40// applicable, this list of conditions and the disclaimer below. 41// 42// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 43// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 44// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 45// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 46// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 47// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 48// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 49// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 50// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 51// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 52// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53// 54// Authors: Gabe Black 55 56//////////////////////////////////////////////////////////////////// 57// 58// Decode the two byte opcodes 59// 600x2: decode OPCODE_PREFIXA { 61 0x0F: decode OPCODE_OP_TOP5 { 62 format WarnUnimpl { 63 0x00: decode OPCODE_OP_BOTTOM3 { 64 //0x00: group6(); 65 0x00: decode MODRM_REG { 66 0x0: sldt_Mw_or_Rv(); 67 0x1: str_Mw_or_Rv(); 68 0x2: lldt_Mw_or_Rv(); 69 0x3: ltr_Mw_or_Rv(); 70 0x4: verr_Mw_or_Rv(); 71 0x5: verw_Mw_or_Rv(); 72 //0x6: jmpe_Ev(); // IA-64 73 default: Inst::UD2(); 74 } 75 //0x01: group7(); // Ugly, ugly, ugly... 76 0x01: decode MODRM_MOD { 77 0x3: decode MODRM_REG { 78 0x0: decode MODRM_RM { 79 0x1: vmcall(); 80 0x2: vmlaunch(); 81 0x3: vmresume(); 82 0x4: vmxoff(); 83 default: Inst::UD2(); 84 } 85 0x1: decode MODRM_RM { 86 0x0: monitor(); 87 0x1: mwait(); 88 default: Inst::UD2(); 89 } 90 0x3: decode MODRM_RM { 91 0x0: vmrun(); 92 0x1: vmmcall(); 93 0x2: vmload(); 94 0x3: vmsave(); 95 0x4: stgi(); 96 0x5: clgi(); 97 0x6: skinit(); 98 0x7: invlpga(); 99 } 100 0x4: smsw_Rv(); 101 0x6: lmsw_Rv(); 102 0x7: decode MODRM_RM { 103 0x0: swapgs(); 104 0x1: rdtscp(); 105 default: Inst::UD2(); 106 } 107 default: Inst::UD2(); 108 } 109 default: decode MODRM_REG { 110 0x0: sgdt_Ms(); 111 0x1: sidt_Ms(); 112 0x2: decode MODE_SUBMODE { 113 0x0: Inst::LGDT(M); 114 default: decode OPSIZE { 115 // 16 bit operand sizes are special, but only 116 // in legacy and compatability modes. 117 0x2: Inst::LGDT_16(M); 118 default: Inst::LGDT(M); 119 } 120 } 121 0x3: lidt_Ms(); 122 0x4: smsw_Mw(); 123 0x6: lmsw_Mw(); 124 0x7: invlpg_M(); 125 default: Inst::UD2(); 126 } 127 } 128 0x02: lar_Gv_Ew(); 129 0x03: lsl_Gv_Ew(); 130 //sandpile.org doesn't seem to know what this is... ? 131 0x04: loadall_or_reset_or_hang(); 132#if FULL_SYSTEM 133 0x05: syscall(); 134#else 135 0x05: SyscallInst::syscall('xc->syscall(rax)', IsSyscall); 136#endif 137 0x06: clts(); 138 //sandpile.org says (AMD) after sysret, so I might want to check 139 //if that means amd64 or AMD machines 140 0x07: loadall_or_sysret(); 141 } 142 0x01: decode OPCODE_OP_BOTTOM3 { 143 0x0: invd(); 144 0x1: wbinvd(); 145 0x2: Inst::UD2(); 146 0x3: Inst::UD2(); 147 0x4: Inst::UD2(); 148 0x5: threednow(); 149 0x6: threednow(); 150 0x7: threednow(); 151 } 152 0x02: decode LEGACY_DECODEVAL { 153 // no prefix 154 0x0: decode OPCODE_OP_BOTTOM3 { 155 0x0: movups_Vo_Wo(); 156 0x1: movups_Wo_Vo(); 157 0x2: decode MODRM_MOD { 158 0x3: movhlps_Vq_VRq(); 159 default: movlps_Vq_Mq(); 160 } 161 0x3: movlps_Mq_Vq(); 162 0x4: unpcklps(); 163 0x5: unpckhps(); 164 0x6: decode MODRM_MOD { 165 0x3: movlhps_Vq_VRq(); 166 default: movhps_Vq_Mq(); 167 } 168 0x7: movhps_Mq_Vq(); 169 } 170 // repe (0xF3) 171 0x4: decode OPCODE_OP_BOTTOM3 { 172 0x0: movss_Vd_Wd(); 173 0x1: movss_Wd_Vd(); 174 0x2: movsldup_Vo_Wo(); 175 0x6: movshdup_Vo_Wo(); 176 default: Inst::UD2(); 177 } 178 // operand size (0x66) 179 0x1: decode OPCODE_OP_BOTTOM3 { 180 0x0: movupd_Vo_Wo(); 181 0x1: movupd_Wo_Vo(); 182 0x2: Inst::MOVLPD(Vq,Mq); 183 0x3: Inst::MOVLPD(Mq,Vq); 184 0x4: unpcklpd_Vo_Wq(); 185 0x5: unpckhpd_Vo_Wo(); 186 0x6: movhpd_Vq_Mq(); 187 0x7: movhpd_Mq_Vq(); 188 } 189 // repne (0xF2) 190 0x8: decode OPCODE_OP_BOTTOM3 { 191 0x0: Inst::MOVSD(Vq,Wq); 192 0x1: Inst::MOVSD(Wq,Vq); 193 0x2: movddup_Vo_Wq(); 194 default: Inst::UD2(); 195 } 196 default: Inst::UD2(); 197 } 198 0x03: decode OPCODE_OP_BOTTOM3 { 199 0x0: group17(); 200 0x1: group17(); 201 0x2: group17(); 202 0x3: group17(); 203 0x4: group17(); 204 0x5: group17(); 205 0x6: group17(); 206 0x7: group17(); 207 } 208 0x04: decode LEGACY_DECODEVAL { 209 // no prefix 210 0x0: decode OPCODE_OP_BOTTOM3 { 211 0x0: mov_Rd_Cd(); 212 0x1: mov_Rd_Dd(); 213 0x2: Inst::MOV(Cd,Rd); 214 0x3: mov_Dd_Rd(); 215 0x4: mov_Rd_Td(); 216 0x6: mov_Td_Rd(); 217 default: Inst::UD2(); 218 } 219 // lock prefix (0xF0) 220 0x2: decode OPCODE_OP_BOTTOM3 { 221 0x0: mov_Rd_CR8D(); 222 0x2: mov_CR8D_Rd(); 223 } 224 default: Inst::UD2(); 225 } 226 0x05: decode LEGACY_DECODEVAL { 227 // no prefix 228 0x0: decode OPCODE_OP_BOTTOM3 { 229 //These moves should really use size o (octword), but 230 //because they are split in two, they use q (quadword). 231 0x0: Inst::MOVAPS(Vq,Wq); 232 0x1: Inst::MOVAPS(Wq,Vq); 233 0x2: decode MODRM_MOD { 234 0x3: cvtpi2pS_Vq_Pq(); 235 default: cvtpi2ps_Vq_Mq(); 236 } 237 0x3: movntps_Mo_Vo(); 238 0x4: cvttps2pi_Pq_Wq(); 239 0x5: cvtpS2pi_Pq_Wq(); 240 0x6: ucomiss_Vd_Wd(); 241 0x7: comiss_Vd_Wd(); 242 } 243 // repe (0xF3) 244 0x4: decode OPCODE_OP_BOTTOM3 { 245 0x2: cvtsi2ss_Vd_Ed(); 246 0x4: cvttss2si_Gd_Wd(); 247 0x5: cvtss2si_Gd_Wd(); 248 default: Inst::UD2(); 249 } 250 // operand size (0x66) 251 0x1: decode OPCODE_OP_BOTTOM3 { 252 0x0: movapd_Vo_Wo(); 253 0x1: movapd_Wo_Vo(); 254 0x2: decode MODRM_MOD { 255 0x3: cvtpi2pd_Vo_Pq(); 256 default: cvtpi2pd_Vo_Mq(); 257 } 258 0x3: movntpd_Mo_Vo(); 259 0x4: cvttpd2pi_Pq_Wo(); 260 0x5: cvtpd2pi_Pq_Wo(); 261 0x6: Inst::UCOMISD(Vq,Wq); 262 0x7: comisd_Vq_Wq(); 263 } 264 // repne (0xF2) 265 0x8: decode OPCODE_OP_BOTTOM3 { 266 // The size of the V operand should be q, not dp 267 0x2: Inst::CVTSI2SD(Vdp,Edp); 268 // The size of the W operand should be q, not dp 269 0x4: Inst::CVTTSD2SI(Gdp,Wdp); 270 0x5: cvtsd2si_Gd_Wq(); 271 default: Inst::UD2(); 272 } 273 default: Inst::UD2(); 274 } 275 0x06: decode OPCODE_OP_BOTTOM3 { 276 0x0: Inst::WRMSR(); 277 0x1: rdtsc(); 278 0x2: Inst::RDMSR(); 279 0x3: rdpmc(); 280 0x4: sysenter(); 281 0x5: sysexit(); 282 0x6: Inst::UD2(); 283 0x7: getsec(); 284 } 285 0x07: decode OPCODE_OP_BOTTOM3 { 286 0x0: three_byte_opcode(); 287 0x1: three_byte_opcode(); 288 0x2: three_byte_opcode(); 289 0x3: three_byte_opcode(); 290 0x4: three_byte_opcode(); 291 0x5: three_byte_opcode(); 292 0x6: three_byte_opcode(); 293 0x7: three_byte_opcode(); 294 } 295 format Inst { 296 0x08: decode OPCODE_OP_BOTTOM3 { 297 0x0: CMOVO(Gv,Ev); 298 0x1: CMOVNO(Gv,Ev); 299 0x2: CMOVB(Gv,Ev); 300 0x3: CMOVNB(Gv,Ev); 301 0x4: CMOVZ(Gv,Ev); 302 0x5: CMOVNZ(Gv,Ev); 303 0x6: CMOVBE(Gv,Ev); 304 0x7: CMOVNBE(Gv,Ev); 305 } 306 0x09: decode OPCODE_OP_BOTTOM3 { 307 0x0: CMOVS(Gv,Ev); 308 0x1: CMOVNS(Gv,Ev); 309 0x2: CMOVP(Gv,Ev); 310 0x3: CMOVNP(Gv,Ev); 311 0x4: CMOVL(Gv,Ev); 312 0x5: CMOVNL(Gv,Ev); 313 0x6: CMOVLE(Gv,Ev); 314 0x7: CMOVNLE(Gv,Ev); 315 } 316 } 317 0x0A: decode LEGACY_DECODEVAL { 318 // no prefix 319 0x0: decode OPCODE_OP_BOTTOM3 { 320 0x0: movmskps_Gd_VRo(); 321 0x1: sqrtps_Vo_Wo(); 322 0x2: rqsrtps_Vo_Wo(); 323 0x3: rcpps_Vo_Wo(); 324 0x4: andps_Vo_Wo(); 325 0x5: andnps_Vo_Wo(); 326 0x6: orps_Vo_Wo(); 327 0x7: xorps_Vo_Wo(); 328 } 329 // repe (0xF3) 330 0x4: decode OPCODE_OP_BOTTOM3 { 331 0x1: sqrtss_Vd_Wd(); 332 0x2: rsqrtss_Vd_Wd(); 333 0x3: rcpss_Vd_Wd(); 334 default: Inst::UD2(); 335 } 336 // operand size (0x66) 337 0x1: decode OPCODE_OP_BOTTOM3 { 338 0x0: movmskpd_Gd_VRo(); 339 0x1: sqrtpd_Vo_Wo(); 340 0x4: andpd_Vo_Wo(); 341 0x5: andnpd_Vo_Wo(); 342 0x6: orpd_Vo_Wo(); 343 //This really should be type o, but it works on q sized 344 //chunks at a time. 345 0x7: Inst::XORPD(Vq,Wq); 346 default: Inst::UD2(); 347 } 348 format Inst { 349 // repne (0xF2) 350 0x8: decode OPCODE_OP_BOTTOM3 { 351 0x1: SQRTSD(Vq,Wq); 352 default: UD2(); 353 } 354 default: UD2(); 355 } 356 } 357 0x0B: decode LEGACY_DECODEVAL { 358 // no prefix 359 0x0: decode OPCODE_OP_BOTTOM3 { 360 0x0: addps_Vo_Wo(); 361 0x1: mulps_Vo_Wo(); 362 0x2: cvtps2pd_Vo_Wq(); 363 0x3: cvtdq2ps_Vo_Wo(); 364 0x4: subps_Vo_Wo(); 365 0x5: minps_Vo_Wo(); 366 0x6: divps_Vo_Wo(); 367 0x7: maxps_Vo_Wo(); 368 } 369 // repe (0xF3) 370 0x4: decode OPCODE_OP_BOTTOM3 { 371 0x0: addss_Vd_Wd(); 372 0x1: mulss_Vd_Wd(); 373 0x2: cvtss2sd_Vq_Wd(); 374 0x3: cvttps2dq_Vo_Wo(); 375 0x4: subss_Vd_Wd(); 376 0x5: minss_Vd_Wd(); 377 0x6: divss_Vd_Wd(); 378 0x7: maxss_Vd_Wd(); 379 } 380 // operand size (0x66) 381 0x1: decode OPCODE_OP_BOTTOM3 { 382 0x0: addpd_Vo_Wo(); 383 0x1: mulpd_Vo_Wo(); 384 0x2: cvtpd2ps_Vo_Wo(); 385 0x3: cvtps2dq_Vo_Wo(); 386 0x4: subpd_Vo_Wo(); 387 0x5: minpd_Vo_Wo(); 388 0x6: divpd_Vo_Wo(); 389 0x7: maxpd_Vo_Wo(); 390 } 391 // repne (0xF2) 392 0x8: decode OPCODE_OP_BOTTOM3 { 393 0x0: Inst::ADDSD(Vq,Wq); 394 0x1: Inst::MULSD(Vq,Wq); 395 0x2: cvtsd2ss_Vd_Wq(); 396 0x4: Inst::SUBSD(Vq,Wq); 397 0x5: minsd_Vq_Wq(); 398 0x6: Inst::DIVSD(Vq,Wq); 399 0x7: maxsd_Vq_Wq(); 400 default: Inst::UD2(); 401 } 402 default: Inst::UD2(); 403 } 404 0x0C: decode LEGACY_DECODEVAL { 405 // no prefix 406 0x0: decode OPCODE_OP_BOTTOM3 { 407 0x0: punpcklbw_Pq_Qd(); 408 0x1: punpcklwd_Pq_Qd(); 409 0x2: punpckldq_Pq_Qd(); 410 0x3: packsswb_Pq_Qq(); 411 0x4: pcmpgtb_Pq_Qq(); 412 0x5: pcmpgtw_Pq_Qq(); 413 0x6: pcmpgtd_Pq_Qq(); 414 0x7: packuswb_Pq_Qq(); 415 } 416 // operand size (0x66) 417 0x1: decode OPCODE_OP_BOTTOM3 { 418 0x0: punpcklbw_Vo_Wq(); 419 0x1: punpcklwd_Vo_Wq(); 420 0x2: punpckldq_Vo_Wq(); 421 0x3: packsswb_Vo_Wo(); 422 0x4: pcmpgtb_Vo_Wo(); 423 0x5: pcmpgtw_Vo_Wo(); 424 0x6: pcmpgtd_Vo_Wo(); 425 0x7: packuswb_Vo_Wo(); 426 } 427 default: Inst::UD2(); 428 } 429 0x0D: decode LEGACY_DECODEVAL { 430 // no prefix 431 0x0: decode OPCODE_OP_BOTTOM3 { 432 0x0: punpckhbw_Pq_Qq(); 433 0x1: punpckhwd_Pq_Qq(); 434 0x2: punpckhdq_Pq_Qq(); 435 0x3: packssdw_Pq_Qq(); 436 0x6: movd_Pq_Ed(); 437 0x7: movq_Pq_Qq(); 438 default: Inst::UD2(); 439 } 440 // repe (0xF3) 441 0x4: decode OPCODE_OP_BOTTOM3 { 442 0x7: movdqu_Vo_Wo(); 443 default: Inst::UD2(); 444 } 445 // operand size (0x66) 446 0x1: decode OPCODE_OP_BOTTOM3 { 447 0x0: punpckhbw_Vo_Wo(); 448 0x1: punpckhwd_Vo_Wo(); 449 0x2: punpckhdq_Vo_Wo(); 450 0x3: packssdw_Vo_Wo(); 451 0x4: punpcklqdq_Vo_Wq(); 452 0x5: punpcklqdq_Vo_Wq(); 453 0x6: movd_Vo_Ed(); 454 0x7: movdqa_Vo_Wo(); 455 } 456 default: Inst::UD2(); 457 } 458 0x0E: decode LEGACY_DECODEVAL { 459 // no prefix 460 0x0: decode OPCODE_OP_BOTTOM3 { 461 0x0: pshufw_Pq_Qq_Ib(); 462 //0x1: group13_pshimw(); 463 0x1: decode MODRM_REG { 464 0x2: decode LEGACY_OP { 465 0x0: psrlw_PRq_Ib(); 466 0x1: psrlw_VRo_Ib(); 467 } 468 0x4: decode LEGACY_OP { 469 0x0: psraw_PRq_Ib(); 470 0x1: psraw_VRo_Ib(); 471 } 472 0x6: decode LEGACY_OP { 473 0x0: psllw_PRq_Ib(); 474 0x1: psllw_VRo_Ib(); 475 } 476 default: Inst::UD2(); 477 } 478 //0x2: group14_pshimd(); 479 0x2: decode MODRM_REG { 480 0x2: decode LEGACY_OP { 481 0x0: psrld_PRq_Ib(); 482 0x1: psrld_VRo_Ib(); 483 } 484 0x4: decode LEGACY_OP { 485 0x0: psrad_PRq_Ib(); 486 0x1: psrad_VRo_Ib(); 487 } 488 0x6: decode LEGACY_OP { 489 0x0: pslld_PRq_Ib(); 490 0x1: pslld_VRo_Ib(); 491 } 492 default: Inst::UD2(); 493 } 494 //0x3: group15_pshimq(); 495 0x3: decode MODRM_REG { 496 0x2: decode LEGACY_OP { 497 0x0: psrlq_PRq_Ib(); 498 0x1: psrlq_VRo_Ib(); 499 } 500 0x3: decode LEGACY_OP { 501 0x0: Inst::UD2(); 502 0x1: psrldq_VRo_Ib(); 503 } 504 0x6: decode LEGACY_OP { 505 0x0: psllq_PRq_Ib(); 506 0x1: psllq_VRo_Ib(); 507 } 508 0x7: decode LEGACY_OP { 509 0x0: Inst::UD2(); 510 0x1: pslldq_VRo_Ib(); 511 } 512 default: Inst::UD2(); 513 } 514 0x4: pcmpeqb_Pq_Qq(); 515 0x5: pcmpeqw_Pq_Qq(); 516 0x6: pcmpeqd_Pq_Qq(); 517 0x7: emms(); 518 } 519 // repe (0xF3) 520 0x4: decode OPCODE_OP_BOTTOM3 { 521 0x0: pshufhw_Vo_Wo_Ib(); 522 default: Inst::UD2(); 523 } 524 // operand size (0x66) 525 0x1: decode OPCODE_OP_BOTTOM3 { 526 0x0: pshufd_Vo_Wo_Ib(); 527 //0x1: group13_pshimw(); 528 0x1: decode MODRM_REG { 529 0x2: decode LEGACY_OP { 530 0x0: psrlw_PRq_Ib(); 531 0x1: psrlw_VRo_Ib(); 532 } 533 0x4: decode LEGACY_OP { 534 0x0: psraw_PRq_Ib(); 535 0x1: psraw_VRo_Ib(); 536 } 537 0x6: decode LEGACY_OP { 538 0x0: psllw_PRq_Ib(); 539 0x1: psllw_VRo_Ib(); 540 } 541 default: Inst::UD2(); 542 } 543 //0x2: group14_pshimd(); 544 0x2: decode MODRM_REG { 545 0x2: decode LEGACY_OP { 546 0x0: psrld_PRq_Ib(); 547 0x1: psrld_VRo_Ib(); 548 } 549 0x4: decode LEGACY_OP { 550 0x0: psrad_PRq_Ib(); 551 0x1: psrad_VRo_Ib(); 552 } 553 0x6: decode LEGACY_OP { 554 0x0: pslld_PRq_Ib(); 555 0x1: pslld_VRo_Ib(); 556 } 557 default: Inst::UD2(); 558 } 559 //0x3: group15_pshimq(); 560 0x3: decode MODRM_REG { 561 0x2: decode LEGACY_OP { 562 0x0: psrlq_PRq_Ib(); 563 0x1: psrlq_VRo_Ib(); 564 } 565 0x3: decode LEGACY_OP { 566 0x0: Inst::UD2(); 567 0x1: psrldq_VRo_Ib(); 568 } 569 0x6: decode LEGACY_OP { 570 0x0: psllq_PRq_Ib(); 571 0x1: psllq_VRo_Ib(); 572 } 573 0x7: decode LEGACY_OP { 574 0x0: Inst::UD2(); 575 0x1: pslldq_VRo_Ib(); 576 } 577 default: Inst::UD2(); 578 } 579 0x4: pcmpeqb_Vo_Wo(); 580 0x5: pcmpeqw_Vo_Wo(); 581 0x6: pcmpeqd_Vo_Wo(); 582 default: Inst::UD2(); 583 } 584 // repne (0xF2) 585 0x8: decode OPCODE_OP_BOTTOM3 { 586 0x0: pshuflw_Vo_Wo_Ib(); 587 default: Inst::UD2(); 588 } 589 default: Inst::UD2(); 590 } 591 0x0F: decode LEGACY_DECODEVAL { 592 // no prefix 593 0x0: decode OPCODE_OP_BOTTOM3 { 594 0x0: vmread_Ed_or_Eq_Gd_or_Gq(); 595 0x1: vmwrite_Gd_or_Gq_Ed_or_Eq(); 596 0x6: mov_Ed_Pd(); 597 0x7: mov_Qq_Pq(); 598 default: Inst::UD2(); 599 } 600 // repe (0xF3) 601 0x4: decode OPCODE_OP_BOTTOM3 { 602 0x6: movq_Vo_Mq_or_Vq_Vq(); 603 0x7: movdqu_Wo_Vo(); 604 default: Inst::UD2(); 605 } 606 // operand size (0x66) 607 0x1: decode OPCODE_OP_BOTTOM3 { 608 0x4: haddpd_Vo_Wo(); 609 0x5: hsubpd_Vo_Wo(); 610 0x6: movd_Ed_Vd(); 611 0x7: movdqa_Wo_Vo(); 612 default: Inst::UD2(); 613 } 614 // repne (0xF2) 615 0x8: decode OPCODE_OP_BOTTOM3 { 616 0x4: haddps_Vo_Wo(); 617 0x5: hsubps_Vo_Wo(); 618 default: Inst::UD2(); 619 } 620 default: Inst::UD2(); 621 } 622 format Inst { 623 0x10: decode OPCODE_OP_BOTTOM3 { 624 0x0: JO(Jz); 625 0x1: JNO(Jz); 626 0x2: JB(Jz); 627 0x3: JNB(Jz); 628 0x4: JZ(Jz); 629 0x5: JNZ(Jz); 630 0x6: JBE(Jz); 631 0x7: JNBE(Jz); 632 } 633 0x11: decode OPCODE_OP_BOTTOM3 { 634 0x0: JS(Jz); 635 0x1: JNS(Jz); 636 0x2: JP(Jz); 637 0x3: JNP(Jz); 638 0x4: JL(Jz); 639 0x5: JNL(Jz); 640 0x6: JLE(Jz); 641 0x7: JNLE(Jz); 642 } 643 0x12: decode OPCODE_OP_BOTTOM3 { 644 0x0: SETO(Eb); 645 0x1: SETNO(Eb); 646 0x2: SETB(Eb); 647 0x3: SETNB(Eb); 648 0x4: SETZ(Eb); 649 0x5: SETNZ(Eb); 650 0x6: SETBE(Eb); 651 0x7: SETNBE(Eb); 652 } 653 0x13: decode OPCODE_OP_BOTTOM3 { 654 0x0: SETS(Eb); 655 0x1: SETNS(Eb); 656 0x2: SETP(Eb); 657 0x3: SETNP(Eb); 658 0x4: SETL(Eb); 659 0x5: SETNL(Eb); 660 0x6: SETLE(Eb); 661 0x7: SETNLE(Eb); 662 } 663 } 664 0x14: decode OPCODE_OP_BOTTOM3 { 665 0x0: push_fs(); 666 0x1: pop_fs(); 667 0x2: Inst::CPUID(rAd); 668 0x3: Inst::BT(Ev,Gv); 669 0x4: shld_Ev_Gv_Ib(); 670 0x5: shld_Ev_Gv_rCl(); 671 0x6: xbts_and_cmpxchg(); 672 0x7: ibts_and_cmpxchg(); 673 } 674 0x15: decode OPCODE_OP_BOTTOM3 { 675 0x0: push_gs(); 676 0x1: pop_gs(); 677 0x2: rsm_smm(); 678 0x3: Inst::BTS(Ev,Gv); 679 0x4: shrd_Ev_Gv_Ib(); 680 0x5: shrd_Ev_Gv_rCl(); 681 //0x6: group16(); 682 0x6: decode MODRM_MOD { 683 0x3: decode MODRM_REG { 684 0x5: lfence(); 685 0x6: mfence(); 686 0x7: sfence(); 687 default: Inst::UD2(); 688 } 689 default: decode MODRM_REG { 690 0x0: fxsave(); 691 0x1: fxrstor(); 692 0x7: clflush(); 693 default: Inst::UD2(); 694 } 695 } 696 0x7: Inst::IMUL(Gv,Ev); 697 } 698 0x16: decode OPCODE_OP_BOTTOM3 { 699 0x0: Inst::CMPXCHG(Eb,Gb); 700 0x1: Inst::CMPXCHG(Ev,Gv); 701 0x2: lss_Gz_Mp(); 702 0x3: Inst::BTR(Ev,Gv); 703 0x4: lfs_Gz_Mp(); 704 0x5: lgs_Gz_Mp(); 705 //The size of the second operand in these instructions should 706 //really be "b" or "w", but it's set to v in order to have a 707 //consistent register size. This shouldn't affect behavior. 708 0x6: Inst::MOVZX_B(Gv,Ev); 709 0x7: Inst::MOVZX_W(Gv,Ev); 710 } 711 0x17: decode OPCODE_OP_BOTTOM3 { 712 0x0: jmpe_Jz(); // IA-64? 713 format Inst { 714 //0x1: group11_UD2(); 715 0x1: UD2(); 716 //0x2: group8_Ev_Ib(); 717 0x2: decode MODRM_REG { 718 0x4: BT(Ev,Ib); 719 0x5: BTS(Ev,Ib); 720 0x6: BTR(Ev,Ib); 721 0x7: BTC(Ev,Ib); 722 default: UD2(); 723 } 724 0x3: BTC(Ev,Gv); 725 } 726 0x4: bsf_Gv_Ev(); 727 0x5: bsr_Gv_Ev(); 728 //The size of the second operand in these instructions should 729 //really be "b" or "w", but it's set to v in order to have a 730 //consistent register size. This shouldn't affect behavior. 731 0x6: Inst::MOVSX_B(Gv,Ev); 732 0x7: Inst::MOVSX_W(Gv,Ev); 733 } 734 0x18: decode OPCODE_OP_BOTTOM3 { 735 0x0: xadd_Eb_Gb(); 736 0x1: xadd_Ev_Gv(); 737 //0x7: group9(); 738 0x7: decode MODRM_REG { 739 0x1: cmpxchg_Mq(); 740 0x6: decode LEGACY_OP { 741 0x1: vmclear_Mq(); 742 default: decode LEGACY_REP { 743 0x1: vmxon_Mq(); 744 0x0: vmptrld_Mq(); 745 } 746 } 747 0x7: vmptrst_Mq(); 748 default: Inst::UD2(); 749 } 750 default: decode LEGACY_DECODEVAL { 751 // no prefix 752 0x0: decode OPCODE_OP_BOTTOM3 { 753 0x2: cmpccps_Vo_Wo_Ib(); 754 0x3: cvtdq2ps_Vo_Wo(); 755 0x4: subps_Vo_Wo(); 756 0x5: minps_Vo_Wo(); 757 0x6: divps_Vo_Wo(); 758 } 759 // repe (0xF3) 760 0x4: decode OPCODE_OP_BOTTOM3 { 761 0x2: cmpccss_Vd_Wd_Ib(); 762 default: Inst::UD2(); 763 } 764 // operand size (0x66) 765 0x1: decode OPCODE_OP_BOTTOM3 { 766 0x2: cmpccpd_Vo_Wo_Ib(); 767 0x4: subpd_Vo_Wo(); 768 0x5: minpd_Vo_Wo(); 769 0x6: divpd_Vo_Wo(); 770 default: Inst::UD2(); 771 } 772 // repne (0xF2) 773 0x8: decode OPCODE_OP_BOTTOM3 { 774 0x2: cmpccsd_Vq_Wq_Ib(); 775 default: Inst::UD2(); 776 } 777 default: Inst::UD2(); 778 } 779 } 780 0x19: bswap_B(); 781 0x1A: decode LEGACY_DECODEVAL { 782 // no prefix 783 0x0: decode OPCODE_OP_BOTTOM3 { 784 0x1: psrlw_Pq_Qq(); 785 0x2: psrld_Pq_Qq(); 786 0x3: psrlq_Pq_Qq(); 787 0x4: paddq_Pq_Qq(); 788 0x5: pmullw_Pq_Qq(); 789 0x7: pmovmskb_Gd_PRq(); 790 default: Inst::UD2(); 791 } 792 // repe (0xF3) 793 0x4: decode OPCODE_OP_BOTTOM3 { 794 0x6: movq2dq_Vo_PRq(); 795 default: Inst::UD2(); 796 } 797 // operand size (0x66) 798 0x1: decode OPCODE_OP_BOTTOM3 { 799 0x0: addsubpd_Vo_Wo(); 800 0x1: psrlw_Vo_Wo(); 801 0x2: psrld_Vo_Wo(); 802 0x3: psrlq_Vo_Wo(); 803 0x4: paddq_Vo_Wo(); 804 0x5: pmullw_Vo_Wo(); 805 0x6: decode MODRM_MOD { 806 0x3: movq_Vq_Vq(); 807 default: movq_Mq_Vq(); 808 } 809 0x7: pmovmskb_Gd_VRo(); 810 } 811 // repne (0xF2) 812 0x8: decode OPCODE_OP_BOTTOM3 { 813 0x0: addsubps_Vo_Wo(); 814 0x6: movdq2q_Pq_VRq(); 815 default: Inst::UD2(); 816 } 817 default: Inst::UD2(); 818 } 819 0x1B: decode LEGACY_DECODEVAL { 820 // no prefix 821 0x0: decode OPCODE_OP_BOTTOM3 { 822 0x0: psubusb_Pq_Qq(); 823 0x1: psubusw_Pq_Qq(); 824 0x2: pminub_Pq_Qq(); 825 0x3: pand_Pq_Qq(); 826 0x4: paddusb_Pq_Qq(); 827 0x5: paddusw_Pq_Qq(); 828 0x6: pmaxub_Pq_Qq(); 829 0x7: pandn_Pq_Qq(); 830 } 831 // operand size (0x66) 832 0x1: decode OPCODE_OP_BOTTOM3 { 833 0x0: psubusb_Vo_Wo(); 834 0x1: psubusw_Vo_Wo(); 835 0x2: pminub_Vo_Wo(); 836 0x3: pand_Vo_Wo(); 837 0x4: paddusb_Vo_Wo(); 838 0x5: paddusw_Vo_Wo(); 839 0x6: pmaxub_Vo_Wo(); 840 0x7: pandn_Vo_Wo(); 841 } 842 default: Inst::UD2(); 843 } 844 0x1C: decode LEGACY_DECODEVAL { 845 // no prefix 846 0x0: decode OPCODE_OP_BOTTOM3 { 847 0x0: pavgb_Pq_Qq(); 848 0x1: psraw_Pq_Qq(); 849 0x2: psrad_Pq_Qq(); 850 0x3: pavgw_Pq_Qq(); 851 0x4: pmulhuw_Pq_Qq(); 852 0x5: pmulhw_Pq_Qq(); 853 0x7: movntq_Mq_Pq(); 854 default: Inst::UD2(); 855 } 856 // repe (0xF3) 857 0x4: decode OPCODE_OP_BOTTOM3 { 858 0x6: cvtdq2pd_Vo_Wq(); 859 default: Inst::UD2(); 860 } 861 // operand size (0x66) 862 0x1: decode OPCODE_OP_BOTTOM3 { 863 0x0: pavgb_Vo_Wo(); 864 0x1: psraw_Vo_Wo(); 865 0x2: psrad_Vo_Wo(); 866 0x3: pavgw_Vo_Wo(); 867 0x4: pmulhuw_Vo_Wo(); 868 0x5: pmulhw_Vo_Wo(); 869 0x6: cvttpd2dq_Vo_Wo(); 870 0x7: movntdq_Mo_Vo(); 871 } 872 // repne (0xF2) 873 0x8: decode OPCODE_OP_BOTTOM3 { 874 0x6: cvtpd2dq_Vo_Wo(); 875 default: Inst::UD2(); 876 } 877 default: Inst::UD2(); 878 } 879 0x1D: decode LEGACY_DECODEVAL { 880 // no prefix 881 0x0: decode OPCODE_OP_BOTTOM3 { 882 0x0: psubsb_Pq_Qq(); 883 0x1: psubsw_Pq_Qq(); 884 0x2: pminsw_Pq_Qq(); 885 0x3: por_Pq_Qq(); 886 0x4: paddsb_Pq_Qq(); 887 0x5: paddsw_Pq_Qq(); 888 0x6: pmaxsw_Pq_Qq(); 889 0x7: pxor_Pq_Qq(); 890 } 891 // operand size (0x66) 892 0x1: decode OPCODE_OP_BOTTOM3 { 893 0x0: psubsb_Vo_Wo(); 894 0x1: psubsw_Vo_Wo(); 895 0x2: pminsw_Vo_Wo(); 896 0x3: por_Vo_Wo(); 897 0x4: paddsb_Vo_Wo(); 898 0x5: paddsw_Vo_Wo(); 899 0x6: pmaxsw_Vo_Wo(); 900 0x7: pxor_Vo_Wo(); 901 } 902 default: Inst::UD2(); 903 } 904 0x1E: decode OPCODE_OP_BOTTOM3 { 905 // no prefix 906 0x0: decode OPCODE_OP_BOTTOM3 { 907 0x1: psllw_Pq_Qq(); 908 0x2: pslld_Pq_Qq(); 909 0x3: psllq_Pq_Qq(); 910 0x4: pmuludq_Pq_Qq(); 911 0x5: pmaddwd_Pq_Qq(); 912 0x6: psadbw_Pq_Qq(); 913 0x7: maskmovq_Pq_PRq(); 914 default: Inst::UD2(); 915 } 916 // operand size (0x66) 917 0x1: decode OPCODE_OP_BOTTOM3 { 918 0x1: psllw_Vo_Wo(); 919 0x2: pslld_Vo_Wo(); 920 0x3: psllq_Vo_Wo(); 921 0x4: pmuludq_Vo_Wo(); 922 0x5: pmaddwd_Vo_Wo(); 923 0x6: psadbw_Vo_Wo(); 924 0x7: maskmovdqu_Vo_VRo(); 925 default: Inst::UD2(); 926 } 927 // repne (0xF2) 928 0x8: decode OPCODE_OP_BOTTOM3 { 929 0x0: lddqu_Vo_Mo(); 930 default: Inst::UD2(); 931 } 932 default: Inst::UD2(); 933 } 934 0x1F: decode LEGACY_DECODEVAL { 935 // no prefix 936 0x0: decode OPCODE_OP_BOTTOM3 { 937 0x0: psubb_Pq_Qq(); 938 0x1: psubw_Pq_Qq(); 939 0x2: psubd_Pq_Qq(); 940 0x3: psubq_Pq_Qq(); 941 0x4: paddb_Pq_Qq(); 942 0x5: paddw_Pq_Qq(); 943 0x6: paddd_Pq_Qq(); 944 0x7: Inst::UD2(); 945 } 946 // operand size (0x66) 947 0x1: decode OPCODE_OP_BOTTOM3 { 948 0x0: psubb_Vo_Wo(); 949 0x1: psubw_Vo_Wo(); 950 0x2: psubd_Vo_Wo(); 951 0x3: psubq_Vo_Wo(); 952 0x4: paddb_Vo_Wo(); 953 0x5: paddw_Vo_Wo(); 954 0x6: paddd_Vo_Wo(); 955 0x7: Inst::UD2(); 956 } 957 default: Inst::UD2(); 958 } 959 default: FailUnimpl::twoByteOps(); 960 } 961 } 962 default: M5InternalError::error( 963 {{"Unexpected first opcode byte in two byte opcode!"}}); 964} 965