sh2 drc, fix constant memory address access calculation

This commit is contained in:
kub 2021-06-16 22:21:08 +02:00
parent cbd148906d
commit b5aba27c9b

View file

@ -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);