X86: Make merge and pick work with high bytes. Fix a sizing issue in pick.
authorGabe Black <gblack@eecs.umich.edu>
Mon, 30 Jul 2007 20:26:48 +0000 (13:26 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Mon, 30 Jul 2007 20:26:48 +0000 (13:26 -0700)
--HG--
extra : convert_revision : 4ddc2ca8c23bb7e90a646329ebf27a013ac5e3d6

src/arch/x86/insts/static_inst.hh

index f42e6693dd52f572fd47cfb52248c5e4b07ca64a..22139fc77c7bba074a4429a843ab748d3fc3e01f 100644 (file)
@@ -92,9 +92,12 @@ namespace X86ISA
 
         inline uint64_t merge(uint64_t into, uint64_t val, int size) const
         {
-            X86IntReg reg;
-            reg = into;
-            //FIXME This needs to be handle high bytes as well
+            X86IntReg reg = into;
+            if(_destRegIdx[0] & (1 << 6))
+            {
+                reg.H = val;
+                return reg;
+            }
             switch(size)
             {
               case 1:
@@ -117,18 +120,20 @@ namespace X86ISA
             return reg;
         }
 
-        inline uint64_t pick(uint64_t from, int size)
+        inline uint64_t pick(uint64_t from, int idx, int size) const
         {
-            X86IntReg reg;
-            reg = from;
+            X86IntReg reg = from;
+            DPRINTF(X86, "Picking with size %d\n", size);
+            if(_srcRegIdx[idx] & (1 << 6))
+                return reg.H;
             switch(size)
             {
               case 1:
                 return reg.L;
               case 2:
-                return reg.E;
-              case 4:
                 return reg.X;
+              case 4:
+                return reg.E;
               case 8:
                 return reg.R;
               default: