summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:10 -0500
committerGabe Black <gblack@eecs.umich.edu>2010-06-02 12:58:10 -0500
commit3ad31f61c27b505b299295008b8f52b44ddbd499 (patch)
tree5c1911eca3706347e72578fbb3eb692ff1d0f754
parent54ab07e636a0e83527a87c5d88406e3b443b2e99 (diff)
downloadgem5-3ad31f61c27b505b299295008b8f52b44ddbd499.tar.xz
ARM: Decode the strex instructions.
-rw-r--r--src/arch/arm/isa/formats/mem.isa28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/arch/arm/isa/formats/mem.isa b/src/arch/arm/isa/formats/mem.isa
index 5d389458c..8f2dacade 100644
--- a/src/arch/arm/isa/formats/mem.isa
+++ b/src/arch/arm/isa/formats/mem.isa
@@ -229,19 +229,19 @@ def format ArmSyncMem() {{
case 0x14:
return new Swpb(machInst, rt, rt2, rn);
case 0x18:
- return new WarnUnimplemented("strex", machInst);
+ return new %(strex)s(machInst, rt, rt2, rn, true, 0);
case 0x19:
return new %(ldrex)s(machInst, rt, rn, true, 0);
case 0x1a:
- return new WarnUnimplemented("strexd", machInst);
+ return new %(strexd)s(machInst, rt, rt2, rt2 + 1, rn, true, 0);
case 0x1b:
return new WarnUnimplemented("ldrexd", machInst);
case 0x1c:
- return new WarnUnimplemented("strexb", machInst);
+ return new %(strexb)s(machInst, rt, rt2, rn, true, 0);
case 0x1d:
return new %(ldrexb)s(machInst, rt, rn, true, 0);
case 0x1e:
- return new WarnUnimplemented("strexh", machInst);
+ return new %(strexh)s(machInst, rt, rt2, rn, true, 0);
case 0x1f:
return new %(ldrexh)s(machInst, rt, rn, true, 0);
default:
@@ -251,7 +251,11 @@ def format ArmSyncMem() {{
''' % {
"ldrex" : "LDREX_" + loadImmClassName(False, True, False, size=4),
"ldrexb" : "LDREXB_" + loadImmClassName(False, True, False, size=1),
- "ldrexh" : "LDREXH_" + loadImmClassName(False, True, False, size=2)
+ "ldrexh" : "LDREXH_" + loadImmClassName(False, True, False, size=2),
+ "strex" : "STREX_" + storeImmClassName(False, True, False, size=4),
+ "strexb" : "STREXB_" + storeImmClassName(False, True, False, size=1),
+ "strexh" : "STREXH_" + storeImmClassName(False, True, False, size=2),
+ "strexd" : "STREXD_" + storeDoubleImmClassName(False, True, False)
}
}};
@@ -294,12 +298,13 @@ def format Thumb32LdrStrDExTbh() {{
const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
const IntRegIndex rt2 = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
+ const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
const uint32_t imm8 = bits(machInst, 7, 0);
if (bits(op1, 1) == 0 && bits(op2, 1) == 0) {
if (op1 == 0) {
const uint32_t imm = bits(machInst, 7, 0) << 2;
if (op2 == 0) {
- return new WarnUnimplemented("strex", machInst);
+ return new %(strex)s(machInst, rt2, rt, rn, true, imm);
} else {
return new %(ldrex)s(machInst, rt, rn, true, imm);
}
@@ -307,11 +312,12 @@ def format Thumb32LdrStrDExTbh() {{
if (op2 == 0) {
switch (op3) {
case 0x4:
- return new WarnUnimplemented("strexb", machInst);
+ return new %(strexb)s(machInst, rd, rt, rn, true, 0);
case 0x5:
- return new WarnUnimplemented("strexh", machInst);
+ return new %(strexh)s(machInst, rd, rt, rn, true, 0);
case 0x7:
- return new WarnUnimplemented("strexd", machInst);
+ return new %(strexd)s(machInst, rd, rt,
+ rt2, rn, true, 0);
default:
return new Unknown(machInst);
}
@@ -378,6 +384,10 @@ def format Thumb32LdrStrDExTbh() {{
"ldrexb" : "LDREXB_" + loadImmClassName(False, True, False, size=1),
"ldrexh" : "LDREXH_" + loadImmClassName(False, True, False, size=2),
"ldrexd" : "LDREXD_" + loadDoubleImmClassName(False, True, False),
+ "strex" : "STREX_" + storeImmClassName(False, True, False, size=4),
+ "strexb" : "STREXB_" + storeImmClassName(False, True, False, size=1),
+ "strexh" : "STREXH_" + storeImmClassName(False, True, False, size=2),
+ "strexd" : "STREXD_" + storeDoubleImmClassName(False, True, False),
"ldrd_w" : loadDoubleImmClassName(True, False, True),
"ldrd_uw" : loadDoubleImmClassName(True, True, True),
"ldrd_p" : loadDoubleImmClassName(False, False, False),