summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorAli Saidi <Ali.Saidi@ARM.com>2010-08-23 11:18:40 -0500
committerAli Saidi <Ali.Saidi@ARM.com>2010-08-23 11:18:40 -0500
commitfc1730044eca89c4df7169546be69fed3b415f57 (patch)
tree7e5e8eb8da5ab12fe9fa23dbea2b535d6c5499a2 /src/arch
parentd1362d582a10c1207e4edb5792600d7ba6303cb6 (diff)
downloadgem5-fc1730044eca89c4df7169546be69fed3b415f57.tar.xz
ARM: Decode neon memory instructions.
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/isa/formats/fp.isa104
1 files changed, 95 insertions, 9 deletions
diff --git a/src/arch/arm/isa/formats/fp.isa b/src/arch/arm/isa/formats/fp.isa
index 22207d4e7..0a5f77e6e 100644
--- a/src/arch/arm/isa/formats/fp.isa
+++ b/src/arch/arm/isa/formats/fp.isa
@@ -65,27 +65,113 @@ let {{
if (l) {
// Load instructions.
if (a) {
- switch (b) {
+ if (bits(b, 3, 2) != 3) {
+ switch (bits(b, 1, 0)) {
+ case 0x0:
+ return new WarnUnimplemented("vld1 single", machInst);
+ case 0x1:
+ return new WarnUnimplemented("vld2 single", machInst);
+ case 0x2:
+ return new WarnUnimplemented("vld3 single", machInst);
+ case 0x3:
+ return new WarnUnimplemented("vld4 single", machInst);
+ }
+ } else {
+ switch (bits(b, 1, 0)) {
+ case 0x0:
+ return new WarnUnimplemented("vld1 single all",
+ machInst);
+ case 0x1:
+ return new WarnUnimplemented("vld2 single all",
+ machInst);
+ case 0x2:
+ return new WarnUnimplemented("vld3 single all",
+ machInst);
+ case 0x3:
+ return new WarnUnimplemented("vld4 single all",
+ machInst);
+ }
}
- // Single.
} else {
- switch (b) {
+ switch (bits(b, 3, 1)) {
+ case 0x0:
+ return new WarnUnimplemented("vld4 multiple", machInst);
+ case 0x2:
+ return new WarnUnimplemented("vld3 multiple", machInst);
+ case 0x3:
+ return new WarnUnimplemented("vld1 multiple", machInst);
+ case 0x4:
+ return new WarnUnimplemented("vld2 multiple", machInst);
+ case 0x1:
+ if (b & 0x1) {
+ return new WarnUnimplemented("vld2 multiple", machInst);
+ } else {
+ return new WarnUnimplemented("vld1 multiple", machInst);
+ }
+ case 0x5:
+ if ((b & 0x1) == 0) {
+ return new WarnUnimplemented("vld1 multiple", machInst);
+ } else {
+ break;
+ }
}
- // Multiple.
}
} else {
// Store instructions.
if (a) {
- switch (b) {
+ if (bits(b, 3, 2) != 3) {
+ switch (bits(b, 1, 0)) {
+ case 0x0:
+ return new WarnUnimplemented("vst1 single", machInst);
+ case 0x1:
+ return new WarnUnimplemented("vst2 single", machInst);
+ case 0x2:
+ return new WarnUnimplemented("vst3 single", machInst);
+ case 0x3:
+ return new WarnUnimplemented("vst4 single", machInst);
+ }
+ } else {
+ switch (bits(b, 1, 0)) {
+ case 0x0:
+ return new WarnUnimplemented("vst1 single all",
+ machInst);
+ case 0x1:
+ return new WarnUnimplemented("vst2 single all",
+ machInst);
+ case 0x2:
+ return new WarnUnimplemented("vst3 single all",
+ machInst);
+ case 0x3:
+ return new WarnUnimplemented("vst4 single all",
+ machInst);
+ }
}
- // Single.
} else {
- switch (b) {
+ switch (bits(b, 3, 1)) {
+ case 0x0:
+ return new WarnUnimplemented("vst4 multiple", machInst);
+ case 0x2:
+ return new WarnUnimplemented("vst3 multiple", machInst);
+ case 0x3:
+ return new WarnUnimplemented("vst1 multiple", machInst);
+ case 0x4:
+ return new WarnUnimplemented("vst2 multiple", machInst);
+ case 0x1:
+ if (b & 0x1) {
+ return new WarnUnimplemented("vst2 multiple", machInst);
+ } else {
+ return new WarnUnimplemented("vst1 multiple", machInst);
+ }
+ case 0x5:
+ if ((b & 0x1) == 0) {
+ return new WarnUnimplemented("vst1 multiple", machInst);
+ } else {
+ break;
+ }
}
- // Multiple.
}
}
- return new WarnUnimplemented("neon memory", machInst);
+ return new Unknown(machInst);
}
'''