ARM: Add a function to decode 32 bit thumb immediate values.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 2 Jun 2010 17:58:00 +0000 (12:58 -0500)
src/arch/arm/insts/static_inst.cc
src/arch/arm/insts/static_inst.hh

index ffcef25089ff8b59bda4f87f2a0707e4febd0cd9..77d329564b8109973835128e5ca53cef918ee30f 100644 (file)
@@ -231,6 +231,29 @@ ArmStaticInstBase::arm_sub_overflow(int32_t result, int32_t lhs, int32_t rhs) co
     return findOverflow(32, result, lhs, ~rhs);
 }
 
+uint32_t
+ArmStaticInstBase::modified_imm(uint8_t ctrlImm, uint8_t dataImm) const
+{
+    uint32_t bigData = dataImm;
+    uint32_t bigCtrl = ctrlImm;
+    if (bigCtrl < 4) {
+        switch (bigCtrl) {
+          case 0:
+            return bigData;
+          case 1:
+            return bigData | (bigData << 16);
+          case 2:
+            return (bigData << 8) | (bigData << 24);
+          case 3:
+            return (bigData << 0) | (bigData << 8) |
+                   (bigData << 16) | (bigData << 24);
+        }
+    }
+    bigCtrl = (bigCtrl << 1) | ((bigData >> 7) & 0x1);
+    bigData |= (1 << 7);
+    return bigData << (32 - bigCtrl);
+}
+
 void
 ArmStaticInstBase::printReg(std::ostream &os, int reg) const
 {
index 99fa819b5f3a9c8ab43ce379845c94f58388968a..ec33c73a2cccfa5c38a086aa18cf57cd6e4bb7f9 100644 (file)
@@ -66,6 +66,8 @@ class ArmStaticInstBase : public StaticInst
     bool arm_add_overflow(int32_t result, int32_t lhs, int32_t rhs) const;
     bool arm_sub_overflow(int32_t result, int32_t lhs, int32_t rhs) const;
 
+    uint32_t modified_imm(uint8_t ctrlImm, uint8_t dataImm) const;
+
     // Constructor
     ArmStaticInstBase(const char *mnem, ExtMachInst _machInst,
             OpClass __opClass)