diff --git a/src/backend/cod3.c b/src/backend/cod3.c
index 16c40eb..de35100 100644
--- a/src/backend/cod3.c
+++ b/src/backend/cod3.c
@@ -215,6 +215,77 @@ static unsigned char inssize2[256] =
         M|3,M|3,M|3,M|3, M|3,M|3,M|3,2          // F8
 };
 
+/* For 3 byte opcodes starting with 0x0F38        */
+static unsigned char inssize3_38[256] =
+{       M|4,M|4,M|4,M|4, M|4,M|4,M|4,M|4,       // 00
+        M|4,M|4,M|4,M|4, 0,0,0,0,               // 08
+        0,0,0,0,        0,0,0,0,                // 10
+        0,0,0,0,        M|4,M|4,M|4,M|4,        // 18
+        0,0,0,0,        0,0,0,0,                // 20
+        0,0,0,0,        0,0,0,0,                // 28
+        0,0,0,0,        0,0,0,0,                // 30
+        0,0,0,0,        0,0,0,0,                // 38
+        0,0,0,0,        0,0,0,0,                // 40
+        0,0,0,0,        0,0,0,0,                // 48
+        0,0,0,0,        0,0,0,0,                // 50
+        0,0,0,0,        0,0,0,0,                // 58
+        0,0,0,0,        0,0,0,0,                // 60
+        0,0,0,0,        0,0,0,0,                // 68
+        0,0,0,0,        0,0,0,0,                // 70
+        0,0,0,0,        0,0,0,0,                // 78
+        0,0,0,0,        0,0,0,0,                // 80
+        0,0,0,0,        0,0,0,0,                // 88
+        0,0,0,0,        0,0,0,0,                // 90
+        0,0,0,0,        0,0,0,0,                // 98
+        0,0,0,0,        0,0,0,0,                // A0
+        0,0,0,0,        0,0,0,0,                // A8
+        0,0,0,0,        0,0,0,0,                // B0
+        0,0,0,0,        0,0,0,0,                // B8
+        0,0,0,0,        0,0,0,0,                // C0
+        0,0,0,0,        0,0,0,0,                // C8
+        0,0,0,0,        0,0,0,0,                // D0
+        0,0,0,0,        0,0,0,0,                // D8
+        0,0,0,0,        0,0,0,0,                // E0
+        0,0,0,0,        0,0,0,0,                // E8
+        M|4,M|4,0,0,    0,0,0,0,                // F0
+        0,0,0,0,        0,0,0,0                 // F8
+};
+
+static unsigned char inssize3_3A[256] =
+{       0,0,0,0,        0,0,0,0,                // 00
+        0,0,0,0,        0,0,0,M|T|E|5,          // 08
+        0,0,0,0,        0,0,0,0,                // 10
+        0,0,0,0,        0,0,0,0,                // 18
+        0,0,0,0,        0,0,0,0,                // 20
+        0,0,0,0,        0,0,0,0,                // 28
+        0,0,0,0,        0,0,0,0,                // 30
+        0,0,0,0,        0,0,0,0,                // 38
+        0,0,0,0,        0,0,0,0,                // 40
+        0,0,0,0,        0,0,0,0,                // 48
+        0,0,0,0,        0,0,0,0,                // 50
+        0,0,0,0,        0,0,0,0,                // 58
+        0,0,0,0,        0,0,0,0,                // 60
+        0,0,0,0,        0,0,0,0,                // 68
+        0,0,0,0,        0,0,0,0,                // 70
+        0,0,0,0,        0,0,0,0,                // 78
+        0,0,0,0,        0,0,0,0,                // 80
+        0,0,0,0,        0,0,0,0,                // 88
+        0,0,0,0,        0,0,0,0,                // 90
+        0,0,0,0,        0,0,0,0,                // 98
+        0,0,0,0,        0,0,0,0,                // A0
+        0,0,0,0,        0,0,0,0,                // A8
+        0,0,0,0,        0,0,0,0,                // B0
+        0,0,0,0,        0,0,0,0,                // B8
+        0,0,0,0,        0,0,0,0,                // C0
+        0,0,0,0,        0,0,0,0,                // C8
+        0,0,0,0,        0,0,0,0,                // D0
+        0,0,0,0,        0,0,0,0,                // D8
+        0,0,0,0,        0,0,0,0,                // E0
+        0,0,0,0,        0,0,0,0,                // E8
+        0,0,0,0,        0,0,0,0,                // F0
+        0,0,0,0,        0,0,0,0                 // F8
+};
+
 /************************************
  * Determine if there is a modregrm byte for code.
  */
@@ -225,6 +296,10 @@ int cod3_EA(code *c)
     unsigned op1 = c->Iop & 0xFF;
     if (op1 == ESCAPE)
         ins = 0;
+    else if ((c->Iop & 0xFFFF00) == 0x0F3800)
+        ins = inssize3_38[op1];
+    else if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+        ins = inssize3_3A[op1];
     else if ((c->Iop & 0xFF00) == 0x0F00)
         ins = inssize2[op1];
     else
@@ -2772,7 +2847,11 @@ void assignaddrc(code *c)
         if (code_next(c) && code_next(code_next(c)) == c)
             assert(0);
 #endif
-        if ((c->Iop & 0xFF00) == 0x0F00)
+        if ((c->Iop & 0xFFFF00) == 0x0F3800)
+            ins = inssize3_38[c->Iop & 0xFF];
+        else if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+            ins = inssize3_3A[c->Iop & 0xFF];
+        else if ((c->Iop & 0xFF00) == 0x0F00)
             ins = inssize2[c->Iop & 0xFF];
         else if ((c->Iop & 0xFF) == ESCAPE)
         {
@@ -3151,7 +3230,11 @@ void pinholeopt(code *c,block *b)
   {
     L1:
         op = c->Iop;
-        if ((op & 0xFF00) == 0x0F00)
+        if ((op & 0xFFFF00) == 0x0F3800)
+            ins = inssize3_38[op & 0xFF];
+        else if ((op & 0xFFFF00) == 0x0F3A00)
+            ins = inssize3_3A[op & 0xFF];
+        else if ((op & 0xFF00) == 0x0F00)
             ins = inssize2[op & 0xFF];
         else
             ins = inssize[op & 0xFF];
@@ -3776,17 +3859,24 @@ unsigned calccodsize(code *c)
 #endif
     iflags = c->Iflags;
     op = c->Iop;
-    if ((op & 0xFF00) == 0x0F00)
+    if ((op & 0xFF00) == 0x0F00 || (op & 0xFFFD00) == 0x0F3800)
         op = 0x0F;
     else
         op &= 0xFF;
     switch (op)
     {
         case 0x0F:
-            ins = inssize2[c->Iop & 0xFF];
+        	  if ((c->Iop & 0xFFFF00) == 0x0F3800)
+                ins = inssize3_38[c->Iop & 0xFF];
+        	  else if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+                ins = inssize3_3A[c->Iop & 0xFF];
+            else
+                ins = inssize2[c->Iop & 0xFF];
             size = ins & 7;
-            if (c->Iop & 0xFF0000 || (c->Iop & 0xFFFFFF) == 0x000F38) // Opcode 0F_38_00 PSHUFB ( ssse3 )
+            if (c->Iop & 0xFF000000) // Opcode from SSSE3
                 size++;
+            //if (c->Iop & 0xFF0000 || (c->Iop & 0xFFFFFF) == 0x000F38) // Opcode 0F_38_00 PSHUFB ( ssse3 )
+            //    size++;
             break;
 
         case NOP:
@@ -3972,7 +4062,15 @@ int code_match(code *c1,code *c2)
         goto nomatch;
 
     ins = inssize[cs1.Iop & 0xFF];
-    if ((cs1.Iop & 0xFF00) == 0x0F00)
+    if ((cs1.Iop & 0xFFFF00) == 0x0F3800)
+    {
+        ins = inssize3_38[cs1.Iop & 0xFF];
+    }
+    else if ((cs1.Iop & 0xFFFF00) == 0x0F3A00)
+    {
+        ins = inssize3_3A[cs1.Iop & 0xFF];
+    }
+    else if ((cs1.Iop & 0xFF00) == 0x0F00)
     {
         ins = inssize2[cs1.Iop & 0xFF];
     }
@@ -4198,16 +4296,20 @@ unsigned codout(code *c)
 
         if (op > 0xFF)
         {
-            if ((op & 0xFF00) == 0x0F00)
+            if ((op & 0xFFFF00) == 0x0F3800)
+                ins = inssize3_38[op & 0xFF];
+            else if ((op & 0xFFFF00) == 0x0F3A00)
+                ins = inssize3_3A[op & 0xFF];
+            else if ((op & 0xFF00) == 0x0F00)
                 ins = inssize2[op & 0xFF];
             if (op & 0xFF000000)
             {
                 if (c->Irex)
                     GEN(c->Irex | REX);
                 GEN(op >> 24);
+                GEN((op >> 16) & 0xFF);         // yes, this is out of order. For 0x660F3A41 & 40
                 GEN((op >> 8) & 0xFF);
                 GEN(op & 0xFF);
-                GEN((op >> 16) & 0xFF);         // yes, this is out of order. For 0x660F3A41 & 40
             }
             else if (op & 0xFF0000)
             {
@@ -4961,7 +5063,11 @@ void code_hydrate(code **pc)
     while (*pc)
     {
         c = (code *) ph_hydrate(pc);
-        if ((c->Iop & 0xFF00) == 0x0F00)
+        if ((c->Iop & 0xFFFF00) == 0x0F3800)
+            ins = inssize3_38[c->Iop & 0xFF];
+        if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+            ins = inssize3_3A[c->Iop & 0xFF];
+        else if ((c->Iop & 0xFF00) == 0x0F00)
             ins = inssize2[c->Iop & 0xFF];
         else
             ins = inssize[c->Iop & 0xFF];
@@ -5127,7 +5233,11 @@ void code_dehydrate(code **pc)
     {
         ph_dehydrate(pc);
 
-        if ((c->Iop & 0xFF00) == 0x0F00)
+        if ((c->Iop & 0xFFFF00) == 0x0F3800)
+            ins = inssize3_38[c->Iop & 0xFF];
+        else if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+            ins = inssize3_3A[c->Iop & 0xFF];
+        else if ((c->Iop & 0xFF00) == 0x0F00)
             ins = inssize2[c->Iop & 0xFF];
         else
             ins = inssize[c->Iop & 0xFF];
@@ -5299,7 +5409,11 @@ void code::print()
     }
 
     unsigned op = c->Iop;
-    if ((c->Iop & 0xFF00) == 0x0F00)
+    if ((c->Iop & 0xFFFF00) == 0x0F3800)
+        ins = inssize3_38[op & 0xFF];
+    else if ((c->Iop & 0xFFFF00) == 0x0F3A00)
+        ins = inssize3_3A[op & 0xFF];
+    else if ((c->Iop & 0xFF00) == 0x0F00)
         ins = inssize2[op & 0xFF];
     else
         ins = inssize[op & 0xFF];
diff --git a/src/iasm.c b/src/iasm.c
index 15c9b85..e40fa2a 100644
--- a/src/iasm.c
+++ b/src/iasm.c
@@ -1387,12 +1387,12 @@ L386_WARNING2:
         unsigned usOpcode = ptb.pptb0->usOpcode;
 
         pc->Iop = usOpcode;
-        if ((usOpcode & 0xFFFFFF00) == 0x660F3A00 ||    // SSE4
+/*        if ((usOpcode & 0xFFFFFF00) == 0x660F3A00 ||    // SSE4
             (usOpcode & 0xFFFFFF00) == 0x660F3800)      // SSE4
         {
             pc->Iop = 0x66000F00 | ((usOpcode >> 8) & 0xFF) | ((usOpcode & 0xFF) << 16);
             goto L3;
-        }
+        }*/
         switch (usOpcode & 0xFF0000)
         {
             case 0:
@@ -1428,7 +1428,8 @@ L386_WARNING2:
                 emit(puc[2]);
                 emit(puc[1]);
                 emit(puc[0]);
-                pc->Iop >>= 8;
+                if ((puc[1] &0xFD) != 0x38)
+                    pc->Iop >>= 8;
                 pc->Irm = puc[0];
                 goto L3;
         }
