Previous 199869 Revisions Next

r36049 Sunday 22nd February, 2015 at 14:31:04 UTC by Samuele Zannoli
i386.c: updates for the future and more [Samuele Zannoli]
- add infrastructure to support opcodes ?? 0f 38 ?? and ?? 0f 3a ??
- add placeholders in opcode table for all instructions not yet implemented
- fix opcode group 0f 73
- add opcode group 66 0f 73
- move sse opcodes movd movdqa to their own routine
- move sse opcodes pinsrw pextrw to ther own routine
- add opcodes punpcklbw punpcklwd punpckldq punpcklqdq
[/branches/kale/src/emu/cpu/i386]i386.c i386.h i386ops.h pentops.inc

branches/kale/src/emu/cpu/i386/i386.c
r244560r244561
28762876      (this->*m_opcode_table1_16[m_opcode])();
28772877}
28782878
2879/* Two-byte opcode prefix */
2879/* Two-byte opcode 0f xx */
28802880void i386_device::i386_decode_two_byte()
28812881{
28822882   m_opcode = FETCH();
r244560r244561
28902890      (this->*m_opcode_table2_16[m_opcode])();
28912891}
28922892
2893/* Three-byte opcode prefix 66 0f */
2893/* Three-byte opcode 0f 38 xx */
2894void i386_device::i386_decode_three_byte38()
2895{
2896   m_opcode = FETCH();
2897
2898   if (m_operand_size)
2899      (this->*m_opcode_table338_32[m_opcode])();
2900   else
2901      (this->*m_opcode_table338_16[m_opcode])();
2902}
2903
2904/* Three-byte opcode 0f 3a xx */
2905void i386_device::i386_decode_three_byte3a()
2906{
2907   m_opcode = FETCH();
2908
2909   if (m_operand_size)
2910      (this->*m_opcode_table33a_32[m_opcode])();
2911   else
2912      (this->*m_opcode_table33a_16[m_opcode])();
2913}
2914
2915/* Three-byte opcode prefix 66 0f xx */
28942916void i386_device::i386_decode_three_byte66()
28952917{
28962918   m_opcode = FETCH();
r244560r244561
29002922      (this->*m_opcode_table366_16[m_opcode])();
29012923}
29022924
2903/* Three-byte opcode prefix f2 0f */
2925/* Three-byte opcode prefix f2 0f xx */
29042926void i386_device::i386_decode_three_bytef2()
29052927{
29062928   m_opcode = FETCH();
r244560r244561
29202942      (this->*m_opcode_table3f3_16[m_opcode])();
29212943}
29222944
2945/* Four-byte opcode prefix 66 0f 38 xx */
2946void i386_device::i386_decode_four_byte3866()
2947{
2948   m_opcode = FETCH();
2949   if (m_operand_size)
2950      (this->*m_opcode_table46638_32[m_opcode])();
2951   else
2952      (this->*m_opcode_table46638_16[m_opcode])();
2953}
2954
2955/* Four-byte opcode prefix 66 0f 3a xx */
2956void i386_device::i386_decode_four_byte3a66()
2957{
2958   m_opcode = FETCH();
2959   if (m_operand_size)
2960      (this->*m_opcode_table4663a_32[m_opcode])();
2961   else
2962      (this->*m_opcode_table4663a_16[m_opcode])();
2963}
2964
2965/* Four-byte opcode prefix f2 0f 38 xx */
2966void i386_device::i386_decode_four_byte38f2()
2967{
2968   m_opcode = FETCH();
2969   if (m_operand_size)
2970      (this->*m_opcode_table4f238_32[m_opcode])();
2971   else
2972      (this->*m_opcode_table4f238_16[m_opcode])();
2973}
2974
2975/* Four-byte opcode prefix f2 0f 3a xx */
2976void i386_device::i386_decode_four_byte3af2()
2977{
2978   m_opcode = FETCH();
2979   if (m_operand_size)
2980      (this->*m_opcode_table4f23a_32[m_opcode])();
2981   else
2982      (this->*m_opcode_table4f23a_16[m_opcode])();
2983}
2984
2985/* Four-byte opcode prefix f3 0f 38 xx */
2986void i386_device::i386_decode_four_byte38f3()
2987{
2988   m_opcode = FETCH();
2989   if (m_operand_size)
2990      (this->*m_opcode_table4f338_32[m_opcode])();
2991   else
2992      (this->*m_opcode_table4f338_16[m_opcode])();
2993}
2994
2995
29232996/*************************************************************************/
29242997
29252998UINT8 i386_device::read8_debug(UINT32 ea, UINT8 *data)
r244560r244561
35013574            m_opcode_table3f3_32[op->opcode] = op->handler32;
35023575            m_opcode_table3f3_16[op->opcode] = op->handler16;
35033576         }
3577         else if (op->flags & OP_3BYTE38)
3578         {
3579            m_opcode_table338_32[op->opcode] = op->handler32;
3580            m_opcode_table338_16[op->opcode] = op->handler16;
3581         }
3582         else if (op->flags & OP_3BYTE3A)
3583         {
3584            m_opcode_table33a_32[op->opcode] = op->handler32;
3585            m_opcode_table33a_16[op->opcode] = op->handler16;
3586         }
3587         else if (op->flags & OP_4BYTE3866)
3588         {
3589            m_opcode_table46638_32[op->opcode] = op->handler32;
3590            m_opcode_table46638_16[op->opcode] = op->handler16;
3591         }
3592         else if (op->flags & OP_4BYTE3A66)
3593         {
3594            m_opcode_table4663a_32[op->opcode] = op->handler32;
3595            m_opcode_table4663a_16[op->opcode] = op->handler16;
3596         }
3597         else if (op->flags & OP_4BYTE38F2)
3598         {
3599            m_opcode_table4f238_32[op->opcode] = op->handler32;
3600            m_opcode_table4f238_16[op->opcode] = op->handler16;
3601         }
3602         else if (op->flags & OP_4BYTE3AF2)
3603         {
3604            m_opcode_table4f23a_32[op->opcode] = op->handler32;
3605            m_opcode_table4f23a_16[op->opcode] = op->handler16;
3606         }
3607         else if (op->flags & OP_4BYTE38F3)
3608         {
3609            m_opcode_table4f338_32[op->opcode] = op->handler32;
3610            m_opcode_table4f338_16[op->opcode] = op->handler16;
3611         }
35043612         else
35053613         {
35063614            m_opcode_table1_32[op->opcode] = op->handler32;
branches/kale/src/emu/cpu/i386/i386.h
r244560r244561
239239   i386_op_func m_opcode_table1_32[256];
240240   i386_op_func m_opcode_table2_16[256];
241241   i386_op_func m_opcode_table2_32[256];
242   i386_op_func m_opcode_table338_16[256];
243   i386_op_func m_opcode_table338_32[256];
244   i386_op_func m_opcode_table33a_16[256];
245   i386_op_func m_opcode_table33a_32[256];
242246   i386_op_func m_opcode_table366_16[256];
243247   i386_op_func m_opcode_table366_32[256];
244248   i386_op_func m_opcode_table3f2_16[256];
245249   i386_op_func m_opcode_table3f2_32[256];
246250   i386_op_func m_opcode_table3f3_16[256];
247251   i386_op_func m_opcode_table3f3_32[256];
252   i386_op_func m_opcode_table46638_16[256];
253   i386_op_func m_opcode_table46638_32[256];
254   i386_op_func m_opcode_table4f238_16[256];
255   i386_op_func m_opcode_table4f238_32[256];
256   i386_op_func m_opcode_table4f338_16[256];
257   i386_op_func m_opcode_table4f338_32[256];
258   i386_op_func m_opcode_table4663a_16[256];
259   i386_op_func m_opcode_table4663a_32[256];
260   i386_op_func m_opcode_table4f23a_16[256];
261   i386_op_func m_opcode_table4f23a_32[256];
248262
249263   bool m_lock_table[2][256];
250264
r244560r244561
366380   void report_invalid_modrm(const char* opcode, UINT8 modrm);
367381   void i386_decode_opcode();
368382   void i386_decode_two_byte();
383   void i386_decode_three_byte38();
384   void i386_decode_three_byte3a();
369385   void i386_decode_three_byte66();
370386   void i386_decode_three_bytef2();
371387   void i386_decode_three_bytef3();
388   void i386_decode_four_byte3866();
389   void i386_decode_four_byte3a66();
390   void i386_decode_four_byte38f2();
391   void i386_decode_four_byte3af2();
392   void i386_decode_four_byte38f3();
372393   UINT8 read8_debug(UINT32 ea, UINT8 *data);
373394   UINT32 i386_get_debug_desc(I386_SREG *seg);
374395   inline void CYCLES(int x);
r244560r244561
10031024   void mmx_punpckhwd_r64_rm64();
10041025   void mmx_punpckhdq_r64_rm64();
10051026   void mmx_packssdw_r64_rm64();
1006   void sse_sse_group0fae();
1027   void sse_group_0fae();
1028   void sse_group_660f73();
10071029   void sse_cvttps2dq_r128_rm128();
10081030   void sse_cvtss2sd_r128_r128m32();
10091031   void sse_cvttss2si_r32_r128m32();
r244560r244561
10331055   void sse_movq2dq_r128_r64();
10341056   void sse_movdqu_r128_rm128();
10351057   void sse_movdqu_rm128_r128();
1058   void sse_movd_m128_rm32();
1059   void sse_movdqa_m128_rm128();
10361060   void sse_movq_r128_r128m64();
1061   void sse_movd_rm32_r128();
1062   void sse_movdqa_rm128_r128();
10371063   void sse_pmovmskb_r16_r64();
10381064   void sse_pmovmskb_r32_r64();
10391065   void sse_xorps();
r244560r244561
10611087   void sse_comiss_r128_r128m32();
10621088   void sse_ucomiss_r128_r128m32();
10631089   void sse_shufps();
1090   void sse_punpcklbw_r128_rm128();
1091   void sse_punpcklwd_r128_rm128();
1092   void sse_punpckldq_r128_rm128();
1093   void sse_punpcklqdq_r128_rm128();
10641094   void sse_unpcklps_r128_rm128();
10651095   void sse_unpckhps_r128_rm128();
10661096   void sse_cmpps_r128_rm128_i8();
10671097   void sse_cmpss_r128_r128m32_i8();
10681098   void sse_pinsrw_r64_r16m16_i8();
10691099   void sse_pinsrw_r64_r32m16_i8();
1100   void sse_pinsrw_r128_r32m16_i8();
10701101   void sse_pextrw_r16_r64_i8();
10711102   void sse_pextrw_r32_r64_i8();
1103   void sse_pextrw_reg_r128_i8();
10721104   void sse_pminub_r64_rm64();
10731105   void sse_pmaxub_r64_rm64();
10741106   void sse_pavgb_r64_rm64();
branches/kale/src/emu/cpu/i386/i386ops.h
r244560r244561
1414#define OP_3BYTE66      0x40000000
1515#define OP_3BYTEF2      0x20000000
1616#define OP_3BYTEF3      0x10000000
17#define OP_3BYTE38      0x08000000
18#define OP_3BYTE3A      0x04000000
19#define OP_4BYTE3866    0x02000000
20#define OP_4BYTE3A66    0x01000000
21#define OP_4BYTE38F2    0x00800000
22#define OP_4BYTE3AF2    0x00400000
23#define OP_4BYTE38F3    0x00200000
1724
1825const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
1926{
r244560r244561
320327   { 0x30,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_wrmsr,               &i386_device::pentium_wrmsr,           false},
321328   { 0x31,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_rdtsc,               &i386_device::pentium_rdtsc,           false},
322329   { 0x32,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_rdmsr,               &i386_device::pentium_rdmsr,           false},
323   { 0x40,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovo_r16_rm16,      &i386_device::pentium_cmovo_r32_rm32,  false},
330   { 0x38,     OP_2BYTE|OP_PENTIUM,        &i386_device::i386_decode_three_byte38,    &i386_device::i386_decode_three_byte38,false},
331   { 0x3A,     OP_2BYTE|OP_PENTIUM,        &i386_device::i386_decode_three_byte3a,    &i386_device::i386_decode_three_byte3a,false},
332   { 0x40,       OP_2BYTE|OP_PENTIUM,   &i386_device::pentium_cmovo_r16_rm16,      &i386_device::pentium_cmovo_r32_rm32,  false},
324333   { 0x41,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovno_r16_rm16,     &i386_device::pentium_cmovno_r32_rm32, false},
325334   { 0x42,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovb_r16_rm16,      &i386_device::pentium_cmovb_r32_rm32,  false},
326335   { 0x43,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovae_r16_rm16,     &i386_device::pentium_cmovae_r32_rm32, false},
r244560r244561
421430   { 0xAB,     OP_2BYTE|OP_I386,           &i386_device::i386_bts_rm16_r16,           &i386_device::i386_bts_rm32_r32,       true },
422431   { 0xAC,     OP_2BYTE|OP_I386,           &i386_device::i386_shrd16_i8,              &i386_device::i386_shrd32_i8,          false},
423432   { 0xAD,     OP_2BYTE|OP_I386,           &i386_device::i386_shrd16_cl,              &i386_device::i386_shrd32_cl,          false},
424   { 0xAE,     OP_2BYTE|OP_SSE,            &i386_device::sse_sse_group0fae,           &i386_device::sse_sse_group0fae,       false},
433   { 0xAE,     OP_2BYTE|OP_SSE,            &i386_device::sse_group_0fae,              &i386_device::sse_group_0fae,          false},
425434   { 0xAF,     OP_2BYTE|OP_I386,           &i386_device::i386_imul_r16_rm16,          &i386_device::i386_imul_r32_rm32,      false},
426435   { 0xB0,     OP_2BYTE|OP_I486,           &i386_device::i486_cmpxchg_rm8_r8,         &i386_device::i486_cmpxchg_rm8_r8,     true },
427436   { 0xB1,     OP_2BYTE|OP_I486,           &i386_device::i486_cmpxchg_rm16_r16,       &i386_device::i486_cmpxchg_rm32_r32,   true },
r244560r244561
519528   { 0x70,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_pshufhw_r128_rm128_i8,   &i386_device::sse_pshufhw_r128_rm128_i8,false},
520529   { 0x7E,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movq_r128_r128m64,       &i386_device::sse_movq_r128_r128m64,   false},
521530   { 0x7F,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movdqu_rm128_r128,       &i386_device::sse_movdqu_rm128_r128,   false},
531   { 0xAE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
522532   { 0xB8,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_popcnt_r16_rm16,     &i386_device::pentium_popcnt_r32_rm32, false},
523   { 0xBC,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_tzcnt_r16_rm16,      &i386_device::pentium_tzcnt_r32_rm32, false},
533   { 0xBC,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_tzcnt_r16_rm16,      &i386_device::pentium_tzcnt_r32_rm32, false},
524534   { 0xC2,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cmpss_r128_r128m32_i8,   &i386_device::sse_cmpss_r128_r128m32_i8,false},
535   { 0xC7,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
525536   { 0xD6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movq2dq_r128_r64,        &i386_device::sse_movq2dq_r128_r64,    false},
526   { 0xE6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cvtdq2pd_r128_r128m64,   &i386_device::sse_cvtdq2pd_r128_r128m64,false}
537   { 0xE6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cvtdq2pd_r128_r128m64,   &i386_device::sse_cvtdq2pd_r128_r128m64,false},
538   /* F2 0F ?? */
539   { 0x10,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
540   { 0x11,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
541   { 0x12,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
542   { 0x2A,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
543   { 0x2C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
544   { 0x2D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
545   { 0x51,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
546   { 0x58,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
547   { 0x59,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
548   { 0x5A,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
549   { 0x5C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
550   { 0x5D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
551   { 0x5E,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
552   { 0x5F,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
553   { 0x70,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
554   { 0x7C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
555   { 0x7D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
556   { 0xC2,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
557   { 0xD0,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
558   { 0xD6,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
559   { 0xE6,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
560   { 0xF0,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
561   /* 66 0F ?? */
562   { 0x10,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
563   { 0x11,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
564   { 0x12,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
565   { 0x13,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
566   { 0x14,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
567   { 0x15,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
568   { 0x16,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
569   { 0x17,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
570   { 0x28,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
571   { 0x29,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
572   { 0x2A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
573   { 0x2B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
574   { 0x2C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
575   { 0x2D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
576   { 0x2E,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
577   { 0x2F,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
578   { 0x50,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
579   { 0x51,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
580   { 0x54,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
581   { 0x55,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
582   { 0x56,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
583   { 0x57,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
584   { 0x58,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
585   { 0x59,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
586   { 0x5A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
587   { 0x5B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
588   { 0x5C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
589   { 0x5D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
590   { 0x5E,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
591   { 0x5F,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
592   { 0x60,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklbw_r128_rm128,    &i386_device::sse_punpcklbw_r128_rm128,false},
593   { 0x61,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklwd_r128_rm128,    &i386_device::sse_punpcklwd_r128_rm128,false},
594   { 0x62,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpckldq_r128_rm128,    &i386_device::sse_punpckldq_r128_rm128,false},
595   { 0x63,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
596   { 0x64,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
597   { 0x65,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
598   { 0x66,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
599   { 0x67,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
600   { 0x68,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
601   { 0x69,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
602   { 0x6A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
603   { 0x6B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
604   { 0x6C,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklqdq_r128_rm128,   &i386_device::sse_punpcklqdq_r128_rm128,false},
605   { 0x6D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
606   { 0x6E,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movd_m128_rm32,          &i386_device::sse_movd_m128_rm32,      false},
607   { 0x6F,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movdqa_m128_rm128,       &i386_device::sse_movdqa_m128_rm128,   false},
608   { 0x70,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
609   { 0x71,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
610   { 0x72,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
611   { 0x73,     OP_3BYTE66|OP_SSE,          &i386_device::sse_group_660f73,            &i386_device::sse_group_660f73,        false},
612   { 0x74,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
613   { 0x76,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
614   { 0x7C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
615   { 0x7D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
616   { 0x7E,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movd_rm32_r128,          &i386_device::sse_movd_rm32_r128,      false},
617   { 0x7F,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movdqa_rm128_r128,       &i386_device::sse_movdqa_rm128_r128,   false},
618   { 0xC2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
619   { 0xC4,     OP_3BYTE66|OP_SSE,          &i386_device::sse_pinsrw_r128_r32m16_i8,   &i386_device::sse_pinsrw_r128_r32m16_i8,false},
620   { 0xC5,     OP_3BYTE66|OP_SSE,          &i386_device::sse_pextrw_reg_r128_i8,      &i386_device::sse_pextrw_reg_r128_i8,  false},
621   { 0xC6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
622   { 0xC7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
623   { 0xD0,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
624   { 0xD1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
625   { 0xD2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
626   { 0xD3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
627   { 0xD4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
628   { 0xD5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
629   { 0xD6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
630   { 0xD7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
631   { 0xD8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
632   { 0xD9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
633   { 0xDA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
634   { 0xDB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
635   { 0xDC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
636   { 0xDD,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
637   { 0xDE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
638   { 0xDF,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
639   { 0xE0,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
640   { 0xE1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
641   { 0xE2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
642   { 0xE3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
643   { 0xE4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
644   { 0xE5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
645   { 0xE6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
646   { 0xE7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
647   { 0xE8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
648   { 0xE9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
649   { 0xEA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
650   { 0xEB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
651   { 0xEC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
652   { 0xED,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
653   { 0xEE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
654   { 0xEF,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
655   { 0xF1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
656   { 0xF2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
657   { 0xF3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
658   { 0xF4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
659   { 0xF5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
660   { 0xF6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
661   { 0xF7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
662   { 0xF8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
663   { 0xF9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
664   { 0xFA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
665   { 0xFB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
666   { 0xFC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
667   { 0xFD,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
668   { 0xFE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
669   /* 0F 38 ?? */
670   { 0x00,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
671   { 0x01,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
672   { 0x02,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
673   { 0x03,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
674   { 0x04,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
675   { 0x05,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
676   { 0x06,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
677   { 0x07,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
678   { 0x08,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
679   { 0x09,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
680   { 0x0A,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
681   { 0x0B,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
682   { 0x1C,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
683   { 0x1D,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
684   { 0x1E,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
685   { 0xF0,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
686   { 0xF1,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
687   { 0xF2,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
688   { 0xF3,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
689   { 0xF5,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
690   { 0xF7,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
691   /* 0F 3A ?? */
692   { 0x0F,     OP_3BYTE3A|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
693   /* 66 0F 38 ?? */
694   { 0x00,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
695   { 0x01,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
696   { 0x02,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
697   { 0x03,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
698   { 0x04,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
699   { 0x05,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
700   { 0x06,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
701   { 0x07,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
702   { 0x08,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
703   { 0x09,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
704   { 0x0A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
705   { 0x0B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
706   { 0x0C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
707   { 0x0D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
708   { 0x0E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
709   { 0x0F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
710   { 0x10,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
711   { 0x13,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
712   { 0x14,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
713   { 0x15,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
714   { 0x16,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
715   { 0x17,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
716   { 0x18,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
717   { 0x19,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
718   { 0x1A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
719   { 0x1C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
720   { 0x1D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
721   { 0x1E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
722   { 0x20,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
723   { 0x21,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
724   { 0x22,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
725   { 0x23,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
726   { 0x24,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
727   { 0x25,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
728   { 0x28,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
729   { 0x29,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
730   { 0x2A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
731   { 0x2B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
732   { 0x2C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
733   { 0x2D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
734   { 0x2E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
735   { 0x2F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
736   { 0x30,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
737   { 0x31,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
738   { 0x32,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
739   { 0x33,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
740   { 0x34,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
741   { 0x35,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
742   { 0x36,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
743   { 0x37,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
744   { 0x38,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
745   { 0x39,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
746   { 0x3A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
747   { 0x3B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
748   { 0x3C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
749   { 0x3D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
750   { 0x3E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
751   { 0x3F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
752   { 0x40,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
753   { 0x41,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
754   { 0x45,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
755   { 0x46,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
756   { 0x47,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
757   { 0x58,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
758   { 0x59,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
759   { 0x5A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
760   { 0x78,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
761   { 0x79,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
762   { 0x80,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
763   { 0x81,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
764   { 0x82,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
765   { 0x8C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
766   { 0x8E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
767   { 0x90,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
768   { 0x91,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
769   { 0x92,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
770   { 0x93,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
771   { 0x96,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
772   { 0x97,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
773   { 0x98,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
774   { 0x99,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
775   { 0x9A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
776   { 0x9B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
777   { 0x9C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
778   { 0x9D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
779   { 0x9E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
780   { 0x9F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
781   { 0xA6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
782   { 0xA7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
783   { 0xA8,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
784   { 0xA9,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
785   { 0xAA,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
786   { 0xAB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
787   { 0xAC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
788   { 0xAD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
789   { 0xAE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
790   { 0xAF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
791   { 0xB6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
792   { 0xB7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
793   { 0xB8,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
794   { 0xB9,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
795   { 0xBA,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
796   { 0xBB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
797   { 0xBC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
798   { 0xBD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
799   { 0xBE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
800   { 0xBF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
801   { 0xDB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
802   { 0xDC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
803   { 0xDD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
804   { 0xDE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
805   { 0xDF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
806   { 0xF0,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
807   { 0xF1,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
808   { 0xF3,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
809   { 0xF6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
810   { 0xF7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
811   /* F2 0F 38 ?? */
812   { 0xF0,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
813   { 0xF1,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
814   { 0xF3,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
815   { 0xF5,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
816   { 0xF6,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
817   { 0xF7,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
818   /* F3 0F 38 ?? */
819   { 0xF3,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
820   { 0xF5,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
821   { 0xF6,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
822   { 0xF7,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
823   /* 66 0F 3A ?? */
824   { 0x00,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
825   { 0x01,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
826   { 0x02,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
827   { 0x04,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
828   { 0x05,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
829   { 0x06,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
830   { 0x08,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
831   { 0x09,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
832   { 0x0A,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
833   { 0x0B,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
834   { 0x0C,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
835   { 0x0D,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
836   { 0x0E,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
837   { 0x0F,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
838   { 0x14,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
839   { 0x15,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
840   { 0x16,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
841   { 0x17,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
842   { 0x18,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
843   { 0x19,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
844   { 0x1D,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
845   { 0x20,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
846   { 0x21,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
847   { 0x22,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
848   { 0x38,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
849   { 0x39,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
850   { 0x40,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
851   { 0x41,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
852   { 0x42,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
853   { 0x44,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
854   { 0x46,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
855   { 0x4A,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
856   { 0x4B,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
857   { 0x4C,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
858   { 0x60,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
859   { 0x61,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
860   { 0x62,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
861   { 0x63,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
862   { 0xDF,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
863   /* F2 0F 3A ?? */
864   { 0xF0,     OP_4BYTE3AF2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false}
527865};
branches/kale/src/emu/cpu/i386/pentops.inc
r244560r244561
12691269      switch ( (modm & 0x38) >> 3 )
12701270      {
12711271         case 2: // psrlq
1272            if (m_xmm_operand_size)
1273            {
1274               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
1275               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
1276            }
1277            else
1278               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
1272            MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
12791273            break;
1280         case 3: // psrldq
1281            if (imm8 >= 16)
1282            {
1283               XMM(modm & 7).q[0] = 0;
1284               XMM(modm & 7).q[1] = 0;
1285            }
1286            else if(imm8 >= 8)
1287            {
1288               imm8 = (imm8 & 7) << 3;
1289               XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
1290               XMM(modm & 7).q[1] = 0;
1291            }
1292            else if(imm8)
1293            {
1294               imm8 = imm8 << 3;
1295               XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (XMM(modm & 7).q[0] >> imm8);
1296               XMM(modm & 7).q[1] = XMM(modm & 7).q[0] >> imm8;
1297            }
1298            break;
12991274         case 6: // psllq
1300            if (m_xmm_operand_size)
1301            {
1302               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
1303               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
1304            }
1305            else
1306               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
1275            MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
13071276            break;
1308         case 7: // pslldq
1309            if (imm8 >= 16)
1310            {
1311               XMM(modm & 7).q[0] = 0;
1312               XMM(modm & 7).q[1] = 0;
1313            }
1314            else if(imm8 >= 8)
1315            {
1316               imm8 = (imm8 & 7) << 3;
1317               XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
1318               XMM(modm & 7).q[0] = 0;
1319            }
1320            else if(imm8)
1321            {
1322               imm8 = imm8 << 3;
1323               XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
1324               XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
1325            }
1326            break;
13271277         default:
13281278            report_invalid_modrm("mmx_group0f73", modm);
13291279      }
13301280   }
13311281}
13321282
1283void i386_device::sse_group_660f73()  // Opcode 66 0f 73
1284{
1285   UINT64 t0;
1286   UINT8 modm = FETCH();
1287   UINT8 imm8 = FETCH();
1288   if (modm >= 0xc0) {
1289      switch ((modm & 0x38) >> 3)
1290      {
1291      case 2: // psrlq
1292         XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
1293         XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
1294         break;
1295      case 3: // psrldq
1296         if (imm8 >= 16)
1297         {
1298            XMM(modm & 7).q[0] = 0;
1299            XMM(modm & 7).q[1] = 0;
1300         }
1301         else if (imm8 >= 8)
1302         {
1303            imm8 = (imm8 & 7) << 3;
1304            XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
1305            XMM(modm & 7).q[1] = 0;
1306         }
1307         else if (imm8)
1308         {
1309            t0 = XMM(modm & 7).q[0];
1310            imm8 = imm8 << 3;
1311            XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (t0 >> imm8);
1312            XMM(modm & 7).q[1] = t0 >> imm8;
1313         }
1314         break;
1315      case 6: // psllq
1316         XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
1317         XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
1318         break;
1319      case 7: // pslldq
1320         if (imm8 >= 16)
1321         {
1322            XMM(modm & 7).q[0] = 0;
1323            XMM(modm & 7).q[1] = 0;
1324         }
1325         else if (imm8 >= 8)
1326         {
1327            imm8 = (imm8 & 7) << 3;
1328            XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
1329            XMM(modm & 7).q[0] = 0;
1330         }
1331         else if (imm8)
1332         {
1333            imm8 = imm8 << 3;
1334            XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
1335            XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
1336         }
1337         break;
1338      default:
1339         report_invalid_modrm("sse_group660f73", modm);
1340      }
1341   }
1342}
1343
13331344void i386_device::mmx_psrlw_r64_rm64()  // Opcode 0f d1
13341345{
13351346   MMXPROLOG();
r244560r244561
18921903   MMXPROLOG();
18931904   UINT8 modrm = FETCH();
18941905   if( modrm >= 0xc0 ) {
1895      if (m_xmm_operand_size)
1896         XMM((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
1897      else
1898         MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
1906      MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
18991907   } else {
19001908      UINT32 ea = GetEA(modrm, 0);
1901      if (m_xmm_operand_size)
1902         XMM((modrm >> 3) & 0x7).d[0]=READ32(ea);
1903      else
1904         MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
1909      MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
19051910   }
19061911   MMX((modrm >> 3) & 0x7).d[1]=0;
19071912   CYCLES(1);     // TODO: correct cycle count
r244560r244561
19121917   MMXPROLOG();
19131918   UINT8 modrm = FETCH();
19141919   if( modrm >= 0xc0 ) {
1915      if (m_xmm_operand_size)
1916         XMM((modrm >> 3) & 0x7).l[0]=XMM(modrm & 0x7).l[0];
1917      else
1918         MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
1920      MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
19191921   } else {
19201922      UINT32 ea = GetEA(modrm, 0);
1921      if (m_xmm_operand_size)
1922         READXMM_LO64(ea, XMM((modrm >> 3) & 0x7));
1923      else
1924         READMMX(ea, MMX((modrm >> 3) & 0x7));
1925
1923      READMMX(ea, MMX((modrm >> 3) & 0x7));
19261924   }
19271925   CYCLES(1);     // TODO: correct cycle count
19281926}
r244560r244561
19321930   MMXPROLOG();
19331931   UINT8 modrm = FETCH();
19341932   if( modrm >= 0xc0 ) {
1935      if (m_xmm_operand_size)
1936         STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
1937      else
1938         STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
1933      STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
19391934   } else {
19401935      UINT32 ea = GetEA(modrm, 0);
1941      if (m_xmm_operand_size)
1942         WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
1943      else
1944         WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
1936      WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
19451937   }
19461938   CYCLES(1);     // TODO: correct cycle count
19471939}
r244560r244561
19511943   MMXPROLOG();
19521944   UINT8 modrm = FETCH();
19531945   if( modrm >= 0xc0 ) {
1954      if (m_xmm_operand_size)
1955         XMM(modrm & 0x7).l[0]=XMM((modrm >> 3) & 0x7).l[0];
1956      else
1957         MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
1946      MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
19581947   } else {
19591948      UINT32 ea = GetEA(modrm, 0);
19601949      WRITEMMX(ea, MMX((modrm >> 3) & 0x7));
r244560r244561
20592048   CYCLES(1);     // TODO: correct cycle count
20602049}
20612050
2051void i386_device::sse_punpcklbw_r128_rm128() // Opcode 66 0f 60
2052{
2053   UINT8 modrm = FETCH();
2054   if (modrm >= 0xc0) {
2055      XMM_REG xd,xs;
2056      int s, d;
2057      s = modrm & 0x7;
2058      d = (modrm >> 3) & 0x7;
2059      xd.l[0] = XMM(d).l[0];
2060      xs.l[0] = XMM(s).l[0];
2061      XMM(d).b[0] = xd.b[0];
2062      XMM(d).b[1] = xs.b[0];
2063      XMM(d).b[2] = xd.b[1];
2064      XMM(d).b[3] = xs.b[1];
2065      XMM(d).b[4] = xd.b[2];
2066      XMM(d).b[5] = xs.b[2];
2067      XMM(d).b[6] = xd.b[3];
2068      XMM(d).b[7] = xs.b[3];
2069      XMM(d).b[8] = xd.b[4];
2070      XMM(d).b[9] = xs.b[4];
2071      XMM(d).b[10] = xd.b[5];
2072      XMM(d).b[11] = xs.b[5];
2073      XMM(d).b[12] = xd.b[6];
2074      XMM(d).b[13] = xs.b[6];
2075      XMM(d).b[14] = xd.b[7];
2076      XMM(d).b[15] = xs.b[7];
2077   }
2078   else {
2079      XMM_REG xd, xs;
2080      int d = (modrm >> 3) & 0x7;
2081      UINT32 ea = GetEA(modrm, 0);
2082      xd.l[0] = XMM(d).l[0];
2083      xs.q[0] = READ64(ea);
2084      for (int n = 0; n < 8; n++) {
2085         XMM(d).b[n << 1] = xd.b[n];
2086         XMM(d).b[(n << 1) | 1] = xs.b[n];
2087      }
2088   }
2089   CYCLES(1);     // TODO: correct cycle count
2090}
2091
2092void i386_device::sse_punpcklwd_r128_rm128()
2093{
2094   UINT8 modrm = FETCH();
2095   if (modrm >= 0xc0) {
2096      XMM_REG xd, xs;
2097      int s, d;
2098      s = modrm & 0x7;
2099      d = (modrm >> 3) & 0x7;
2100      xd.l[0] = XMM(d).l[0];
2101      xs.l[0] = XMM(s).l[0];
2102      for (int n = 0; n < 4; n++) {
2103         XMM(d).w[n << 1] = xd.w[n];
2104         XMM(d).w[(n << 1) | 1] = xs.w[n];
2105      }
2106   }
2107   else {
2108      XMM_REG xd, xs;
2109      int d = (modrm >> 3) & 0x7;
2110      UINT32 ea = GetEA(modrm, 0);
2111      xd.l[0] = XMM(d).l[0];
2112      xs.q[0] = READ64(ea);
2113      for (int n = 0; n < 4; n++) {
2114         XMM(d).w[n << 1] = xd.w[n];
2115         XMM(d).w[(n << 1) | 1] = xs.w[n];
2116      }
2117   }
2118   CYCLES(1);     // TODO: correct cycle count
2119}
2120
2121void i386_device::sse_punpckldq_r128_rm128()
2122{
2123   UINT8 modrm = FETCH();
2124   if (modrm >= 0xc0) {
2125      XMM_REG xd, xs;
2126      int s, d;
2127      s = modrm & 0x7;
2128      d = (modrm >> 3) & 0x7;
2129      xd.l[0] = XMM(d).l[0];
2130      xs.l[0] = XMM(s).l[0];
2131      for (int n = 0; n < 2; n++) {
2132         XMM(d).d[n << 1] = xd.d[n];
2133         XMM(d).d[(n << 1) | 1] = xs.d[n];
2134      }
2135   }
2136   else {
2137      XMM_REG xd, xs;
2138      int d = (modrm >> 3) & 0x7;
2139      UINT32 ea = GetEA(modrm, 0);
2140      xd.l[0] = XMM(d).l[0];
2141      xs.q[0] = READ64(ea);
2142      for (int n = 0; n < 2; n++) {
2143         XMM(d).d[n << 1] = xd.d[n];
2144         XMM(d).d[(n << 1) | 1] = xs.d[n];
2145      }
2146   }
2147   CYCLES(1);     // TODO: correct cycle count
2148}
2149
2150void i386_device::sse_punpcklqdq_r128_rm128()
2151{
2152   UINT8 modrm = FETCH();
2153   if (modrm >= 0xc0) {
2154      XMM_REG xd, xs;
2155      int s, d;
2156      s = modrm & 0x7;
2157      d = (modrm >> 3) & 0x7;
2158      xd.l[0] = XMM(d).l[0];
2159      xs.l[0] = XMM(s).l[0];
2160      XMM(d).q[0] = xd.q[0];
2161      XMM(d).q[1] = xs.q[0];
2162   }
2163   else {
2164      XMM_REG xd, xs;
2165      int d = (modrm >> 3) & 0x7;
2166      UINT32 ea = GetEA(modrm, 0);
2167      xd.l[0] = XMM(d).l[0];
2168      xs.q[0] = READ64(ea);
2169      XMM(d).q[0] = xd.q[0];
2170      XMM(d).q[1] = xs.q[0];
2171   }
2172   CYCLES(1);     // TODO: correct cycle count
2173}
2174
20622175void i386_device::mmx_punpcklbw_r64_r64m32() // Opcode 0f 60
20632176{
20642177   MMXPROLOG();
r244560r244561
23942507   CYCLES(1);     // TODO: correct cycle count
23952508}
23962509
2397void i386_device::sse_sse_group0fae()  // Opcode 0f ae
2510void i386_device::sse_group_0fae()  // Opcode 0f ae
23982511{
23992512   UINT8 modm = FETCH();
24002513   if( modm == 0xf8 ) {
r244560r244561
24202533            GetNonTranslatedEA(modm, NULL);
24212534            break;
24222535         default:
2423            report_invalid_modrm("sse_group0fae", modm);
2536            report_invalid_modrm("sse_group_0fae", modm);
24242537      }
24252538   } else {
2426      report_invalid_modrm("sse_group0fae", modm);
2539      report_invalid_modrm("sse_group_0fae", modm);
24272540   }
24282541}
24292542
r244560r244561
28572970   CYCLES(1);     // TODO: correct cycle count
28582971}
28592972
2973void i386_device::sse_movd_m128_rm32() // Opcode 66 0f 6e
2974{
2975   UINT8 modrm = FETCH();
2976   if (modrm >= 0xc0) {
2977      XMM((modrm >> 3) & 0x7).d[0] = LOAD_RM32(modrm);
2978   }
2979   else {
2980      UINT32 ea = GetEA(modrm, 0);
2981      XMM((modrm >> 3) & 0x7).d[0] = READ32(ea);
2982   }
2983   XMM((modrm >> 3) & 0x7).d[1] = 0;
2984   XMM((modrm >> 3) & 0x7).q[1] = 0;
2985   CYCLES(1);     // TODO: correct cycle count
2986}
2987
2988void i386_device::sse_movdqa_m128_rm128() // Opcode 66 0f 6f
2989{
2990   UINT8 modrm = FETCH();
2991   if (modrm >= 0xc0) {
2992      XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
2993      XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
2994   }
2995   else {
2996      UINT32 ea = GetEA(modrm, 0);
2997      READXMM(ea, XMM((modrm >> 3) & 0x7));
2998   }
2999   CYCLES(1);     // TODO: correct cycle count
3000}
3001
28603002void i386_device::sse_movq_r128_r128m64() // Opcode f3 0f 7e
28613003{
28623004   MMXPROLOG();
r244560r244561
28723014   CYCLES(1);     // TODO: correct cycle count
28733015}
28743016
3017void i386_device::sse_movd_rm32_r128() // Opcode 66 0f 7e
3018{
3019   UINT8 modrm = FETCH();
3020   if (modrm >= 0xc0) {
3021      STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
3022   }
3023   else {
3024      UINT32 ea = GetEA(modrm, 0);
3025      WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
3026   }
3027   CYCLES(1);     // TODO: correct cycle count
3028}
3029
3030void i386_device::sse_movdqa_rm128_r128() // Opcode 66 0f 7f
3031{
3032   UINT8 modrm = FETCH();
3033   if (modrm >= 0xc0) {
3034      XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
3035      XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
3036   }
3037   else {
3038      UINT32 ea = GetEA(modrm, 0);
3039      WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
3040   }
3041   CYCLES(1);     // TODO: correct cycle count
3042}
3043
28753044void i386_device::sse_pmovmskb_r16_r64() // Opcode 0f d7
28763045{
28773046   //MMXPROLOG();
r244560r244561
34703639      UINT32 ea = GetEA(modrm, 0);
34713640      READXMM(ea, src);
34723641      t1 = XMM(d).d[2];
3473      t3 = XMM(d).d[3];
3642      t2 = XMM(d).d[3];
34743643      XMM(d).d[0]=t1;
34753644      XMM(d).d[1]=src.d[2];
3476      XMM(d).d[2]=t3;
3645      XMM(d).d[2]=t2;
34773646      XMM(d).d[3]=src.d[3];
34783647   }
34793648   CYCLES(1);     // TODO: correct cycle count
r244560r244561
36193788   CYCLES(1);     // TODO: correct cycle count
36203789}
36213790
3622void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4
3791void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4, 16bit register
36233792{
36243793   MMXPROLOG();
36253794   UINT8 modrm = FETCH();
r244560r244561
36423811   CYCLES(1);     // TODO: correct cycle count
36433812}
36443813
3645void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4
3814void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4, 32bit register
36463815{
36473816   MMXPROLOG();
36483817   UINT8 modrm = FETCH();
36493818   if( modrm >= 0xc0 ) {
36503819      UINT8 imm8 = FETCH();
36513820      UINT16 v = (UINT16)LOAD_RM32(modrm);
3652      if (m_xmm_operand_size)
3653         XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3654      else
3655         MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
3821      MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
36563822   } else {
36573823      UINT32 ea = GetEA(modrm, 0);
36583824      UINT8 imm8 = FETCH();
36593825      UINT16 v = READ16(ea);
3660      if (m_xmm_operand_size)
3661         XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3662      else
3663         MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
3826      MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
36643827   }
36653828   CYCLES(1);     // TODO: correct cycle count
36663829}
36673830
3831void i386_device::sse_pinsrw_r128_r32m16_i8() // Opcode 66 0f c4
3832{
3833   UINT8 modrm = FETCH();
3834   if (modrm >= 0xc0) {
3835      UINT8 imm8 = FETCH();
3836      UINT16 v = (UINT16)LOAD_RM32(modrm);
3837      XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3838   }
3839   else {
3840      UINT32 ea = GetEA(modrm, 0);
3841      UINT8 imm8 = FETCH();
3842      UINT16 v = READ16(ea);
3843      XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3844   }
3845   CYCLES(1);     // TODO: correct cycle count
3846}
3847
36683848void i386_device::sse_pextrw_r16_r64_i8() // Opcode 0f c5
36693849{
36703850   //MMXPROLOG();
r244560r244561
36883868   UINT8 modrm = FETCH();
36893869   if( modrm >= 0xc0 ) {
36903870      UINT8 imm8 = FETCH();
3691      if (m_xmm_operand_size)
3692         STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
3693      else
3694         STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
3871      STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
36953872   } else {
36963873      //UINT8 imm8 = FETCH();
36973874      report_invalid_modrm("pextrw_r32_r64_i8", modrm);
r244560r244561
36993876   CYCLES(1);     // TODO: correct cycle count
37003877}
37013878
3879void i386_device::sse_pextrw_reg_r128_i8() // Opcode 66 0f c5
3880{
3881   UINT8 modrm = FETCH();
3882   if (modrm >= 0xc0) {
3883      UINT8 imm8 = FETCH();
3884      STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
3885   }
3886   else {
3887      //UINT8 imm8 = FETCH();
3888      report_invalid_modrm("sse_pextrw_reg_r128_i8", modrm);
3889   }
3890   CYCLES(1);     // TODO: correct cycle count
3891}
3892
37023893void i386_device::sse_pminub_r64_rm64() // Opcode 0f da
37033894{
37043895   int n;


Previous 199869 Revisions Next


© 1997-2024 The MAME Team