@@ -75,6 +75,7 @@ extern int last_count; // last absolute target, often = next_interupt
75
75
76
76
extern int reg_cop2d [], reg_cop2c [];
77
77
78
+ extern void * hash_table_ptr ;
78
79
extern uintptr_t ram_offset ;
79
80
extern uintptr_t mini_ht [32 ][2 ];
80
81
@@ -400,7 +401,7 @@ void jump_to_new_pc();
400
401
void call_gteStall ();
401
402
void new_dyna_leave ();
402
403
403
- void * ndrc_get_addr_ht (u_int vaddr );
404
+ void * ndrc_get_addr_ht (u_int vaddr , struct ht_entry * ht );
404
405
void ndrc_add_jump_out (u_int vaddr , void * src );
405
406
void ndrc_write_invalidate_one (u_int addr );
406
407
static void ndrc_write_invalidate_many (u_int addr , u_int end );
@@ -642,9 +643,14 @@ static u_int get_page_prev(u_int vaddr)
642
643
return page ;
643
644
}
644
645
646
+ static struct ht_entry * hash_table_get_p (struct ht_entry * ht , u_int vaddr )
647
+ {
648
+ return & ht [((vaddr >> 16 ) ^ vaddr ) & 0xFFFF ];
649
+ }
650
+
645
651
static struct ht_entry * hash_table_get (u_int vaddr )
646
652
{
647
- return & hash_table [(( vaddr >> 16 )^ vaddr ) & 0xFFFF ] ;
653
+ return hash_table_get_p ( hash_table , vaddr ) ;
648
654
}
649
655
650
656
#define HASH_TABLE_BAD 0xbac
@@ -805,7 +811,8 @@ static noinline u_int generate_exception(u_int pc)
805
811
806
812
// Get address from virtual address
807
813
// This is called from the recompiled JR/JALR instructions
808
- static void noinline * get_addr (const u_int vaddr , enum ndrc_compile_mode compile_mode )
814
+ static void noinline * get_addr (struct ht_entry * ht , const u_int vaddr ,
815
+ enum ndrc_compile_mode compile_mode )
809
816
{
810
817
u_int start_page = get_page_prev (vaddr );
811
818
u_int i , page , end_page = get_page (vaddr );
@@ -846,31 +853,32 @@ static void noinline *get_addr(const u_int vaddr, enum ndrc_compile_mode compile
846
853
847
854
int r = new_recompile_block (vaddr );
848
855
if (likely (r == 0 ))
849
- return ndrc_get_addr_ht (vaddr );
856
+ return ndrc_get_addr_ht (vaddr , ht );
850
857
851
858
if (compile_mode == ndrc_cm_compile_live )
852
- return ndrc_get_addr_ht (generate_exception (vaddr ));
859
+ return ndrc_get_addr_ht (generate_exception (vaddr ), ht );
853
860
854
861
return NULL ;
855
862
}
856
863
857
864
// Look up address in hash table first
858
- void * ndrc_get_addr_ht_param (unsigned int vaddr , enum ndrc_compile_mode compile_mode )
865
+ void * ndrc_get_addr_ht_param (struct ht_entry * ht , unsigned int vaddr ,
866
+ enum ndrc_compile_mode compile_mode )
859
867
{
860
868
//check_for_block_changes(vaddr, vaddr + MAXBLOCK);
861
- const struct ht_entry * ht_bin = hash_table_get ( vaddr );
869
+ const struct ht_entry * ht_bin = hash_table_get_p ( ht , vaddr );
862
870
u_int vaddr_a = vaddr & ~3 ;
863
871
stat_inc (stat_ht_lookups );
864
872
if (ht_bin -> vaddr [0 ] == vaddr_a ) return ht_bin -> tcaddr [0 ];
865
873
if (ht_bin -> vaddr [1 ] == vaddr_a ) return ht_bin -> tcaddr [1 ];
866
- return get_addr (vaddr , compile_mode );
874
+ return get_addr (ht , vaddr , compile_mode );
867
875
}
868
876
869
877
// "usual" addr lookup for indirect branches, etc
870
878
// to be used by currently running code only
871
- void * ndrc_get_addr_ht (u_int vaddr )
879
+ void * ndrc_get_addr_ht (u_int vaddr , struct ht_entry * ht )
872
880
{
873
- return ndrc_get_addr_ht_param (vaddr , ndrc_cm_compile_live );
881
+ return ndrc_get_addr_ht_param (ht , vaddr , ndrc_cm_compile_live );
874
882
}
875
883
876
884
static void clear_all_regs (signed char regmap [])
@@ -1317,6 +1325,7 @@ static const char *fpofs_name(u_int ofs)
1317
1325
ofscase (psxH_ptr );
1318
1326
ofscase (invc_ptr );
1319
1327
ofscase (ram_offset );
1328
+ ofscase (hash_table_ptr );
1320
1329
#undef ofscase
1321
1330
}
1322
1331
buf [0 ] = 0 ;
@@ -3439,9 +3448,10 @@ static void store_assemble(int i, const struct regstat *i_regs, int ccadj_)
3439
3448
if (i_regs -> regmap == regs [i ].regmap ) {
3440
3449
load_all_consts (regs [i ].regmap_entry ,regs [i ].wasdirty ,i );
3441
3450
wb_dirtys (regs [i ].regmap_entry ,regs [i ].wasdirty );
3442
- emit_movimm (start + i * 4 + 4 ,0 );
3443
- emit_writeword (0 ,& psxRegs .pc );
3444
- emit_addimm (HOST_CCREG ,2 ,HOST_CCREG );
3451
+ emit_readptr (& hash_table_ptr , 1 );
3452
+ emit_movimm (start + i * 4 + 4 , 0 );
3453
+ emit_writeword (0 , & psxRegs .pc );
3454
+ emit_addimm (HOST_CCREG , 2 , HOST_CCREG );
3445
3455
emit_far_call (ndrc_get_addr_ht );
3446
3456
emit_jmpreg (0 );
3447
3457
}
@@ -3620,6 +3630,7 @@ static void cop0_assemble(int i, const struct regstat *i_regs, int ccadj_)
3620
3630
emit_cmp (HOST_TEMPREG , 0 );
3621
3631
void * jaddr = out ;
3622
3632
emit_jeq (0 );
3633
+ emit_readptr (& hash_table_ptr , 1 );
3623
3634
emit_far_call (ndrc_get_addr_ht );
3624
3635
emit_jmpreg (0 );
3625
3636
set_jump_target (jaddr , out );
@@ -6368,6 +6379,7 @@ void new_dynarec_init(void)
6368
6379
#endif
6369
6380
out = ndrc -> translation_cache ;
6370
6381
new_dynarec_clear_full ();
6382
+ hash_table_ptr = hash_table ;
6371
6383
#ifdef HOST_IMM8
6372
6384
// Copy this into local area so we don't have to put it in every literal pool
6373
6385
invc_ptr = invalid_code ;
@@ -6542,7 +6554,7 @@ void new_dynarec_load_blocks(const void *save, int size)
6542
6554
psxRegs .GPR .r [i ] = 0x1f800000 ;
6543
6555
}
6544
6556
6545
- ndrc_get_addr_ht_param (sblocks [b ].addr , ndrc_cm_compile_offline );
6557
+ ndrc_get_addr_ht_param (hash_table , sblocks [b ].addr , ndrc_cm_compile_offline );
6546
6558
6547
6559
for (f = sblocks [b ].regflags , i = 0 ; f ; f >>= 1 , i ++ ) {
6548
6560
if (f & 1 )
@@ -9038,6 +9050,7 @@ static int new_recompile_block(u_int addr)
9038
9050
emit_addimm (0 , 0x18 , 0 );
9039
9051
emit_adds_ptr (1 , 1 , 1 );
9040
9052
emit_ldr_dualindexed (1 , 0 , 0 );
9053
+ emit_readptr (& hash_table_ptr , 1 );
9041
9054
emit_writeword (0 , & psxRegs .GPR .r [26 ]); // lw k0, 0x18(sp)
9042
9055
emit_far_call (ndrc_get_addr_ht );
9043
9056
emit_jmpreg (0 ); // jr k0
0 commit comments