Commit 1017ebe9cb38ae034b0e7c6c449abe2c9b5284fb

Authored by bellard
1 parent 77f8dd5a

convert several x86 instructions at the same time


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@24 c046a42c-6fe2-441c-8c8c-71466251a162
Makefile
@@ -86,7 +86,7 @@ i386.ld ppc.ld\ @@ -86,7 +86,7 @@ i386.ld ppc.ld\
86 tests/Makefile\ 86 tests/Makefile\
87 tests/test-i386.c tests/test-i386-shift.h tests/test-i386.h\ 87 tests/test-i386.c tests/test-i386-shift.h tests/test-i386.h\
88 tests/test-i386-muldiv.h\ 88 tests/test-i386-muldiv.h\
89 -tests/test2.c tests/hello.c tests/sha1.c tests/test1.c 89 +tests/test2.c tests/hello.c tests/sha1.c
90 90
91 FILE=gemu-$(VERSION) 91 FILE=gemu-$(VERSION)
92 92
cpu-i386.h
@@ -242,7 +242,7 @@ int cpu_x86_exec(CPUX86State *s); @@ -242,7 +242,7 @@ int cpu_x86_exec(CPUX86State *s);
242 void cpu_x86_close(CPUX86State *s); 242 void cpu_x86_close(CPUX86State *s);
243 243
244 /* internal functions */ 244 /* internal functions */
245 -int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr,  
246 - uint8_t *pc_start); 245 +int cpu_x86_gen_code(uint8_t *gen_code_buf, int max_code_size,
  246 + int *gen_code_size_ptr, uint8_t *pc_start);
247 247
248 #endif /* CPU_I386_H */ 248 #endif /* CPU_I386_H */
op-i386.c
@@ -1959,7 +1959,8 @@ int cpu_x86_exec(CPUX86State *env1) @@ -1959,7 +1959,8 @@ int cpu_x86_exec(CPUX86State *env1)
1959 #endif 1959 #endif
1960 } 1960 }
1961 #endif 1961 #endif
1962 - cpu_x86_gen_code(code_gen_buffer, &code_gen_size, (uint8_t *)env->pc); 1962 + cpu_x86_gen_code(code_gen_buffer, sizeof(code_gen_buffer),
  1963 + &code_gen_size, (uint8_t *)env->pc);
1963 /* execute the generated code */ 1964 /* execute the generated code */
1964 gen_func = (void *)code_gen_buffer; 1965 gen_func = (void *)code_gen_buffer;
1965 gen_func(); 1966 gen_func();
translate-i386.c
@@ -995,7 +995,7 @@ static void gen_jcc(DisasContext *s, int b, int val) @@ -995,7 +995,7 @@ static void gen_jcc(DisasContext *s, int b, int val)
995 default: 995 default:
996 slow_jcc: 996 slow_jcc:
997 if (s->cc_op != CC_OP_DYNAMIC) 997 if (s->cc_op != CC_OP_DYNAMIC)
998 - op_set_cc_op(s->cc_op); 998 + gen_op_set_cc_op(s->cc_op);
999 func = gen_jcc_slow[jcc_op]; 999 func = gen_jcc_slow[jcc_op];
1000 break; 1000 break;
1001 } 1001 }
@@ -1041,10 +1041,10 @@ static void gen_setcc(DisasContext *s, int b) @@ -1041,10 +1041,10 @@ static void gen_setcc(DisasContext *s, int b)
1041 case CC_OP_SHLL: 1041 case CC_OP_SHLL:
1042 switch(jcc_op) { 1042 switch(jcc_op) {
1043 case JCC_Z: 1043 case JCC_Z:
1044 - func = gen_setcc_sub[s->cc_op - CC_OP_ADDB][jcc_op]; 1044 + func = gen_setcc_sub[(s->cc_op - CC_OP_ADDB) % 3][jcc_op];
1045 break; 1045 break;
1046 case JCC_S: 1046 case JCC_S:
1047 - func = gen_setcc_sub[s->cc_op - CC_OP_ADDB][jcc_op]; 1047 + func = gen_setcc_sub[(s->cc_op - CC_OP_ADDB) % 3][jcc_op];
1048 break; 1048 break;
1049 default: 1049 default:
1050 goto slow_jcc; 1050 goto slow_jcc;
@@ -1053,7 +1053,7 @@ static void gen_setcc(DisasContext *s, int b) @@ -1053,7 +1053,7 @@ static void gen_setcc(DisasContext *s, int b)
1053 default: 1053 default:
1054 slow_jcc: 1054 slow_jcc:
1055 if (s->cc_op != CC_OP_DYNAMIC) 1055 if (s->cc_op != CC_OP_DYNAMIC)
1056 - op_set_cc_op(s->cc_op); 1056 + gen_op_set_cc_op(s->cc_op);
1057 func = gen_setcc_slow[jcc_op]; 1057 func = gen_setcc_slow[jcc_op];
1058 break; 1058 break;
1059 } 1059 }
@@ -1891,7 +1891,7 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr) @@ -1891,7 +1891,7 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr)
1891 break; 1891 break;
1892 case 0x3c: /* fbld */ 1892 case 0x3c: /* fbld */
1893 gen_op_fpush(); 1893 gen_op_fpush();
1894 - op_fbld_ST0_A0(); 1894 + gen_op_fbld_ST0_A0();
1895 break; 1895 break;
1896 case 0x3e: /* fbstp */ 1896 case 0x3e: /* fbstp */
1897 gen_op_fbst_ST0_A0(); 1897 gen_op_fbst_ST0_A0();
@@ -2338,6 +2338,8 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr) @@ -2338,6 +2338,8 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr)
2338 /************************/ 2338 /************************/
2339 /* flags */ 2339 /* flags */
2340 case 0x9c: /* pushf */ 2340 case 0x9c: /* pushf */
  2341 + if (s->cc_op != CC_OP_DYNAMIC)
  2342 + gen_op_set_cc_op(s->cc_op);
2341 gen_op_movl_T0_eflags(); 2343 gen_op_movl_T0_eflags();
2342 gen_op_pushl_T0(); 2344 gen_op_pushl_T0();
2343 break; 2345 break;
@@ -2349,31 +2351,31 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr) @@ -2349,31 +2351,31 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr)
2349 case 0x9e: /* sahf */ 2351 case 0x9e: /* sahf */
2350 gen_op_mov_TN_reg[OT_BYTE][0][R_AH](); 2352 gen_op_mov_TN_reg[OT_BYTE][0][R_AH]();
2351 if (s->cc_op != CC_OP_DYNAMIC) 2353 if (s->cc_op != CC_OP_DYNAMIC)
2352 - op_set_cc_op(s->cc_op); 2354 + gen_op_set_cc_op(s->cc_op);
2353 gen_op_movb_eflags_T0(); 2355 gen_op_movb_eflags_T0();
2354 s->cc_op = CC_OP_EFLAGS; 2356 s->cc_op = CC_OP_EFLAGS;
2355 break; 2357 break;
2356 case 0x9f: /* lahf */ 2358 case 0x9f: /* lahf */
2357 if (s->cc_op != CC_OP_DYNAMIC) 2359 if (s->cc_op != CC_OP_DYNAMIC)
2358 - op_set_cc_op(s->cc_op); 2360 + gen_op_set_cc_op(s->cc_op);
2359 gen_op_movl_T0_eflags(); 2361 gen_op_movl_T0_eflags();
2360 gen_op_mov_reg_T0[OT_BYTE][R_AH](); 2362 gen_op_mov_reg_T0[OT_BYTE][R_AH]();
2361 break; 2363 break;
2362 case 0xf5: /* cmc */ 2364 case 0xf5: /* cmc */
2363 if (s->cc_op != CC_OP_DYNAMIC) 2365 if (s->cc_op != CC_OP_DYNAMIC)
2364 - op_set_cc_op(s->cc_op); 2366 + gen_op_set_cc_op(s->cc_op);
2365 gen_op_cmc(); 2367 gen_op_cmc();
2366 s->cc_op = CC_OP_EFLAGS; 2368 s->cc_op = CC_OP_EFLAGS;
2367 break; 2369 break;
2368 case 0xf8: /* clc */ 2370 case 0xf8: /* clc */
2369 if (s->cc_op != CC_OP_DYNAMIC) 2371 if (s->cc_op != CC_OP_DYNAMIC)
2370 - op_set_cc_op(s->cc_op); 2372 + gen_op_set_cc_op(s->cc_op);
2371 gen_op_clc(); 2373 gen_op_clc();
2372 s->cc_op = CC_OP_EFLAGS; 2374 s->cc_op = CC_OP_EFLAGS;
2373 break; 2375 break;
2374 case 0xf9: /* stc */ 2376 case 0xf9: /* stc */
2375 if (s->cc_op != CC_OP_DYNAMIC) 2377 if (s->cc_op != CC_OP_DYNAMIC)
2376 - op_set_cc_op(s->cc_op); 2378 + gen_op_set_cc_op(s->cc_op);
2377 gen_op_stc(); 2379 gen_op_stc();
2378 s->cc_op = CC_OP_EFLAGS; 2380 s->cc_op = CC_OP_EFLAGS;
2379 break; 2381 break;
@@ -2503,10 +2505,11 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr) @@ -2503,10 +2505,11 @@ long disas_insn(DisasContext *s, uint8_t *pc_start, int *is_jmp_ptr)
2503 } 2505 }
2504 2506
2505 /* return the next pc */ 2507 /* return the next pc */
2506 -int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr,  
2507 - uint8_t *pc_start) 2508 +int cpu_x86_gen_code(uint8_t *gen_code_buf, int max_code_size,
  2509 + int *gen_code_size_ptr, uint8_t *pc_start)
2508 { 2510 {
2509 DisasContext dc1, *dc = &dc1; 2511 DisasContext dc1, *dc = &dc1;
  2512 + uint8_t *gen_code_end, *pc_ptr;
2510 int is_jmp; 2513 int is_jmp;
2511 long ret; 2514 long ret;
2512 #ifdef DEBUG_DISAS 2515 #ifdef DEBUG_DISAS
@@ -2515,35 +2518,18 @@ int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr, @@ -2515,35 +2518,18 @@ int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr,
2515 2518
2516 dc->cc_op = CC_OP_DYNAMIC; 2519 dc->cc_op = CC_OP_DYNAMIC;
2517 gen_code_ptr = gen_code_buf; 2520 gen_code_ptr = gen_code_buf;
  2521 + gen_code_end = gen_code_buf + max_code_size - 4096;
2518 gen_start(); 2522 gen_start();
2519 2523
2520 -#ifdef DEBUG_DISAS  
2521 - if (loglevel) {  
2522 - INIT_DISASSEMBLE_INFO(disasm_info, logfile, fprintf);  
2523 - disasm_info.buffer = pc_start;  
2524 - disasm_info.buffer_vma = (unsigned long)pc_start;  
2525 - disasm_info.buffer_length = 15;  
2526 -#if 0  
2527 - disasm_info.flavour = bfd_get_flavour (abfd);  
2528 - disasm_info.arch = bfd_get_arch (abfd);  
2529 - disasm_info.mach = bfd_get_mach (abfd);  
2530 -#endif  
2531 -#ifdef WORDS_BIGENDIAN  
2532 - disasm_info.endian = BFD_ENDIAN_BIG;  
2533 -#else  
2534 - disasm_info.endian = BFD_ENDIAN_LITTLE;  
2535 -#endif  
2536 - fprintf(logfile, "IN:\n");  
2537 - fprintf(logfile, "0x%08lx: ", (long)pc_start);  
2538 - print_insn_i386((unsigned long)pc_start, &disasm_info);  
2539 - fprintf(logfile, "\n\n");  
2540 - }  
2541 -#endif  
2542 is_jmp = 0; 2524 is_jmp = 0;
2543 - ret = disas_insn(dc, pc_start, &is_jmp);  
2544 - if (ret == -1)  
2545 - error("unknown instruction at PC=0x%x B=%02x %02x",  
2546 - pc_start, pc_start[0], pc_start[1]); 2525 + pc_ptr = pc_start;
  2526 + do {
  2527 + ret = disas_insn(dc, pc_ptr, &is_jmp);
  2528 + if (ret == -1)
  2529 + error("unknown instruction at PC=0x%x B=%02x %02x",
  2530 + pc_ptr, pc_ptr[0], pc_ptr[1]);
  2531 + pc_ptr = (void *)ret;
  2532 + } while (!is_jmp && gen_code_ptr < gen_code_end);
2547 /* we must store the eflags state if it is not already done */ 2533 /* we must store the eflags state if it is not already done */
2548 if (dc->cc_op != CC_OP_DYNAMIC) 2534 if (dc->cc_op != CC_OP_DYNAMIC)
2549 gen_op_set_cc_op(dc->cc_op); 2535 gen_op_set_cc_op(dc->cc_op);
@@ -2559,6 +2545,30 @@ int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr, @@ -2559,6 +2545,30 @@ int cpu_x86_gen_code(uint8_t *gen_code_buf, int *gen_code_size_ptr,
2559 uint8_t *pc; 2545 uint8_t *pc;
2560 int count; 2546 int count;
2561 2547
  2548 + INIT_DISASSEMBLE_INFO(disasm_info, logfile, fprintf);
  2549 +#if 0
  2550 + disasm_info.flavour = bfd_get_flavour (abfd);
  2551 + disasm_info.arch = bfd_get_arch (abfd);
  2552 + disasm_info.mach = bfd_get_mach (abfd);
  2553 +#endif
  2554 +#ifdef WORDS_BIGENDIAN
  2555 + disasm_info.endian = BFD_ENDIAN_BIG;
  2556 +#else
  2557 + disasm_info.endian = BFD_ENDIAN_LITTLE;
  2558 +#endif
  2559 + fprintf(logfile, "IN:\n");
  2560 + disasm_info.buffer = pc_start;
  2561 + disasm_info.buffer_vma = (unsigned long)pc_start;
  2562 + disasm_info.buffer_length = pc_ptr - pc_start;
  2563 + pc = pc_start;
  2564 + while (pc < pc_ptr) {
  2565 + fprintf(logfile, "0x%08lx: ", (long)pc);
  2566 + count = print_insn_i386((unsigned long)pc, &disasm_info);
  2567 + fprintf(logfile, "\n");
  2568 + pc += count;
  2569 + }
  2570 + fprintf(logfile, "\n");
  2571 +
2562 pc = gen_code_buf; 2572 pc = gen_code_buf;
2563 disasm_info.buffer = pc; 2573 disasm_info.buffer = pc;
2564 disasm_info.buffer_vma = (unsigned long)pc; 2574 disasm_info.buffer_vma = (unsigned long)pc;