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

index 652a15b3b6a5be0af3690f4923627c238f20879f..09d27360e0db672f82b386cc71f1c3b27a73eef9 100644 (file)
@@ -154,6 +154,26 @@ let {{
     decoder_output += RevOpConstructor.subst(revshIop)
     exec_output += PredOpExecute.subst(revshIop)
 
+    rbitCode = '''
+    uint8_t *opBytes = (uint8_t *)&Op1;
+    uint32_t resTemp;
+    uint8_t *destBytes = (uint8_t *)&resTemp;
+    // This reverses the bytes and bits of the input, or so says the
+    // internet.
+    for (int i = 0; i < 4; i++) {
+        uint32_t temp = opBytes[i];
+        temp = (temp * 0x0802 & 0x22110) | (temp * 0x8020 & 0x88440);
+        destBytes[3 - i] = (temp * 0x10101) >> 16;
+    }
+    Dest = resTemp;
+    '''
+    rbitIop = InstObjParams("rbit", "Rbit", "RevOp",
+                            { "code": rbitCode,
+                              "predicate_test": predicateTest }, [])
+    header_output += RevOpDeclare.subst(rbitIop)
+    decoder_output += RevOpConstructor.subst(rbitIop)
+    exec_output += PredOpExecute.subst(rbitIop)
+
     ssatCode = '''
         int32_t operand = shift_rm_imm(Op1, shiftAmt, shiftType, 0);
         int32_t res;