ARM: Decode the CPS instruction.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:11 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:11 +0000 (12:58 -0500)
src/arch/arm/isa/formats/branch.isa
src/arch/arm/isa/formats/data.isa
src/arch/arm/isa/formats/uncond.isa

index 53a2c95b44c9ef88fcc07517d15fe251fe28ed84..dbb6f9f9db8c9d864e73cb02da3aa1b8754559a2 100644 (file)
@@ -161,7 +161,10 @@ def format Thumb32BranchesAndMiscCtrl() {{
                         const uint32_t op1 = bits(machInst, 10, 8);
                         const uint32_t op2 = bits(machInst, 7, 0);
                         if (op1 != 0) {
-                            return new WarnUnimplemented("cps", machInst);
+                            const bool enable = bits(machInst, 10, 9) == 0x2;
+                            const uint32_t mods = bits(machInst, 8, 0) |
+                                                  ((enable ? 1 : 0) << 9);
+                            return new Cps(machInst, mods);
                         } else if ((op2 & 0xf0) == 0xf0) {
                             return new WarnUnimplemented("dbg", machInst);
                         } else {
index 19a9ee9fe5b0c5f56eef75d0d44f21326e98947d..3e6265d0bf5e896a7f6f6a9bef2f140d35524679 100644 (file)
@@ -1026,7 +1026,10 @@ def format Thumb16Misc() {{
                 if (opBits == 2) {
                     return new Setend(machInst, bits(machInst, 3));
                 } else if (opBits == 3) {
-                    return new WarnUnimplemented("cps", machInst);
+                    const bool enable = (bits(machInst, 4) == 0);
+                    const uint32_t mods = (bits(machInst, 2, 0) << 5) |
+                                          ((enable ? 1 : 0) << 9);
+                    return new Cps(machInst, mods);
                 }
             }
           case 0x9:
index 45cdbd058d5b4069b17e74201135ecc2cb54862a..0aa57a261395378a75a8ffe968f9463bff824a7d 100644 (file)
@@ -46,7 +46,12 @@ def format ArmUnconditional() {{
                 if (bits((uint32_t)rn, 0) == 1 && op2 == 0) {
                     return new Setend(machInst, bits(machInst, 9));
                 } else if (bits((uint32_t)rn, 0) == 0 && bits(op2, 1) == 0) {
-                    return new WarnUnimplemented("cps", machInst);
+                    const bool enable = bits(machInst, 19, 18) == 0x2;
+                    const uint32_t mods = bits(machInst, 4, 0) |
+                                          (bits(machInst, 8, 6) << 5) |
+                                          (bits(machInst, 17) << 8) |
+                                          ((enable ? 1 : 0) << 9);
+                    return new Cps(machInst, mods);
                 }
             } else if (bits(op1, 6, 5) == 0x1) {
                 return new WarnUnimplemented(