mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
sh2 drc, fix constant memory address access calculation
This commit is contained in:
parent
cbd148906d
commit
b5aba27c9b
1 changed files with 5 additions and 4 deletions
|
@ -2612,8 +2612,8 @@ static uptr split_address(uptr la, uptr mask, s32 *offs)
|
||||||
uptr sign = (mask>>1) + 1; // sign bit in offset
|
uptr sign = (mask>>1) + 1; // sign bit in offset
|
||||||
*offs = (la & mask) | (la & sign ? ~mask : 0); // offset part, sign extended
|
*offs = (la & mask) | (la & sign ? ~mask : 0); // offset part, sign extended
|
||||||
la = (la & ~mask) + ((la & sign) << 1); // base part, corrected for offs sign
|
la = (la & ~mask) + ((la & sign) << 1); // base part, corrected for offs sign
|
||||||
if (~mask && la == ~mask && !(*offs & sign)) { // special case la=-1 & offs>0
|
if (~mask && la == ~mask && *offs > 0) { // special case la=-1&~mask && offs>0
|
||||||
*offs = -*offs;
|
*offs -= mask+1;
|
||||||
la = 0;
|
la = 0;
|
||||||
}
|
}
|
||||||
return la;
|
return la;
|
||||||
|
@ -2676,8 +2676,9 @@ static int emit_get_rbase_and_offs(SH2 *sh2, sh2_reg_e r, int rmode, s32 *offs)
|
||||||
// known fixed host address
|
// known fixed host address
|
||||||
la = split_address(la + ((a + *offs) & mask), omask, offs);
|
la = split_address(la + ((a + *offs) & mask), omask, offs);
|
||||||
if (la == 0) {
|
if (la == 0) {
|
||||||
la = *offs;
|
// offset only. optimize for hosts having short indexed addressing
|
||||||
*offs = 0;
|
la = *offs & ~0x7f; // keep the lower bits for endianess handling
|
||||||
|
*offs &= 0x7f;
|
||||||
}
|
}
|
||||||
hr = rcache_get_tmp();
|
hr = rcache_get_tmp();
|
||||||
emith_move_r_ptr_imm(hr, la);
|
emith_move_r_ptr_imm(hr, la);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue