diff options
author | Ali Saidi <Ali.Saidi@ARM.com> | 2010-08-23 11:18:40 -0500 |
---|---|---|
committer | Ali Saidi <Ali.Saidi@ARM.com> | 2010-08-23 11:18:40 -0500 |
commit | fc1730044eca89c4df7169546be69fed3b415f57 (patch) | |
tree | 7e5e8eb8da5ab12fe9fa23dbea2b535d6c5499a2 /src/arch | |
parent | d1362d582a10c1207e4edb5792600d7ba6303cb6 (diff) | |
download | gem5-fc1730044eca89c4df7169546be69fed3b415f57.tar.xz |
ARM: Decode neon memory instructions.
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/arm/isa/formats/fp.isa | 104 |
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); } ''' |