changeset c7e724c1570f in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=c7e724c1570f
description:
        X86: Create a pack media microop.

diffstat:

1 file changed, 67 insertions(+)
src/arch/x86/isa/microops/mediaop.isa |   67 +++++++++++++++++++++++++++++++++

diffs (77 lines):

diff -r 9c68aea7b1e6 -r c7e724c1570f src/arch/x86/isa/microops/mediaop.isa
--- a/src/arch/x86/isa/microops/mediaop.isa     Mon Aug 17 18:27:44 2009 -0700
+++ b/src/arch/x86/isa/microops/mediaop.isa     Mon Aug 17 18:27:54 2009 -0700
@@ -335,6 +335,73 @@
             FpDestReg.uqw = result;
         '''
 
+    class Pack(MediaOp):
+        code = '''
+            assert(srcSize == destSize * 2);
+            int items = (sizeof(FloatRegBits) / destSize);
+            int destBits = destSize * 8;
+            int srcBits = srcSize * 8;
+            uint64_t result = 0;
+            int i;
+            for (i = 0; i < items / 2; i++) {
+                uint64_t picked =
+                    bits(FpSrcReg1.uqw, (i + 1) * srcBits - 1,
+                                        (i + 0) * srcBits);
+                unsigned signBit = bits(picked, srcBits - 1);
+                uint64_t overflow = bits(picked, srcBits - 1, destBits - 1);
+
+                // Handle saturation.
+                if (signBit) {
+                    if (overflow != mask(destBits - srcBits + 1)) {
+                        if (ext & 0x1)
+                            picked = (1 << (destBits - 1));
+                        else
+                            picked = 0;
+                    }
+                } else {
+                    if (overflow != 0) {
+                        if (ext & 0x1)
+                            picked = mask(destBits - 1);
+                        else
+                            picked = mask(destBits);
+                    }
+                }
+                result = insertBits(result,
+                                    (i + 1) * destBits - 1,
+                                    (i + 0) * destBits,
+                                    picked);
+            }
+            for (;i < items; i++) {
+                uint64_t picked =
+                    bits(FpSrcReg2.uqw, (i - items + 1) * srcBits - 1,
+                                        (i - items + 0) * srcBits);
+                unsigned signBit = bits(picked, srcBits - 1);
+                uint64_t overflow = bits(picked, srcBits - 1, destBits - 1);
+
+                // Handle saturation.
+                if (signBit) {
+                    if (overflow != mask(destBits - srcBits + 1)) {
+                        if (ext & 0x1)
+                            picked = (1 << (destBits - 1));
+                        else
+                            picked = 0;
+                    }
+                } else {
+                    if (overflow != 0) {
+                        if (ext & 0x1)
+                            picked = mask(destBits - 1);
+                        else
+                            picked = mask(destBits);
+                    }
+                }
+                result = insertBits(result,
+                                    (i + 1) * destBits - 1,
+                                    (i + 0) * destBits,
+                                    picked);
+            }
+            FpDestReg.uqw = result;
+        '''
+
     class Mxor(MediaOp):
         def __init__(self, dest, src1, src2):
             super(Mxor, self).__init__(dest, src1, src2, 1)
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to