Deleted Added
sdiff udiff text old ( 6610:dbfe22c711d5 ) new ( 6611:2cd76560a1f1 )
full compact
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_MOD {
105 0x3: decode MODRM_REG {
106 0x0: decode MODRM_RM {
107 0x1: vmcall();
108 0x2: vmlaunch();
109 0x3: vmresume();
110 0x4: vmxoff();
111 default: Inst::UD2();
112 }
113 0x1: decode MODRM_RM {
114 0x0: monitor();
115 0x1: mwait();
116 default: Inst::UD2();
117 }
118 0x3: decode MODRM_RM {
119 0x0: vmrun();
120 0x1: vmmcall();
121 0x2: vmload();
122 0x3: vmsave();
123 0x4: stgi();
124 0x5: clgi();
125 0x6: skinit();
126 0x7: invlpga();
127 }
128 0x4: Inst::SMSW(Rv);
129 0x6: Inst::LMSW(Rv);
130 0x7: decode MODRM_RM {
131 0x0: Inst::SWAPGS();
132 0x1: rdtscp();
133 default: Inst::UD2();
134 }
135 default: Inst::UD2();
136 }
137 default: decode MODRM_REG {
138 0x0: sgdt_Ms();
139 0x1: sidt_Ms();
140 0x2: decode MODE_SUBMODE {
141 0x0: Inst::LGDT(M);
142 default: decode OPSIZE {
143 // 16 bit operand sizes are special, but only
144 // in legacy and compatability modes.
145 0x2: Inst::LGDT_16(M);
146 default: Inst::LGDT(M);
147 }
148 }
149 0x3: 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 0x4: Inst::SMSW(Mw);
159 0x6: Inst::LMSW(Mw);
160 0x7: Inst::INVLPG(M);
161 default: Inst::UD2();
162 }
163 }
164 0x02: lar_Gv_Ew();
165 0x03: lsl_Gv_Ew();
166 // sandpile.org doesn't seem to know what this is...? We'll
167 // use it for pseudo instructions. We've got 16 bits of space
168 // to play with so there can be quite a few pseudo
169 // instructions.
170 //0x04: loadall_or_reset_or_hang();

--- 116 unchanged lines hidden (view full) ---

287 }
288 format Inst{
289 0x02: decode LEGACY_DECODEVAL {
290 // no prefix
291 0x0: decode OPCODE_OP_BOTTOM3 {
292 0x0: MOVUPS(Vo,Wo);
293 0x1: MOVUPS(Wo,Vo);
294 0x2: decode MODRM_MOD {
295 0x3: MOVHLPS(Vq,VRq);
296 default: MOVLPS(Vq,Mq);
297 }
298 0x3: MOVLPS(Mq,Vq);
299 0x4: UNPCKLPS(Vps,Wq);
300 0x5: UNPCKHPS(Vpd,Wq);
301 0x6: decode MODRM_MOD {
302 0x3: MOVLHPS(Vq,VRq);
303 default: MOVHPS(Vq,Mq);
304 }
305 0x7: MOVHPS(Mq,Vq);
306 }
307 // repe (0xF3)
308 0x4: decode OPCODE_OP_BOTTOM3 {
309 0x0: MOVSS(Vd,Wd);
310 0x1: MOVSS(Wd,Vd);
311 0x2: WarnUnimpl::movsldup_Vo_Wo();

--- 16 unchanged lines hidden (view full) ---

328 0x0: MOVSD(Vq,Wq);
329 0x1: MOVSD(Wq,Vq);
330 0x2: MOVDDUP(Vo,Wq);
331 default: UD2();
332 }
333 default: UD2();
334 }
335 0x03: decode OPCODE_OP_BOTTOM3 {
336 //group17();
337 0x0: decode MODRM_REG {
338 0x0: WarnUnimpl::prefetch_nta();
339 0x1: PREFETCH_T0(Mb);
340 0x2: WarnUnimpl::prefetch_t1();
341 0x3: WarnUnimpl::prefetch_t2();
342 default: HINT_NOP();
343 }
344 0x1: HINT_NOP();

--- 6 unchanged lines hidden (view full) ---

351 }
352 0x04: decode LEGACY_DECODEVAL {
353 // no prefix
354 0x0: decode OPCODE_OP_BOTTOM3 {
355 0x0: MOV(Rd,Cd);
356 0x1: MOV(Rd,Dd);
357 0x2: MOV(Cd,Rd);
358 0x3: MOV(Dd,Rd);
359 0x4: WarnUnimpl::mov_Rd_Td();
360 0x6: WarnUnimpl::mov_Td_Rd();
361 default: UD2();
362 }
363 // lock prefix (0xF0)
364 0x2: decode OPCODE_OP_BOTTOM3 {
365 0x0: WarnUnimpl::mov_Rd_CR8D();
366 0x2: WarnUnimpl::mov_CR8D_Rd();
367 }
368 default: UD2();
369 }
370 }
371 0x05: decode LEGACY_DECODEVAL {
372 // no prefix
373 0x0: decode OPCODE_OP_BOTTOM3 {
374 //These moves should really use size o (octword), but
375 //because they are split in two, they use q (quadword).
376 0x0: Inst::MOVAPS(Vq,Wq);
377 0x1: Inst::MOVAPS(Wq,Vq);
378 0x2: Inst::CVTPI2PS(Vq,Qq);
379 0x3: movntps_Mo_Vo();
380 0x4: Inst::CVTTPS2PI(Pq,Wq);
381 0x5: Inst::CVTPS2PI(Pq,Wq);
382 0x6: Inst::UCOMISS(Vd,Wd);
383 0x7: Inst::COMISS(Vd,Wd);
384 }
385 // repe (0xF3)
386 0x4: decode OPCODE_OP_BOTTOM3 {
387 0x2: Inst::CVTSI2SS(Vd,Ed);
388 0x4: Inst::CVTTSS2SI(Gd,Wd);
389 0x5: Inst::CVTSS2SI(Gd,Wd);
390 default: Inst::UD2();
391 }
392 // operand size (0x66)
393 0x1: decode OPCODE_OP_BOTTOM3 {
394 0x0: Inst::MOVAPD(Vo,Wo);
395 0x1: Inst::MOVAPD(Wo,Vo);
396 0x2: Inst::CVTPI2PD(Vo,Qq);
397 0x3: movntpd_Mo_Vo();
398 0x4: Inst::CVTTPD2PI(Pq,Wo);
399 0x5: Inst::CVTPD2PI(Pq,Wo);
400 0x6: Inst::UCOMISD(Vq,Wq);
401 0x7: Inst::COMISD(Vq,Wq);
402 }
403 // repne (0xF2)
404 0x8: decode OPCODE_OP_BOTTOM3 {
405 // The size of the V operand should be q, not dp
406 0x2: Inst::CVTSI2SD(Vdp,Edp);
407 // The size of the W operand should be q, not dp
408 0x4: Inst::CVTTSD2SI(Gdp,Wdp);
409 0x5: Inst::CVTSD2SI(Gd,Wq);
410 default: Inst::UD2();
411 }
412 default: Inst::UD2();
413 }
414 0x06: decode OPCODE_OP_BOTTOM3 {
415 0x0: Inst::WRMSR();
416 0x1: Inst::RDTSC();
417 0x2: Inst::RDMSR();
418 0x3: rdpmc();
419#if FULL_SYSTEM
420 0x4: sysenter();
421#else
422 0x4: SyscallInst::sysenter('xc->syscall(Rax)', IsSyscall);
423#endif
424 0x5: sysexit();
425 0x6: Inst::UD2();
426 0x7: getsec();
427 }
428 0x07: decode OPCODE_OP_BOTTOM3 {
429 0x0: three_byte_opcode();
430 0x1: three_byte_opcode();
431 0x2: three_byte_opcode();
432 0x3: three_byte_opcode();
433 0x4: three_byte_opcode();
434 0x5: three_byte_opcode();
435 0x6: three_byte_opcode();
436 0x7: three_byte_opcode();
437 }
438 format Inst {
439 0x08: decode OPCODE_OP_BOTTOM3 {
440 0x0: CMOVO(Gv,Ev);
441 0x1: CMOVNO(Gv,Ev);
442 0x2: CMOVB(Gv,Ev);
443 0x3: CMOVNB(Gv,Ev);
444 0x4: CMOVZ(Gv,Ev);

--- 32 unchanged lines hidden (view full) ---

477 }
478 // operand size (0x66)
479 0x1: decode OPCODE_OP_BOTTOM3 {
480 0x0: MOVMSKPD(Gd,VRo);
481 0x1: SQRTPD(Vo,Wo);
482 0x4: ANDPD(Vo,Wo);
483 0x5: ANDNPD(Vo,Wo);
484 0x6: ORPD(Vo,Wo);
485 //This really should be type o, but it works on q sized
486 //chunks at a time.
487 0x7: XORPD(Vq,Wq);
488 default: UD2();
489 }
490 // repne (0xF2)
491 0x8: decode OPCODE_OP_BOTTOM3 {
492 0x1: SQRTSD(Vq,Wq);
493 default: UD2();
494 }
495 default: UD2();

--- 98 unchanged lines hidden (view full) ---

594 0x7: WarnUnimpl::movdqa_Vo_Wo();
595 }
596 default: UD2();
597 }
598 0x0E: decode LEGACY_DECODEVAL {
599 // no prefix
600 0x0: decode OPCODE_OP_BOTTOM3 {
601 0x0: PSHUFW(Pq,Qq,Ib);
602 //0x1: group13_pshimw();
603 0x1: decode MODRM_REG {
604 0x2: decode LEGACY_OP {
605 0x0: PSRLW(PRq,Ib);
606 0x1: PSRLW(VRo,Ib);
607 }
608 0x4: decode LEGACY_OP {
609 0x0: PSRAW(PRq,Ib);
610 0x1: PSRAW(VRo,Ib);
611 }
612 0x6: decode LEGACY_OP {
613 0x0: PSLLW(PRq,Ib);
614 0x1: PSLLW(VRo,Ib);
615 }
616 default: UD2();
617 }
618 //0x2: group14_pshimd();
619 0x2: decode MODRM_REG {
620 0x2: decode LEGACY_OP {
621 0x0: PSRLD(PRq,Ib);
622 0x1: PSRLD(VRo,Ib);
623 }
624 0x4: decode LEGACY_OP {
625 0x0: PSRAD(PRq,Ib);
626 0x1: PSRAD(VRo,Ib);
627 }
628 0x6: decode LEGACY_OP {
629 0x0: PSLLD(PRq,Ib);
630 0x1: PSLLD(VRo,Ib);
631 }
632 default: UD2();
633 }
634 //0x3: group15_pshimq();
635 0x3: decode MODRM_REG {
636 0x2: decode LEGACY_OP {
637 0x0: PSRLQ(PRq,Ib);
638 0x1: PSRLQ(VRo,Ib);
639 }
640 0x3: decode LEGACY_OP {
641 0x0: UD2();
642 0x1: WarnUnimpl::psrldq_VRo_Ib();
643 }
644 0x6: decode LEGACY_OP {
645 0x0: PSLLQ(PRq,Ib);
646 0x1: PSLLQ(VRo,Ib);
647 }
648 0x7: decode LEGACY_OP {
649 0x0: UD2();
650 0x1: WarnUnimpl::pslldq_VRo_Ib();
651 }
652 default: Inst::UD2();
653 }
654 0x4: Inst::PCMPEQB(Pq,Qq);
655 0x5: Inst::PCMPEQW(Pq,Qq);
656 0x6: Inst::PCMPEQD(Pq,Qq);
657 0x7: WarnUnimpl::emms();
658 }
659 // repe (0xF3)
660 0x4: decode OPCODE_OP_BOTTOM3 {
661 0x0: PSHUFHW(Vo,Wo,Ib);
662 default: UD2();
663 }
664 // operand size (0x66)
665 0x1: decode OPCODE_OP_BOTTOM3 {
666 0x0: PSHUFD(Vo,Wo,Ib);
667 //0x1: group13_pshimw();
668 0x1: decode MODRM_REG {
669 0x2: decode LEGACY_OP {
670 0x0: PSRLW(PRq,Ib);
671 0x1: PSRLW(VRo,Ib);
672 }
673 0x4: decode LEGACY_OP {
674 0x0: PSRAW(PRq,Ib);
675 0x1: PSRAW(VRo,Ib);
676 }
677 0x6: decode LEGACY_OP {
678 0x0: PSLLW(PRq,Ib);
679 0x1: PSLLW(VRo,Ib);
680 }
681 default: Inst::UD2();
682 }
683 //0x2: group14_pshimd();
684 0x2: decode MODRM_REG {
685 0x2: decode LEGACY_OP {
686 0x0: PSRLD(PRq,Ib);
687 0x1: PSRLD(VRo,Ib);
688 }
689 0x4: decode LEGACY_OP {
690 0x0: PSRAD(PRq,Ib);
691 0x1: PSRAD(VRo,Ib);
692 }
693 0x6: decode LEGACY_OP {
694 0x0: PSLLD(PRq,Ib);
695 0x1: PSLLD(VRo,Ib);
696 }
697 default: UD2();
698 }
699 //0x3: group15_pshimq();
700 0x3: decode MODRM_REG {
701 0x2: decode LEGACY_OP {
702 0x0: PSRLQ(PRq,Ib);
703 0x1: PSRLQ(VRo,Ib);
704 }
705 0x3: decode LEGACY_OP {
706 0x0: UD2();
707 0x1: WarnUnimpl::psrldq_VRo_Ib();
708 }
709 0x6: decode LEGACY_OP {
710 0x0: PSLLQ(PRq,Ib);
711 0x1: PSLLQ(VRo,Ib);
712 }
713 0x7: decode LEGACY_OP {
714 0x0: UD2();
715 0x1: WarnUnimpl::pslldq_VRo_Ib();
716 }
717 default: UD2();
718 }
719 0x4: PCMPEQB(Vo,Wo);
720 0x5: PCMPEQW(Vo,Wo);
721 0x6: PCMPEQD(Vo,Wo);
722 default: UD2();
723 }
724 // repne (0xF2)
725 0x8: decode OPCODE_OP_BOTTOM3 {
726 0x0: PSHUFLW(Vo,Wo,Ib);
727 default: UD2();
728 }
729 default: UD2();
730 }
731 0x0F: decode LEGACY_DECODEVAL {
732 // no prefix
733 0x0: decode OPCODE_OP_BOTTOM3 {
734 0x0: WarnUnimpl::vmread_Ed_or_Eq_Gd_or_Gq();
735 0x1: WarnUnimpl::vmwrite_Gd_or_Gq_Ed_or_Eq();
736 0x6: MOVD(Edp,Pdp);
737 0x7: MOVQ(Qq,Pq);
738 default: UD2();
739 }
740 // repe (0xF3)
741 0x4: decode OPCODE_OP_BOTTOM3 {
742 0x6: MOVQ(Vq,Wq);
743 0x7: WarnUnimpl::movdqu_Wo_Vo();

--- 65 unchanged lines hidden (view full) ---

809 Rax = result.rax;
810 Rbx = result.rbx;
811 Rcx = result.rcx;
812 Rdx = result.rdx;
813 }});
814 0x3: Inst::BT(Ev,Gv);
815 0x4: Inst::SHLD(Ev,Gv,Ib);
816 0x5: Inst::SHLD(Ev,Gv);
817 0x6: xbts_and_cmpxchg();
818 0x7: ibts_and_cmpxchg();
819 }
820 0x15: decode OPCODE_OP_BOTTOM3 {
821 0x0: push_gs();
822 0x1: pop_gs();
823 0x2: rsm_smm();
824 0x3: Inst::BTS(Ev,Gv);
825 0x4: Inst::SHRD(Ev,Gv,Ib);
826 0x5: Inst::SHRD(Ev,Gv);
827 //0x6: group16();
828 0x6: decode MODRM_REG {
829 0x0: fxsave();
830 0x1: fxrstor();
831 0x2: Inst::LDMXCSR(Md);
832 0x3: Inst::STMXCSR(Md);
833 0x4: Inst::UD2();
834 0x5: decode MODRM_MOD {
835 0x3: BasicOperate::LFENCE(
836 {{/*Nothing*/}}, IsReadBarrier);
837 default: Inst::UD2();
838 }
839 0x6: decode MODRM_MOD {
840 0x3: BasicOperate::MFENCE(
841 {{/*Nothing*/}}, IsMemBarrier);
842 default: Inst::UD2();
843 }
844 0x7: decode MODRM_MOD {
845 0x3: BasicOperate::SFENCE(
846 {{/*Nothing*/}}, IsWriteBarrier);
847 default: Inst::UD2();
848 }
849 }
850 0x7: Inst::IMUL(Gv,Ev);
851 }
852 format Inst {
853 0x16: decode OPCODE_OP_BOTTOM3 {
854 0x0: CMPXCHG(Eb,Gb);
855 0x1: CMPXCHG(Ev,Gv);
856 0x2: WarnUnimpl::lss_Gz_Mp();
857 0x3: BTR(Ev,Gv);
858 0x4: WarnUnimpl::lfs_Gz_Mp();
859 0x5: WarnUnimpl::lgs_Gz_Mp();
860 //The size of the second operand in these instructions
861 //should really be "b" or "w", but it's set to v in order
862 //to have a consistent register size. This shouldn't
863 //affect behavior.
864 0x6: MOVZX_B(Gv,Ev);
865 0x7: MOVZX_W(Gv,Ev);
866 }
867 0x17: decode OPCODE_OP_BOTTOM3 {
868 0x0: WarnUnimpl::jmpe_Jz(); // IA-64?
869 //0x1: group11_UD2();
870 0x1: UD2();
871 //0x2: group8_Ev_Ib();
872 0x2: decode MODRM_REG {
873 0x4: BT(Ev,Ib);
874 0x5: BTS(Ev,Ib);
875 0x6: BTR(Ev,Ib);
876 0x7: BTC(Ev,Ib);
877 default: UD2();

--- 245 unchanged lines hidden ---