diff options
Diffstat (limited to 'src/arch/arm/insts')
-rw-r--r-- | src/arch/arm/insts/static_inst.cc | 23 | ||||
-rw-r--r-- | src/arch/arm/insts/static_inst.hh | 2 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/arch/arm/insts/static_inst.cc b/src/arch/arm/insts/static_inst.cc index ffcef2508..77d329564 100644 --- a/src/arch/arm/insts/static_inst.cc +++ b/src/arch/arm/insts/static_inst.cc @@ -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 { diff --git a/src/arch/arm/insts/static_inst.hh b/src/arch/arm/insts/static_inst.hh index 99fa819b5..ec33c73a2 100644 --- a/src/arch/arm/insts/static_inst.hh +++ b/src/arch/arm/insts/static_inst.hh @@ -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) |