From fc1730044eca89c4df7169546be69fed3b415f57 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Mon, 23 Aug 2010 11:18:40 -0500 Subject: ARM: Decode neon memory instructions. --- src/arch/arm/isa/formats/fp.isa | 104 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 9 deletions(-) (limited to 'src/arch/arm/isa/formats') 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); } ''' -- cgit v1.2.3