A32: Add ThumbExpandImm and ThumbExpandImm_C
These are used by many thumb2 instructions
This commit is contained in:
parent
43a1a523f6
commit
069beb5228
1 changed files with 32 additions and 0 deletions
|
@ -24,6 +24,38 @@ struct ThumbTranslatorVisitor final {
|
|||
ASSERT_MSG(descriptor.TFlag(), "The processor must be in Thumb mode");
|
||||
}
|
||||
|
||||
struct ImmAndCarry {
|
||||
u32 imm32;
|
||||
IR::U1 carry;
|
||||
};
|
||||
|
||||
ImmAndCarry ThumbExpandImm_C(Imm<1> i, Imm<3> imm3, Imm<8> imm8, IR::U1 carry_in) {
|
||||
const Imm<12> imm12 = concatenate(i, imm3, imm8);
|
||||
if (imm12.Bits<10, 11>() == 0) {
|
||||
const u32 imm32 = [&]{
|
||||
const u32 imm8 = imm12.Bits<0, 7>();
|
||||
switch (imm12.Bits<8, 9>()) {
|
||||
case 0b00:
|
||||
return imm8;
|
||||
case 0b01:
|
||||
return Common::Replicate(imm8, 16);
|
||||
case 0b10:
|
||||
return Common::Replicate(imm8 << 8, 16);
|
||||
case 0b11:
|
||||
return Common::Replicate(imm8, 8);
|
||||
}
|
||||
UNREACHABLE();
|
||||
}();
|
||||
return {imm32, carry_in};
|
||||
}
|
||||
const u32 imm32 = Common::RotateRight<u32>((1 << 7) | imm12.Bits<0, 6>(), imm12.Bits<7, 11>());
|
||||
return {imm32, ir.Imm1(Common::Bit<31>(imm32))};
|
||||
}
|
||||
|
||||
u32 ThumbExpandImm(Imm<1> i, Imm<3> imm3, Imm<8> imm8) {
|
||||
return ThumbExpandImm_C(i, imm3, imm8, ir.Imm1(0)).imm32;
|
||||
}
|
||||
|
||||
A32::IREmitter ir;
|
||||
ConditionalState cond_state = ConditionalState::None;
|
||||
TranslationOptions options;
|
||||
|
|
Loading…
Reference in a new issue