namespace X86ISA
 {
+    enum MediaFlag {
+        MediaScalarOp = 128
+    };
+
     class MediaOpBase : public X86MicroopBase
     {
       protected:
             src1(_src1.idx), dest(_dest.idx),
             srcSize(_srcSize), destSize(_destSize), ext(_ext)
         {}
+
+        bool
+        scalarOp() const
+        {
+            return ext & MediaScalarOp;
+        }
+        
+        int
+        numItems(int size) const
+        {
+            return scalarOp() ? 1 : (sizeof(FloatRegBits) / size);
+        }
     };
 
     class MediaOpReg : public MediaOpBase
 
 
 microcode = '''
 def macroop ADDSS_XMM_XMM {
-    maddf xmml, xmml, xmmlm, size=4, ext=1
+    maddf xmml, xmml, xmmlm, size=4, ext=Scalar
 };
 
 def macroop ADDSS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    maddf xmml, xmml, ufp1, size=4, ext=1
+    maddf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop ADDSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    maddf xmml, xmml, ufp1, size=4, ext=1
+    maddf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop ADDSD_XMM_XMM {
-    maddf xmml, xmml, xmmlm, size=8, ext=1
+    maddf xmml, xmml, xmmlm, size=8, ext=Scalar
 };
 
 def macroop ADDSD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    maddf xmml, xmml, ufp1, size=8, ext=1
+    maddf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop ADDSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    maddf xmml, xmml, ufp1, size=8, ext=1
+    maddf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop ADDPS_XMM_XMM {
 
 
 microcode = '''
 def macroop DIVSS_XMM_XMM {
-    mdivf xmml, xmml, xmmlm, size=4, ext=1
+    mdivf xmml, xmml, xmmlm, size=4, ext=Scalar
 };
 
 def macroop DIVSS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mdivf xmml, xmml, ufp1, size=4, ext=1
+    mdivf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop DIVSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mdivf xmml, xmml, ufp1, size=4, ext=1
+    mdivf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop DIVSD_XMM_XMM {
-    mdivf xmml, xmml, xmmlm, size=8, ext=1
+    mdivf xmml, xmml, xmmlm, size=8, ext=Scalar
 };
 
 def macroop DIVSD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mdivf xmml, xmml, ufp1, size=8, ext=1
+    mdivf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop DIVSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mdivf xmml, xmml, ufp1, size=8, ext=1
+    mdivf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop DIVPS_XMM_XMM {
 
 # HADDPS
 
 def macroop HADDPD_XMM_XMM {
-    maddf ufp1, xmmh , xmml, size=8, ext=1
-    maddf xmmh, xmmlm, xmmhm, size=8, ext=1
+    maddf ufp1, xmmh , xmml, size=8, ext=Scalar
+    maddf xmmh, xmmlm, xmmhm, size=8, ext=Scalar
     movfp xmml, ufp1
 };
 
 def macroop HADDPD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
     ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8
-    maddf xmml, xmmh, xmml, size=8, ext=1
-    maddf xmmh, ufp1, ufp2, size=8, ext=1
+    maddf xmml, xmmh, xmml, size=8, ext=Scalar
+    maddf xmmh, ufp1, ufp2, size=8, ext=Scalar
 };
 
 def macroop HADDPD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
     ldfp ufp2, seg, riprel, "DISPLACEMENT+8", dataSize=8
-    maddf xmml, xmmh, xmml, size=8, ext=1
-    maddf xmmh, ufp1, ufp2, size=8, ext=1
+    maddf xmml, xmmh, xmml, size=8, ext=Scalar
+    maddf xmmh, ufp1, ufp2, size=8, ext=Scalar
 };
 '''
 
 
 microcode = '''
 def macroop MULSS_XMM_XMM {
-    mmulf xmml, xmml, xmmlm, size=4, ext=1
+    mmulf xmml, xmml, xmmlm, size=4, ext=Scalar
 };
 
 def macroop MULSS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmulf xmml, xmml, ufp1, size=4, ext=1
+    mmulf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop MULSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmulf xmml, xmml, ufp1, size=4, ext=1
+    mmulf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop MULSD_XMM_XMM {
-    mmulf xmml, xmml, xmmlm, size=8, ext=1
+    mmulf xmml, xmml, xmmlm, size=8, ext=Scalar
 };
 
 def macroop MULSD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmulf xmml, xmml, ufp1, size=8, ext=1
+    mmulf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop MULSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmulf xmml, xmml, ufp1, size=8, ext=1
+    mmulf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop MULPS_XMM_XMM {
 
 
 microcode = '''
 def macroop SQRTSS_XMM_XMM {
-    msqrt xmml, xmmlm, size=4, ext=1
+    msqrt xmml, xmmlm, size=4, ext=Scalar
 };
 
 def macroop SQRTSS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    msqrt xmml, ufp1, size=4, ext=1
+    msqrt xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop SQRTSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    msqrt xmml, ufp1, size=4, ext=1
+    msqrt xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop SQRTPS_XMM_XMM {
 };
 
 def macroop SQRTSD_XMM_XMM {
-    msqrt xmml, xmmlm, size=8, ext=1
+    msqrt xmml, xmmlm, size=8, ext=Scalar
 };
 
 def macroop SQRTSD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    msqrt xmml, ufp1, size=8, ext=1
+    msqrt xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop SQRTSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    msqrt xmml, ufp1, size=8, ext=1
+    msqrt xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop SQRTPD_XMM_XMM {
 
 
 microcode = '''
 def macroop SUBSS_XMM_XMM {
-    msubf xmml, xmml, xmmlm, size=4, ext=1
+    msubf xmml, xmml, xmmlm, size=4, ext=Scalar
 };
 
 def macroop SUBSS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    msubf xmml, xmml, ufp1, size=4, ext=1
+    msubf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop SUBSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    msubf xmml, xmml, ufp1, size=4, ext=1
+    msubf xmml, xmml, ufp1, size=4, ext=Scalar
 };
 
 def macroop SUBSD_XMM_XMM {
-    msubf xmml, xmml, xmmlm, size=8, ext=1
+    msubf xmml, xmml, xmmlm, size=8, ext=Scalar
 };
 
 def macroop SUBSD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    msubf xmml, xmml, ufp1, size=8, ext=1
+    msubf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop SUBSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    msubf xmml, xmml, ufp1, size=8, ext=1
+    msubf xmml, xmml, ufp1, size=8, ext=Scalar
 };
 
 def macroop SUBPS_XMM_XMM {
 
 };
 
 def macroop CMPSS_XMM_XMM_I {
-    mcmpf2r xmml, xmml, xmmlm, size=4, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, xmmlm, size=4, ext="IMMEDIATE |" + Scalar
 };
 
 def macroop CMPSS_XMM_M_I {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mcmpf2r xmml, xmml, ufp1, size=4, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, ufp1, size=4, ext="IMMEDIATE |" + Scalar
 };
 
 def macroop CMPSS_XMM_P_I {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mcmpf2r xmml, xmml, ufp1, size=4, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, ufp1, size=4, ext="IMMEDIATE |" + Scalar
 };
 
 def macroop CMPSD_XMM_XMM_I {
-    mcmpf2r xmml, xmml, xmmlm, size=8, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, xmmlm, size=8, ext="IMMEDIATE |" + Scalar
 };
 
 def macroop CMPSD_XMM_M_I {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mcmpf2r xmml, xmml, ufp1, size=8, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, ufp1, size=8, ext="IMMEDIATE |" + Scalar
 };
 
 def macroop CMPSD_XMM_P_I {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mcmpf2r xmml, xmml, ufp1, size=8, ext="IMMEDIATE | 0x8"
+    mcmpf2r xmml, xmml, ufp1, size=8, ext="IMMEDIATE |" + Scalar
 };
 '''
 
 };
 
 def macroop MINSS_XMM_XMM {
-    mminf xmml, xmml, xmmlm, ext=1, size=4
+    mminf xmml, xmml, xmmlm, ext=Scalar, size=4
 };
 
 def macroop MINSS_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mminf xmml, xmml, ufp1, ext=1, size=4
+    mminf xmml, xmml, ufp1, ext=Scalar, size=4
 };
 
 def macroop MINSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mminf xmml, xmml, ufp1, ext=1, size=4
+    mminf xmml, xmml, ufp1, ext=Scalar, size=4
 };
 
 def macroop MINSD_XMM_XMM {
-    mminf xmml, xmml, xmmlm, ext=1, size=8
+    mminf xmml, xmml, xmmlm, ext=Scalar, size=8
 };
 
 def macroop MINSD_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mminf xmml, xmml, ufp1, ext=1, size=8
+    mminf xmml, xmml, ufp1, ext=Scalar, size=8
 };
 
 def macroop MINSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mminf xmml, xmml, ufp1, ext=1, size=8
+    mminf xmml, xmml, ufp1, ext=Scalar, size=8
 };
 
 def macroop MAXPS_XMM_XMM {
 };
 
 def macroop MAXSS_XMM_XMM {
-    mmaxf xmml, xmml, xmmlm, ext=1, size=4
+    mmaxf xmml, xmml, xmmlm, ext=Scalar, size=4
 };
 
 def macroop MAXSS_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mmaxf xmml, xmml, ufp1, ext=1, size=4
+    mmaxf xmml, xmml, ufp1, ext=Scalar, size=4
 };
 
 def macroop MAXSS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mmaxf xmml, xmml, ufp1, ext=1, size=4
+    mmaxf xmml, xmml, ufp1, ext=Scalar, size=4
 };
 
 def macroop MAXSD_XMM_XMM {
-    mmaxf xmml, xmml, xmmlm, ext=1, size=8
+    mmaxf xmml, xmml, xmmlm, ext=Scalar, size=8
 };
 
 def macroop MAXSD_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
-    mmaxf xmml, xmml, ufp1, ext=1, size=8
+    mmaxf xmml, xmml, ufp1, ext=Scalar, size=8
 };
 
 def macroop MAXSD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
-    mmaxf xmml, xmml, ufp1, ext=1, size=8
+    mmaxf xmml, xmml, ufp1, ext=Scalar, size=8
 };
 '''
 
 
 microcode = '''
 def macroop CVTSS2SD_XMM_XMM {
-    cvtf2f xmml, xmmlm, destSize=8, srcSize=4, ext=1
+    cvtf2f xmml, xmmlm, destSize=8, srcSize=4, ext=Scalar
 };
 
 def macroop CVTSS2SD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2f xmml, ufp1, destSize=8, srcSize=4, ext=1
+    cvtf2f xmml, ufp1, destSize=8, srcSize=4, ext=Scalar
 };
 
 def macroop CVTSS2SD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2f xmml, ufp1, destSize=8, srcSize=4, ext=1
+    cvtf2f xmml, ufp1, destSize=8, srcSize=4, ext=Scalar
 };
 
 def macroop CVTSD2SS_XMM_XMM {
-    cvtf2f xmml, xmmlm, destSize=4, srcSize=8, ext=1
+    cvtf2f xmml, xmmlm, destSize=4, srcSize=8, ext=Scalar
 };
 
 def macroop CVTSD2SS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2f xmml, ufp1, destSize=4, srcSize=8, ext=1
+    cvtf2f xmml, ufp1, destSize=4, srcSize=8, ext=Scalar
 };
 
 def macroop CVTSD2SS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2f xmml, ufp1, destSize=4, srcSize=8, ext=1
+    cvtf2f xmml, ufp1, destSize=4, srcSize=8, ext=Scalar
 };
 
 def macroop CVTPS2PD_XMM_XMM {
 
 
 microcode = '''
 def macroop CVTSS2SI_R_XMM {
-    cvtf2i ufp1, xmmlm, srcSize=4, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, xmmlm, srcSize=4, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTSS2SI_R_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTSS2SI_R_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTSD2SI_R_XMM {
-    cvtf2i ufp1, xmmlm, srcSize=8, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, xmmlm, srcSize=8, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTSD2SI_R_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTSD2SI_R_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=(1 | 4)
+    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext = Scalar + "| 4"
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSS2SI_R_XMM {
-    cvtf2i ufp1, xmmlm, srcSize=4, destSize=dsz, ext=1
+    cvtf2i ufp1, xmmlm, srcSize=4, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSS2SI_R_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=1
+    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSS2SI_R_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=1
+    cvtf2i ufp1, ufp1, srcSize=4, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSD2SI_R_XMM {
-    cvtf2i ufp1, xmmlm, srcSize=8, destSize=dsz, ext=1
+    cvtf2i ufp1, xmmlm, srcSize=8, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSD2SI_R_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=1
+    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 
 def macroop CVTTSD2SI_R_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=1
+    cvtf2i ufp1, ufp1, srcSize=8, destSize=dsz, ext=Scalar
     mov2int reg, ufp1, size=dsz
 };
 '''
 
 };
 
 def macroop PMULUDQ_XMM_XMM {
-    mmuli xmml, xmml, xmmlm, srcSize=4, destSize=8, ext=1
-    mmuli xmmh, xmmh, xmmhm, srcSize=4, destSize=8, ext=1
+    mmuli xmml, xmml, xmmlm, srcSize=4, destSize=8, ext=Scalar
+    mmuli xmmh, xmmh, xmmhm, srcSize=4, destSize=8, ext=Scalar
 };
 
 def macroop PMULUDQ_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, sib, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, srcSize=4, destSize=8, ext=1
-    mmuli xmmh, xmmh, ufp2, srcSize=4, destSize=8, ext=1
+    mmuli xmml, xmml, ufp1, srcSize=4, destSize=8, ext=Scalar
+    mmuli xmmh, xmmh, ufp2, srcSize=4, destSize=8, ext=Scalar
 };
 
 def macroop PMULUDQ_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, riprel, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, srcSize=4, destSize=8, ext=1
-    mmuli xmmh, xmmh, ufp2, srcSize=4, destSize=8, ext=1
+    mmuli xmml, xmml, ufp1, srcSize=4, destSize=8, ext=Scalar
+    mmuli xmmh, xmmh, ufp2, srcSize=4, destSize=8, ext=Scalar
 };
 '''
 
 microcode = '''
 def macroop CVTSI2SS_XMM_R {
     mov2fp ufp1, regm, destSize=dsz, srcSize=dsz
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=Scalar
 };
 
 def macroop CVTSI2SS_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=Scalar
 };
 
 def macroop CVTSI2SS_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=4, ext=Scalar
 };
 
 def macroop CVTSI2SD_XMM_R {
     mov2fp ufp1, regm, destSize=dsz, srcSize=dsz
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=Scalar
 };
 
 def macroop CVTSI2SD_XMM_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=Scalar
 };
 
 def macroop CVTSI2SD_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=1
+    cvti2f xmml, ufp1, srcSize=dsz, destSize=8, ext=Scalar
 };
 '''
 
 };
 
 def macroop PMULUDQ_MMX_MMX {
-    mmuli mmx, mmx, mmxm, srcSize=4, destSize=8, ext=1
+    mmuli mmx, mmx, mmxm, srcSize=4, destSize=8, ext=Scalar
 };
 
 def macroop PMULUDQ_MMX_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, srcSize=4, destSize=8, ext=1
+    mmuli mmx, mmx, ufp1, srcSize=4, destSize=8, ext=Scalar
 };
 
 def macroop PMULUDQ_MMX_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, srcSize=4, destSize=8, ext=1
+    mmuli mmx, mmx, ufp1, srcSize=4, destSize=8, ext=Scalar
 };
 '''
 
                 'kernel_gs_base'):
         assembler.symbols[reg] = regIdx("MISCREG_%s" % reg.upper())
 
+    for flag in ('Scalar',):
+        assembler.symbols[flag] = 'Media%sOp' % flag
+
     # Code literal which forces a default 64 bit operand size in 64 bit mode.
     assembler.symbols["oszIn64Override"] = '''
     if (machInst.mode.submode == SixtyFourBitMode &&
 
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int size = srcSize;
             int sizeBits = size * 8;
             assert(srcSize == 4 || srcSize == 8);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             int destBits = destSize * 8;
             assert(destBits <= 64);
             assert(destSize >= srcSize);
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / destSize);
+            int items = numItems(destSize);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t shiftAmt = op2.uqw;
             uint64_t result = FpDestReg.uqw;
 
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t shiftAmt = op2.uqw;
             uint64_t result = FpDestReg.uqw;
 
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t shiftAmt = op2.uqw;
             uint64_t result = FpDestReg.uqw;
 
             int srcStart = 0;
             int destStart = 0;
             if (srcSize == 2 * destSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / srcSize;
+                items = numItems(srcSize);
                 if (ext & 0x2)
                     destStart = destSizeBits * items;
             } else if (destSize == 2 * srcSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
                 if (ext & 0x2)
                     srcStart = srcSizeBits * items;
             } else {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
             }
             uint64_t result = FpDestReg.uqw;
 
             int srcStart = 0;
             int destStart = 0;
             if (srcSize == 2 * destSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / srcSize;
+                items = numItems(srcSize);
                 if (ext & 0x2)
                     destStart = destSizeBits * items;
             } else if (destSize == 2 * srcSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
                 if (ext & 0x2)
                     srcStart = srcSizeBits * items;
             } else {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
             }
             uint64_t result = FpDestReg.uqw;
 
             int srcStart = 0;
             int destStart = 0;
             if (srcSize == 2 * destSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / srcSize;
+                items = numItems(srcSize);
                 if (ext & 0x2)
                     destStart = destSizeBits * items;
             } else if (destSize == 2 * srcSize) {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
                 if (ext & 0x2)
                     srcStart = srcSizeBits * items;
             } else {
-                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
+                items = numItems(destSize);
             }
             uint64_t result = FpDestReg.uqw;
 
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {
             assert(srcSize == destSize);
             int size = srcSize;
             int sizeBits = size * 8;
-            int items = (ext & 0x8) ? 1: (sizeof(FloatRegBits) / size);
+            int items = numItems(size);
             uint64_t result = FpDestReg.uqw;
 
             for (int i = 0; i < items; i++) {