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_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 ---