two_byte_opcodes.isa revision 5238:95f494fd38bd
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: lgdt_Ms(); 113 0x3: lidt_Ms(); 114 0x4: smsw_Mw(); 115 0x6: lmsw_Mw(); 116 0x7: invlpg_M(); 117 default: Inst::UD2(); 118 } 119 } 120 0x02: lar_Gv_Ew(); 121 0x03: lsl_Gv_Ew(); 122 //sandpile.org doesn't seem to know what this is... ? 123 0x04: loadall_or_reset_or_hang(); 124#if FULL_SYSTEM 125 0x05: syscall(); 126#else 127 0x05: SyscallInst::syscall('xc->syscall(rax)', IsSyscall); 128#endif 129 0x06: clts(); 130 //sandpile.org says (AMD) after sysret, so I might want to check 131 //if that means amd64 or AMD machines 132 0x07: loadall_or_sysret(); 133 } 134 0x01: decode OPCODE_OP_BOTTOM3 { 135 0x0: invd(); 136 0x1: wbinvd(); 137 0x2: Inst::UD2(); 138 0x3: Inst::UD2(); 139 0x4: Inst::UD2(); 140 0x5: threednow(); 141 0x6: threednow(); 142 0x7: threednow(); 143 } 144 0x02: decode LEGACY_DECODEVAL { 145 // no prefix 146 0x0: decode OPCODE_OP_BOTTOM3 { 147 0x0: movups_Vo_Wo(); 148 0x1: movups_Wo_Vo(); 149 0x2: decode MODRM_MOD { 150 0x3: movhlps_Vq_VRq(); 151 default: movlps_Vq_Mq(); 152 } 153 0x3: movlps_Mq_Vq(); 154 0x4: unpcklps(); 155 0x5: unpckhps(); 156 0x6: decode MODRM_MOD { 157 0x3: movlhps_Vq_VRq(); 158 default: movhps_Vq_Mq(); 159 } 160 0x7: movhps_Mq_Vq(); 161 } 162 // repe (0xF3) 163 0x4: decode OPCODE_OP_BOTTOM3 { 164 0x0: movss_Vd_Wd(); 165 0x1: movss_Wd_Vd(); 166 0x2: movsldup_Vo_Wo(); 167 0x6: movshdup_Vo_Wo(); 168 default: Inst::UD2(); 169 } 170 // operand size (0x66) 171 0x1: decode OPCODE_OP_BOTTOM3 { 172 0x0: movupd_Vo_Wo(); 173 0x1: movupd_Wo_Vo(); 174 0x2: Inst::MOVLPD(Vq,Mq); 175 0x3: Inst::MOVLPD(Mq,Vq); 176 0x4: unpcklpd_Vo_Wq(); 177 0x5: unpckhpd_Vo_Wo(); 178 0x6: movhpd_Vq_Mq(); 179 0x7: movhpd_Mq_Vq(); 180 } 181 // repne (0xF2) 182 0x8: decode OPCODE_OP_BOTTOM3 { 183 0x0: Inst::MOVSD(Vq,Wq); 184 0x1: Inst::MOVSD(Wq,Vq); 185 0x2: movddup_Vo_Wq(); 186 default: Inst::UD2(); 187 } 188 default: Inst::UD2(); 189 } 190 0x03: decode OPCODE_OP_BOTTOM3 { 191 0x0: group17(); 192 0x1: group17(); 193 0x2: group17(); 194 0x3: group17(); 195 0x4: group17(); 196 0x5: group17(); 197 0x6: group17(); 198 0x7: group17(); 199 } 200 0x04: decode LEGACY_DECODEVAL { 201 // no prefix 202 0x0: decode OPCODE_OP_BOTTOM3 { 203 0x0: mov_Rd_Cd(); 204 0x1: mov_Rd_Dd(); 205 0x2: mov_Cd_Rd(); 206 0x3: mov_Dd_Rd(); 207 0x4: mov_Rd_Td(); 208 0x6: mov_Td_Rd(); 209 default: Inst::UD2(); 210 } 211 // lock prefix (0xF0) 212 0x2: decode OPCODE_OP_BOTTOM3 { 213 0x0: mov_Rd_CR8D(); 214 0x2: mov_CR8D_Rd(); 215 } 216 default: Inst::UD2(); 217 } 218 0x05: decode LEGACY_DECODEVAL { 219 // no prefix 220 0x0: decode OPCODE_OP_BOTTOM3 { 221 //These moves should really use size o (octword), but 222 //because they are split in two, they use q (quadword). 223 0x0: Inst::MOVAPS(Vq,Wq); 224 0x1: Inst::MOVAPS(Wq,Vq); 225 0x2: decode MODRM_MOD { 226 0x3: cvtpi2pS_Vq_Pq(); 227 default: cvtpi2ps_Vq_Mq(); 228 } 229 0x3: movntps_Mo_Vo(); 230 0x4: cvttps2pi_Pq_Wq(); 231 0x5: cvtpS2pi_Pq_Wq(); 232 0x6: ucomiss_Vd_Wd(); 233 0x7: comiss_Vd_Wd(); 234 } 235 // repe (0xF3) 236 0x4: decode OPCODE_OP_BOTTOM3 { 237 0x2: cvtsi2ss_Vd_Ed(); 238 0x4: cvttss2si_Gd_Wd(); 239 0x5: cvtss2si_Gd_Wd(); 240 default: Inst::UD2(); 241 } 242 // operand size (0x66) 243 0x1: decode OPCODE_OP_BOTTOM3 { 244 0x0: movapd_Vo_Wo(); 245 0x1: movapd_Wo_Vo(); 246 0x2: decode MODRM_MOD { 247 0x3: cvtpi2pd_Vo_Pq(); 248 default: cvtpi2pd_Vo_Mq(); 249 } 250 0x3: movntpd_Mo_Vo(); 251 0x4: cvttpd2pi_Pq_Wo(); 252 0x5: cvtpd2pi_Pq_Wo(); 253 0x6: Inst::UCOMISD(Vq,Wq); 254 0x7: comisd_Vq_Wq(); 255 } 256 // repne (0xF2) 257 0x8: decode OPCODE_OP_BOTTOM3 { 258 // The size of the V operand should be q, not dp 259 0x2: Inst::CVTSI2SD(Vdp,Edp); 260 // The size of the W operand should be q, not dp 261 0x4: Inst::CVTTSD2SI(Gdp,Wdp); 262 0x5: cvtsd2si_Gd_Wq(); 263 default: Inst::UD2(); 264 } 265 default: Inst::UD2(); 266 } 267 0x06: decode OPCODE_OP_BOTTOM3 { 268 0x0: Inst::WRMSR(); 269 0x1: rdtsc(); 270 0x2: Inst::RDMSR(); 271 0x3: rdpmc(); 272 0x4: sysenter(); 273 0x5: sysexit(); 274 0x6: Inst::UD2(); 275 0x7: getsec(); 276 } 277 0x07: decode OPCODE_OP_BOTTOM3 { 278 0x0: three_byte_opcode(); 279 0x1: three_byte_opcode(); 280 0x2: three_byte_opcode(); 281 0x3: three_byte_opcode(); 282 0x4: three_byte_opcode(); 283 0x5: three_byte_opcode(); 284 0x6: three_byte_opcode(); 285 0x7: three_byte_opcode(); 286 } 287 format Inst { 288 0x08: decode OPCODE_OP_BOTTOM3 { 289 0x0: CMOVO(Gv,Ev); 290 0x1: CMOVNO(Gv,Ev); 291 0x2: CMOVB(Gv,Ev); 292 0x3: CMOVNB(Gv,Ev); 293 0x4: CMOVZ(Gv,Ev); 294 0x5: CMOVNZ(Gv,Ev); 295 0x6: CMOVBE(Gv,Ev); 296 0x7: CMOVNBE(Gv,Ev); 297 } 298 0x09: decode OPCODE_OP_BOTTOM3 { 299 0x0: CMOVS(Gv,Ev); 300 0x1: CMOVNS(Gv,Ev); 301 0x2: CMOVP(Gv,Ev); 302 0x3: CMOVNP(Gv,Ev); 303 0x4: CMOVL(Gv,Ev); 304 0x5: CMOVNL(Gv,Ev); 305 0x6: CMOVLE(Gv,Ev); 306 0x7: CMOVNLE(Gv,Ev); 307 } 308 } 309 0x0A: decode LEGACY_DECODEVAL { 310 // no prefix 311 0x0: decode OPCODE_OP_BOTTOM3 { 312 0x0: movmskps_Gd_VRo(); 313 0x1: sqrtps_Vo_Wo(); 314 0x2: rqsrtps_Vo_Wo(); 315 0x3: rcpps_Vo_Wo(); 316 0x4: andps_Vo_Wo(); 317 0x5: andnps_Vo_Wo(); 318 0x6: orps_Vo_Wo(); 319 0x7: xorps_Vo_Wo(); 320 } 321 // repe (0xF3) 322 0x4: decode OPCODE_OP_BOTTOM3 { 323 0x1: sqrtss_Vd_Wd(); 324 0x2: rsqrtss_Vd_Wd(); 325 0x3: rcpss_Vd_Wd(); 326 default: Inst::UD2(); 327 } 328 // operand size (0x66) 329 0x1: decode OPCODE_OP_BOTTOM3 { 330 0x0: movmskpd_Gd_VRo(); 331 0x1: sqrtpd_Vo_Wo(); 332 0x4: andpd_Vo_Wo(); 333 0x5: andnpd_Vo_Wo(); 334 0x6: orpd_Vo_Wo(); 335 //This really should be type o, but it works on q sized 336 //chunks at a time. 337 0x7: Inst::XORPD(Vq,Wq); 338 default: Inst::UD2(); 339 } 340 format Inst { 341 // repne (0xF2) 342 0x8: decode OPCODE_OP_BOTTOM3 { 343 0x1: SQRTSD(Vq,Wq); 344 default: UD2(); 345 } 346 default: UD2(); 347 } 348 } 349 0x0B: decode LEGACY_DECODEVAL { 350 // no prefix 351 0x0: decode OPCODE_OP_BOTTOM3 { 352 0x0: addps_Vo_Wo(); 353 0x1: mulps_Vo_Wo(); 354 0x2: cvtps2pd_Vo_Wq(); 355 0x3: cvtdq2ps_Vo_Wo(); 356 0x4: subps_Vo_Wo(); 357 0x5: minps_Vo_Wo(); 358 0x6: divps_Vo_Wo(); 359 0x7: maxps_Vo_Wo(); 360 } 361 // repe (0xF3) 362 0x4: decode OPCODE_OP_BOTTOM3 { 363 0x0: addss_Vd_Wd(); 364 0x1: mulss_Vd_Wd(); 365 0x2: cvtss2sd_Vq_Wd(); 366 0x3: cvttps2dq_Vo_Wo(); 367 0x4: subss_Vd_Wd(); 368 0x5: minss_Vd_Wd(); 369 0x6: divss_Vd_Wd(); 370 0x7: maxss_Vd_Wd(); 371 } 372 // operand size (0x66) 373 0x1: decode OPCODE_OP_BOTTOM3 { 374 0x0: addpd_Vo_Wo(); 375 0x1: mulpd_Vo_Wo(); 376 0x2: cvtpd2ps_Vo_Wo(); 377 0x3: cvtps2dq_Vo_Wo(); 378 0x4: subpd_Vo_Wo(); 379 0x5: minpd_Vo_Wo(); 380 0x6: divpd_Vo_Wo(); 381 0x7: maxpd_Vo_Wo(); 382 } 383 // repne (0xF2) 384 0x8: decode OPCODE_OP_BOTTOM3 { 385 0x0: Inst::ADDSD(Vq,Wq); 386 0x1: Inst::MULSD(Vq,Wq); 387 0x2: cvtsd2ss_Vd_Wq(); 388 0x4: Inst::SUBSD(Vq,Wq); 389 0x5: minsd_Vq_Wq(); 390 0x6: Inst::DIVSD(Vq,Wq); 391 0x7: maxsd_Vq_Wq(); 392 default: Inst::UD2(); 393 } 394 default: Inst::UD2(); 395 } 396 0x0C: decode LEGACY_DECODEVAL { 397 // no prefix 398 0x0: decode OPCODE_OP_BOTTOM3 { 399 0x0: punpcklbw_Pq_Qd(); 400 0x1: punpcklwd_Pq_Qd(); 401 0x2: punpckldq_Pq_Qd(); 402 0x3: packsswb_Pq_Qq(); 403 0x4: pcmpgtb_Pq_Qq(); 404 0x5: pcmpgtw_Pq_Qq(); 405 0x6: pcmpgtd_Pq_Qq(); 406 0x7: packuswb_Pq_Qq(); 407 } 408 // operand size (0x66) 409 0x1: decode OPCODE_OP_BOTTOM3 { 410 0x0: punpcklbw_Vo_Wq(); 411 0x1: punpcklwd_Vo_Wq(); 412 0x2: punpckldq_Vo_Wq(); 413 0x3: packsswb_Vo_Wo(); 414 0x4: pcmpgtb_Vo_Wo(); 415 0x5: pcmpgtw_Vo_Wo(); 416 0x6: pcmpgtd_Vo_Wo(); 417 0x7: packuswb_Vo_Wo(); 418 } 419 default: Inst::UD2(); 420 } 421 0x0D: decode LEGACY_DECODEVAL { 422 // no prefix 423 0x0: decode OPCODE_OP_BOTTOM3 { 424 0x0: punpckhbw_Pq_Qq(); 425 0x1: punpckhwd_Pq_Qq(); 426 0x2: punpckhdq_Pq_Qq(); 427 0x3: packssdw_Pq_Qq(); 428 0x6: movd_Pq_Ed(); 429 0x7: movq_Pq_Qq(); 430 default: Inst::UD2(); 431 } 432 // repe (0xF3) 433 0x4: decode OPCODE_OP_BOTTOM3 { 434 0x7: movdqu_Vo_Wo(); 435 default: Inst::UD2(); 436 } 437 // operand size (0x66) 438 0x1: decode OPCODE_OP_BOTTOM3 { 439 0x0: punpckhbw_Vo_Wo(); 440 0x1: punpckhwd_Vo_Wo(); 441 0x2: punpckhdq_Vo_Wo(); 442 0x3: packssdw_Vo_Wo(); 443 0x4: punpcklqdq_Vo_Wq(); 444 0x5: punpcklqdq_Vo_Wq(); 445 0x6: movd_Vo_Ed(); 446 0x7: movdqa_Vo_Wo(); 447 } 448 default: Inst::UD2(); 449 } 450 0x0E: decode LEGACY_DECODEVAL { 451 // no prefix 452 0x0: decode OPCODE_OP_BOTTOM3 { 453 0x0: pshufw_Pq_Qq_Ib(); 454 //0x1: group13_pshimw(); 455 0x1: decode MODRM_REG { 456 0x2: decode LEGACY_OP { 457 0x0: psrlw_PRq_Ib(); 458 0x1: psrlw_VRo_Ib(); 459 } 460 0x4: decode LEGACY_OP { 461 0x0: psraw_PRq_Ib(); 462 0x1: psraw_VRo_Ib(); 463 } 464 0x6: decode LEGACY_OP { 465 0x0: psllw_PRq_Ib(); 466 0x1: psllw_VRo_Ib(); 467 } 468 default: Inst::UD2(); 469 } 470 //0x2: group14_pshimd(); 471 0x2: decode MODRM_REG { 472 0x2: decode LEGACY_OP { 473 0x0: psrld_PRq_Ib(); 474 0x1: psrld_VRo_Ib(); 475 } 476 0x4: decode LEGACY_OP { 477 0x0: psrad_PRq_Ib(); 478 0x1: psrad_VRo_Ib(); 479 } 480 0x6: decode LEGACY_OP { 481 0x0: pslld_PRq_Ib(); 482 0x1: pslld_VRo_Ib(); 483 } 484 default: Inst::UD2(); 485 } 486 //0x3: group15_pshimq(); 487 0x3: decode MODRM_REG { 488 0x2: decode LEGACY_OP { 489 0x0: psrlq_PRq_Ib(); 490 0x1: psrlq_VRo_Ib(); 491 } 492 0x3: decode LEGACY_OP { 493 0x0: Inst::UD2(); 494 0x1: psrldq_VRo_Ib(); 495 } 496 0x6: decode LEGACY_OP { 497 0x0: psllq_PRq_Ib(); 498 0x1: psllq_VRo_Ib(); 499 } 500 0x7: decode LEGACY_OP { 501 0x0: Inst::UD2(); 502 0x1: pslldq_VRo_Ib(); 503 } 504 default: Inst::UD2(); 505 } 506 0x4: pcmpeqb_Pq_Qq(); 507 0x5: pcmpeqw_Pq_Qq(); 508 0x6: pcmpeqd_Pq_Qq(); 509 0x7: emms(); 510 } 511 // repe (0xF3) 512 0x4: decode OPCODE_OP_BOTTOM3 { 513 0x0: pshufhw_Vo_Wo_Ib(); 514 default: Inst::UD2(); 515 } 516 // operand size (0x66) 517 0x1: decode OPCODE_OP_BOTTOM3 { 518 0x0: pshufd_Vo_Wo_Ib(); 519 //0x1: group13_pshimw(); 520 0x1: decode MODRM_REG { 521 0x2: decode LEGACY_OP { 522 0x0: psrlw_PRq_Ib(); 523 0x1: psrlw_VRo_Ib(); 524 } 525 0x4: decode LEGACY_OP { 526 0x0: psraw_PRq_Ib(); 527 0x1: psraw_VRo_Ib(); 528 } 529 0x6: decode LEGACY_OP { 530 0x0: psllw_PRq_Ib(); 531 0x1: psllw_VRo_Ib(); 532 } 533 default: Inst::UD2(); 534 } 535 //0x2: group14_pshimd(); 536 0x2: decode MODRM_REG { 537 0x2: decode LEGACY_OP { 538 0x0: psrld_PRq_Ib(); 539 0x1: psrld_VRo_Ib(); 540 } 541 0x4: decode LEGACY_OP { 542 0x0: psrad_PRq_Ib(); 543 0x1: psrad_VRo_Ib(); 544 } 545 0x6: decode LEGACY_OP { 546 0x0: pslld_PRq_Ib(); 547 0x1: pslld_VRo_Ib(); 548 } 549 default: Inst::UD2(); 550 } 551 //0x3: group15_pshimq(); 552 0x3: decode MODRM_REG { 553 0x2: decode LEGACY_OP { 554 0x0: psrlq_PRq_Ib(); 555 0x1: psrlq_VRo_Ib(); 556 } 557 0x3: decode LEGACY_OP { 558 0x0: Inst::UD2(); 559 0x1: psrldq_VRo_Ib(); 560 } 561 0x6: decode LEGACY_OP { 562 0x0: psllq_PRq_Ib(); 563 0x1: psllq_VRo_Ib(); 564 } 565 0x7: decode LEGACY_OP { 566 0x0: Inst::UD2(); 567 0x1: pslldq_VRo_Ib(); 568 } 569 default: Inst::UD2(); 570 } 571 0x4: pcmpeqb_Vo_Wo(); 572 0x5: pcmpeqw_Vo_Wo(); 573 0x6: pcmpeqd_Vo_Wo(); 574 default: Inst::UD2(); 575 } 576 // repne (0xF2) 577 0x8: decode OPCODE_OP_BOTTOM3 { 578 0x0: pshuflw_Vo_Wo_Ib(); 579 default: Inst::UD2(); 580 } 581 default: Inst::UD2(); 582 } 583 0x0F: decode LEGACY_DECODEVAL { 584 // no prefix 585 0x0: decode OPCODE_OP_BOTTOM3 { 586 0x0: vmread_Ed_or_Eq_Gd_or_Gq(); 587 0x1: vmwrite_Gd_or_Gq_Ed_or_Eq(); 588 0x6: mov_Ed_Pd(); 589 0x7: mov_Qq_Pq(); 590 default: Inst::UD2(); 591 } 592 // repe (0xF3) 593 0x4: decode OPCODE_OP_BOTTOM3 { 594 0x6: movq_Vo_Mq_or_Vq_Vq(); 595 0x7: movdqu_Wo_Vo(); 596 default: Inst::UD2(); 597 } 598 // operand size (0x66) 599 0x1: decode OPCODE_OP_BOTTOM3 { 600 0x4: haddpd_Vo_Wo(); 601 0x5: hsubpd_Vo_Wo(); 602 0x6: movd_Ed_Vd(); 603 0x7: movdqa_Wo_Vo(); 604 default: Inst::UD2(); 605 } 606 // repne (0xF2) 607 0x8: decode OPCODE_OP_BOTTOM3 { 608 0x4: haddps_Vo_Wo(); 609 0x5: hsubps_Vo_Wo(); 610 default: Inst::UD2(); 611 } 612 default: Inst::UD2(); 613 } 614 format Inst { 615 0x10: decode OPCODE_OP_BOTTOM3 { 616 0x0: JO(Jz); 617 0x1: JNO(Jz); 618 0x2: JB(Jz); 619 0x3: JNB(Jz); 620 0x4: JZ(Jz); 621 0x5: JNZ(Jz); 622 0x6: JBE(Jz); 623 0x7: JNBE(Jz); 624 } 625 0x11: decode OPCODE_OP_BOTTOM3 { 626 0x0: JS(Jz); 627 0x1: JNS(Jz); 628 0x2: JP(Jz); 629 0x3: JNP(Jz); 630 0x4: JL(Jz); 631 0x5: JNL(Jz); 632 0x6: JLE(Jz); 633 0x7: JNLE(Jz); 634 } 635 0x12: decode OPCODE_OP_BOTTOM3 { 636 0x0: SETO(Eb); 637 0x1: SETNO(Eb); 638 0x2: SETB(Eb); 639 0x3: SETNB(Eb); 640 0x4: SETZ(Eb); 641 0x5: SETNZ(Eb); 642 0x6: SETBE(Eb); 643 0x7: SETNBE(Eb); 644 } 645 0x13: decode OPCODE_OP_BOTTOM3 { 646 0x0: SETS(Eb); 647 0x1: SETNS(Eb); 648 0x2: SETP(Eb); 649 0x3: SETNP(Eb); 650 0x4: SETL(Eb); 651 0x5: SETNL(Eb); 652 0x6: SETLE(Eb); 653 0x7: SETNLE(Eb); 654 } 655 } 656 0x14: decode OPCODE_OP_BOTTOM3 { 657 0x0: push_fs(); 658 0x1: pop_fs(); 659 0x2: Inst::CPUID(rAd); 660 0x3: bt_Ev_Gv(); 661 0x4: shld_Ev_Gv_Ib(); 662 0x5: shld_Ev_Gv_rCl(); 663 0x6: xbts_and_cmpxchg(); 664 0x7: ibts_and_cmpxchg(); 665 } 666 0x15: decode OPCODE_OP_BOTTOM3 { 667 0x0: push_gs(); 668 0x1: pop_gs(); 669 0x2: rsm_smm(); 670 0x3: bts_Ev_Gv(); 671 0x4: shrd_Ev_Gv_Ib(); 672 0x5: shrd_Ev_Gv_rCl(); 673 //0x6: group16(); 674 0x6: decode MODRM_MOD { 675 0x3: decode MODRM_REG { 676 0x5: lfence(); 677 0x6: mfence(); 678 0x7: sfence(); 679 default: Inst::UD2(); 680 } 681 default: decode MODRM_REG { 682 0x0: fxsave(); 683 0x1: fxrstor(); 684 0x7: clflush(); 685 default: Inst::UD2(); 686 } 687 } 688 0x7: Inst::IMUL(Gv,Ev); 689 } 690 0x16: decode OPCODE_OP_BOTTOM3 { 691 0x0: Inst::CMPXCHG(Eb,Gb); 692 0x1: Inst::CMPXCHG(Ev,Gv); 693 0x2: lss_Gz_Mp(); 694 0x3: btr_Ev_Gv(); 695 0x4: lfs_Gz_Mp(); 696 0x5: lgs_Gz_Mp(); 697 //The size of the second operand in these instructions should 698 //really be "b" or "w", but it's set to v in order to have a 699 //consistent register size. This shouldn't affect behavior. 700 0x6: Inst::MOVZX_B(Gv,Ev); 701 0x7: Inst::MOVZX_W(Gv,Ev); 702 } 703 0x17: decode OPCODE_OP_BOTTOM3 { 704 0x0: jmpe_Jz(); // IA-64? 705 //0x1: group11_UD2(); 706 0x1: Inst::UD2(); 707 //0x2: group8_Ev_Ib(); 708 0x2: decode MODRM_REG { 709 0x4: bt_Ev_Ib(); 710 0x5: bts_Ev_Ib(); 711 0x6: btr_Ev_Ib(); 712 0x7: btc_Ev_Ib(); 713 default: Inst::UD2(); 714 } 715 0x3: btc_Ev_Gv(); 716 0x4: bsf_Gv_Ev(); 717 0x5: bsr_Gv_Ev(); 718 //The size of the second operand in these instructions should 719 //really be "b" or "w", but it's set to v in order to have a 720 //consistent register size. This shouldn't affect behavior. 721 0x6: Inst::MOVSX_B(Gv,Ev); 722 0x7: Inst::MOVSX_W(Gv,Ev); 723 } 724 0x18: decode OPCODE_OP_BOTTOM3 { 725 0x0: xadd_Eb_Gb(); 726 0x1: xadd_Ev_Gv(); 727 //0x7: group9(); 728 0x7: decode MODRM_REG { 729 0x1: cmpxchg_Mq(); 730 0x6: decode LEGACY_OP { 731 0x1: vmclear_Mq(); 732 default: decode LEGACY_REP { 733 0x1: vmxon_Mq(); 734 0x0: vmptrld_Mq(); 735 } 736 } 737 0x7: vmptrst_Mq(); 738 default: Inst::UD2(); 739 } 740 default: decode LEGACY_DECODEVAL { 741 // no prefix 742 0x0: decode OPCODE_OP_BOTTOM3 { 743 0x2: cmpccps_Vo_Wo_Ib(); 744 0x3: cvtdq2ps_Vo_Wo(); 745 0x4: subps_Vo_Wo(); 746 0x5: minps_Vo_Wo(); 747 0x6: divps_Vo_Wo(); 748 } 749 // repe (0xF3) 750 0x4: decode OPCODE_OP_BOTTOM3 { 751 0x2: cmpccss_Vd_Wd_Ib(); 752 default: Inst::UD2(); 753 } 754 // operand size (0x66) 755 0x1: decode OPCODE_OP_BOTTOM3 { 756 0x2: cmpccpd_Vo_Wo_Ib(); 757 0x4: subpd_Vo_Wo(); 758 0x5: minpd_Vo_Wo(); 759 0x6: divpd_Vo_Wo(); 760 default: Inst::UD2(); 761 } 762 // repne (0xF2) 763 0x8: decode OPCODE_OP_BOTTOM3 { 764 0x2: cmpccsd_Vq_Wq_Ib(); 765 default: Inst::UD2(); 766 } 767 default: Inst::UD2(); 768 } 769 } 770 0x19: bswap_B(); 771 0x1A: decode LEGACY_DECODEVAL { 772 // no prefix 773 0x0: decode OPCODE_OP_BOTTOM3 { 774 0x1: psrlw_Pq_Qq(); 775 0x2: psrld_Pq_Qq(); 776 0x3: psrlq_Pq_Qq(); 777 0x4: paddq_Pq_Qq(); 778 0x5: pmullw_Pq_Qq(); 779 0x7: pmovmskb_Gd_PRq(); 780 default: Inst::UD2(); 781 } 782 // repe (0xF3) 783 0x4: decode OPCODE_OP_BOTTOM3 { 784 0x6: movq2dq_Vo_PRq(); 785 default: Inst::UD2(); 786 } 787 // operand size (0x66) 788 0x1: decode OPCODE_OP_BOTTOM3 { 789 0x0: addsubpd_Vo_Wo(); 790 0x1: psrlw_Vo_Wo(); 791 0x2: psrld_Vo_Wo(); 792 0x3: psrlq_Vo_Wo(); 793 0x4: paddq_Vo_Wo(); 794 0x5: pmullw_Vo_Wo(); 795 0x6: decode MODRM_MOD { 796 0x3: movq_Vq_Vq(); 797 default: movq_Mq_Vq(); 798 } 799 0x7: pmovmskb_Gd_VRo(); 800 } 801 // repne (0xF2) 802 0x8: decode OPCODE_OP_BOTTOM3 { 803 0x0: addsubps_Vo_Wo(); 804 0x6: movdq2q_Pq_VRq(); 805 default: Inst::UD2(); 806 } 807 default: Inst::UD2(); 808 } 809 0x1B: decode LEGACY_DECODEVAL { 810 // no prefix 811 0x0: decode OPCODE_OP_BOTTOM3 { 812 0x0: psubusb_Pq_Qq(); 813 0x1: psubusw_Pq_Qq(); 814 0x2: pminub_Pq_Qq(); 815 0x3: pand_Pq_Qq(); 816 0x4: paddusb_Pq_Qq(); 817 0x5: paddusw_Pq_Qq(); 818 0x6: pmaxub_Pq_Qq(); 819 0x7: pandn_Pq_Qq(); 820 } 821 // operand size (0x66) 822 0x1: decode OPCODE_OP_BOTTOM3 { 823 0x0: psubusb_Vo_Wo(); 824 0x1: psubusw_Vo_Wo(); 825 0x2: pminub_Vo_Wo(); 826 0x3: pand_Vo_Wo(); 827 0x4: paddusb_Vo_Wo(); 828 0x5: paddusw_Vo_Wo(); 829 0x6: pmaxub_Vo_Wo(); 830 0x7: pandn_Vo_Wo(); 831 } 832 default: Inst::UD2(); 833 } 834 0x1C: decode LEGACY_DECODEVAL { 835 // no prefix 836 0x0: decode OPCODE_OP_BOTTOM3 { 837 0x0: pavgb_Pq_Qq(); 838 0x1: psraw_Pq_Qq(); 839 0x2: psrad_Pq_Qq(); 840 0x3: pavgw_Pq_Qq(); 841 0x4: pmulhuw_Pq_Qq(); 842 0x5: pmulhw_Pq_Qq(); 843 0x7: movntq_Mq_Pq(); 844 default: Inst::UD2(); 845 } 846 // repe (0xF3) 847 0x4: decode OPCODE_OP_BOTTOM3 { 848 0x6: cvtdq2pd_Vo_Wq(); 849 default: Inst::UD2(); 850 } 851 // operand size (0x66) 852 0x1: decode OPCODE_OP_BOTTOM3 { 853 0x0: pavgb_Vo_Wo(); 854 0x1: psraw_Vo_Wo(); 855 0x2: psrad_Vo_Wo(); 856 0x3: pavgw_Vo_Wo(); 857 0x4: pmulhuw_Vo_Wo(); 858 0x5: pmulhw_Vo_Wo(); 859 0x6: cvttpd2dq_Vo_Wo(); 860 0x7: movntdq_Mo_Vo(); 861 } 862 // repne (0xF2) 863 0x8: decode OPCODE_OP_BOTTOM3 { 864 0x6: cvtpd2dq_Vo_Wo(); 865 default: Inst::UD2(); 866 } 867 default: Inst::UD2(); 868 } 869 0x1D: decode LEGACY_DECODEVAL { 870 // no prefix 871 0x0: decode OPCODE_OP_BOTTOM3 { 872 0x0: psubsb_Pq_Qq(); 873 0x1: psubsw_Pq_Qq(); 874 0x2: pminsw_Pq_Qq(); 875 0x3: por_Pq_Qq(); 876 0x4: paddsb_Pq_Qq(); 877 0x5: paddsw_Pq_Qq(); 878 0x6: pmaxsw_Pq_Qq(); 879 0x7: pxor_Pq_Qq(); 880 } 881 // operand size (0x66) 882 0x1: decode OPCODE_OP_BOTTOM3 { 883 0x0: psubsb_Vo_Wo(); 884 0x1: psubsw_Vo_Wo(); 885 0x2: pminsw_Vo_Wo(); 886 0x3: por_Vo_Wo(); 887 0x4: paddsb_Vo_Wo(); 888 0x5: paddsw_Vo_Wo(); 889 0x6: pmaxsw_Vo_Wo(); 890 0x7: pxor_Vo_Wo(); 891 } 892 default: Inst::UD2(); 893 } 894 0x1E: decode OPCODE_OP_BOTTOM3 { 895 // no prefix 896 0x0: decode OPCODE_OP_BOTTOM3 { 897 0x1: psllw_Pq_Qq(); 898 0x2: pslld_Pq_Qq(); 899 0x3: psllq_Pq_Qq(); 900 0x4: pmuludq_Pq_Qq(); 901 0x5: pmaddwd_Pq_Qq(); 902 0x6: psadbw_Pq_Qq(); 903 0x7: maskmovq_Pq_PRq(); 904 default: Inst::UD2(); 905 } 906 // operand size (0x66) 907 0x1: decode OPCODE_OP_BOTTOM3 { 908 0x1: psllw_Vo_Wo(); 909 0x2: pslld_Vo_Wo(); 910 0x3: psllq_Vo_Wo(); 911 0x4: pmuludq_Vo_Wo(); 912 0x5: pmaddwd_Vo_Wo(); 913 0x6: psadbw_Vo_Wo(); 914 0x7: maskmovdqu_Vo_VRo(); 915 default: Inst::UD2(); 916 } 917 // repne (0xF2) 918 0x8: decode OPCODE_OP_BOTTOM3 { 919 0x0: lddqu_Vo_Mo(); 920 default: Inst::UD2(); 921 } 922 default: Inst::UD2(); 923 } 924 0x1F: decode LEGACY_DECODEVAL { 925 // no prefix 926 0x0: decode OPCODE_OP_BOTTOM3 { 927 0x0: psubb_Pq_Qq(); 928 0x1: psubw_Pq_Qq(); 929 0x2: psubd_Pq_Qq(); 930 0x3: psubq_Pq_Qq(); 931 0x4: paddb_Pq_Qq(); 932 0x5: paddw_Pq_Qq(); 933 0x6: paddd_Pq_Qq(); 934 0x7: Inst::UD2(); 935 } 936 // operand size (0x66) 937 0x1: decode OPCODE_OP_BOTTOM3 { 938 0x0: psubb_Vo_Wo(); 939 0x1: psubw_Vo_Wo(); 940 0x2: psubd_Vo_Wo(); 941 0x3: psubq_Vo_Wo(); 942 0x4: paddb_Vo_Wo(); 943 0x5: paddw_Vo_Wo(); 944 0x6: paddd_Vo_Wo(); 945 0x7: Inst::UD2(); 946 } 947 default: Inst::UD2(); 948 } 949 default: FailUnimpl::twoByteOps(); 950 } 951 } 952 default: M5InternalError::error( 953 {{"Unexpected first opcode byte in two byte opcode!"}}); 954} 955