comparison backend_x86.c @ 2138:b6338e18787e

Fix some dynarec code invalidation issues
author Michael Pavone <pavone@retrodev.com>
date Sat, 19 Mar 2022 15:50:45 -0700
parents 9caebcfeac72
children f82c090c1e89
comparison
equal deleted inserted replaced
2137:3ef9456b76cf 2138:b6338e18787e
164 164
165 if (memmap[chunk].mask != opts->address_mask) { 165 if (memmap[chunk].mask != opts->address_mask) {
166 and_ir(code, memmap[chunk].mask, adr_reg, opts->address_size); 166 and_ir(code, memmap[chunk].mask, adr_reg, opts->address_size);
167 } 167 }
168 code_ptr after_normal = NULL; 168 code_ptr after_normal = NULL;
169 uint8_t need_addr_pop = 0;
169 if (size == SZ_B && memmap[chunk].shift != 0) { 170 if (size == SZ_B && memmap[chunk].shift != 0) {
171 if (is_write && (memmap[chunk].flags & MMAP_CODE)) {
172 push_r(code, adr_reg);
173 need_addr_pop = 1;
174 }
170 btr_ir(code, 0, adr_reg, opts->address_size); 175 btr_ir(code, 0, adr_reg, opts->address_size);
171 code_ptr normal = code->cur+1; 176 code_ptr normal = code->cur+1;
172 jcc(code, CC_NC, normal); 177 jcc(code, CC_NC, normal);
173 if (memmap[chunk].shift > 0) { 178 if (memmap[chunk].shift > 0) {
174 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size); 179 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size);
179 after_normal = code->cur + 1; 184 after_normal = code->cur + 1;
180 jmp(code, after_normal); 185 jmp(code, after_normal);
181 *normal = code->cur - (normal + 1); 186 *normal = code->cur - (normal + 1);
182 } 187 }
183 if (memmap[chunk].shift > 0) { 188 if (memmap[chunk].shift > 0) {
189 if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) {
190 push_r(code, adr_reg);
191 need_addr_pop = 1;
192 }
184 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size); 193 shl_ir(code, memmap[chunk].shift, adr_reg, opts->address_size);
185 } else if (memmap[chunk].shift < 0) { 194 } else if (memmap[chunk].shift < 0) {
195 if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) {
196 push_r(code, adr_reg);
197 need_addr_pop = 1;
198 }
186 shr_ir(code, -memmap[chunk].shift, adr_reg, opts->address_size); 199 shr_ir(code, -memmap[chunk].shift, adr_reg, opts->address_size);
187 } 200 }
188 if (after_normal) { 201 if (after_normal) {
189 *after_normal = code->cur - (after_normal + 1); 202 *after_normal = code->cur - (after_normal + 1);
190 } 203 }
230 xor_ir(code, 1, adr_reg, opts->address_size); 243 xor_ir(code, 1, adr_reg, opts->address_size);
231 } 244 }
232 if (opts->address_size != SZ_D) { 245 if (opts->address_size != SZ_D) {
233 movzx_rr(code, adr_reg, adr_reg, opts->address_size, SZ_D); 246 movzx_rr(code, adr_reg, adr_reg, opts->address_size, SZ_D);
234 } 247 }
235 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { 248 if (!need_addr_pop && is_write && (memmap[chunk].flags & MMAP_CODE)) {
236 push_r(code, adr_reg); 249 push_r(code, adr_reg);
250 need_addr_pop = 1;
237 } 251 }
238 add_rdispr(code, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, adr_reg, SZ_PTR); 252 add_rdispr(code, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, adr_reg, SZ_PTR);
239 if (is_write) { 253 if (is_write) {
240 mov_rrind(code, opts->scratch1, opts->scratch2, size); 254 mov_rrind(code, opts->scratch1, opts->scratch2, size);
241 if (memmap[chunk].flags & MMAP_CODE) {
242 pop_r(code, adr_reg);
243 }
244 } else { 255 } else {
245 mov_rindr(code, opts->scratch1, opts->scratch1, size); 256 mov_rindr(code, opts->scratch1, opts->scratch1, size);
246 } 257 }
247 } else { 258 } else {
248 uint8_t tmp_size = size; 259 uint8_t tmp_size = size;
281 push_r(code, opts->scratch2); 292 push_r(code, opts->scratch2);
282 mov_ir(code, (intptr_t)memmap[chunk].buffer, opts->scratch2, SZ_PTR); 293 mov_ir(code, (intptr_t)memmap[chunk].buffer, opts->scratch2, SZ_PTR);
283 add_rdispr(code, RSP, 0, opts->scratch2, SZ_PTR); 294 add_rdispr(code, RSP, 0, opts->scratch2, SZ_PTR);
284 mov_rrind(code, opts->scratch1, opts->scratch2, tmp_size); 295 mov_rrind(code, opts->scratch1, opts->scratch2, tmp_size);
285 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { 296 if (is_write && (memmap[chunk].flags & MMAP_CODE)) {
286 pop_r(code, opts->scratch2); 297 need_addr_pop = 1;
287 } else { 298 } else {
288 add_ir(code, sizeof(void*), RSP, SZ_PTR); 299 add_ir(code, sizeof(void*), RSP, SZ_PTR);
289 code->stack_off -= sizeof(void *); 300 code->stack_off -= sizeof(void *);
290 } 301 }
291 } else { 302 } else {
303 or_ir(code, 0xFF00, opts->scratch1, SZ_W); 314 or_ir(code, 0xFF00, opts->scratch1, SZ_W);
304 } 315 }
305 } 316 }
306 } 317 }
307 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { 318 if (is_write && (memmap[chunk].flags & MMAP_CODE)) {
319 if (need_addr_pop) {
320 pop_r(code, adr_reg);
321 }
308 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); 322 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size);
309 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); 323 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size);
310 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size); 324 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size);
311 code_ptr not_code = code->cur + 1; 325 code_ptr not_code = code->cur + 1;
312 jcc(code, CC_NC, code->cur + 2); 326 jcc(code, CC_NC, code->cur + 2);