ARM: Implement the ubfx and sbfx instructions.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:08 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:08 +0000 (12:58 -0500)
src/arch/arm/isa/insts/misc.isa

index d7fa310b7486cf8b1da8906cdb77319fa4a624bf..e3c3132d9b1595074af13d68cdea33a3e92aefa3 100644 (file)
@@ -458,4 +458,25 @@ let {{
     header_output += BasicDeclare.subst(nopIop)
     decoder_output += BasicConstructor.subst(nopIop)
     exec_output += BasicExecute.subst(nopIop)
+
+    ubfxCode = '''
+        Dest = bits(Op1, imm2, imm1);
+    '''
+    ubfxIop = InstObjParams("ubfx", "Ubfx", "RegRegImmImmOp",
+                            { "code": ubfxCode,
+                              "predicate_test": predicateTest }, [])
+    header_output += RegRegImmImmOpDeclare.subst(ubfxIop)
+    decoder_output += RegRegImmImmOpConstructor.subst(ubfxIop)
+    exec_output += PredOpExecute.subst(ubfxIop)
+
+    sbfxCode = '''
+        int32_t resTemp = bits(Op1, imm2, imm1);
+        Dest = resTemp | -(resTemp & (1 << (imm2 - imm1)));
+    '''
+    sbfxIop = InstObjParams("sbfx", "Sbfx", "RegRegImmImmOp",
+                            { "code": sbfxCode,
+                              "predicate_test": predicateTest }, [])
+    header_output += RegRegImmImmOpDeclare.subst(sbfxIop)
+    decoder_output += RegRegImmImmOpConstructor.subst(sbfxIop)
+    exec_output += PredOpExecute.subst(sbfxIop)
 }};