1// Copyright (c) 2008 The Regents of The University of Michigan 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer; 8// redistributions in binary form must reproduce the above copyright --- 87 unchanged lines hidden (view full) --- 96 0x2: Inst::LLDT(Ew); 97 0x3: Inst::LTR(Ew); 98 0x4: verr_Mw_or_Rv(); 99 0x5: verw_Mw_or_Rv(); 100 //0x6: jmpe_Ev(); // IA-64 101 default: Inst::UD2(); 102 } 103 //0x01: group7(); // Ugly, ugly, ugly... |
104 0x01: decode MODRM_REG { 105 0x0: decode MODRM_MOD { 106 0x3: decode MODRM_RM { |
107 0x1: vmcall(); 108 0x2: vmlaunch(); 109 0x3: vmresume(); 110 0x4: vmxoff(); 111 default: Inst::UD2(); 112 } |
113 default: sgdt_Ms(); 114 } 115 0x1: decode MODRM_MOD { 116 0x3: decode MODRM_RM { |
117 0x0: monitor(); 118 0x1: mwait(); 119 default: Inst::UD2(); 120 } |
121 default: sidt_Ms(); 122 } 123 0x2: decode MODRM_MOD { |
124 0x3: decode MODRM_RM { |
125 0x0: xgetbv(); 126 0x1: xsetbv(); |
127 } |
128 default: decode MODE_SUBMODE { |
129 0x0: Inst::LGDT(M); 130 default: decode OPSIZE { 131 // 16 bit operand sizes are special, but only 132 // in legacy and compatability modes. 133 0x2: Inst::LGDT_16(M); 134 default: Inst::LGDT(M); 135 } 136 } |
137 } 138 0x3: decode MODRM_MOD { 139 0x3: decode MODRM_RM { 140 0x0: vmrun(); 141 0x1: vmmcall(); 142 0x2: vmload(); 143 0x3: vmsave(); 144 0x4: stgi(); 145 0x5: clgi(); 146 0x6: skinit(); 147 0x7: invlpga(); 148 } 149 default: decode MODE_SUBMODE { |
150 0x0: Inst::LIDT(M); 151 default: decode OPSIZE { 152 // 16 bit operand sizes are special, but only 153 // in legacy and compatability modes. 154 0x2: Inst::LIDT_16(M); 155 default: Inst::LIDT(M); 156 } 157 } |
158 } |
159 0x4: decode MODRM_MOD { 160 0x3: Inst::SMSW(Rv); 161 default: Inst::SMSW(Mw); 162 } 163 0x6: Inst::LMSW(Ew); 164 0x7: decode MODRM_MOD { 165 0x3: decode MODRM_RM { 166 0x0: Inst::SWAPGS(); 167 0x1: rdtscp(); 168 default: Inst::UD2(); 169 } 170 default: Inst::INVLPG(M); 171 } |
172 } 173 0x02: lar_Gv_Ew(); 174 0x03: lsl_Gv_Ew(); 175 // sandpile.org doesn't seem to know what this is...? We'll 176 // use it for pseudo instructions. We've got 16 bits of space 177 // to play with so there can be quite a few pseudo 178 // instructions. 179 //0x04: loadall_or_reset_or_hang(); --- 116 unchanged lines hidden (view full) --- 296 } 297 format Inst{ 298 0x02: decode LEGACY_DECODEVAL { 299 // no prefix 300 0x0: decode OPCODE_OP_BOTTOM3 { 301 0x0: MOVUPS(Vo,Wo); 302 0x1: MOVUPS(Wo,Vo); 303 0x2: decode MODRM_MOD { |
304 0x3: MOVHLPS(Vps,VRq); 305 default: MOVLPS(Vps,Mq); |
306 } |
307 0x3: MOVLPS(Mq,Vps); |
308 0x4: UNPCKLPS(Vps,Wq); |
309 0x5: UNPCKHPS(Vps,Wq); |
310 0x6: decode MODRM_MOD { |
311 0x3: MOVLHPS(Vps,VRq); 312 default: MOVHPS(Vps,Mq); |
313 } 314 0x7: MOVHPS(Mq,Vq); 315 } 316 // repe (0xF3) 317 0x4: decode OPCODE_OP_BOTTOM3 { 318 0x0: MOVSS(Vd,Wd); 319 0x1: MOVSS(Wd,Vd); 320 0x2: WarnUnimpl::movsldup_Vo_Wo(); --- 16 unchanged lines hidden (view full) --- 337 0x0: MOVSD(Vq,Wq); 338 0x1: MOVSD(Wq,Vq); 339 0x2: MOVDDUP(Vo,Wq); 340 default: UD2(); 341 } 342 default: UD2(); 343 } 344 0x03: decode OPCODE_OP_BOTTOM3 { |
345 //group16(); |
346 0x0: decode MODRM_REG { 347 0x0: WarnUnimpl::prefetch_nta(); 348 0x1: PREFETCH_T0(Mb); 349 0x2: WarnUnimpl::prefetch_t1(); 350 0x3: WarnUnimpl::prefetch_t2(); 351 default: HINT_NOP(); 352 } 353 0x1: HINT_NOP(); --- 6 unchanged lines hidden (view full) --- 360 } 361 0x04: decode LEGACY_DECODEVAL { 362 // no prefix 363 0x0: decode OPCODE_OP_BOTTOM3 { 364 0x0: MOV(Rd,Cd); 365 0x1: MOV(Rd,Dd); 366 0x2: MOV(Cd,Rd); 367 0x3: MOV(Dd,Rd); |
368 default: UD2(); 369 } |
370 default: UD2(); 371 } 372 0x05: decode LEGACY_DECODEVAL { 373 // no prefix 374 0x0: decode OPCODE_OP_BOTTOM3 { 375 //These moves should really use size o (octword), but 376 //because they are split in two, they use q (quadword). 377 0x0: MOVAPS(Vq,Wq); 378 0x1: MOVAPS(Wq,Vq); 379 0x2: CVTPI2PS(Vq,Qq); 380 0x3: WarnUnimpl::movntps_Mo_Vo(); 381 0x4: CVTTPS2PI(Pq,Wq); 382 0x5: CVTPS2PI(Pq,Wq); 383 0x6: UCOMISS(Vd,Wd); 384 0x7: COMISS(Vd,Wd); |
385 } |
386 // repe (0xF3) 387 0x4: decode OPCODE_OP_BOTTOM3 { 388 0x2: CVTSI2SS(Vd,Ed); 389 0x4: CVTTSS2SI(Gd,Wd); 390 0x5: CVTSS2SI(Gd,Wd); 391 default: UD2(); 392 } 393 // operand size (0x66) 394 0x1: decode OPCODE_OP_BOTTOM3 { 395 0x0: MOVAPD(Vo,Wo); 396 0x1: MOVAPD(Wo,Vo); 397 0x2: CVTPI2PD(Vo,Qq); 398 0x3: WarnUnimpl::movntpd_Mo_Vo(); 399 0x4: CVTTPD2PI(Pq,Wo); 400 0x5: CVTPD2PI(Pq,Wo); 401 0x6: UCOMISD(Vq,Wq); 402 0x7: COMISD(Vq,Wq); 403 } 404 // repne (0xF2) 405 0x8: decode OPCODE_OP_BOTTOM3 { 406 // The size of the V operand should be q, not dp 407 0x2: CVTSI2SD(Vdp,Edp); 408 // The size of the W operand should be q, not dp 409 0x4: CVTTSD2SI(Gdp,Wdp); 410 0x5: CVTSD2SI(Gd,Wq); 411 default: UD2(); 412 } |
413 default: UD2(); 414 } 415 } |
416 0x06: decode OPCODE_OP_BOTTOM3 { 417 0x0: Inst::WRMSR(); 418 0x1: Inst::RDTSC(); 419 0x2: Inst::RDMSR(); 420 0x3: rdpmc(); 421#if FULL_SYSTEM 422 0x4: sysenter(); 423#else 424 0x4: SyscallInst::sysenter('xc->syscall(Rax)', IsSyscall); 425#endif 426 0x5: sysexit(); 427 0x6: Inst::UD2(); 428 0x7: getsec(); 429 } 430 0x07: decode OPCODE_OP_BOTTOM3 { 431 0x0: three_byte_opcode(); |
432 0x2: three_byte_opcode(); |
433 default: UD2(); |
434 } 435 format Inst { 436 0x08: decode OPCODE_OP_BOTTOM3 { 437 0x0: CMOVO(Gv,Ev); 438 0x1: CMOVNO(Gv,Ev); 439 0x2: CMOVB(Gv,Ev); 440 0x3: CMOVNB(Gv,Ev); 441 0x4: CMOVZ(Gv,Ev); --- 32 unchanged lines hidden (view full) --- 474 } 475 // operand size (0x66) 476 0x1: decode OPCODE_OP_BOTTOM3 { 477 0x0: MOVMSKPD(Gd,VRo); 478 0x1: SQRTPD(Vo,Wo); 479 0x4: ANDPD(Vo,Wo); 480 0x5: ANDNPD(Vo,Wo); 481 0x6: ORPD(Vo,Wo); |
482 0x7: XORPD(Vo,Wo); |
483 default: UD2(); 484 } 485 // repne (0xF2) 486 0x8: decode OPCODE_OP_BOTTOM3 { 487 0x1: SQRTSD(Vq,Wq); 488 default: UD2(); 489 } 490 default: UD2(); --- 98 unchanged lines hidden (view full) --- 589 0x7: WarnUnimpl::movdqa_Vo_Wo(); 590 } 591 default: UD2(); 592 } 593 0x0E: decode LEGACY_DECODEVAL { 594 // no prefix 595 0x0: decode OPCODE_OP_BOTTOM3 { 596 0x0: PSHUFW(Pq,Qq,Ib); |
597 //0x1: group12_pshimw(); |
598 0x1: decode MODRM_REG { |
599 0x2: PSRLW(PRq,Ib); 600 0x4: PSRAW(PRq,Ib); 601 0x6: PSLLW(PRq,Ib); |
602 default: UD2(); 603 } |
604 //0x2: group13_pshimd(); |
605 0x2: decode MODRM_REG { |
606 0x2: PSRLD(PRq,Ib); 607 0x4: PSRAD(PRq,Ib); 608 0x6: PSLLD(PRq,Ib); |
609 default: UD2(); 610 } |
611 //0x3: group14_pshimq(); |
612 0x3: decode MODRM_REG { |
613 0x2: PSRLQ(PRq,Ib); 614 0x6: PSLLQ(PRq,Ib); |
615 default: Inst::UD2(); 616 } 617 0x4: Inst::PCMPEQB(Pq,Qq); 618 0x5: Inst::PCMPEQW(Pq,Qq); 619 0x6: Inst::PCMPEQD(Pq,Qq); 620 0x7: WarnUnimpl::emms(); 621 } 622 // repe (0xF3) 623 0x4: decode OPCODE_OP_BOTTOM3 { 624 0x0: PSHUFHW(Vo,Wo,Ib); 625 default: UD2(); 626 } 627 // operand size (0x66) 628 0x1: decode OPCODE_OP_BOTTOM3 { 629 0x0: PSHUFD(Vo,Wo,Ib); |
630 //0x1: group12_pshimw(); |
631 0x1: decode MODRM_REG { |
632 0x2: PSRLW(VRo,Ib); 633 0x4: PSRAW(VRo,Ib); 634 0x6: PSLLW(VRo,Ib); |
635 } |
636 //0x2: group13_pshimd(); |
637 0x2: decode MODRM_REG { |
638 0x2: PSRLD(VRo,Ib); 639 0x4: PSRAD(VRo,Ib); 640 0x6: PSLLD(VRo,Ib); |
641 default: UD2(); 642 } |
643 //0x3: group14_pshimq(); |
644 0x3: decode MODRM_REG { |
645 0x2: PSRLQ(VRo,Ib); 646 0x3: WarnUnimpl::psrldq_VRo_Ib(); 647 0x6: PSLLQ(VRo,Ib); 648 0x7: WarnUnimpl::pslldq_VRo_Ib(); |
649 default: UD2(); 650 } 651 0x4: PCMPEQB(Vo,Wo); 652 0x5: PCMPEQW(Vo,Wo); 653 0x6: PCMPEQD(Vo,Wo); 654 default: UD2(); 655 } 656 // repne (0xF2) 657 0x8: decode OPCODE_OP_BOTTOM3 { 658 0x0: PSHUFLW(Vo,Wo,Ib); 659 default: UD2(); 660 } 661 default: UD2(); 662 } 663 0x0F: decode LEGACY_DECODEVAL { 664 // no prefix 665 0x0: decode OPCODE_OP_BOTTOM3 { |
666 0x0: WarnUnimpl::vmread_Edp_Gdp(); 667 0x1: WarnUnimpl::vmwrite_Gdp_Edp(); |
668 0x6: MOVD(Edp,Pdp); 669 0x7: MOVQ(Qq,Pq); 670 default: UD2(); 671 } 672 // repe (0xF3) 673 0x4: decode OPCODE_OP_BOTTOM3 { 674 0x6: MOVQ(Vq,Wq); 675 0x7: WarnUnimpl::movdqu_Wo_Vo(); --- 65 unchanged lines hidden (view full) --- 741 Rax = result.rax; 742 Rbx = result.rbx; 743 Rcx = result.rcx; 744 Rdx = result.rdx; 745 }}); 746 0x3: Inst::BT(Ev,Gv); 747 0x4: Inst::SHLD(Ev,Gv,Ib); 748 0x5: Inst::SHLD(Ev,Gv); |
749 default: Inst::UD2(); |
750 } 751 0x15: decode OPCODE_OP_BOTTOM3 { 752 0x0: push_gs(); 753 0x1: pop_gs(); 754 0x2: rsm_smm(); 755 0x3: Inst::BTS(Ev,Gv); 756 0x4: Inst::SHRD(Ev,Gv,Ib); 757 0x5: Inst::SHRD(Ev,Gv); |
758 //0x6: group15(); 759 0x6: decode MODRM_MOD { 760 0x3: decode MODRM_REG { 761 0x5: BasicOperate::LFENCE( |
762 {{/*Nothing*/}}, IsReadBarrier); |
763 0x6: BasicOperate::MFENCE( |
764 {{/*Nothing*/}}, IsMemBarrier); |
765 0x7: BasicOperate::SFENCE( |
766 {{/*Nothing*/}}, IsWriteBarrier); 767 default: Inst::UD2(); 768 } |
769 default: decode MODRM_REG { 770 0x0: fxsave(); 771 0x1: fxrstor(); 772 0x2: Inst::LDMXCSR(Md); 773 0x3: Inst::STMXCSR(Md); 774 0x4: xsave(); 775 0x5: xrstor(); 776 0x6: Inst::UD2(); 777 0x7: clflush(); 778 } |
779 } 780 0x7: Inst::IMUL(Gv,Ev); 781 } 782 format Inst { 783 0x16: decode OPCODE_OP_BOTTOM3 { 784 0x0: CMPXCHG(Eb,Gb); 785 0x1: CMPXCHG(Ev,Gv); 786 0x2: WarnUnimpl::lss_Gz_Mp(); 787 0x3: BTR(Ev,Gv); 788 0x4: WarnUnimpl::lfs_Gz_Mp(); 789 0x5: WarnUnimpl::lgs_Gz_Mp(); 790 //The size of the second operand in these instructions 791 //should really be "b" or "w", but it's set to v in order 792 //to have a consistent register size. This shouldn't 793 //affect behavior. 794 0x6: MOVZX_B(Gv,Ev); 795 0x7: MOVZX_W(Gv,Ev); 796 } 797 0x17: decode OPCODE_OP_BOTTOM3 { |
798 0x0: decode LEGACY_REP { 799 0x0: WarnUnimpl::jmpe_Jz(); 800 0x1: WarnUnimpl::popcnt_Gv_Ev(); 801 } 802 //0x1: group10_UD2(); |
803 0x1: UD2(); 804 //0x2: group8_Ev_Ib(); 805 0x2: decode MODRM_REG { 806 0x4: BT(Ev,Ib); 807 0x5: BTS(Ev,Ib); 808 0x6: BTR(Ev,Ib); 809 0x7: BTC(Ev,Ib); 810 default: UD2(); --- 245 unchanged lines hidden --- |