ARM: Decode miscellaneous arm mode media 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/decoder/arm.isa
src/arch/arm/isa/formats/data.isa

index ca74a2c1e5dfb54309342e2ff8c572dca94ffed8..cbc763d6a74a4305c207c64c38b849285c466d56 100644 (file)
@@ -114,9 +114,7 @@ format DataOp {
             0x0: ArmParallelAddSubtract::armParallelAddSubtract();
             0x1: ArmPackUnpackSatReverse::armPackUnpackSatReverse();
             0x2: ArmSignedMultiplies::armSignedMultiplies();
-            0x3: decode MEDIA_OPCODE {
-                0x18: ArmUsad::armUsad();
-            }
+            0x3: ArmMiscMedia::armMiscMedia();
         }
     }
     0x4: ArmMacroMem::armMacroMem();
index 03f94075c9b11ce5a9e69701dfe85709f24f7042..dee377658f1a0ff7fc126157486357ce292bb12b 100644 (file)
 //
 // Authors: Gabe Black
 
-def format ArmUsad() {{
+def format ArmMiscMedia() {{
     decode_block = '''
     {
-        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
+        const uint32_t op1 = bits(machInst, 22, 20);
+        const uint32_t op2 = bits(machInst, 7, 5);
         const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
-        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
         const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
-        if (ra == 0xf) {
-            return new Usad8(machInst, rd, rn, rm);
-        } else {
-            return new Usada8(machInst, rd, rn, rm, ra);
+        if (op1 == 0 && op2 == 0) {
+            const IntRegIndex rd =
+                (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
+            const IntRegIndex rm =
+                (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
+            if (ra == 0xf) {
+                return new Usad8(machInst, rd, rn, rm);
+            } else {
+                return new Usada8(machInst, rd, rn, rm, ra);
+            }
+        } else if (bits(op2, 1, 0) == 0x2) {
+            if (bits(op1, 2, 1) == 0x3) {
+                return new WarnUnimplemented("ubfx", machInst);
+            } else if (bits(op1, 2, 1) == 0x1) {
+                return new WarnUnimplemented("sbfx", machInst);
+            }
+        } else if (bits(op2, 1, 0) == 0x0 && bits(op1, 2, 1) == 0x2) {
+            if (rn == 0xf) {
+                return new WarnUnimplemented("bfc", machInst);
+            } else {
+                return new WarnUnimplemented("bfi", machInst);
+            }
         }
+        return new Unknown(machInst);
     }
     '''
 }};