use generic GenOpFunc
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@543 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
16d17fdb8e
commit
bd49793889
|
@ -51,11 +51,6 @@ enum {
|
||||||
|
|
||||||
#include "gen-op.h"
|
#include "gen-op.h"
|
||||||
|
|
||||||
typedef void (GenOpFunc)(void);
|
|
||||||
typedef void (GenOpFunc1)(long);
|
|
||||||
typedef void (GenOpFunc2)(long, long);
|
|
||||||
typedef void (GenOpFunc3)(long, long, long);
|
|
||||||
|
|
||||||
static GenOpFunc2 *gen_test_cc[14] = {
|
static GenOpFunc2 *gen_test_cc[14] = {
|
||||||
gen_op_test_eq,
|
gen_op_test_eq,
|
||||||
gen_op_test_ne,
|
gen_op_test_ne,
|
||||||
|
|
|
@ -128,11 +128,6 @@ enum {
|
||||||
NB_OREGS,
|
NB_OREGS,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (GenOpFunc)(void);
|
|
||||||
typedef void (GenOpFunc1)(long);
|
|
||||||
typedef void (GenOpFunc2)(long, long);
|
|
||||||
typedef void (GenOpFunc3)(long, long, long);
|
|
||||||
|
|
||||||
static GenOpFunc *gen_op_mov_reg_T0[3][8] = {
|
static GenOpFunc *gen_op_mov_reg_T0[3][8] = {
|
||||||
[OT_BYTE] = {
|
[OT_BYTE] = {
|
||||||
gen_op_movb_EAX_T0,
|
gen_op_movb_EAX_T0,
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
SPARC translation
|
SPARC translation
|
||||||
|
|
||||||
Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
|
Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
|
||||||
|
Copyright (C) 2003 Fabrice Bellard
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -19,32 +20,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SPARC has two pitfalls: Delay slots and (a)nullification.
|
|
||||||
This is currently solved as follows:
|
|
||||||
|
|
||||||
'call' instructions simply execute the delay slot before the actual
|
|
||||||
control transfer instructions.
|
|
||||||
|
|
||||||
'jmpl' instructions execute calculate the destination, then execute
|
|
||||||
the delay slot and then do the control transfer.
|
|
||||||
|
|
||||||
(conditional) branch instructions are the most difficult ones, as the
|
|
||||||
delay slot may be nullified (ie. not executed). This happens when a
|
|
||||||
conditional branch is not executed (thus no control transfer happens)
|
|
||||||
and the 'anull' bit in the branch instruction opcode is set. This is
|
|
||||||
currently solved by doing a jump after the delay slot instruction.
|
|
||||||
|
|
||||||
TODO-list:
|
TODO-list:
|
||||||
|
|
||||||
Register window overflow/underflow check
|
NPC/PC static optimisations (use JUMP_TB when possible)
|
||||||
FPU-Instructions
|
FPU-Instructions
|
||||||
Coprocessor-Instructions
|
|
||||||
Check signedness issues
|
|
||||||
Privileged instructions
|
Privileged instructions
|
||||||
|
Coprocessor-Instructions
|
||||||
Optimize synthetic instructions
|
Optimize synthetic instructions
|
||||||
Optional alignment and privileged instruction check
|
Optional alignment and privileged instruction check
|
||||||
|
|
||||||
-- TMO, 09/03/03
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -87,11 +70,6 @@ enum {
|
||||||
|
|
||||||
static void disas_sparc_insn(DisasContext * dc);
|
static void disas_sparc_insn(DisasContext * dc);
|
||||||
|
|
||||||
typedef void (GenOpFunc) (void);
|
|
||||||
typedef void (GenOpFunc1) (long);
|
|
||||||
typedef void (GenOpFunc2) (long, long);
|
|
||||||
typedef void (GenOpFunc3) (long, long, long);
|
|
||||||
|
|
||||||
static GenOpFunc *gen_op_movl_TN_reg[2][32] = {
|
static GenOpFunc *gen_op_movl_TN_reg[2][32] = {
|
||||||
{
|
{
|
||||||
gen_op_movl_g0_T0,
|
gen_op_movl_g0_T0,
|
||||||
|
|
Reference in New Issue