ARM: Add a function to decode 32 bit thumb immediate values.

This commit is contained in:
Gabe Black
2010-06-02 12:58:00 -05:00
parent 0116655674
commit bfe1a194dd
2 changed files with 25 additions and 0 deletions

View 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
{

View 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)