@@ -4,17 +4,23 @@ use crate::jit::jit_memory::{JitEntries, JitEntry, JitLiveRanges, BIOS_UNINTERRU
44use crate :: utils:: HeapMemU32 ;
55use CpuType :: { ARM7 , ARM9 } ;
66
7+ // ARM9 Bios starts at 0xFFFF0000, but just treat everything above OAM region as bios
8+ // Also omit 0xF msb to save more memory
9+ const MEMORY_RANGE_ARM9 : u32 = 0x10000000 ;
10+ const MEMORY_RANGE_ARM7 : u32 = regions:: OAM_OFFSET ;
11+
712pub const BLOCK_SHIFT : usize = 13 ;
813pub const BLOCK_SIZE : usize = 1 << BLOCK_SHIFT ;
9- const SIZE : usize = ( 1 << 31 ) / BLOCK_SIZE ;
10- const LIVE_RANGES_SIZE : usize = 1 << ( 32 - JIT_LIVE_RANGE_PAGE_SIZE_SHIFT - 5 ) ;
14+ const SIZE_ARM9 : usize = ( MEMORY_RANGE_ARM9 >> 1 ) as usize / BLOCK_SIZE ;
15+ const SIZE_ARM7 : usize = ( MEMORY_RANGE_ARM7 >> 1 ) as usize / BLOCK_SIZE ;
16+ const LIVE_RANGES_SIZE : usize = ( regions:: OAM_OFFSET >> ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 3 ) ) as usize ;
1117
1218const BIOS_UNINTERRUPT_ENTRIES_ARM9 : [ JitEntry ; BLOCK_SIZE ] = [ BIOS_UNINTERRUPT_ENTRY_ARM9 ; BLOCK_SIZE ] ;
1319const BIOS_UNINTERRUPT_ENTRIES_ARM7 : [ JitEntry ; BLOCK_SIZE ] = [ BIOS_UNINTERRUPT_ENTRY_ARM7 ; BLOCK_SIZE ] ;
1420
1521pub struct JitMemoryMap {
16- map_arm9 : HeapMemU32 < SIZE > ,
17- map_arm7 : HeapMemU32 < SIZE > ,
22+ map_arm9 : HeapMemU32 < SIZE_ARM9 > ,
23+ map_arm7 : HeapMemU32 < SIZE_ARM7 > ,
1824 live_ranges_map_arm9 : HeapMemU32 < LIVE_RANGES_SIZE > ,
1925 live_ranges_map_arm7 : HeapMemU32 < LIVE_RANGES_SIZE > ,
2026}
@@ -28,36 +34,39 @@ impl JitMemoryMap {
2834 live_ranges_map_arm7 : HeapMemU32 :: new ( ) ,
2935 } ;
3036
31- for i in 0 ..SIZE {
37+ macro_rules! get_ptr {
38+ ( $addr: expr, $entries: expr) => { {
39+ ( unsafe { $entries. as_ptr( ) . add( ( $addr >> 1 ) % $entries. len( ) ) } as u32 )
40+ } } ;
41+ }
42+
43+ for i in 0 ..SIZE_ARM9 {
3244 let addr = ( i << BLOCK_SHIFT ) << 1 ;
3345 let arm9_ptr = & mut instance. map_arm9 [ i] ;
34- let arm7_ptr = & mut instance. map_arm7 [ i] ;
3546
36- macro_rules! get_ptr {
37- ( $entries: expr) => { {
38- ( unsafe { $entries. as_ptr( ) . add( ( addr >> 1 ) % $entries. len( ) ) } as u32 )
39- } } ;
47+ match ( addr as u32 ) & 0x0F000000 {
48+ regions:: INSTRUCTION_TCM_OFFSET | regions:: INSTRUCTION_TCM_MIRROR_OFFSET => * arm9_ptr = get_ptr ! ( addr, entries. itcm) ,
49+ regions:: MAIN_MEMORY_OFFSET => * arm9_ptr = get_ptr ! ( addr, entries. main_arm9) ,
50+ 0x0F000000 => * arm9_ptr = BIOS_UNINTERRUPT_ENTRIES_ARM9 . as_ptr ( ) as u32 ,
51+ _ => { }
4052 }
53+ }
4154
42- match ( addr as u32 ) & 0xFF000000 {
43- 0 => {
44- * arm9_ptr = get_ptr ! ( entries. itcm) ;
45- * arm7_ptr = BIOS_UNINTERRUPT_ENTRIES_ARM7 . as_ptr ( ) as u32 ;
46- }
47- regions:: INSTRUCTION_TCM_MIRROR_OFFSET => * arm9_ptr = get_ptr ! ( entries. itcm) ,
48- regions:: MAIN_MEMORY_OFFSET => {
49- * arm9_ptr = get_ptr ! ( entries. main_arm9) ;
50- * arm7_ptr = get_ptr ! ( entries. main_arm7) ;
51- }
52- regions:: SHARED_WRAM_OFFSET => * arm7_ptr = get_ptr ! ( entries. wram) ,
53- regions:: VRAM_OFFSET => * arm7_ptr = get_ptr ! ( entries. vram_arm7) ,
54- 0xFF000000 => * arm9_ptr = BIOS_UNINTERRUPT_ENTRIES_ARM9 . as_ptr ( ) as u32 ,
55+ for i in 0 ..SIZE_ARM7 {
56+ let addr = ( i << BLOCK_SHIFT ) << 1 ;
57+ let arm7_ptr = & mut instance. map_arm7 [ i] ;
58+
59+ match ( addr as u32 ) & 0x0F000000 {
60+ 0 => * arm7_ptr = BIOS_UNINTERRUPT_ENTRIES_ARM7 . as_ptr ( ) as u32 ,
61+ regions:: MAIN_MEMORY_OFFSET => * arm7_ptr = get_ptr ! ( addr, entries. main_arm7) ,
62+ regions:: SHARED_WRAM_OFFSET => * arm7_ptr = get_ptr ! ( addr, entries. wram) ,
63+ regions:: VRAM_OFFSET => * arm7_ptr = get_ptr ! ( addr, entries. vram_arm7) ,
5564 _ => { }
5665 }
5766 }
5867
5968 for i in 0 ..LIVE_RANGES_SIZE {
60- let addr = i << ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 5 ) ;
69+ let addr = i << ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 3 ) ;
6170 let arm9_ptr = & mut instance. live_ranges_map_arm9 [ i] ;
6271 let arm7_ptr = & mut instance. live_ranges_map_arm7 [ i] ;
6372
@@ -68,9 +77,7 @@ impl JitMemoryMap {
6877 }
6978
7079 match ( addr as u32 ) & 0xFF000000 {
71- 0 => {
72- * arm9_ptr = get_ptr ! ( live_ranges. itcm) ;
73- }
80+ 0 => * arm9_ptr = get_ptr ! ( live_ranges. itcm) ,
7481 regions:: INSTRUCTION_TCM_MIRROR_OFFSET => * arm9_ptr = get_ptr ! ( live_ranges. itcm) ,
7582 regions:: MAIN_MEMORY_OFFSET => {
7683 * arm9_ptr = get_ptr ! ( live_ranges. main) ;
@@ -86,7 +93,7 @@ impl JitMemoryMap {
8693 }
8794
8895 pub fn get_jit_entry < const CPU : CpuType > ( & self , addr : u32 ) -> * mut JitEntry {
89- let addr = addr >> 1 ;
96+ let addr = ( addr & 0x0FFFFFFF ) >> 1 ;
9097 macro_rules! get_jit_entry {
9198 ( $map: expr) => { {
9299 unsafe { ( $map[ ( addr >> BLOCK_SHIFT ) as usize ] as * mut JitEntry ) . add( ( addr as usize ) & ( BLOCK_SIZE - 1 ) ) }
@@ -98,10 +105,10 @@ impl JitMemoryMap {
98105 }
99106 }
100107
101- pub fn get_live_range < const CPU : CpuType > ( & self , addr : u32 ) -> * mut u32 {
108+ pub fn get_live_range < const CPU : CpuType > ( & self , addr : u32 ) -> * mut u8 {
102109 match CPU {
103- ARM9 => self . live_ranges_map_arm9 [ ( addr >> ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 5 ) ) as usize ] as _ ,
104- ARM7 => self . live_ranges_map_arm7 [ ( addr >> ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 5 ) ) as usize ] as _ ,
110+ ARM9 => self . live_ranges_map_arm9 [ ( addr >> ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 3 ) ) as usize ] as _ ,
111+ ARM7 => self . live_ranges_map_arm7 [ ( addr >> ( JIT_LIVE_RANGE_PAGE_SIZE_SHIFT + 3 ) ) as usize ] as _ ,
105112 }
106113 }
107114
0 commit comments