ARM: Decode neon memory instructions.
authorAli Saidi <Ali.Saidi@ARM.com>
Mon, 23 Aug 2010 16:18:40 +0000 (11:18 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Mon, 23 Aug 2010 16:18:40 +0000 (11:18 -0500)
src/arch/arm/isa/formats/fp.isa

index 22207d4e7ae698bba36991d6ec2650244965fad0..0a5f77e6e6b7f66da539906235c8440d40b865b0 100644 (file)
@@ -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);
     }
     '''