diff options
Diffstat (limited to 'src/arch/arm/insts/static_inst.cc')
-rw-r--r-- | src/arch/arm/insts/static_inst.cc | 23 |
1 files changed, 23 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 { |