comparison gen_x86.h @ 2268:5b308c7b098c

Avoid code mem allocation bomb when a div instruction gets rewritten
author Michael Pavone <pavone@retrodev.com>
date Sun, 25 Dec 2022 18:16:44 -0800
parents e45a317802bd
children
comparison
equal deleted inserted replaced
2267:94cca8b8429e 2268:5b308c7b098c
216 void btc_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size); 216 void btc_rrdisp(code_info *code, uint8_t src, uint8_t dst_base, int32_t dst_disp, uint8_t size);
217 void btc_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size); 217 void btc_ir(code_info *code, uint8_t val, uint8_t dst, uint8_t size);
218 void btc_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size); 218 void btc_irdisp(code_info *code, uint8_t val, uint8_t dst_base, int32_t dst_disp, uint8_t size);
219 void jcc(code_info *code, uint8_t cc, code_ptr dest); 219 void jcc(code_info *code, uint8_t cc, code_ptr dest);
220 void jmp_rind(code_info *code, uint8_t dst); 220 void jmp_rind(code_info *code, uint8_t dst);
221 void jmp_nocheck(code_info *code, code_ptr dest);
221 void call_noalign(code_info *code, code_ptr fun); 222 void call_noalign(code_info *code, code_ptr fun);
222 void call_r(code_info *code, uint8_t dst); 223 void call_r(code_info *code, uint8_t dst);
223 void retn(code_info *code); 224 void retn(code_info *code);
224 void cdq(code_info *code); 225 void cdq(code_info *code);
225 void loop(code_info *code, code_ptr dst); 226 void loop(code_info *code, code_ptr dst);
226 uint8_t is_mov_ir(code_ptr inst); 227 uint8_t is_mov_ir(code_ptr inst);
227 228
229 #define ALLOC_CODE_RETRY_POINT code_info tmp_alloc_retry = *code; alloc_code_retry:
230 #define ALLOC_CODE_RETRY_VAR code_info tmp_alloc_retry
231 #define ALLOC_CODE_RETRY_POINT_NO_VAR tmp_alloc_retry = *code; alloc_code_retry:
232 #define CHECK_BRANCH_DEST(ptr) if (code->cur - ((ptr) + 1) > 127 || code->cur - ((ptr) + 1) < -128) {\
233 code_info next_alloc_retry = *code;\
234 *code = tmp_alloc_retry;\
235 next_alloc_retry.cur = next_alloc_retry.last - (CODE_ALLOC_SIZE-RESERVE_WORDS);\
236 jmp_nocheck(code, next_alloc_retry.cur);\
237 *code = next_alloc_retry;\
238 goto alloc_code_retry;\
239 }\
240 *(ptr) = code->cur - ((ptr) + 1);
241
228 #endif //GEN_X86_H_ 242 #endif //GEN_X86_H_
229 243