X86: Create a common flag with a name to indicate high multiplies.
authorGabe Black <gblack@eecs.umich.edu>
Sat, 19 Dec 2009 09:48:07 +0000 (01:48 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Sat, 19 Dec 2009 09:48:07 +0000 (01:48 -0800)
src/arch/x86/insts/micromediaop.hh
src/arch/x86/isa/insts/simd128/integer/arithmetic/multiplication.py
src/arch/x86/isa/insts/simd64/integer/arithmetic/multiplication.py
src/arch/x86/isa/microasm.isa
src/arch/x86/isa/microops/mediaop.isa

index f2871f67e3910111af6b72348a96cacadc7fccb8..7f8e3a364a266532c1cb4d59e6831a38c62b4e99 100644 (file)
@@ -36,6 +36,7 @@
 namespace X86ISA
 {
     enum MediaFlag {
+        MediaMultHiOp = 1,
         MediaScalarOp = 128
     };
 
@@ -75,6 +76,12 @@ namespace X86ISA
         {
             return scalarOp() ? 1 : (sizeof(FloatRegBits) / size);
         }
+
+        bool
+        multHi() const
+        {
+            return ext & MediaMultHiOp;
+        }
     };
 
     class MediaOpReg : public MediaOpBase
index 274ee42872972623ae8b6e28e45fb845bdaa9bb6..2715f5d2522d7632e65944230593780a445d7694 100644 (file)
 
 microcode = '''
 def macroop PMULHW_XMM_XMM {
-    mmuli xmml, xmml, xmmlm, size=2, ext=(0x2 | 0x8)
-    mmuli xmmh, xmmh, xmmhm, size=2, ext=(0x2 | 0x8)
+    mmuli xmml, xmml, xmmlm, size=2, ext = "0x2 |" + MultHi
+    mmuli xmmh, xmmh, xmmhm, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULHW_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, sib, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, size=2, ext=(0x2 | 0x8)
-    mmuli xmmh, xmmh, ufp2, size=2, ext=(0x2 | 0x8)
+    mmuli xmml, xmml, ufp1, size=2, ext = "0x2 |" + MultHi
+    mmuli xmmh, xmmh, ufp2, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULHW_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, riprel, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, size=2, ext=(0x2 | 0x8)
-    mmuli xmmh, xmmh, ufp2, size=2, ext=(0x2 | 0x8)
+    mmuli xmml, xmml, ufp1, size=2, ext = "0x2 |" + MultHi
+    mmuli xmmh, xmmh, ufp2, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULLW_XMM_XMM {
@@ -95,23 +95,23 @@ def macroop PMULLW_XMM_P {
 };
 
 def macroop PMULHUW_XMM_XMM {
-    mmuli xmml, xmml, xmmlm, size=2, ext=8
-    mmuli xmmh, xmmh, xmmhm, size=2, ext=8
+    mmuli xmml, xmml, xmmlm, size=2, ext = MultHi
+    mmuli xmmh, xmmh, xmmhm, size=2, ext = MultHi
 };
 
 def macroop PMULHUW_XMM_M {
     ldfp ufp1, seg, sib, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, sib, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, size=2, ext=8
-    mmuli xmmh, xmmh, ufp2, size=2, ext=8
+    mmuli xmml, xmml, ufp1, size=2, ext = MultHi
+    mmuli xmmh, xmmh, ufp2, size=2, ext = MultHi
 };
 
 def macroop PMULHUW_XMM_P {
     rdip t7
     ldfp ufp1, seg, riprel, "DISPLACEMENT", dataSize=8
     ldfp ufp2, seg, riprel, "DISPLACEMENT + 8", dataSize=8
-    mmuli xmml, xmml, ufp1, size=2, ext=8
-    mmuli xmmh, xmmh, ufp2, size=2, ext=8
+    mmuli xmml, xmml, ufp1, size=2, ext = MultHi
+    mmuli xmmh, xmmh, ufp2, size=2, ext = MultHi
 };
 
 def macroop PMULUDQ_XMM_XMM {
index d116d04b3f3684a1cc9b24fa4adada7157afb3f2..50a1e5dc0a159279fa40352c3d19a1a5cf061e50 100644 (file)
 
 microcode = '''
 def macroop PMULHW_MMX_MMX {
-    mmuli mmx, mmx, mmxm, size=2, ext=(0x2 | 0x8)
+    mmuli mmx, mmx, mmxm, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULHW_MMX_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=(0x2 | 0x8)
+    mmuli mmx, mmx, ufp1, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULHW_MMX_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=(0x2 | 0x8)
+    mmuli mmx, mmx, ufp1, size=2, ext = "0x2 |" + MultHi
 };
 
 def macroop PMULLW_MMX_MMX {
@@ -85,33 +85,33 @@ def macroop PMULLW_MMX_P {
 };
 
 def macroop PMULHRW_MMX_MMX {
-    mmuli mmx, mmx, mmxm, size=2, ext=(0x2 | 0x4 | 0x8)
+    mmuli mmx, mmx, mmxm, size=2, ext = "0x2 | 0x4 |" + MultHi
 };
 
 def macroop PMULHRW_MMX_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=(0x2 | 0x4 | 0x8)
+    mmuli mmx, mmx, ufp1, size=2, ext = "0x2 | 0x4 |" + MultHi
 };
 
 def macroop PMULHRW_MMX_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=(0x2 | 0x4 | 0x8)
+    mmuli mmx, mmx, ufp1, size=2, ext = "0x2 | 0x4 |" + MultHi
 };
 
 def macroop PMULHUW_MMX_MMX {
-    mmuli mmx, mmx, mmxm, size=2, ext=8
+    mmuli mmx, mmx, mmxm, size=2, ext = MultHi
 };
 
 def macroop PMULHUW_MMX_M {
     ldfp ufp1, seg, sib, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=8
+    mmuli mmx, mmx, ufp1, size=2, ext = MultHi
 };
 
 def macroop PMULHUW_MMX_P {
     rdip t7
     ldfp ufp1, seg, riprel, disp, dataSize=8
-    mmuli mmx, mmx, ufp1, size=2, ext=8
+    mmuli mmx, mmx, ufp1, size=2, ext = MultHi
 };
 
 def macroop PMULUDQ_MMX_MMX {
index 23e2f74ca581b0ac63cb63acfd362ed44a66d5f7..e48ad3d69518eb1cc7374f348f4eaa18702e2f0c 100644 (file)
@@ -181,7 +181,7 @@ let {{
                 'kernel_gs_base'):
         assembler.symbols[reg] = regIdx("MISCREG_%s" % reg.upper())
 
-    for flag in ('Scalar',):
+    for flag in ('Scalar', 'MultHi'):
         assembler.symbols[flag] = 'Media%sOp' % flag
 
     # Code literal which forces a default 64 bit operand size in 64 bit mode.
index 0a45e38fb1e49c71a69f68845645219a235a6210..84d2d7f701e450cba2933c6e0702149c9e7ba7b1 100644 (file)
@@ -1043,7 +1043,7 @@ let {{
                 if (ext & 0x4)
                     resBits += (ULL(1) << (destBits - 1));
                 
-                if (ext & 0x8)
+                if (multHi())
                     resBits >>= destBits;
 
                 int destHiIndex = (i + 1) * destBits - 1;