summaryrefslogtreecommitdiff
path: root/src/arch/arm/isa/insts/str64.isa
diff options
context:
space:
mode:
authorChuan Zhu <chuan.zhu@arm.com>2017-07-26 17:03:18 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2018-02-16 09:28:24 +0000
commitc105793a2027cd113233e8ce6c5e2d4ea2f9cded (patch)
tree7e8fd86bc3ea02ea382d451db968ca8f61e9ea9a /src/arch/arm/isa/insts/str64.isa
parentfcc98a50e3af273921914f9adf61db7b1944bb05 (diff)
downloadgem5-c105793a2027cd113233e8ce6c5e2d4ea2f9cded.tar.xz
arch-arm: Fix big endian support in {Load,Store}Double64
{Load, Store}Double64 didn't consider some of the big-endian situations. Added big-endian related data conversions to correct them. Change-Id: I8840613f94446e6042276779d1f02350ab57987f Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/8145 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/arch/arm/isa/insts/str64.isa')
-rw-r--r--src/arch/arm/isa/insts/str64.isa12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/arch/arm/isa/insts/str64.isa b/src/arch/arm/isa/insts/str64.isa
index 324d1fc69..0c55b4b64 100644
--- a/src/arch/arm/isa/insts/str64.isa
+++ b/src/arch/arm/isa/insts/str64.isa
@@ -212,14 +212,18 @@ let {{
if self.flavor == "fp":
accCode = '''
uint64_t data = AA64FpDest2P0_uw;
- data = (data << 32) | AA64FpDestP0_uw;
+ data = isBigEndian64(xc->tcBase())
+ ? ((uint64_t(AA64FpDestP0_uw) << 32) | data)
+ : ((data << 32) | AA64FpDestP0_uw);
Mem_ud = cSwap(data, isBigEndian64(xc->tcBase()));
'''
else:
if self.size == 4:
accCode = '''
uint64_t data = XDest2_uw;
- data = (data << 32) | XDest_uw;
+ data = isBigEndian64(xc->tcBase())
+ ? ((uint64_t(XDest_uw) << 32) | data)
+ : ((data << 32) | XDest_uw);
Mem_ud = cSwap(data, isBigEndian64(xc->tcBase()));
'''
elif self.size == 8:
@@ -227,8 +231,8 @@ let {{
// This temporary needs to be here so that the parser
// will correctly identify this instruction as a store.
std::array<uint64_t, 2> temp;
- temp[0] = XDest_ud;
- temp[1] = XDest2_ud;
+ temp[0] = cSwap(XDest_ud,isBigEndian64(xc->tcBase()));
+ temp[1] = cSwap(XDest2_ud,isBigEndian64(xc->tcBase()));
Mem_tud = temp;
'''
self.codeBlobs["memacc_code"] = accCode