X86: Implement an unpack microop.
authorGabe Black <gblack@eecs.umich.edu>
Tue, 18 Aug 2009 01:15:39 +0000 (18:15 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 18 Aug 2009 01:15:39 +0000 (18:15 -0700)
src/arch/x86/isa/microops/mediaop.isa

index a5371474eec149853063b9614dde1cd061999434..7e03fcba349014d74687660941fff4950338c14c 100644 (file)
@@ -308,4 +308,30 @@ let {{
             FpDestReg.uqw =
                 insertBits(FpDestReg.uqw, destSize * 8 - 1, 0, srcReg1);
         '''
+
+    class Unpack(MediaOp):
+        code = '''
+            assert(srcSize == destSize);
+            int size = destSize;
+            int items = (sizeof(FloatRegBits) / size) / 2;
+            int offset = sel ? items : 0;
+            uint64_t result = 0;
+            for (int i = 0; i < items; i++) {
+                uint64_t pickedLow =
+                    bits(FpSrcReg1.uqw, (i + offset + 1) * 8 * size - 1,
+                                        (i + offset) * 8 * size);
+                result = insertBits(result,
+                                    (2 * i + 1) * 8 * size - 1,
+                                    (2 * i + 0) * 8 * size,
+                                    pickedLow);
+                uint64_t pickedHigh =
+                    bits(FpSrcReg2.uqw, (i + offset + 1) * 8 * size - 1,
+                                        (i + offset) * 8 * size);
+                result = insertBits(result,
+                                    (2 * i + 2) * 8 * size - 1,
+                                    (2 * i + 1) * 8 * size,
+                                    pickedHigh);
+            }
+            FpDestReg.uqw = result;
+        '''
 }};