summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm/isa/formats/fp.isa33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/arch/arm/isa/formats/fp.isa b/src/arch/arm/isa/formats/fp.isa
index 55668e5f6..1bb15fd5b 100644
--- a/src/arch/arm/isa/formats/fp.isa
+++ b/src/arch/arm/isa/formats/fp.isa
@@ -96,20 +96,25 @@ let {{
}
break;
case 0x1:
- switch (bits(opcode, 1, 0)) {
- case 0x0:
- return new VLdmStm(machInst, rn, vd, single,
- true, false, false, offset);
- case 0x1:
- return new VLdmStm(machInst, rn, vd, single,
- true, false, true, offset);
- case 0x2:
- return new VLdmStm(machInst, rn, vd, single,
- true, true, false, offset);
- case 0x3:
- // If rn == sp, then this is called vpop.
- return new VLdmStm(machInst, rn, vd, single,
- true, true, true, offset);
+ {
+ if (offset == 0 || vd + offset > NumFloatArchRegs) {
+ break;
+ }
+ switch (bits(opcode, 1, 0)) {
+ case 0x0:
+ return new VLdmStm(machInst, rn, vd, single,
+ true, false, false, offset);
+ case 0x1:
+ return new VLdmStm(machInst, rn, vd, single,
+ true, false, true, offset);
+ case 0x2:
+ return new VLdmStm(machInst, rn, vd, single,
+ true, true, false, offset);
+ case 0x3:
+ // If rn == sp, then this is called vpop.
+ return new VLdmStm(machInst, rn, vd, single,
+ true, true, true, offset);
+ }
}
case 0x2:
if (bits(opcode, 1, 0) == 0x2) {