summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:05 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:05 -0500
commitf61bb9adb95e704ced44ea4efefa3fe6630de371 (patch)
tree7b2208903b058fd8f5421b1aae2f2bccd85db54e /src/arch
parenta76ab8e040c6582a1d60a8c70e90ce757b347485 (diff)
downloadgem5-f61bb9adb95e704ced44ea4efefa3fe6630de371.tar.xz
ARM: Hook up the push/pop versions of stm/ldm in thumb.
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/isa/formats/data.isa14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/arch/arm/isa/formats/data.isa b/src/arch/arm/isa/formats/data.isa
index f6e093b80..43bd65589 100644
--- a/src/arch/arm/isa/formats/data.isa
+++ b/src/arch/arm/isa/formats/data.isa
@@ -531,7 +531,12 @@ def format Thumb16Misc() {{
(IntRegIndex)(uint32_t)bits(machInst, 2, 0));
case 0x4:
case 0x5:
- return new WarnUnimplemented("push", machInst);
+ {
+ const uint32_t m = bits(machInst, 8);
+ const uint32_t regList = bits(machInst, 7, 0) | (m << 14);
+ return new LdmStm(machInst, INTREG_SP, false, false, false,
+ true, false, regList);
+ }
case 0x6:
{
const uint32_t opBits = bits(machInst, 7, 5);
@@ -565,7 +570,12 @@ def format Thumb16Misc() {{
(IntRegIndex)(uint32_t)bits(machInst, 2, 0));
case 0xc:
case 0xd:
- return new WarnUnimplemented("pop", machInst);
+ {
+ const uint32_t p = bits(machInst, 8);
+ const uint32_t regList = bits(machInst, 7, 0) | (p << 15);
+ return new LdmStm(machInst, INTREG_SP, true, true, false,
+ true, true, regList);
+ }
case 0xe:
return new WarnUnimplemented("bkpt", machInst);
case 0xf: