Commit 2157fa0682e3b2a1cb0b4864e6f4b86f88b1fae2
1 parent
d24b15a8
better fpu state dump
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1503 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
49 additions
and
11 deletions
target-i386/helper2.c
... | ... | @@ -250,7 +250,7 @@ void cpu_dump_state(CPUState *env, FILE *f, |
250 | 250 | int (*cpu_fprintf)(FILE *f, const char *fmt, ...), |
251 | 251 | int flags) |
252 | 252 | { |
253 | - int eflags, i; | |
253 | + int eflags, i, nb; | |
254 | 254 | char cc_op_name[32]; |
255 | 255 | static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" }; |
256 | 256 | |
... | ... | @@ -398,16 +398,54 @@ void cpu_dump_state(CPUState *env, FILE *f, |
398 | 398 | } |
399 | 399 | } |
400 | 400 | if (flags & X86_DUMP_FPU) { |
401 | - cpu_fprintf(f, "ST0=%f ST1=%f ST2=%f ST3=%f\n", | |
402 | - (double)env->fpregs[0].d, | |
403 | - (double)env->fpregs[1].d, | |
404 | - (double)env->fpregs[2].d, | |
405 | - (double)env->fpregs[3].d); | |
406 | - cpu_fprintf(f, "ST4=%f ST5=%f ST6=%f ST7=%f\n", | |
407 | - (double)env->fpregs[4].d, | |
408 | - (double)env->fpregs[5].d, | |
409 | - (double)env->fpregs[7].d, | |
410 | - (double)env->fpregs[8].d); | |
401 | + int fptag; | |
402 | + fptag = 0; | |
403 | + for(i = 0; i < 8; i++) { | |
404 | + fptag |= ((!env->fptags[i]) << i); | |
405 | + } | |
406 | + cpu_fprintf(f, "FCW=%04x FSW=%04x [ST=%d] FTW=%02x MXCSR=%08x\n", | |
407 | + env->fpuc, | |
408 | + (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11, | |
409 | + env->fpstt, | |
410 | + fptag, | |
411 | + env->mxcsr); | |
412 | + for(i=0;i<8;i++) { | |
413 | +#if defined(USE_X86LDOUBLE) | |
414 | + union { | |
415 | + long double d; | |
416 | + struct { | |
417 | + uint64_t lower; | |
418 | + uint16_t upper; | |
419 | + } l; | |
420 | + } tmp; | |
421 | + tmp.d = env->fpregs[i].d; | |
422 | + cpu_fprintf(f, "FPR%d=%016llx %04x", | |
423 | + i, tmp.l.lower, tmp.l.upper); | |
424 | +#else | |
425 | + cpu_fprintf(f, "FPR%d=%016llx", | |
426 | + i, env->fpregs[i].mmx.q); | |
427 | +#endif | |
428 | + if ((i & 1) == 1) | |
429 | + cpu_fprintf(f, "\n"); | |
430 | + else | |
431 | + cpu_fprintf(f, " "); | |
432 | + } | |
433 | + if (env->hflags & HF_CS64_MASK) | |
434 | + nb = 16; | |
435 | + else | |
436 | + nb = 8; | |
437 | + for(i=0;i<nb;i++) { | |
438 | + cpu_fprintf(f, "XMM%02d=%08x%08x%08x%08x", | |
439 | + i, | |
440 | + env->xmm_regs[i].XMM_L(3), | |
441 | + env->xmm_regs[i].XMM_L(2), | |
442 | + env->xmm_regs[i].XMM_L(1), | |
443 | + env->xmm_regs[i].XMM_L(0)); | |
444 | + if ((i & 1) == 1) | |
445 | + cpu_fprintf(f, "\n"); | |
446 | + else | |
447 | + cpu_fprintf(f, " "); | |
448 | + } | |
411 | 449 | } |
412 | 450 | } |
413 | 451 | ... | ... |