Commit 9621339dcacc148a86d312d1e71623202c9df7db
1 parent
ede28208
changed basic block exit generation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@322 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
8 changed files
with
44 additions
and
38 deletions
dyngen-exec.h
... | ... | @@ -125,6 +125,8 @@ extern int printf(const char *, ...); |
125 | 125 | |
126 | 126 | #define xglue(x, y) x ## y |
127 | 127 | #define glue(x, y) xglue(x, y) |
128 | +#define stringify(s) tostring(s) | |
129 | +#define tostring(s) #s | |
128 | 130 | |
129 | 131 | #ifdef __alpha__ |
130 | 132 | /* the symbols are considered non exported so a br immediate is generated */ |
... | ... | @@ -153,3 +155,27 @@ extern int __op_param1, __op_param2, __op_param3; |
153 | 155 | #endif |
154 | 156 | |
155 | 157 | extern int __op_jmp0, __op_jmp1; |
158 | + | |
159 | +#ifdef __i386__ | |
160 | +#define EXIT_TB() asm volatile ("ret") | |
161 | +#endif | |
162 | +#ifdef __powerpc__ | |
163 | +#define EXIT_TB() asm volatile ("blr") | |
164 | +#endif | |
165 | +#ifdef __s390__ | |
166 | +#define EXIT_TB() asm volatile ("br %r14") | |
167 | +#endif | |
168 | +#ifdef __alpha__ | |
169 | +#define EXIT_TB() asm volatile ("ret") | |
170 | +#endif | |
171 | +#ifdef __ia64__ | |
172 | +#define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;") | |
173 | +#endif | |
174 | +#ifdef __sparc__ | |
175 | +#define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0\n" | |
176 | + "nop") | |
177 | +#endif | |
178 | +#ifdef __arm__ | |
179 | +#define EXIT_TB() asm volatile ("b exec_loop") | |
180 | +#endif | |
181 | + | ... | ... |
dyngen.c
... | ... | @@ -1306,38 +1306,10 @@ fprintf(outfile, |
1306 | 1306 | " the_end:\n" |
1307 | 1307 | ); |
1308 | 1308 | |
1309 | -/* generate epilogue */ | |
1310 | - switch(ELF_ARCH) { | |
1311 | - case EM_386: | |
1312 | - fprintf(outfile, "*gen_code_ptr++ = 0xc3; /* ret */\n"); | |
1313 | - break; | |
1314 | - case EM_PPC: | |
1315 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x4e800020; /* blr */\n"); | |
1316 | - break; | |
1317 | - case EM_S390: | |
1318 | - fprintf(outfile, "*((uint16_t *)gen_code_ptr)++ = 0x07fe; /* br %%r14 */\n"); | |
1319 | - break; | |
1320 | - case EM_ALPHA: | |
1321 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x6bfa8001; /* ret */\n"); | |
1322 | - break; | |
1323 | - case EM_IA_64: | |
1324 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x00840008; /* br.ret.sptk.many b0;; */\n"); | |
1325 | - break; | |
1326 | - case EM_SPARC: | |
1327 | - case EM_SPARC32PLUS: | |
1328 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x81c62008; /* jmpl %%i0 + 8, %%g0 */\n"); | |
1329 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x01000000; /* nop */\n"); | |
1330 | - break; | |
1331 | - case EM_SPARCV9: | |
1332 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x81c7e008; /* ret */\n"); | |
1333 | - fprintf(outfile, "*((uint32_t *)gen_code_ptr)++ = 0x81e80000; /* restore */\n"); | |
1334 | - break; | |
1335 | - case EM_ARM: | |
1336 | - fprintf(outfile, "gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, arm_ldr_ptr, arm_data_table, arm_data_ptr, 0);\n"); | |
1337 | - break; | |
1338 | - default: | |
1339 | - error("unknown ELF architecture"); | |
1340 | - } | |
1309 | +/* generate some code patching */ | |
1310 | +#ifdef HOST_ARM | |
1311 | +fprintf(outfile, "gen_code_ptr = arm_flush_ldr(gen_code_ptr, arm_ldr_table, arm_ldr_ptr, arm_data_table, arm_data_ptr, 0);\n"); | |
1312 | +#endif | |
1341 | 1313 | /* flush instruction cache */ |
1342 | 1314 | fprintf(outfile, "flush_icache_range((unsigned long)gen_code_buf, (unsigned long)gen_code_ptr);\n"); |
1343 | 1315 | ... | ... |
dyngen.h
... | ... | @@ -152,11 +152,7 @@ static uint8_t *arm_flush_ldr(uint8_t *gen_code_ptr, |
152 | 152 | |
153 | 153 | data_size = (uint8_t *)data_end - (uint8_t *)data_start; |
154 | 154 | |
155 | - if (!gen_jmp) { | |
156 | - /* b exec_loop */ | |
157 | - arm_reloc_pc24((uint32_t *)gen_code_ptr, 0xeafffffe, (long)(&exec_loop)); | |
158 | - gen_code_ptr += 4; | |
159 | - } else { | |
155 | + if (gen_jmp) { | |
160 | 156 | /* generate branch to skip the data */ |
161 | 157 | if (data_size == 0) |
162 | 158 | return gen_code_ptr; | ... | ... |
exec.h
op-arm.c
op-i386.c
translate-arm.c
... | ... | @@ -828,6 +828,7 @@ static inline int gen_intermediate_code_internal(TranslationBlock *tb, int searc |
828 | 828 | case DISAS_JUMP: |
829 | 829 | /* indicate that the hash table must be used to find the next TB */ |
830 | 830 | gen_op_movl_T0_0(); |
831 | + gen_op_exit_tb(); | |
831 | 832 | break; |
832 | 833 | case DISAS_TB_JUMP: |
833 | 834 | /* nothing more to generate */ | ... | ... |
translate-i386.c
... | ... | @@ -4163,6 +4163,7 @@ static inline int gen_intermediate_code_internal(TranslationBlock *tb, int searc |
4163 | 4163 | if (dc->is_jmp != DISAS_TB_JUMP) { |
4164 | 4164 | /* indicate that the hash table must be used to find the next TB */ |
4165 | 4165 | gen_op_movl_T0_0(); |
4166 | + gen_op_exit_tb(); | |
4166 | 4167 | } |
4167 | 4168 | *gen_opc_ptr = INDEX_op_end; |
4168 | 4169 | /* we don't forget to fill the last values */ | ... | ... |