ARM: Implement 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/insts/misc.isa

index c7caf5cb793f0e3ac08282e783085e4b3a591560..2e3fb2031a443af8f7b485ea9b3055c1656c6eab 100644 (file)
@@ -546,4 +546,35 @@ let {{
     header_output += ImmOpDeclare.subst(setendIop)
     decoder_output += ImmOpConstructor.subst(setendIop)
     exec_output += PredOpExecute.subst(setendIop)
+
+    cpsCode = '''
+    uint32_t mode = bits(imm, 4, 0);
+    uint32_t f = bits(imm, 5);
+    uint32_t i = bits(imm, 6);
+    uint32_t a = bits(imm, 7);
+    bool setMode = bits(imm, 8);
+    bool enable = bits(imm, 9);
+    CPSR cpsr = Cpsr;
+    if (cpsr.mode != MODE_USER) {
+        if (enable) {
+            if (f) cpsr.f = 0;
+            if (i) cpsr.i = 0;
+            if (a) cpsr.a = 0;
+        } else {
+            if (f) cpsr.f = 1;
+            if (i) cpsr.i = 1;
+            if (a) cpsr.a = 1;
+        }
+        if (setMode) {
+            cpsr.mode = mode;
+        }
+    }
+    Cpsr = cpsr;
+    '''
+    cpsIop = InstObjParams("cps", "Cps", "ImmOp",
+                           { "code": cpsCode,
+                             "predicate_test": predicateTest }, [])
+    header_output += ImmOpDeclare.subst(cpsIop)
+    decoder_output += ImmOpConstructor.subst(cpsIop)
+    exec_output += PredOpExecute.subst(cpsIop)
 }};