mirror of
https://git.suyu.dev/suyu/dynarmic.git
synced 2026-01-04 05:34:42 +01:00
Implement thumb1_ADD_reg_t1 and thumb1_ADD_reg_t2
This commit is contained in:
parent
e93fb0ba2b
commit
d0b48bfb59
9 changed files with 144 additions and 6 deletions
|
|
@ -14,13 +14,29 @@ void IREmitter::Unimplemented() {
|
|||
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::Imm1(bool value) {
|
||||
auto imm1 = std::make_shared<IR::ImmU1>(value);
|
||||
AddToBlock(imm1);
|
||||
return imm1;
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::Imm8(u8 i) {
|
||||
auto imm8 = std::make_shared<IR::ImmU8>(i);
|
||||
AddToBlock(imm8);
|
||||
return imm8;
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::GetRegister(Dynarmic::Arm::Reg reg) {
|
||||
IR::ValuePtr IREmitter::Imm32(u32 i) {
|
||||
auto imm32 = std::make_shared<IR::ImmU32>(i);
|
||||
AddToBlock(imm32);
|
||||
return imm32;
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::GetRegister(Reg reg) {
|
||||
if (reg == Reg::PC) {
|
||||
u32 offset = current_location.TFlag ? 4 : 8;
|
||||
return Imm32(current_location.arm_pc + offset);
|
||||
}
|
||||
return Inst(IR::Opcode::GetRegister, { RegRef(reg) });
|
||||
}
|
||||
|
||||
|
|
@ -28,6 +44,11 @@ void IREmitter::SetRegister(const Reg reg, IR::ValuePtr value) {
|
|||
Inst(IR::Opcode::SetRegister, { RegRef(reg), value });
|
||||
}
|
||||
|
||||
void IREmitter::ALUWritePC(IR::ValuePtr value) {
|
||||
// This behaviour is ARM version-dependent.
|
||||
ASSERT_MSG(false, "Unimplemented");
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::GetCFlag() {
|
||||
return Inst(IR::Opcode::GetCFlag, {});
|
||||
}
|
||||
|
|
@ -44,6 +65,10 @@ void IREmitter::SetCFlag(IR::ValuePtr value) {
|
|||
Inst(IR::Opcode::SetCFlag, {value});
|
||||
}
|
||||
|
||||
void IREmitter::SetVFlag(IR::ValuePtr value) {
|
||||
Inst(IR::Opcode::SetVFlag, {value});
|
||||
}
|
||||
|
||||
IR::ValuePtr IREmitter::LeastSignificantByte(IR::ValuePtr value) {
|
||||
return Inst(IR::Opcode::LeastSignificantByte, {value});
|
||||
}
|
||||
|
|
@ -74,6 +99,13 @@ IREmitter::ResultAndCarry IREmitter::ArithmeticShiftRight(IR::ValuePtr value_in,
|
|||
return {result, carry_out};
|
||||
}
|
||||
|
||||
IREmitter::ResultAndCarryAndOverflow IREmitter::AddWithCarry(IR::ValuePtr a, IR::ValuePtr b, IR::ValuePtr carry_in) {
|
||||
auto result = Inst(IR::Opcode::AddWithCarry, {a, b, carry_in});
|
||||
auto carry_out = Inst(IR::Opcode::GetCarryFromOp, {result});
|
||||
auto overflow = Inst(IR::Opcode::GetOverflowFromOp, {result});
|
||||
return {result, carry_out, overflow};
|
||||
}
|
||||
|
||||
void IREmitter::SetTerm(const IR::Terminal& terminal) {
|
||||
ASSERT_MSG(block.terminal.which() == 0, "Terminal has already been set.");
|
||||
block.terminal = terminal;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue