make ldtw(a) -- Twin 32 bit load work correctly -- by doing it the same way as the...
authorAli Saidi <saidi@eecs.umich.edu>
Sat, 3 Mar 2007 03:34:51 +0000 (22:34 -0500)
committerAli Saidi <saidi@eecs.umich.edu>
Sat, 3 Mar 2007 03:34:51 +0000 (22:34 -0500)
src/arch/isa_parser.py:
src/arch/sparc/isa/decoder.isa:
src/arch/sparc/isa/operands.isa:
src/base/bigint.hh:
src/cpu/simple/atomic.cc:
src/cpu/simple/timing.cc:
src/mem/packet_access.hh:
    make ldtw(a) Twin 32 bit load work correctly

--HG--
extra : convert_revision : 2646b269d58cc1774e896065875a56cf5e313b42

src/arch/isa_parser.py
src/arch/sparc/isa/decoder.isa
src/arch/sparc/isa/operands.isa
src/base/bigint.hh
src/cpu/simple/atomic.cc
src/cpu/simple/timing.cc
src/mem/packet_access.hh

index 39500df36082a4950cfba1947a021ede7d983105..9b63c88428e76e65e9dcd309d3a5425f682a1e3a 100755 (executable)
@@ -1124,9 +1124,12 @@ def buildOperandTypeMap(userDict, lineno):
                 ctype = 'float'
             elif size == 64:
                 ctype = 'double'
-        elif desc == 'twin int':
+        elif desc == 'twin64 int':
             is_signed = 0
             ctype = 'Twin64_t'
+        elif desc == 'twin32 int':
+            is_signed = 0
+            ctype = 'Twin32_t'
         if ctype == '':
             error(lineno, 'Unrecognized type description "%s" in userDict')
         operandTypeMap[ext] = (size, ctype, is_signed)
@@ -1159,7 +1162,7 @@ class Operand(object):
         # template must be careful not to use it if it doesn't apply.
         if self.isMem():
             self.mem_acc_size = self.makeAccSize()
-            if self.ctype == 'Twin64_t':
+            if self.ctype in ['Twin32_t', 'Twin64_t']:
                 self.mem_acc_type = 'Twin'
             else:
                 self.mem_acc_type = 'uint'
@@ -1392,7 +1395,7 @@ class MemOperand(Operand):
         # Note that initializations in the declarations are solely
         # to avoid 'uninitialized variable' errors from the compiler.
         # Declare memory data variable.
-        if self.ctype == 'Twin64_t':
+        if self.ctype in ['Twin32_t','Twin64_t']:
             return "%s %s; %s.a = 0; %s.b = 0;\n" % (self.ctype, self.base_name,
                     self.base_name, self.base_name)
         c = '%s %s = 0;\n' % (self.ctype, self.base_name)
index 36b9d1caa5f4030802f3f5e45aae68b9794126f5..2e85e1274e45024e6ce37fbd7701e1616a30e605 100644 (file)
@@ -1160,9 +1160,8 @@ decode OP default Unknown::unknown()
             0x01: ldub({{Rd = Mem.ub;}});
             0x02: lduh({{Rd = Mem.uhw;}});
             0x03: ldtw({{
-                uint64_t val = Mem.udw;
-                RdLow = val<31:0>;
-                RdHigh = val<63:32>;
+                        RdLow = (Mem.tuw).a;
+                        RdHigh = (Mem.tuw).b;
             }});
         }
         format Store {
@@ -1250,9 +1249,8 @@ decode OP default Unknown::unknown()
                     {{RdLow.udw = (Mem.tudw).a;
                       RdHigh.udw = (Mem.tudw).b;}}, {{EXT_ASI}});
                 default: ldtwa({{
-                        uint64_t val = Mem.udw;
-                        RdLow = val<31:0>;
-                        RdHigh = val<63:32>;
+                        RdLow = (Mem.tuw).a;
+                        RdHigh = (Mem.tuw).b;
                         }}, {{EXT_ASI}});
             }
         }
index 092544aab2d72d48b79dd8da806fb4492cdd401e..038919bd1fcdb6fd849bc1f4faf5c2c8f087e102 100644 (file)
@@ -37,7 +37,8 @@ def operand_types {{
     'uw' : ('unsigned int', 32),
     'sdw' : ('signed int', 64),
     'udw' : ('unsigned int', 64),
-    'tudw' : ('twin int', 64),
+    'tudw' : ('twin64 int', 64),
+    'tuw' : ('twin32 int', 32),
     'sf' : ('float', 32),
     'df' : ('float', 64),
     'qf' : ('float', 128)
index aa60eeb04e7656d0e69cf6dd1e867a667eb69336..d533e662a541c0f042fc6148da5db73a4a80fbb0 100644 (file)
@@ -42,9 +42,22 @@ struct m5_twin64_t {
     }
 };
 
+struct m5_twin32_t {
+    uint32_t a;
+    uint32_t b;
+    inline m5_twin32_t& operator=(const uint32_t x)
+    {
+        a = x;
+        b = x;
+        return *this;
+    }
+};
+
+
 // This is for twin loads (two 64 bit values), not 1 128 bit value (as far as
 // endian conversion is concerned!
 typedef m5_twin64_t Twin64_t;
+typedef m5_twin32_t Twin32_t;
 
 
 #endif // __BASE_BIGINT_HH__
index 3001241fe390e9c599621e5c2d6eef127b6a9b9b..df7e780e639588275a9f0294337bfaa72148d926 100644 (file)
@@ -319,6 +319,10 @@ AtomicSimpleCPU::read(Addr addr, T &data, unsigned flags)
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
+template
+Fault
+AtomicSimpleCPU::read(Addr addr, Twin32_t &data, unsigned flags);
+
 template
 Fault
 AtomicSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
index ff3606a74b56d6dfe10f7cf1a4e4818aa912d333..7f857c68d88e98ba1a1da6c293fbe335bee7e115 100644 (file)
@@ -315,6 +315,10 @@ template
 Fault
 TimingSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
 
+template
+Fault
+TimingSimpleCPU::read(Addr addr, Twin32_t &data, unsigned flags);
+
 template
 Fault
 TimingSimpleCPU::read(Addr addr, uint64_t &data, unsigned flags);
index 882aa98d0c94e57296fb3c203e660765828fe8f6..552b6dd273d6d25885ce75ebcf83e85bf2673dfb 100644 (file)
@@ -53,6 +53,18 @@ Packet::get()
     return d;
 }
 
+template<>
+inline Twin32_t
+Packet::get()
+{
+    Twin32_t d;
+    assert(staticData || dynamicData);
+    assert(sizeof(Twin32_t) <= size);
+    d.a = TheISA::gtoh(*(uint32_t*)data);
+    d.b = TheISA::gtoh(*((uint32_t*)data + 1));
+    return d;
+}
+
 
 /** return the value of what is pointed to in the packet. */
 template <typename T>