diff options
author | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-03-07 08:32:30 +0000 |
---|---|---|
committer | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-03-07 08:32:30 +0000 |
commit | 76a66253e5e48f1744f689041c1c21cedcaff630 (patch) | |
tree | c1003bd73ab8e2cbfe4a05c5b3f497bc2573fa4e /target-ppc/op_template.h | |
parent | 1c7b3754f68382941a1921e578ead25d97d116fb (diff) |
Great PowerPC emulation code resynchronisation and improvments:
- Add status file to make regression tracking easier
- Move all micro-operations helpers definitions into a separate header:
should never be seen outside of op.c
- Update copyrights
- Add new / missing PowerPC CPU definitions
- Add definitions for PowerPC BookE
- Add support for PowerPC 6xx/7xx software driven TLBs
Allow use of PowerPC 603 as an example
- Add preliminary code for POWER, POWER2, PowerPC 403, 405, 440, 601, 602
and BookE support
- Avoid compiling priviledged only resources support for user-mode emulation
- Remove unused helpers / micro-ops / dead code
- Add instructions usage statistics dump: useful to figure which instructions
need strong optimizations.
- Micro-operation fixes:
* add missing RETURN in some micro-ops
* fix prototypes
* use softfloat routines for all floating-point operations
* fix tlbie instruction
* move some huge micro-operations into helpers
- emulation fixes:
* fix inverted opcodes for fcmpo / fcmpu
* condition register update is always to be done after the whole
instruction has completed
* add missing NIP updates when calling helpers that may generate an
exception
- optimizations and improvments:
* optimize very often used instructions (li, mr, rlwixx...)
* remove specific micro-ops for rarely used instructions
* add routines for addresses computations to avoid bugs due to multiple
different implementations
* fix TB linking: do not reset T0 at the end of every TB.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2473 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-ppc/op_template.h')
-rw-r--r-- | target-ppc/op_template.h | 73 |
1 files changed, 25 insertions, 48 deletions
diff --git a/target-ppc/op_template.h b/target-ppc/op_template.h index 1be640d6de..511d065f64 100644 --- a/target-ppc/op_template.h +++ b/target-ppc/op_template.h @@ -1,7 +1,7 @@ /* * PowerPC emulation micro-operations for qemu. * - * Copyright (c) 2003-2005 Jocelyn Mayer + * Copyright (c) 2003-2007 Jocelyn Mayer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,107 +19,97 @@ */ /* General purpose registers moves */ -void OPPROTO glue(op_load_gpr_T0_gpr, REG)(void) +void OPPROTO glue(op_load_gpr_T0_gpr, REG) (void) { T0 = regs->gpr[REG]; RETURN(); } -void OPPROTO glue(op_load_gpr_T1_gpr, REG)(void) +void OPPROTO glue(op_load_gpr_T1_gpr, REG) (void) { T1 = regs->gpr[REG]; RETURN(); } -void OPPROTO glue(op_load_gpr_T2_gpr, REG)(void) +void OPPROTO glue(op_load_gpr_T2_gpr, REG) (void) { T2 = regs->gpr[REG]; RETURN(); } -void OPPROTO glue(op_store_T0_gpr_gpr, REG)(void) +void OPPROTO glue(op_store_T0_gpr_gpr, REG) (void) { regs->gpr[REG] = T0; RETURN(); } -void OPPROTO glue(op_store_T1_gpr_gpr, REG)(void) +void OPPROTO glue(op_store_T1_gpr_gpr, REG) (void) { regs->gpr[REG] = T1; RETURN(); } -void OPPROTO glue(op_store_T2_gpr_gpr, REG)(void) +#if 0 // unused +void OPPROTO glue(op_store_T2_gpr_gpr, REG) (void) { regs->gpr[REG] = T2; RETURN(); } +#endif #if REG <= 7 /* Condition register moves */ -void OPPROTO glue(op_load_crf_T0_crf, REG)(void) +void OPPROTO glue(op_load_crf_T0_crf, REG) (void) { T0 = regs->crf[REG]; RETURN(); } -void OPPROTO glue(op_load_crf_T1_crf, REG)(void) +void OPPROTO glue(op_load_crf_T1_crf, REG) (void) { T1 = regs->crf[REG]; RETURN(); } -void OPPROTO glue(op_store_T0_crf_crf, REG)(void) +void OPPROTO glue(op_store_T0_crf_crf, REG) (void) { regs->crf[REG] = T0; RETURN(); } -void OPPROTO glue(op_store_T1_crf_crf, REG)(void) +void OPPROTO glue(op_store_T1_crf_crf, REG) (void) { regs->crf[REG] = T1; RETURN(); } /* Floating point condition and status register moves */ -void OPPROTO glue(op_load_fpscr_T0_fpscr, REG)(void) +void OPPROTO glue(op_load_fpscr_T0_fpscr, REG) (void) { T0 = regs->fpscr[REG]; RETURN(); } #if REG == 0 -void OPPROTO glue(op_store_T0_fpscr_fpscr, REG)(void) +void OPPROTO glue(op_store_T0_fpscr_fpscr, REG) (void) { regs->fpscr[REG] = (regs->fpscr[REG] & 0x9) | (T0 & ~0x9); RETURN(); } -void OPPROTO glue(op_store_T0_fpscri_fpscr, REG)(void) -{ - regs->fpscr[REG] = (regs->fpscr[REG] & ~0x9) | (PARAM(1) & 0x9); - RETURN(); -} - -void OPPROTO glue(op_clear_fpscr_fpscr, REG)(void) +void OPPROTO glue(op_clear_fpscr_fpscr, REG) (void) { regs->fpscr[REG] = (regs->fpscr[REG] & 0x9); RETURN(); } #else -void OPPROTO glue(op_store_T0_fpscr_fpscr, REG)(void) +void OPPROTO glue(op_store_T0_fpscr_fpscr, REG) (void) { regs->fpscr[REG] = T0; RETURN(); } -void OPPROTO glue(op_store_T0_fpscri_fpscr, REG)(void) -{ - regs->fpscr[REG] = PARAM(1); - RETURN(); -} - -void OPPROTO glue(op_clear_fpscr_fpscr, REG)(void) +void OPPROTO glue(op_clear_fpscr_fpscr, REG) (void) { regs->fpscr[REG] = 0x0; RETURN(); @@ -129,55 +119,42 @@ void OPPROTO glue(op_clear_fpscr_fpscr, REG)(void) #endif /* REG <= 7 */ /* floating point registers moves */ -void OPPROTO glue(op_load_fpr_FT0_fpr, REG)(void) +void OPPROTO glue(op_load_fpr_FT0_fpr, REG) (void) { FT0 = env->fpr[REG]; RETURN(); } -void OPPROTO glue(op_store_FT0_fpr_fpr, REG)(void) +void OPPROTO glue(op_store_FT0_fpr_fpr, REG) (void) { env->fpr[REG] = FT0; RETURN(); } -void OPPROTO glue(op_load_fpr_FT1_fpr, REG)(void) +void OPPROTO glue(op_load_fpr_FT1_fpr, REG) (void) { FT1 = env->fpr[REG]; RETURN(); } -void OPPROTO glue(op_store_FT1_fpr_fpr, REG)(void) +void OPPROTO glue(op_store_FT1_fpr_fpr, REG) (void) { env->fpr[REG] = FT1; RETURN(); } -void OPPROTO glue(op_load_fpr_FT2_fpr, REG)(void) +void OPPROTO glue(op_load_fpr_FT2_fpr, REG) (void) { FT2 = env->fpr[REG]; RETURN(); } -void OPPROTO glue(op_store_FT2_fpr_fpr, REG)(void) +#if 0 // unused +void OPPROTO glue(op_store_FT2_fpr_fpr, REG) (void) { env->fpr[REG] = FT2; RETURN(); } - -#if REG <= 15 -/* Segment register moves */ -void OPPROTO glue(op_load_sr, REG)(void) -{ - T0 = env->sr[REG]; - RETURN(); -} - -void OPPROTO glue(op_store_sr, REG)(void) -{ - do_store_sr(env, REG, T0); - RETURN(); -} #endif #undef REG |