make ldtw(a) -- Twin 32 bit load work correctly -- by doing it the same way as the twin 64 bit loads
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
This commit is contained in:
parent
d8ada247f4
commit
4e8d2d1593
7 changed files with 45 additions and 10 deletions
|
@ -1124,9 +1124,12 @@ def buildOperandTypeMap(userDict, lineno):
|
||||||
ctype = 'float'
|
ctype = 'float'
|
||||||
elif size == 64:
|
elif size == 64:
|
||||||
ctype = 'double'
|
ctype = 'double'
|
||||||
elif desc == 'twin int':
|
elif desc == 'twin64 int':
|
||||||
is_signed = 0
|
is_signed = 0
|
||||||
ctype = 'Twin64_t'
|
ctype = 'Twin64_t'
|
||||||
|
elif desc == 'twin32 int':
|
||||||
|
is_signed = 0
|
||||||
|
ctype = 'Twin32_t'
|
||||||
if ctype == '':
|
if ctype == '':
|
||||||
error(lineno, 'Unrecognized type description "%s" in userDict')
|
error(lineno, 'Unrecognized type description "%s" in userDict')
|
||||||
operandTypeMap[ext] = (size, ctype, is_signed)
|
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.
|
# template must be careful not to use it if it doesn't apply.
|
||||||
if self.isMem():
|
if self.isMem():
|
||||||
self.mem_acc_size = self.makeAccSize()
|
self.mem_acc_size = self.makeAccSize()
|
||||||
if self.ctype == 'Twin64_t':
|
if self.ctype in ['Twin32_t', 'Twin64_t']:
|
||||||
self.mem_acc_type = 'Twin'
|
self.mem_acc_type = 'Twin'
|
||||||
else:
|
else:
|
||||||
self.mem_acc_type = 'uint'
|
self.mem_acc_type = 'uint'
|
||||||
|
@ -1392,7 +1395,7 @@ class MemOperand(Operand):
|
||||||
# Note that initializations in the declarations are solely
|
# Note that initializations in the declarations are solely
|
||||||
# to avoid 'uninitialized variable' errors from the compiler.
|
# to avoid 'uninitialized variable' errors from the compiler.
|
||||||
# Declare memory data variable.
|
# 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,
|
return "%s %s; %s.a = 0; %s.b = 0;\n" % (self.ctype, self.base_name,
|
||||||
self.base_name, self.base_name)
|
self.base_name, self.base_name)
|
||||||
c = '%s %s = 0;\n' % (self.ctype, self.base_name)
|
c = '%s %s = 0;\n' % (self.ctype, self.base_name)
|
||||||
|
|
|
@ -1160,9 +1160,8 @@ decode OP default Unknown::unknown()
|
||||||
0x01: ldub({{Rd = Mem.ub;}});
|
0x01: ldub({{Rd = Mem.ub;}});
|
||||||
0x02: lduh({{Rd = Mem.uhw;}});
|
0x02: lduh({{Rd = Mem.uhw;}});
|
||||||
0x03: ldtw({{
|
0x03: ldtw({{
|
||||||
uint64_t val = Mem.udw;
|
RdLow = (Mem.tuw).a;
|
||||||
RdLow = val<31:0>;
|
RdHigh = (Mem.tuw).b;
|
||||||
RdHigh = val<63:32>;
|
|
||||||
}});
|
}});
|
||||||
}
|
}
|
||||||
format Store {
|
format Store {
|
||||||
|
@ -1250,9 +1249,8 @@ decode OP default Unknown::unknown()
|
||||||
{{RdLow.udw = (Mem.tudw).a;
|
{{RdLow.udw = (Mem.tudw).a;
|
||||||
RdHigh.udw = (Mem.tudw).b;}}, {{EXT_ASI}});
|
RdHigh.udw = (Mem.tudw).b;}}, {{EXT_ASI}});
|
||||||
default: ldtwa({{
|
default: ldtwa({{
|
||||||
uint64_t val = Mem.udw;
|
RdLow = (Mem.tuw).a;
|
||||||
RdLow = val<31:0>;
|
RdHigh = (Mem.tuw).b;
|
||||||
RdHigh = val<63:32>;
|
|
||||||
}}, {{EXT_ASI}});
|
}}, {{EXT_ASI}});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,8 @@ def operand_types {{
|
||||||
'uw' : ('unsigned int', 32),
|
'uw' : ('unsigned int', 32),
|
||||||
'sdw' : ('signed int', 64),
|
'sdw' : ('signed int', 64),
|
||||||
'udw' : ('unsigned int', 64),
|
'udw' : ('unsigned int', 64),
|
||||||
'tudw' : ('twin int', 64),
|
'tudw' : ('twin64 int', 64),
|
||||||
|
'tuw' : ('twin32 int', 32),
|
||||||
'sf' : ('float', 32),
|
'sf' : ('float', 32),
|
||||||
'df' : ('float', 64),
|
'df' : ('float', 64),
|
||||||
'qf' : ('float', 128)
|
'qf' : ('float', 128)
|
||||||
|
|
|
@ -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
|
// This is for twin loads (two 64 bit values), not 1 128 bit value (as far as
|
||||||
// endian conversion is concerned!
|
// endian conversion is concerned!
|
||||||
typedef m5_twin64_t Twin64_t;
|
typedef m5_twin64_t Twin64_t;
|
||||||
|
typedef m5_twin32_t Twin32_t;
|
||||||
|
|
||||||
|
|
||||||
#endif // __BASE_BIGINT_HH__
|
#endif // __BASE_BIGINT_HH__
|
||||||
|
|
|
@ -319,6 +319,10 @@ AtomicSimpleCPU::read(Addr addr, T &data, unsigned flags)
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||||
|
|
||||||
|
template
|
||||||
|
Fault
|
||||||
|
AtomicSimpleCPU::read(Addr addr, Twin32_t &data, unsigned flags);
|
||||||
|
|
||||||
template
|
template
|
||||||
Fault
|
Fault
|
||||||
AtomicSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
|
AtomicSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
|
||||||
|
|
|
@ -315,6 +315,10 @@ template
|
||||||
Fault
|
Fault
|
||||||
TimingSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
|
TimingSimpleCPU::read(Addr addr, Twin64_t &data, unsigned flags);
|
||||||
|
|
||||||
|
template
|
||||||
|
Fault
|
||||||
|
TimingSimpleCPU::read(Addr addr, Twin32_t &data, unsigned flags);
|
||||||
|
|
||||||
template
|
template
|
||||||
Fault
|
Fault
|
||||||
TimingSimpleCPU::read(Addr addr, uint64_t &data, unsigned flags);
|
TimingSimpleCPU::read(Addr addr, uint64_t &data, unsigned flags);
|
||||||
|
|
|
@ -53,6 +53,18 @@ Packet::get()
|
||||||
return d;
|
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. */
|
/** return the value of what is pointed to in the packet. */
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
Loading…
Reference in a new issue