Skip to content

Commit e0d4cea

Browse files
committed
Simplify ldm pc
1 parent c9c9970 commit e0d4cea

File tree

5 files changed

+46
-110
lines changed

5 files changed

+46
-110
lines changed

src/jit/assembler/block_asm.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use crate::jit::inst_info::InstInfo;
88
use crate::jit::reg::{Reg, RegReserve};
99
use crate::jit::{Cond, MemoryAmount, ShiftType};
1010
use crate::utils::{NoHashMap, NoHashSet};
11-
use std::collections::VecDeque;
1211

1312
pub static mut BLOCK_LOG: bool = false;
1413

src/jit/emitter/emit.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::core::CpuType;
22
use crate::core::CpuType::ARM7;
33
use crate::jit::assembler::block_asm::BlockAsm;
4-
use crate::jit::assembler::{BlockLabel, BlockReg};
4+
use crate::jit::assembler::BlockReg;
55
use crate::jit::inst_threag_regs_handler::{register_restore_spsr, restore_thumb_after_restore_spsr, set_pc_arm_mode};
66
use crate::jit::jit_asm::{JitAsm, JitRuntimeData};
77
use crate::jit::op::Op;
@@ -42,15 +42,15 @@ impl<'a, const CPU: CpuType> JitAsm<'a, CPU> {
4242
}
4343
}
4444

45-
if self.jit_buf.current_inst().out_regs.is_reserved(Reg::PC) && !op.is_multiple_mem_transfer() {
45+
if self.jit_buf.current_inst().out_regs.is_reserved(Reg::PC) {
4646
block_asm.save_context();
4747

4848
let restore_spsr = self.jit_buf.current_inst().out_regs.is_reserved(Reg::CPSR) && op.is_arm_alu();
4949
if restore_spsr {
5050
block_asm.call(register_restore_spsr::<CPU> as *const ());
5151
}
5252

53-
if CPU == ARM7 || !op.is_single_mem_transfer() {
53+
if CPU == ARM7 || (!op.is_single_mem_transfer() && !op.is_multiple_mem_transfer()) {
5454
if restore_spsr {
5555
block_asm.call(restore_thumb_after_restore_spsr::<CPU> as *const ());
5656
} else {

src/jit/emitter/emit_transfer.rs

Lines changed: 33 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -141,75 +141,42 @@ impl<'a, const CPU: CpuType> JitAsm<'a, CPU> {
141141
pre = !pre;
142142
}
143143
let write_back = inst_info.op.mem_transfer_write_back();
144-
let has_pc = rlist.is_reserved(Reg::PC);
145144

146145
let op0 = *inst_info.operands()[0].as_reg_no_shift().unwrap();
147146

148-
let func_addr: *const () = match (inst_info.op.mem_is_write(), inst_info.op.mem_transfer_user(), pre, write_back, decrement, has_pc) {
149-
(false, false, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, false, false> as _,
150-
(true, false, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, false, false> as _,
151-
(false, true, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, false, false> as _,
152-
(true, true, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, false, false> as _,
153-
(false, false, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, false, false> as _,
154-
(true, false, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, false, false> as _,
155-
(false, true, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, false, false> as _,
156-
(true, true, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, false, false> as _,
157-
(false, false, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, false, false> as _,
158-
(true, false, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, false, false> as _,
159-
(false, true, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, false, false> as _,
160-
(true, true, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, false, false> as _,
161-
(false, false, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, false, false> as _,
162-
(true, false, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, false, false> as _,
163-
(false, true, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, false, false> as _,
164-
(true, true, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, false, false> as _,
165-
(false, false, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, true, false> as _,
166-
(true, false, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, true, false> as _,
167-
(false, true, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, true, false> as _,
168-
(true, true, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, true, false> as _,
169-
(false, false, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, true, false> as _,
170-
(true, false, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, true, false> as _,
171-
(false, true, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, true, false> as _,
172-
(true, true, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, true, false> as _,
173-
(false, false, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, true, false> as _,
174-
(true, false, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, true, false> as _,
175-
(false, true, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, true, false> as _,
176-
(true, true, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, true, false> as _,
177-
(false, false, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, true, false> as _,
178-
(true, false, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, true, false> as _,
179-
(false, true, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, true, false> as _,
180-
(true, true, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, true, false> as _,
181-
(false, false, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, false, true> as _,
182-
(true, false, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, false, true> as _,
183-
(false, true, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, false, true> as _,
184-
(true, true, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, false, true> as _,
185-
(false, false, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, false, true> as _,
186-
(true, false, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, false, true> as _,
187-
(false, true, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, false, true> as _,
188-
(true, true, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, false, true> as _,
189-
(false, false, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, false, true> as _,
190-
(true, false, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, false, true> as _,
191-
(false, true, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, false, true> as _,
192-
(true, true, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, false, true> as _,
193-
(false, false, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, false, true> as _,
194-
(true, false, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, false, true> as _,
195-
(false, true, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, false, true> as _,
196-
(true, true, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, false, true> as _,
197-
(false, false, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, true, true> as _,
198-
(true, false, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, true, true> as _,
199-
(false, true, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, true, true> as _,
200-
(true, true, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, true, true> as _,
201-
(false, false, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, true, true> as _,
202-
(true, false, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, true, true> as _,
203-
(false, true, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, true, true> as _,
204-
(true, true, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, true, true> as _,
205-
(false, false, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, true, true> as _,
206-
(true, false, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, true, true> as _,
207-
(false, true, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, true, true> as _,
208-
(true, true, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, true, true> as _,
209-
(false, false, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, true, true> as _,
210-
(true, false, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, true, true> as _,
211-
(false, true, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, true, true> as _,
212-
(true, true, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, true, true> as _,
147+
let func_addr: *const () = match (inst_info.op.mem_is_write(), inst_info.op.mem_transfer_user(), pre, write_back, decrement) {
148+
(false, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, false> as _,
149+
(true, false, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, false> as _,
150+
(false, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, false> as _,
151+
(true, true, false, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, false> as _,
152+
(false, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, false> as _,
153+
(true, false, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, false> as _,
154+
(false, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, false> as _,
155+
(true, true, true, false, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, false> as _,
156+
(false, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, false> as _,
157+
(true, false, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, false> as _,
158+
(false, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, false> as _,
159+
(true, true, false, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, false> as _,
160+
(false, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, false> as _,
161+
(true, false, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, false> as _,
162+
(false, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, false> as _,
163+
(true, true, true, true, false) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, false> as _,
164+
(false, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, false, true> as _,
165+
(true, false, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, false, true> as _,
166+
(false, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, false, true> as _,
167+
(true, true, false, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, false, true> as _,
168+
(false, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, false, true> as _,
169+
(true, false, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, false, true> as _,
170+
(false, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, false, true> as _,
171+
(true, true, true, false, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, false, true> as _,
172+
(false, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, false, true, true> as _,
173+
(true, false, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, false, true, true> as _,
174+
(false, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, false, true, true> as _,
175+
(true, true, false, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, false, true, true> as _,
176+
(false, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, false, true, true, true> as _,
177+
(true, false, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, false, true, true, true> as _,
178+
(false, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, false, true, true, true, true> as _,
179+
(true, true, true, true, true) => inst_mem_handler_multiple::<CPU, THUMB, true, true, true, true, true> as _,
213180
};
214181

215182
block_asm.save_context();

src/jit/emitter/thumb/emit_thumb.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::core::CpuType;
2+
use crate::core::CpuType::ARM7;
23
use crate::jit::assembler::block_asm::BlockAsm;
34
use crate::jit::inst_threag_regs_handler::set_pc_thumb_mode;
45
use crate::jit::jit_asm::JitAsm;
@@ -67,10 +68,12 @@ impl<'a, const CPU: CpuType> JitAsm<'a, CPU> {
6768
}
6869
}
6970

70-
if self.jit_buf.current_inst().out_regs.is_reserved(Reg::PC) && !op.is_multiple_mem_transfer() {
71+
if self.jit_buf.current_inst().out_regs.is_reserved(Reg::PC) {
7172
block_asm.save_context();
7273

73-
block_asm.call(set_pc_thumb_mode::<CPU> as *const ());
74+
if CPU == ARM7 || !op.is_multiple_mem_transfer() {
75+
block_asm.call(set_pc_thumb_mode::<CPU> as *const ());
76+
}
7477

7578
self.emit_branch_out_metadata(block_asm);
7679
block_asm.epilogue();

src/jit/inst_mem_handler.rs

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
use crate::core::emu::{get_mem, get_regs_mut};
1+
use crate::core::emu::get_mem;
22
use crate::core::CpuType;
3-
use crate::core::CpuType::ARM7;
3+
use crate::get_jit_asm_ptr;
4+
use crate::jit::reg::Reg;
45
use crate::jit::MemoryAmount;
5-
use crate::{get_jit_asm_ptr, DEBUG_LOG_BRANCH_OUT};
66
use handler::*;
7-
use std::arch::asm;
8-
use std::hint::unreachable_unchecked;
97
use std::intrinsics::unlikely;
108

119
mod handler {
@@ -170,8 +168,6 @@ macro_rules! imm_breakout {
170168
std::hint::unreachable_unchecked();
171169
}};
172170
}
173-
use crate::jit::reg::Reg;
174-
use crate::logging::debug_println;
175171
pub(super) use imm_breakout;
176172

177173
pub unsafe extern "C" fn inst_mem_handler<const CPU: CpuType, const THUMB: bool, const WRITE: bool, const AMOUNT: MemoryAmount, const SIGNED: bool, const MMU: bool>(
@@ -187,43 +183,14 @@ pub unsafe extern "C" fn inst_mem_handler<const CPU: CpuType, const THUMB: bool,
187183
}
188184
}
189185

190-
pub unsafe extern "C" fn inst_mem_handler_multiple<
191-
const CPU: CpuType,
192-
const THUMB: bool,
193-
const WRITE: bool,
194-
const USER: bool,
195-
const PRE: bool,
196-
const WRITE_BACK: bool,
197-
const DECREMENT: bool,
198-
const HAS_PC: bool,
199-
>(
186+
pub unsafe extern "C" fn inst_mem_handler_multiple<const CPU: CpuType, const THUMB: bool, const WRITE: bool, const USER: bool, const PRE: bool, const WRITE_BACK: bool, const DECREMENT: bool>(
200187
op0_rlist: u32,
201188
pc: u32,
202189
total_cycles: u16,
203190
) {
204191
let asm = get_jit_asm_ptr::<CPU>();
205192
handle_multiple_request::<CPU, THUMB, WRITE, USER, PRE, WRITE_BACK, DECREMENT>(pc, (op0_rlist & 0xFFFF) as u16, (op0_rlist >> 16) as u8, (*asm).emu);
206-
if !WRITE && HAS_PC {
207-
debug_println!("{CPU:?} mem handle multiple read load pc, breakout");
208-
if DEBUG_LOG_BRANCH_OUT {
209-
(*asm).runtime_data.branch_out_pc = pc;
210-
}
211-
(*asm).runtime_data.branch_out_total_cycles = total_cycles;
212-
if CPU == ARM7 {
213-
if THUMB {
214-
get_regs_mut!((*asm).emu, CPU).pc |= 1;
215-
} else {
216-
get_regs_mut!((*asm).emu, CPU).pc &= !1;
217-
}
218-
}
219-
// r4-r12,pc since we need an even amount of registers for 8 byte alignment, in case the compiler decides to use neon instructions
220-
asm!(
221-
"mov sp, {}",
222-
"pop {{r4-r12,pc}}",
223-
in(reg) (*asm).runtime_data.host_sp
224-
);
225-
unreachable_unchecked();
226-
} else if WRITE && unlikely(get_mem!((*asm).emu).breakout_imm) {
193+
if WRITE && unlikely(get_mem!((*asm).emu).breakout_imm) {
227194
imm_breakout!((*asm), pc, THUMB, total_cycles);
228195
}
229196
}

0 commit comments

Comments
 (0)