Mercurial > repos > blastem
comparison backend_x86.c @ 658:6aa29ac33f1a
Use call_args and call_args_abi inside gen_mem_fun
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 01 Jan 2015 20:21:20 -0800 |
parents | 9d6fed6501ba |
children | 30ccf56842d6 |
comparison
equal
deleted
inserted
replaced
657:92ce5ea5ffc9 | 658:6aa29ac33f1a |
---|---|
89 if (memmap[chunk].flags & MMAP_FUNC_NULL) { | 89 if (memmap[chunk].flags & MMAP_FUNC_NULL) { |
90 cmp_irdisp(code, 0, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, SZ_PTR); | 90 cmp_irdisp(code, 0, opts->context_reg, opts->mem_ptr_off + sizeof(void*) * memmap[chunk].ptr_index, SZ_PTR); |
91 code_ptr not_null = code->cur + 1; | 91 code_ptr not_null = code->cur + 1; |
92 jcc(code, CC_NZ, code->cur + 2); | 92 jcc(code, CC_NZ, code->cur + 2); |
93 call(code, opts->save_context); | 93 call(code, opts->save_context); |
94 #ifdef X86_64 | |
95 if (is_write) { | 94 if (is_write) { |
96 if (opts->scratch2 != RDI) { | 95 call_args_abi(code, cfun, 3, opts->scratch2, opts->context_reg, opts->scratch1); |
97 mov_rr(code, opts->scratch2, RDI, opts->address_size); | 96 mov_rr(code, RAX, opts->context_reg, SZ_PTR); |
98 } | |
99 mov_rr(code, opts->scratch1, RDX, size); | |
100 } else { | 97 } else { |
101 push_r(code, opts->context_reg); | 98 push_r(code, opts->context_reg); |
102 mov_rr(code, opts->scratch1, RDI, opts->address_size); | 99 call_args_abi(code, cfun, 2, opts->scratch1, opts->context_reg); |
103 } | |
104 test_ir(code, 8, RSP, opts->address_size); | |
105 code_ptr adjust_rsp = code->cur + 1; | |
106 jcc(code, CC_NZ, code->cur + 2); | |
107 call(code, cfun); | |
108 code_ptr no_adjust = code->cur + 1; | |
109 jmp(code, code->cur + 2); | |
110 *adjust_rsp = code->cur - (adjust_rsp + 1); | |
111 sub_ir(code, 8, RSP, SZ_PTR); | |
112 call(code, cfun); | |
113 add_ir(code, 8, RSP, SZ_PTR); | |
114 *no_adjust = code->cur - (no_adjust + 1); | |
115 #else | |
116 if (is_write) { | |
117 push_r(code, opts->scratch1); | |
118 } else { | |
119 push_r(code, opts->context_reg);//save opts->context_reg for later | |
120 } | |
121 push_r(code, opts->context_reg); | |
122 push_r(code, is_write ? opts->scratch2 : opts->scratch1); | |
123 call(code, cfun); | |
124 add_ir(code, is_write ? 12 : 8, RSP, opts->address_size); | |
125 #endif | |
126 if (is_write) { | |
127 mov_rr(code, RAX, opts->context_reg, SZ_PTR); | |
128 } else { | |
129 pop_r(code, opts->context_reg); | 100 pop_r(code, opts->context_reg); |
130 mov_rr(code, RAX, opts->scratch1, size); | 101 mov_rr(code, RAX, opts->scratch1, size); |
131 } | 102 } |
132 jmp(code, opts->load_context); | 103 jmp(code, opts->load_context); |
133 | 104 |
204 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); | 175 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); |
205 bt_rrdisp(code, opts->scratch1, opts->context_reg, opts->ram_flags_off, opts->address_size); | 176 bt_rrdisp(code, opts->scratch1, opts->context_reg, opts->ram_flags_off, opts->address_size); |
206 code_ptr not_code = code->cur + 1; | 177 code_ptr not_code = code->cur + 1; |
207 jcc(code, CC_NC, code->cur + 2); | 178 jcc(code, CC_NC, code->cur + 2); |
208 call(code, opts->save_context); | 179 call(code, opts->save_context); |
209 #ifdef X86_32 | 180 call_args(code, opts->handle_code_write, 2, opts->scratch2, opts->context_reg); |
210 push_r(code, opts->context_reg); | |
211 push_r(code, opts->scratch2); | |
212 #else | |
213 if (opts->scratch2 != RDI) { | |
214 mov_rr(code, opts->scratch2, RDI, opts->address_size); | |
215 } | |
216 #endif | |
217 call(code, opts->handle_code_write); | |
218 #ifdef X86_32 | |
219 add_ir(code, 8, RSP, SZ_D); | |
220 #endif | |
221 mov_rr(code, RAX, opts->context_reg, SZ_PTR); | 181 mov_rr(code, RAX, opts->context_reg, SZ_PTR); |
222 call(code, opts->load_context); | 182 call(code, opts->load_context); |
223 *not_code = code->cur - (not_code+1); | 183 *not_code = code->cur - (not_code+1); |
224 } | 184 } |
225 retn(code); | 185 retn(code); |
226 } else if (cfun) { | 186 } else if (cfun) { |
227 call(code, opts->save_context); | 187 call(code, opts->save_context); |
228 #ifdef X86_64 | |
229 if (is_write) { | 188 if (is_write) { |
230 if (opts->scratch2 != RDI) { | 189 call_args_abi(code, cfun, 3, opts->scratch2, opts->context_reg, opts->scratch1); |
231 mov_rr(code, opts->scratch2, RDI, opts->address_size); | 190 mov_rr(code, RAX, opts->context_reg, SZ_PTR); |
232 } | |
233 mov_rr(code, opts->scratch1, RDX, size); | |
234 } else { | 191 } else { |
235 push_r(code, opts->context_reg); | 192 push_r(code, opts->context_reg); |
236 mov_rr(code, opts->scratch1, RDI, opts->address_size); | 193 call_args_abi(code, cfun, 2, opts->scratch1, opts->context_reg); |
237 } | |
238 test_ir(code, 8, RSP, SZ_D); | |
239 code_ptr adjust_rsp = code->cur + 1; | |
240 jcc(code, CC_NZ, code->cur + 2); | |
241 call(code, cfun); | |
242 code_ptr no_adjust = code->cur + 1; | |
243 jmp(code, code->cur + 2); | |
244 *adjust_rsp = code->cur - (adjust_rsp + 1); | |
245 sub_ir(code, 8, RSP, SZ_PTR); | |
246 call(code, cfun); | |
247 add_ir(code, 8, RSP, SZ_PTR); | |
248 *no_adjust = code->cur - (no_adjust+1); | |
249 #else | |
250 if (is_write) { | |
251 push_r(code, opts->scratch1); | |
252 } else { | |
253 push_r(code, opts->context_reg);//save opts->context_reg for later | |
254 } | |
255 push_r(code, opts->context_reg); | |
256 push_r(code, is_write ? opts->scratch2 : opts->scratch1); | |
257 call(code, cfun); | |
258 add_ir(code, is_write ? 12 : 8, RSP, SZ_D); | |
259 #endif | |
260 if (is_write) { | |
261 mov_rr(code, RAX, opts->context_reg, SZ_PTR); | |
262 } else { | |
263 pop_r(code, opts->context_reg); | 194 pop_r(code, opts->context_reg); |
264 mov_rr(code, RAX, opts->scratch1, size); | 195 mov_rr(code, RAX, opts->scratch1, size); |
265 } | 196 } |
266 jmp(code, opts->load_context); | 197 jmp(code, opts->load_context); |
267 } else { | 198 } else { |