Applied the mainline PCem AGI stall commit;
Fixed the mouse list order mess.
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
|
#ifndef _CODEGEN_H_
|
||||||
|
#define _CODEGEN_H_
|
||||||
|
|
||||||
#include "../mem.h"
|
#include "../mem.h"
|
||||||
|
#include "x86_ops.h"
|
||||||
|
|
||||||
#ifdef __amd64__
|
#ifdef __amd64__
|
||||||
#include "codegen_x86-64.h"
|
#include "codegen_x86-64.h"
|
||||||
@@ -70,7 +74,7 @@ typedef struct codeblock_t
|
|||||||
/*Code block is always entered with the same FPU top-of-stack*/
|
/*Code block is always entered with the same FPU top-of-stack*/
|
||||||
#define CODEBLOCK_STATIC_TOP 2
|
#define CODEBLOCK_STATIC_TOP 2
|
||||||
|
|
||||||
static __inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs)
|
static inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs)
|
||||||
{
|
{
|
||||||
codeblock_t *block = pages[phys >> 12].head;
|
codeblock_t *block = pages[phys >> 12].head;
|
||||||
uint64_t a = _cs | ((uint64_t)phys << 32);
|
uint64_t a = _cs | ((uint64_t)phys << 32);
|
||||||
@@ -88,7 +92,7 @@ static __inline codeblock_t *codeblock_tree_find(uint32_t phys, uint32_t _cs)
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void codeblock_tree_add(codeblock_t *new_block)
|
static inline void codeblock_tree_add(codeblock_t *new_block)
|
||||||
{
|
{
|
||||||
codeblock_t *block = pages[new_block->phys >> 12].head;
|
codeblock_t *block = pages[new_block->phys >> 12].head;
|
||||||
uint64_t a = new_block->_cs | ((uint64_t)new_block->phys << 32);
|
uint64_t a = new_block->_cs | ((uint64_t)new_block->phys << 32);
|
||||||
@@ -122,7 +126,7 @@ static __inline void codeblock_tree_add(codeblock_t *new_block)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void codeblock_tree_delete(codeblock_t *block)
|
static inline void codeblock_tree_delete(codeblock_t *block)
|
||||||
{
|
{
|
||||||
codeblock_t *parent = block->parent;
|
codeblock_t *parent = block->parent;
|
||||||
|
|
||||||
@@ -252,6 +256,7 @@ void codegen_block_init(uint32_t phys_addr);
|
|||||||
void codegen_block_remove();
|
void codegen_block_remove();
|
||||||
void codegen_block_start_recompile(codeblock_t *block);
|
void codegen_block_start_recompile(codeblock_t *block);
|
||||||
void codegen_block_end_recompile(codeblock_t *block);
|
void codegen_block_end_recompile(codeblock_t *block);
|
||||||
|
void codegen_block_end();
|
||||||
void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_pc, uint32_t old_pc);
|
void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t new_pc, uint32_t old_pc);
|
||||||
void codegen_generate_seg_restore();
|
void codegen_generate_seg_restore();
|
||||||
void codegen_set_op32();
|
void codegen_set_op32();
|
||||||
@@ -300,7 +305,7 @@ extern int block_pos;
|
|||||||
|
|
||||||
#define CPU_BLOCK_END() cpu_block_end = 1
|
#define CPU_BLOCK_END() cpu_block_end = 1
|
||||||
|
|
||||||
static __inline void addbyte(uint8_t val)
|
static inline void addbyte(uint8_t val)
|
||||||
{
|
{
|
||||||
codeblock[block_current].data[block_pos++] = val;
|
codeblock[block_current].data[block_pos++] = val;
|
||||||
if (block_pos >= BLOCK_MAX)
|
if (block_pos >= BLOCK_MAX)
|
||||||
@@ -309,9 +314,9 @@ static __inline void addbyte(uint8_t val)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void addword(uint16_t val)
|
static inline void addword(uint16_t val)
|
||||||
{
|
{
|
||||||
uint16_t *p = (uint16_t *)&codeblock[block_current].data[block_pos];
|
uint16_t *p = (uint16_t *) &codeblock[block_current].data[block_pos];
|
||||||
*p = val;
|
*p = val;
|
||||||
block_pos += 2;
|
block_pos += 2;
|
||||||
if (block_pos >= BLOCK_MAX)
|
if (block_pos >= BLOCK_MAX)
|
||||||
@@ -320,9 +325,9 @@ static __inline void addword(uint16_t val)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void addlong(uint32_t val)
|
static inline void addlong(uint32_t val)
|
||||||
{
|
{
|
||||||
uint32_t *p = (uint32_t *)&codeblock[block_current].data[block_pos];
|
uint32_t *p = (uint32_t *) &codeblock[block_current].data[block_pos];
|
||||||
*p = val;
|
*p = val;
|
||||||
block_pos += 4;
|
block_pos += 4;
|
||||||
if (block_pos >= BLOCK_MAX)
|
if (block_pos >= BLOCK_MAX)
|
||||||
@@ -331,9 +336,9 @@ static __inline void addlong(uint32_t val)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline void addquad(uint64_t val)
|
static inline void addquad(uint64_t val)
|
||||||
{
|
{
|
||||||
uint64_t *p = (uint64_t *)&codeblock[block_current].data[block_pos];
|
uint64_t *p = (uint64_t *) &codeblock[block_current].data[block_pos];
|
||||||
*p = val;
|
*p = val;
|
||||||
block_pos += 8;
|
block_pos += 8;
|
||||||
if (block_pos >= BLOCK_MAX)
|
if (block_pos >= BLOCK_MAX)
|
||||||
@@ -360,3 +365,5 @@ extern int codegen_fpu_loaded_iq[8];
|
|||||||
extern int codegen_reg_loaded[8];
|
extern int codegen_reg_loaded[8];
|
||||||
|
|
||||||
extern int codegen_in_recompile;
|
extern int codegen_in_recompile;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
#ifndef _CODEGEN_OPS_H_
|
||||||
|
#define _CODEGEN_OPS_H_
|
||||||
|
|
||||||
|
#include "codegen.h"
|
||||||
|
|
||||||
typedef uint32_t (*RecompOpFn)(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeblock_t *block);
|
typedef uint32_t (*RecompOpFn)(uint8_t opcode, uint32_t fetchdat, uint32_t op_32, uint32_t op_pc, codeblock_t *block);
|
||||||
|
|
||||||
extern RecompOpFn recomp_opcodes[512];
|
extern RecompOpFn recomp_opcodes[512];
|
||||||
@@ -37,3 +42,5 @@ RecompOpFn recomp_opcodes_REPNE[512];
|
|||||||
#define REG_DH 6
|
#define REG_DH 6
|
||||||
#define REG_BL 3
|
#define REG_BL 3
|
||||||
#define REG_BH 7
|
#define REG_BH 7
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
#include "../ibm.h"
|
#include "../ibm.h"
|
||||||
#include "../mem.h"
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include "x86_ops.h"
|
#include "x86_ops.h"
|
||||||
#include "x87.h"
|
#include "x87.h"
|
||||||
|
#include "../mem.h"
|
||||||
#include "codegen.h"
|
#include "codegen.h"
|
||||||
|
#include "codegen_ops.h"
|
||||||
|
#include "codegen_timing_common.h"
|
||||||
|
|
||||||
#define CYCLES(c) (int *)c
|
#define CYCLES(c) (int *)c
|
||||||
#define CYCLES2(c16, c32) (int *)((-1 & ~0xffff) | c16 | (c32 << 8))
|
#define CYCLES2(c16, c32) (int *)((-1 & ~0xffff) | c16 | (c32 << 8))
|
||||||
@@ -247,14 +249,27 @@ static int *opcode_timings_8x[8] =
|
|||||||
{
|
{
|
||||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
};
|
};
|
||||||
|
static int *opcode_timings_8x_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
static int *opcode_timings_81[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
static int *opcode_timings_81_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
|
||||||
static int timing_count;
|
static int timing_count;
|
||||||
static uint8_t last_prefix;
|
static uint8_t last_prefix;
|
||||||
|
static uint32_t regmask_modified;
|
||||||
|
|
||||||
static __inline int COUNT(int *c, int op_32)
|
static inline int COUNT(int *c, int op_32)
|
||||||
{
|
{
|
||||||
if ((uintptr_t)c <= 10000)
|
if ((uintptr_t)c <= 10000)
|
||||||
return (int)c;
|
return (int)(uintptr_t)c;
|
||||||
if (((uintptr_t)c & ~0xffff) == (-1 & ~0xffff))
|
if (((uintptr_t)c & ~0xffff) == (-1 & ~0xffff))
|
||||||
{
|
{
|
||||||
if (op_32 & 0x100)
|
if (op_32 & 0x100)
|
||||||
@@ -266,6 +281,7 @@ static __inline int COUNT(int *c, int op_32)
|
|||||||
|
|
||||||
void codegen_timing_486_block_start()
|
void codegen_timing_486_block_start()
|
||||||
{
|
{
|
||||||
|
regmask_modified = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_486_start()
|
void codegen_timing_486_start()
|
||||||
@@ -283,82 +299,107 @@ void codegen_timing_486_prefix(uint8_t prefix, uint32_t fetchdat)
|
|||||||
void codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
void codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
||||||
{
|
{
|
||||||
int **timings;
|
int **timings;
|
||||||
|
uint64_t *deps;
|
||||||
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
||||||
|
int bit8 = !(opcode & 1);
|
||||||
|
|
||||||
switch (last_prefix)
|
switch (last_prefix)
|
||||||
{
|
{
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||||
|
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd8:
|
case 0xd8:
|
||||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||||
|
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xd9:
|
case 0xd9:
|
||||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||||
|
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xda:
|
case 0xda:
|
||||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||||
|
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdb:
|
case 0xdb:
|
||||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||||
|
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdc:
|
case 0xdc:
|
||||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||||
|
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdd:
|
case 0xdd:
|
||||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||||
|
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xde:
|
case 0xde:
|
||||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||||
|
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdf:
|
case 0xdf:
|
||||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||||
|
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x80: case 0x81: case 0x82: case 0x83:
|
case 0x80: case 0x82: case 0x83:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings_8x;
|
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||||
if (!mod3)
|
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x_mod3;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0x81:
|
||||||
|
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||||
|
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xc0: case 0xc1: case 0xd0: case 0xd1: case 0xd2: case 0xd3:
|
case 0xc0: case 0xc1: case 0xd0: case 0xd1: case 0xd2: case 0xd3:
|
||||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||||
|
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||||
|
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xf7:
|
case 0xf7:
|
||||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||||
|
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xff:
|
case 0xff:
|
||||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||||
|
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||||
|
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
timing_count += COUNT(timings[opcode], op_32);
|
timing_count += COUNT(timings[opcode], op_32);
|
||||||
|
if (regmask_modified & get_addr_regmask(deps[opcode], fetchdat, op_32))
|
||||||
|
timing_count++; /*AGI stall*/
|
||||||
codegen_block_cycles += timing_count;
|
codegen_block_cycles += timing_count;
|
||||||
|
|
||||||
|
regmask_modified = get_dstdep_mask(deps[opcode], fetchdat, bit8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_486_block_end()
|
void codegen_timing_486_block_end()
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
- X/Y pairing
|
- X/Y pairing
|
||||||
- FPU/FXCH pairing
|
- FPU/FXCH pairing
|
||||||
- Prefix decode delay
|
- Prefix decode delay
|
||||||
|
- AGI stalls
|
||||||
Elements not taken into account :
|
Elements not taken into account :
|
||||||
- Branch prediction (beyond most simplistic approximation)
|
- Branch prediction (beyond most simplistic approximation)
|
||||||
- FPU queue
|
- FPU queue
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
#include "x87.h"
|
#include "x87.h"
|
||||||
#include "../mem.h"
|
#include "../mem.h"
|
||||||
#include "codegen.h"
|
#include "codegen.h"
|
||||||
|
#include "codegen_timing_common.h"
|
||||||
|
|
||||||
/*Instruction has different execution time for 16 and 32 bit data. Does not pair */
|
/*Instruction has different execution time for 16 and 32 bit data. Does not pair */
|
||||||
#define CYCLES_HAS_MULTI (1 << 31)
|
#define CYCLES_HAS_MULTI (1 << 31)
|
||||||
@@ -33,11 +35,6 @@
|
|||||||
|
|
||||||
#define CYCLES_MASK ((1 << 7) - 1)
|
#define CYCLES_MASK ((1 << 7) - 1)
|
||||||
|
|
||||||
/*Instruction is MMX shift or pack/unpack instruction*/
|
|
||||||
#define MMX_SHIFTPACK (1 << 7)
|
|
||||||
/*Instruction is MMX multiply instruction*/
|
|
||||||
#define MMX_MULTIPLY (1 << 8)
|
|
||||||
|
|
||||||
/*Instruction does not pair*/
|
/*Instruction does not pair*/
|
||||||
#define PAIR_NP (0 << 29)
|
#define PAIR_NP (0 << 29)
|
||||||
/*Instruction pairs in X pipe only*/
|
/*Instruction pairs in X pipe only*/
|
||||||
@@ -49,35 +46,6 @@
|
|||||||
|
|
||||||
#define PAIR_MASK (3 << 29)
|
#define PAIR_MASK (3 << 29)
|
||||||
|
|
||||||
/*Instruction has input dependency on register in REG field*/
|
|
||||||
#define SRCDEP_REG (1 << 9)
|
|
||||||
/*Instruction has input dependency on register in R/M field*/
|
|
||||||
#define SRCDEP_RM (1 << 10)
|
|
||||||
/*Instruction modifies register in REG field*/
|
|
||||||
#define DSTDEP_REG (1 << 11)
|
|
||||||
/*Instruction modifies register in R/M field*/
|
|
||||||
#define DSTDEP_RM (1 << 12)
|
|
||||||
|
|
||||||
/*Instruction has input dependency on given register*/
|
|
||||||
#define SRCDEP_EAX (1 << 13)
|
|
||||||
#define SRCDEP_ECX (1 << 14)
|
|
||||||
#define SRCDEP_EDX (1 << 15)
|
|
||||||
#define SRCDEP_EBX (1 << 16)
|
|
||||||
#define SRCDEP_ESP (1 << 17)
|
|
||||||
#define SRCDEP_EBP (1 << 18)
|
|
||||||
#define SRCDEP_ESI (1 << 19)
|
|
||||||
#define SRCDEP_EDI (1 << 20)
|
|
||||||
|
|
||||||
/*Instruction modifies given register*/
|
|
||||||
#define DSTDEP_EAX (1 << 21)
|
|
||||||
#define DSTDEP_ECX (1 << 22)
|
|
||||||
#define DSTDEP_EDX (1 << 23)
|
|
||||||
#define DSTDEP_EBX (1 << 24)
|
|
||||||
#define DSTDEP_ESP (1 << 25)
|
|
||||||
#define DSTDEP_EBP (1 << 26)
|
|
||||||
#define DSTDEP_ESI (1 << 27)
|
|
||||||
#define DSTDEP_EDI (1 << 28)
|
|
||||||
|
|
||||||
#define INVALID 0
|
#define INVALID 0
|
||||||
|
|
||||||
static int prev_full;
|
static int prev_full;
|
||||||
@@ -85,117 +53,72 @@ static uint32_t prev_opcode;
|
|||||||
static uint32_t *prev_timings;
|
static uint32_t *prev_timings;
|
||||||
static uint32_t prev_op_32;
|
static uint32_t prev_op_32;
|
||||||
static uint32_t prev_regmask;
|
static uint32_t prev_regmask;
|
||||||
|
static uint64_t *prev_deps;
|
||||||
|
static uint32_t prev_fetchdat;
|
||||||
|
|
||||||
#define REGMASK_MMX (1 << 8)
|
static uint32_t regmask_modified;
|
||||||
|
|
||||||
static uint32_t get_srcdep_mask(uint32_t data, uint32_t fetchdat, int bit8)
|
|
||||||
{
|
|
||||||
uint32_t mask = 0;
|
|
||||||
if (data & SRCDEP_REG)
|
|
||||||
{
|
|
||||||
int reg = (fetchdat >> 3) & 7;
|
|
||||||
if (bit8)
|
|
||||||
reg &= 3;
|
|
||||||
mask |= (1 << reg);
|
|
||||||
}
|
|
||||||
if (data & SRCDEP_RM)
|
|
||||||
{
|
|
||||||
int reg = fetchdat & 7;
|
|
||||||
if (bit8)
|
|
||||||
reg &= 3;
|
|
||||||
mask |= (1 << reg);
|
|
||||||
}
|
|
||||||
mask |= ((data >> 16) & 0xff);
|
|
||||||
if (data & (MMX_SHIFTPACK | MMX_MULTIPLY))
|
|
||||||
mask |= REGMASK_MMX;
|
|
||||||
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t get_dstdep_mask(uint32_t data, uint32_t fetchdat, int bit8)
|
|
||||||
{
|
|
||||||
uint32_t mask = 0;
|
|
||||||
if (data & DSTDEP_REG)
|
|
||||||
{
|
|
||||||
int reg = (fetchdat >> 3) & 7;
|
|
||||||
if (bit8)
|
|
||||||
reg &= 3;
|
|
||||||
mask |= (1 << reg);
|
|
||||||
}
|
|
||||||
if (data & DSTDEP_RM)
|
|
||||||
{
|
|
||||||
int reg = fetchdat & 7;
|
|
||||||
if (bit8)
|
|
||||||
reg &= 3;
|
|
||||||
mask |= (1 << reg);
|
|
||||||
}
|
|
||||||
mask |= ((data >> 24) & 0xff);
|
|
||||||
if (data & (MMX_SHIFTPACK | MMX_MULTIPLY))
|
|
||||||
mask |= REGMASK_MMX;
|
|
||||||
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
static uint32_t opcode_timings[256] =
|
static uint32_t opcode_timings[256] =
|
||||||
{
|
{
|
||||||
/* ADD ADD ADD ADD*/
|
/* ADD ADD ADD ADD*/
|
||||||
/*00*/ PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
/*00*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* ADD ADD PUSH ES POP ES*/
|
/* ADD ADD PUSH ES POP ES*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_NP | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
/* OR OR OR OR*/
|
/* OR OR OR OR*/
|
||||||
PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* OR OR PUSH CS */
|
/* OR OR PUSH CS */
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_NP | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, INVALID,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), INVALID,
|
||||||
|
|
||||||
/* ADC ADC ADC ADC*/
|
/* ADC ADC ADC ADC*/
|
||||||
/*10*/ PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
/*10*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* ADC ADC PUSH SS POP SS*/
|
/* ADC ADC PUSH SS POP SS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_NP | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
/* SBB SBB SBB SBB*/
|
/* SBB SBB SBB SBB*/
|
||||||
PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* SBB SBB PUSH DS POP DS*/
|
/* SBB SBB PUSH DS POP DS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_NP | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
|
|
||||||
/* AND AND AND AND*/
|
/* AND AND AND AND*/
|
||||||
/*20*/ PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
/*20*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* AND AND DAA*/
|
/* AND AND DAA*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
/* SUB SUB SUB SUB*/
|
/* SUB SUB SUB SUB*/
|
||||||
PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* SUB SUB DAS*/
|
/* SUB SUB DAS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
|
|
||||||
/* XOR XOR XOR XOR*/
|
/* XOR XOR XOR XOR*/
|
||||||
/*30*/ PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG | DSTDEP_REG,
|
/*30*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* XOR XOR AAA*/
|
/* XOR XOR AAA*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
/* CMP CMP CMP CMP*/
|
/* CMP CMP CMP CMP*/
|
||||||
PAIR_XY | CYCLES_RM | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG,
|
PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM,
|
||||||
/* CMP CMP AAS*/
|
/* CMP CMP AAS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
|
|
||||||
/* INC EAX INC ECX INC EDX INC EBX*/
|
/* INC EAX INC ECX INC EDX INC EBX*/
|
||||||
/*40*/ PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX,
|
/*40*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* INC ESP INC EBP INC ESI INC EDI*/
|
/* INC ESP INC EBP INC ESI INC EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* DEC EAX DEC ECX DEC EDX DEC EBX*/
|
/* DEC EAX DEC ECX DEC EDX DEC EBX*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* DEC ESP DEC EBP DEC ESI DEC EDI*/
|
/* DEC ESP DEC EBP DEC ESI DEC EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/
|
/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/
|
||||||
/*50*/ PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX | SRCDEP_ESP | DSTDEP_ESP,
|
/*50*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/
|
/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* POP EAX POP ECX POP EDX POP EBX*/
|
/* POP EAX POP ECX POP EDX POP EBX*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* POP ESP POP EBP POP ESI POP EDI*/
|
/* POP ESP POP EBP POP ESI POP EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* PUSHA POPA BOUND ARPL*/
|
/* PUSHA POPA BOUND ARPL*/
|
||||||
/*60*/ PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(9),
|
/*60*/ PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(9),
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
/* PUSH imm IMUL PUSH imm IMUL*/
|
/* PUSH imm IMUL PUSH imm IMUL*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(10), PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(10),
|
PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(10), PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(10),
|
||||||
/* INSB INSW OUTSB OUTSW*/
|
/* INSB INSW OUTSB OUTSW*/
|
||||||
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
||||||
|
|
||||||
@@ -207,11 +130,11 @@ static uint32_t opcode_timings[256] =
|
|||||||
|
|
||||||
/*80*/ INVALID, INVALID, INVALID, INVALID,
|
/*80*/ INVALID, INVALID, INVALID, INVALID,
|
||||||
/* TEST TEST XCHG XCHG*/
|
/* TEST TEST XCHG XCHG*/
|
||||||
PAIR_XY | CYCLES_RM | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
/* MOV MOV MOV MOV*/
|
/* MOV MOV MOV MOV*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG, PAIR_XY | CYCLES_REG | DSTDEP_REG, PAIR_XY | CYCLES_REG | DSTDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* MOV from seg LEA MOV to seg POP*/
|
/* MOV from seg LEA MOV to seg POP*/
|
||||||
PAIR_XY | CYCLES(1), PAIR_XY | CYCLES_REG | DSTDEP_REG, CYCLES(3), PAIR_XY | CYCLES(1),
|
PAIR_XY | CYCLES(1), PAIR_XY | CYCLES_REG, CYCLES(3), PAIR_XY | CYCLES(1),
|
||||||
|
|
||||||
/* NOP XCHG XCHG XCHG*/
|
/* NOP XCHG XCHG XCHG*/
|
||||||
/*90*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
/*90*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
@@ -220,22 +143,22 @@ static uint32_t opcode_timings[256] =
|
|||||||
/* CBW CWD CALL far WAIT*/
|
/* CBW CWD CALL far WAIT*/
|
||||||
PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(2), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5),
|
PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(2), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5),
|
||||||
/* PUSHF POPF SAHF LAHF*/
|
/* PUSHF POPF SAHF LAHF*/
|
||||||
PAIR_XY | CYCLES(2) | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(9) | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(2),
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(9), PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(2),
|
||||||
|
|
||||||
/* MOV MOV MOV MOV*/
|
/* MOV MOV MOV MOV*/
|
||||||
/*a0*/ PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX,
|
/*a0*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* MOVSB MOVSW CMPSB CMPSW*/
|
/* MOVSB MOVSW CMPSB CMPSW*/
|
||||||
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5), PAIR_NP | CYCLES(5),
|
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5), PAIR_NP | CYCLES(5),
|
||||||
/* TEST TEST STOSB STOSW*/
|
/* TEST TEST STOSB STOSW*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
||||||
/* LODSB LODSW SCASB SCASW*/
|
/* LODSB LODSW SCASB SCASW*/
|
||||||
PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
||||||
|
|
||||||
/* MOV*/
|
/* MOV*/
|
||||||
/*b0*/ PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
/*b0*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_ESP, PAIR_XY | CYCLES_REG | DSTDEP_EBP, PAIR_XY | CYCLES_REG | DSTDEP_ESI, PAIR_XY | CYCLES_REG | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* RET imm RET*/
|
/* RET imm RET*/
|
||||||
/*c0*/ INVALID, INVALID, PAIR_X_BRANCH | CYCLES(3), PAIR_X_BRANCH | CYCLES(2),
|
/*c0*/ INVALID, INVALID, PAIR_X_BRANCH | CYCLES(3), PAIR_X_BRANCH | CYCLES(2),
|
||||||
@@ -253,7 +176,7 @@ static uint32_t opcode_timings[256] =
|
|||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
/* LOOPNE LOOPE LOOP JCXZ*/
|
/* LOOPNE LOOPE LOOP JCXZ*/
|
||||||
/*e0*/ PAIR_X_BRANCH| CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX,
|
/*e0*/ PAIR_X_BRANCH| CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
||||||
/* IN AL IN AX OUT_AL OUT_AX*/
|
/* IN AL IN AX OUT_AL OUT_AX*/
|
||||||
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
||||||
/* CALL JMP JMP JMP*/
|
/* CALL JMP JMP JMP*/
|
||||||
@@ -274,65 +197,64 @@ static uint32_t opcode_timings[256] =
|
|||||||
static uint32_t opcode_timings_mod3[256] =
|
static uint32_t opcode_timings_mod3[256] =
|
||||||
{
|
{
|
||||||
/* ADD ADD ADD ADD*/
|
/* ADD ADD ADD ADD*/
|
||||||
/*00*/ PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
/*00*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* ADD ADD PUSH ES POP ES*/
|
/* ADD ADD PUSH ES POP ES*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
/* OR OR OR OR*/
|
/* OR OR OR OR*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* OR OR PUSH CS */
|
/* OR OR PUSH CS */
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, INVALID,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), INVALID,
|
||||||
|
|
||||||
/* ADC ADC ADC ADC*/
|
/* ADC ADC ADC ADC*/
|
||||||
/*10*/ PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
/*10*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* ADC ADC PUSH SS POP SS*/
|
/* ADC ADC PUSH SS POP SS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
/* SBB SBB SBB SBB*/
|
/* SBB SBB SBB SBB*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* SBB SBB PUSH DS POP DS*/
|
/* SBB SBB PUSH DS POP DS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, PAIR_NP | CYCLES(3),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(3),
|
||||||
|
|
||||||
/* AND AND AND AND*/
|
/* AND AND AND AND*/
|
||||||
/*20*/ PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
/*20*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* AND AND DAA*/
|
/* AND AND DAA*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(9),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
/* SUB SUB SUB SUB*/
|
/* SUB SUB SUB SUB*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* SUB SUB DAS*/
|
/* SUB SUB DAS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(9),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
|
|
||||||
/* XOR XOR XOR XOR*/
|
/* XOR XOR XOR XOR*/
|
||||||
/*30*/ PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM | DSTDEP_REG,
|
/*30*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* XOR XOR AAA*/
|
/* XOR XOR AAA*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM | DSTDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
/* CMP CMP CMP CMP*/
|
/* CMP CMP CMP CMP*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | SRCDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* CMP CMP AAS*/
|
/* CMP CMP AAS*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | SRCDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_EAX, INVALID, PAIR_NP | CYCLES(7),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, INVALID, PAIR_NP | CYCLES(7),
|
||||||
|
|
||||||
/* INC EAX INC ECX INC EDX INC EBX*/
|
/* INC EAX INC ECX INC EDX INC EBX*/
|
||||||
/*40*/ PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX,
|
/*40*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* INC ESP INC EBP INC ESI INC EDI*/
|
/* INC ESP INC EBP INC ESI INC EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* DEC EAX DEC ECX DEC EDX DEC EBX*/
|
/* DEC EAX DEC ECX DEC EDX DEC EBX*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* DEC ESP DEC EBP DEC ESI DEC EDI*/
|
/* DEC ESP DEC EBP DEC ESI DEC EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/
|
/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/
|
||||||
/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/
|
/*50*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/*50*/ PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX | SRCDEP_ESP | DSTDEP_ESP,
|
|
||||||
/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/
|
/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* POP EAX POP ECX POP EDX POP EBX*/
|
/* POP EAX POP ECX POP EDX POP EBX*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX | DSTDEP_EAX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ECX | DSTDEP_ECX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDX | DSTDEP_EDX | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBX | DSTDEP_EBX | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* POP ESP POP EBP POP ESI POP EDI*/
|
/* POP ESP POP EBP POP ESI POP EDI*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EBP | DSTDEP_EBP | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_ESI | DSTDEP_ESI | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES_REG | SRCDEP_EDI | DSTDEP_EDI | SRCDEP_ESP | DSTDEP_ESP,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* PUSHA POPA BOUND ARPL*/
|
/* PUSHA POPA BOUND ARPL*/
|
||||||
/*60*/ PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(9),
|
/*60*/ PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(6), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(9),
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
/* PUSH imm IMUL PUSH imm IMUL*/
|
/* PUSH imm IMUL PUSH imm IMUL*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(10), PAIR_XY | CYCLES_REG | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(10),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(10), PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(10),
|
||||||
/* INSB INSW OUTSB OUTSW*/
|
/* INSB INSW OUTSB OUTSW*/
|
||||||
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
||||||
|
|
||||||
@@ -342,13 +264,13 @@ static uint32_t opcode_timings_mod3[256] =
|
|||||||
PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
||||||
PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
||||||
|
|
||||||
/*80*/ PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM,
|
/*80*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* TEST TEST XCHG XCHG*/
|
/* TEST TEST XCHG XCHG*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_REG | SRCDEP_RM, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
/* MOV MOV MOV MOV*/
|
/* MOV MOV MOV MOV*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_REG, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_REG,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* MOV from seg LEA MOV to seg POP*/
|
/* MOV from seg LEA MOV to seg POP*/
|
||||||
PAIR_XY | CYCLES(1), PAIR_XY | CYCLES_REG | DSTDEP_REG, PAIR_NP | CYCLES(3), PAIR_XY | CYCLES(1),
|
PAIR_XY | CYCLES(1), PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(3), PAIR_XY | CYCLES(1),
|
||||||
|
|
||||||
/* NOP XCHG XCHG XCHG*/
|
/* NOP XCHG XCHG XCHG*/
|
||||||
/*90*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
/*90*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
@@ -357,22 +279,22 @@ static uint32_t opcode_timings_mod3[256] =
|
|||||||
/* CBW CWD CALL far WAIT*/
|
/* CBW CWD CALL far WAIT*/
|
||||||
PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(2), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5),
|
PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(2), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5),
|
||||||
/* PUSHF POPF SAHF LAHF*/
|
/* PUSHF POPF SAHF LAHF*/
|
||||||
PAIR_XY | CYCLES(2) | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(9) | SRCDEP_ESP | DSTDEP_ESP, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(2),
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(9), PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(2),
|
||||||
|
|
||||||
/* MOV MOV MOV MOV*/
|
/* MOV MOV MOV MOV*/
|
||||||
/*a0*/ PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX,
|
/*a0*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
/* MOVSB MOVSW CMPSB CMPSW*/
|
/* MOVSB MOVSW CMPSB CMPSW*/
|
||||||
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5), PAIR_NP | CYCLES(5),
|
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(5), PAIR_NP | CYCLES(5),
|
||||||
/* TEST TEST STOSB STOSW*/
|
/* TEST TEST STOSB STOSW*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_XY | CYCLES_REG | SRCDEP_EAX, PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
||||||
/* LODSB LODSW SCASB SCASW*/
|
/* LODSB LODSW SCASB SCASW*/
|
||||||
PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(2),
|
||||||
|
|
||||||
/* MOV*/
|
/* MOV*/
|
||||||
/*b0*/ PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
/*b0*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_EAX, PAIR_XY | CYCLES_REG | DSTDEP_ECX, PAIR_XY | CYCLES_REG | DSTDEP_EDX, PAIR_XY | CYCLES_REG | DSTDEP_EBX,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_ESP, PAIR_XY | CYCLES_REG | DSTDEP_EBP, PAIR_XY | CYCLES_REG | DSTDEP_ESI, PAIR_XY | CYCLES_REG | DSTDEP_EDI,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
|
||||||
/* RET imm RET*/
|
/* RET imm RET*/
|
||||||
/*c0*/ INVALID, INVALID, PAIR_X_BRANCH | CYCLES(3), PAIR_X_BRANCH | CYCLES(2),
|
/*c0*/ INVALID, INVALID, PAIR_X_BRANCH | CYCLES(3), PAIR_X_BRANCH | CYCLES(2),
|
||||||
@@ -391,7 +313,7 @@ static uint32_t opcode_timings_mod3[256] =
|
|||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
|
|
||||||
/* LOOPNE LOOPE LOOP JCXZ*/
|
/* LOOPNE LOOPE LOOP JCXZ*/
|
||||||
/*e0*/ PAIR_X_BRANCH| CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX, PAIR_X_BRANCH | CYCLES_BRANCH | SRCDEP_ECX,
|
/*e0*/ PAIR_X_BRANCH| CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH, PAIR_X_BRANCH | CYCLES_BRANCH,
|
||||||
/* IN AL IN AX OUT_AL OUT_AX*/
|
/* IN AL IN AX OUT_AL OUT_AX*/
|
||||||
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14), PAIR_NP | CYCLES(14),
|
||||||
/* CALL JMP JMP JMP*/
|
/* CALL JMP JMP JMP*/
|
||||||
@@ -441,12 +363,12 @@ static uint32_t opcode_timings_0f[256] =
|
|||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
|
|
||||||
/*60*/ PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM,
|
/*60*/ PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM,
|
|
||||||
INVALID, INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
INVALID, INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
|
|
||||||
/*70*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM,
|
/*70*/ INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES(1),
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES(1),
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
INVALID, INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
INVALID, INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
@@ -476,17 +398,17 @@ static uint32_t opcode_timings_0f[256] =
|
|||||||
PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4),
|
PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4),
|
||||||
PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4),
|
PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES(4),
|
||||||
|
|
||||||
/*d0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM,
|
/*d0*/ INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
||||||
|
|
||||||
/*e0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, INVALID,
|
/*e0*/ INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
||||||
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, PAIR_X | CYCLES_RM,
|
||||||
|
|
||||||
/*f0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM, PAIR_X | MMX_SHIFTPACK | CYCLES_RM,
|
/*f0*/ INVALID, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM,
|
||||||
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_RM, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
||||||
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID,
|
||||||
@@ -523,12 +445,12 @@ static uint32_t opcode_timings_0f_mod3[256] =
|
|||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
|
|
||||||
/*60*/ PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG,
|
/*60*/ PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG,
|
|
||||||
INVALID, INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
INVALID, INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
|
|
||||||
/*70*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG,
|
/*70*/ INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES(1),
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES(1),
|
||||||
INVALID, INVALID, INVALID, INVALID,
|
INVALID, INVALID, INVALID, INVALID,
|
||||||
INVALID, INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
INVALID, INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
@@ -557,18 +479,18 @@ static uint32_t opcode_timings_0f_mod3[256] =
|
|||||||
PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1),
|
PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1),
|
||||||
PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1),
|
PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1), PAIR_NP | CYCLES(1),
|
||||||
|
|
||||||
/*d0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG,
|
/*d0*/ INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
INVALID, PAIR_X | MMX_MULTIPLY | CYCLES_REG, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_REG, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
||||||
|
|
||||||
/*e0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, INVALID,
|
/*e0*/ INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID,
|
||||||
INVALID, PAIR_X | MMX_MULTIPLY | CYCLES_REG, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_REG, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID, PAIR_X | CYCLES_REG,
|
||||||
|
|
||||||
/*f0*/ INVALID, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG, PAIR_X | MMX_SHIFTPACK | CYCLES_REG,
|
/*f0*/ INVALID, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG,
|
||||||
INVALID, PAIR_X | MMX_MULTIPLY | CYCLES_REG, INVALID, INVALID,
|
INVALID, PAIR_X | CYCLES_REG, INVALID, INVALID,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID,
|
||||||
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID,
|
PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, PAIR_X | CYCLES_REG, INVALID,
|
||||||
};
|
};
|
||||||
@@ -580,8 +502,8 @@ static uint32_t opcode_timings_shift[8] =
|
|||||||
};
|
};
|
||||||
static uint32_t opcode_timings_shift_mod3[8] =
|
static uint32_t opcode_timings_shift_mod3[8] =
|
||||||
{
|
{
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES(3) | DSTDEP_RM, PAIR_XY | CYCLES(4) | DSTDEP_RM,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4),
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_shift_imm[8] =
|
static uint32_t opcode_timings_shift_imm[8] =
|
||||||
{
|
{
|
||||||
@@ -590,18 +512,18 @@ static uint32_t opcode_timings_shift_imm[8] =
|
|||||||
};
|
};
|
||||||
static uint32_t opcode_timings_shift_imm_mod3[8] =
|
static uint32_t opcode_timings_shift_imm_mod3[8] =
|
||||||
{
|
{
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES(3) | DSTDEP_RM, PAIR_XY | CYCLES(4) | DSTDEP_RM,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4),
|
||||||
PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM, PAIR_XY | CYCLES_REG | DSTDEP_RM,
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_shift_cl[8] =
|
static uint32_t opcode_timings_shift_cl[8] =
|
||||||
{
|
{
|
||||||
PAIR_XY | CYCLES(2) | SRCDEP_ECX, PAIR_XY | CYCLES(2) | SRCDEP_ECX, PAIR_XY | CYCLES(8) | SRCDEP_ECX, PAIR_XY | CYCLES(9) | SRCDEP_ECX,
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9),
|
||||||
PAIR_XY | CYCLES(2) | SRCDEP_ECX, PAIR_XY | CYCLES(2) | SRCDEP_ECX, PAIR_XY | CYCLES(2) | SRCDEP_ECX, PAIR_XY | CYCLES(2) | SRCDEP_ECX,
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_shift_cl_mod3[8] =
|
static uint32_t opcode_timings_shift_cl_mod3[8] =
|
||||||
{
|
{
|
||||||
PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(8) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(9) | DSTDEP_RM | SRCDEP_ECX,
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9),
|
||||||
PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX, PAIR_XY | CYCLES(2) | DSTDEP_RM | SRCDEP_ECX,
|
PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint32_t opcode_timings_f6[8] =
|
static uint32_t opcode_timings_f6[8] =
|
||||||
@@ -614,21 +536,21 @@ static uint32_t opcode_timings_f6[8] =
|
|||||||
static uint32_t opcode_timings_f6_mod3[8] =
|
static uint32_t opcode_timings_f6_mod3[8] =
|
||||||
{
|
{
|
||||||
/* TST NOT NEG*/
|
/* TST NOT NEG*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_RM, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||||
/* MUL IMUL DIV IDIV*/
|
/* MUL IMUL DIV IDIV*/
|
||||||
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18)
|
PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18)
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_f7[8] =
|
static uint32_t opcode_timings_f7[8] =
|
||||||
{
|
{
|
||||||
/* TST NOT NEG*/
|
/* TST NOT NEG*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_RM, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||||
/* MUL IMUL DIV IDIV*/
|
/* MUL IMUL DIV IDIV*/
|
||||||
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_f7_mod3[8] =
|
static uint32_t opcode_timings_f7_mod3[8] =
|
||||||
{
|
{
|
||||||
/* TST NOT NEG*/
|
/* TST NOT NEG*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_RM, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1),
|
||||||
/* MUL IMUL DIV IDIV*/
|
/* MUL IMUL DIV IDIV*/
|
||||||
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30)
|
||||||
};
|
};
|
||||||
@@ -637,14 +559,14 @@ static uint32_t opcode_timings_ff[8] =
|
|||||||
/* INC DEC CALL CALL far*/
|
/* INC DEC CALL CALL far*/
|
||||||
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5),
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5),
|
||||||
/* JMP JMP far PUSH*/
|
/* JMP JMP far PUSH*/
|
||||||
PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5), PAIR_XY | CYCLES(1) | SRCDEP_ESP | DSTDEP_ESP, INVALID
|
PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5), PAIR_XY | CYCLES(1), INVALID
|
||||||
};
|
};
|
||||||
static uint32_t opcode_timings_ff_mod3[8] =
|
static uint32_t opcode_timings_ff_mod3[8] =
|
||||||
{
|
{
|
||||||
/* INC DEC CALL CALL far*/
|
/* INC DEC CALL CALL far*/
|
||||||
PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM, PAIR_XY | CYCLES_REG | SRCDEP_RM | DSTDEP_RM, PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5),
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5),
|
||||||
/* JMP JMP far PUSH*/
|
/* JMP JMP far PUSH*/
|
||||||
PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5), PAIR_XY | CYCLES(2) | SRCDEP_ESP | DSTDEP_ESP, INVALID
|
PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5), PAIR_XY | CYCLES(2), INVALID
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint32_t opcode_timings_d8[8] =
|
static uint32_t opcode_timings_d8[8] =
|
||||||
@@ -812,8 +734,23 @@ static uint32_t opcode_timings_df_mod3[8] =
|
|||||||
|
|
||||||
static uint32_t opcode_timings_8x[8] =
|
static uint32_t opcode_timings_8x[8] =
|
||||||
{
|
{
|
||||||
PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG,
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||||
PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RMW | SRCDEP_REG, PAIR_XY | CYCLES_RM | SRCDEP_REG
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM
|
||||||
|
};
|
||||||
|
static uint32_t opcode_timings_8x_mod3[8] =
|
||||||
|
{
|
||||||
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG
|
||||||
|
};
|
||||||
|
static uint32_t opcode_timings_81[8] =
|
||||||
|
{
|
||||||
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW,
|
||||||
|
PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM
|
||||||
|
};
|
||||||
|
static uint32_t opcode_timings_81_mod3[8] =
|
||||||
|
{
|
||||||
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG,
|
||||||
|
PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG
|
||||||
};
|
};
|
||||||
|
|
||||||
static int decode_delay;
|
static int decode_delay;
|
||||||
@@ -836,6 +773,7 @@ static inline int COUNT(uint32_t c, int op_32)
|
|||||||
void codegen_timing_686_block_start()
|
void codegen_timing_686_block_start()
|
||||||
{
|
{
|
||||||
prev_full = decode_delay = 0;
|
prev_full = decode_delay = 0;
|
||||||
|
regmask_modified = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_686_start()
|
void codegen_timing_686_start()
|
||||||
@@ -853,9 +791,20 @@ void codegen_timing_686_prefix(uint8_t prefix, uint32_t fetchdat)
|
|||||||
last_prefix = prefix;
|
last_prefix = prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_agi(uint64_t *deps, uint8_t opcode, uint32_t fetchdat, int op_32)
|
||||||
|
{
|
||||||
|
uint32_t addr_regmask = get_addr_regmask(deps[opcode], fetchdat, op_32);
|
||||||
|
|
||||||
|
if (addr_regmask & IMPL_ESP)
|
||||||
|
addr_regmask |= (1 << REG_ESP);
|
||||||
|
|
||||||
|
return regmask_modified & addr_regmask;
|
||||||
|
}
|
||||||
|
|
||||||
void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
||||||
{
|
{
|
||||||
uint32_t *timings;
|
uint32_t *timings;
|
||||||
|
uint64_t *deps;
|
||||||
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
||||||
int bit8 = !(opcode & 1);
|
int bit8 = !(opcode & 1);
|
||||||
|
|
||||||
@@ -863,80 +812,101 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
|||||||
{
|
{
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||||
|
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd8:
|
case 0xd8:
|
||||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||||
|
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xd9:
|
case 0xd9:
|
||||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||||
|
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xda:
|
case 0xda:
|
||||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||||
|
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdb:
|
case 0xdb:
|
||||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||||
|
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdc:
|
case 0xdc:
|
||||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||||
|
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdd:
|
case 0xdd:
|
||||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||||
|
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xde:
|
case 0xde:
|
||||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||||
|
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdf:
|
case 0xdf:
|
||||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||||
|
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x80: case 0x81: case 0x82: case 0x83:
|
case 0x80: case 0x82: case 0x83:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings_8x;
|
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||||
if (!mod3)
|
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x_mod3;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0x81:
|
||||||
|
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||||
|
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xc0: case 0xc1:
|
case 0xc0: case 0xc1:
|
||||||
timings = mod3 ? opcode_timings_shift_imm_mod3 : opcode_timings_shift_imm;
|
timings = mod3 ? opcode_timings_shift_imm_mod3 : opcode_timings_shift_imm;
|
||||||
|
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd0: case 0xd1:
|
case 0xd0: case 0xd1:
|
||||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||||
|
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd2: case 0xd3:
|
case 0xd2: case 0xd3:
|
||||||
timings = mod3 ? opcode_timings_shift_cl_mod3 : opcode_timings_shift_cl;
|
timings = mod3 ? opcode_timings_shift_cl_mod3 : opcode_timings_shift_cl;
|
||||||
|
deps = mod3 ? opcode_deps_shift_cl_mod3 : opcode_deps_shift_cl;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||||
|
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xf7:
|
case 0xf7:
|
||||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||||
|
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xff:
|
case 0xff:
|
||||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||||
|
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||||
|
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -946,33 +916,43 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
|||||||
|
|
||||||
if (prev_full)
|
if (prev_full)
|
||||||
{
|
{
|
||||||
uint8_t regmask = get_srcdep_mask(timings[opcode], fetchdat, bit8);
|
uint32_t regmask = get_srcdep_mask(deps[opcode], fetchdat, bit8, op_32);
|
||||||
|
int agi_stall = 0;
|
||||||
|
|
||||||
|
if (regmask & IMPL_ESP)
|
||||||
|
regmask |= SRCDEP_ESP | DSTDEP_ESP;
|
||||||
|
|
||||||
|
if (check_agi(prev_deps, prev_opcode, prev_fetchdat, prev_op_32))
|
||||||
|
agi_stall = 2;
|
||||||
|
|
||||||
/*Second instruction in the pair*/
|
/*Second instruction in the pair*/
|
||||||
if ((timings[opcode] & PAIR_MASK) == PAIR_NP)
|
if ((timings[opcode] & PAIR_MASK) == PAIR_NP)
|
||||||
{
|
{
|
||||||
/*Instruction can not pair with previous*/
|
/*Instruction can not pair with previous*/
|
||||||
/*Run previous now*/
|
/*Run previous now*/
|
||||||
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay;
|
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay + agi_stall;
|
||||||
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1;
|
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1 + agi_stall;
|
||||||
prev_full = 0;
|
prev_full = 0;
|
||||||
|
regmask_modified = prev_regmask;
|
||||||
}
|
}
|
||||||
else if (((timings[opcode] & PAIR_MASK) == PAIR_X || (timings[opcode] & PAIR_MASK) == PAIR_X_BRANCH)
|
else if (((timings[opcode] & PAIR_MASK) == PAIR_X || (timings[opcode] & PAIR_MASK) == PAIR_X_BRANCH)
|
||||||
&& (prev_timings[opcode] & PAIR_MASK) == PAIR_X)
|
&& (prev_timings[opcode] & PAIR_MASK) == PAIR_X)
|
||||||
{
|
{
|
||||||
/*Instruction can not pair with previous*/
|
/*Instruction can not pair with previous*/
|
||||||
/*Run previous now*/
|
/*Run previous now*/
|
||||||
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay;
|
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay + agi_stall;
|
||||||
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1;
|
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1 + agi_stall;
|
||||||
prev_full = 0;
|
prev_full = 0;
|
||||||
|
regmask_modified = prev_regmask;
|
||||||
}
|
}
|
||||||
else if (prev_regmask & regmask)
|
else if (prev_regmask & regmask)
|
||||||
{
|
{
|
||||||
/*Instruction can not pair with previous*/
|
/*Instruction can not pair with previous*/
|
||||||
/*Run previous now*/
|
/*Run previous now*/
|
||||||
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay;
|
codegen_block_cycles += COUNT(prev_timings[prev_opcode], prev_op_32) + decode_delay + agi_stall;
|
||||||
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1;
|
decode_delay = (-COUNT(prev_timings[prev_opcode], prev_op_32)) + 1 + agi_stall;
|
||||||
prev_full = 0;
|
prev_full = 0;
|
||||||
|
regmask_modified = prev_regmask;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -982,9 +962,14 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
|||||||
|
|
||||||
if (!t_pair)
|
if (!t_pair)
|
||||||
fatal("Pairable 0 cycles! %02x %02x\n", opcode, prev_opcode);
|
fatal("Pairable 0 cycles! %02x %02x\n", opcode, prev_opcode);
|
||||||
codegen_block_cycles += t_pair;
|
|
||||||
decode_delay = (-t_pair) + 1;
|
|
||||||
|
|
||||||
|
if (check_agi(deps, opcode, fetchdat, op_32))
|
||||||
|
agi_stall = 2;
|
||||||
|
|
||||||
|
codegen_block_cycles += t_pair + agi_stall;
|
||||||
|
decode_delay = (-t_pair) + 1 + agi_stall;
|
||||||
|
|
||||||
|
regmask_modified = get_dstdep_mask(deps[opcode], fetchdat, bit8) | prev_regmask;
|
||||||
prev_full = 0;
|
prev_full = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -996,8 +981,14 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
|||||||
if ((timings[opcode] & PAIR_MASK) == PAIR_NP || (timings[opcode] & PAIR_MASK) == PAIR_X_BRANCH)
|
if ((timings[opcode] & PAIR_MASK) == PAIR_NP || (timings[opcode] & PAIR_MASK) == PAIR_X_BRANCH)
|
||||||
{
|
{
|
||||||
/*Instruction not pairable*/
|
/*Instruction not pairable*/
|
||||||
codegen_block_cycles += COUNT(timings[opcode], op_32) + decode_delay;
|
int agi_stall = 0;
|
||||||
decode_delay = (-COUNT(timings[opcode], op_32)) + 1;
|
|
||||||
|
if (check_agi(deps, opcode, fetchdat, op_32))
|
||||||
|
agi_stall = 2;
|
||||||
|
|
||||||
|
codegen_block_cycles += COUNT(timings[opcode], op_32) + decode_delay + agi_stall;
|
||||||
|
decode_delay = (-COUNT(timings[opcode], op_32)) + 1 + agi_stall;
|
||||||
|
regmask_modified = get_dstdep_mask(deps[opcode], fetchdat, bit8);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1006,7 +997,11 @@ void codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
|||||||
prev_opcode = opcode;
|
prev_opcode = opcode;
|
||||||
prev_timings = timings;
|
prev_timings = timings;
|
||||||
prev_op_32 = op_32;
|
prev_op_32 = op_32;
|
||||||
prev_regmask = get_dstdep_mask(timings[opcode], fetchdat, bit8);
|
prev_regmask = get_dstdep_mask(deps[opcode], fetchdat, bit8);
|
||||||
|
if (prev_regmask & IMPL_ESP)
|
||||||
|
prev_regmask |= SRCDEP_ESP | DSTDEP_ESP;
|
||||||
|
prev_deps = deps;
|
||||||
|
prev_fetchdat = fetchdat;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,12 @@
|
|||||||
#include "../ibm.h"
|
#include "../ibm.h"
|
||||||
#include "../mem.h"
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "x86.h"
|
#include "x86.h"
|
||||||
#include "x86_ops.h"
|
#include "x86_ops.h"
|
||||||
#include "x87.h"
|
#include "x87.h"
|
||||||
|
#include "../mem.h"
|
||||||
#include "codegen.h"
|
#include "codegen.h"
|
||||||
|
#include "codegen_ops.h"
|
||||||
|
#include "codegen_timing_common.h"
|
||||||
|
|
||||||
#define CYCLES(c) (int *)c
|
#define CYCLES(c) (int *)c
|
||||||
#define CYCLES2(c16, c32) (int *)((-1 & ~0xffff) | c16 | (c32 << 8))
|
#define CYCLES2(c16, c32) (int *)((-1 & ~0xffff) | c16 | (c32 << 8))
|
||||||
@@ -247,14 +249,27 @@ static int *opcode_timings_8x[8] =
|
|||||||
{
|
{
|
||||||
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
};
|
};
|
||||||
|
static int *opcode_timings_8x_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
static int *opcode_timings_81[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
static int *opcode_timings_81_mod3[8] =
|
||||||
|
{
|
||||||
|
&timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm
|
||||||
|
};
|
||||||
|
|
||||||
static int timing_count;
|
static int timing_count;
|
||||||
static uint8_t last_prefix;
|
static uint8_t last_prefix;
|
||||||
|
static uint32_t regmask_modified;
|
||||||
|
|
||||||
static __inline int COUNT(int *c, int op_32)
|
static inline int COUNT(int *c, int op_32)
|
||||||
{
|
{
|
||||||
if ((uintptr_t)c <= 10000)
|
if ((uintptr_t)c <= 10000)
|
||||||
return (int)c;
|
return (int)(uintptr_t)c;
|
||||||
if (((uintptr_t)c & ~0xffff) == (-1 & ~0xffff))
|
if (((uintptr_t)c & ~0xffff) == (-1 & ~0xffff))
|
||||||
{
|
{
|
||||||
if (op_32 & 0x100)
|
if (op_32 & 0x100)
|
||||||
@@ -266,6 +281,7 @@ static __inline int COUNT(int *c, int op_32)
|
|||||||
|
|
||||||
void codegen_timing_winchip_block_start()
|
void codegen_timing_winchip_block_start()
|
||||||
{
|
{
|
||||||
|
regmask_modified = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_winchip_start()
|
void codegen_timing_winchip_start()
|
||||||
@@ -283,82 +299,107 @@ void codegen_timing_winchip_prefix(uint8_t prefix, uint32_t fetchdat)
|
|||||||
void codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
void codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
||||||
{
|
{
|
||||||
int **timings;
|
int **timings;
|
||||||
|
uint64_t *deps;
|
||||||
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
int mod3 = ((fetchdat & 0xc0) == 0xc0);
|
||||||
|
int bit8 = !(opcode & 1);
|
||||||
|
|
||||||
switch (last_prefix)
|
switch (last_prefix)
|
||||||
{
|
{
|
||||||
case 0x0f:
|
case 0x0f:
|
||||||
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f;
|
||||||
|
deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xd8:
|
case 0xd8:
|
||||||
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8;
|
||||||
|
deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xd9:
|
case 0xd9:
|
||||||
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9;
|
||||||
|
deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xda:
|
case 0xda:
|
||||||
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da;
|
||||||
|
deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdb:
|
case 0xdb:
|
||||||
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db;
|
||||||
|
deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db;
|
||||||
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdc:
|
case 0xdc:
|
||||||
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc;
|
||||||
|
deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdd:
|
case 0xdd:
|
||||||
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd;
|
||||||
|
deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xde:
|
case 0xde:
|
||||||
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de;
|
||||||
|
deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xdf:
|
case 0xdf:
|
||||||
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df;
|
||||||
|
deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df;
|
||||||
opcode = (opcode >> 3) & 7;
|
opcode = (opcode >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x80: case 0x81: case 0x82: case 0x83:
|
case 0x80: case 0x82: case 0x83:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings_8x;
|
timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x;
|
||||||
if (!mod3)
|
deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x_mod3;
|
||||||
|
opcode = (fetchdat >> 3) & 7;
|
||||||
|
break;
|
||||||
|
case 0x81:
|
||||||
|
timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81;
|
||||||
|
deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xc0: case 0xc1: case 0xd0: case 0xd1: case 0xd2: case 0xd3:
|
case 0xc0: case 0xc1: case 0xd0: case 0xd1: case 0xd2: case 0xd3:
|
||||||
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift;
|
||||||
|
deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6;
|
||||||
|
deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xf7:
|
case 0xf7:
|
||||||
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7;
|
||||||
|
deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
case 0xff:
|
case 0xff:
|
||||||
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff;
|
||||||
|
deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff;
|
||||||
opcode = (fetchdat >> 3) & 7;
|
opcode = (fetchdat >> 3) & 7;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
timings = mod3 ? opcode_timings_mod3 : opcode_timings;
|
||||||
|
deps = mod3 ? opcode_deps_mod3 : opcode_deps;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
timing_count += COUNT(timings[opcode], op_32);
|
timing_count += COUNT(timings[opcode], op_32);
|
||||||
|
if (regmask_modified & get_addr_regmask(deps[opcode], fetchdat, op_32))
|
||||||
|
timing_count++; /*AGI stall*/
|
||||||
codegen_block_cycles += timing_count;
|
codegen_block_cycles += timing_count;
|
||||||
|
|
||||||
|
regmask_modified = get_dstdep_mask(deps[opcode], fetchdat, bit8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_winchip_block_end()
|
void codegen_timing_winchip_block_end()
|
||||||
|
|||||||
@@ -146,7 +146,8 @@ MAINOBJ = pc.o config.o device.o timer.o dma.o io.o nmi.o pic.o \
|
|||||||
memregs.o intel_flash.o rtc.o nvr.o ps2_nvr.o
|
memregs.o intel_flash.o rtc.o nvr.o ps2_nvr.o
|
||||||
CPUOBJ = cpu.o 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o \
|
CPUOBJ = cpu.o 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o \
|
||||||
codegen.o \
|
codegen.o \
|
||||||
codegen_ops.o codegen_timing_486.o \
|
codegen_ops.o \
|
||||||
|
codegen_timing_common.o codegen_timing_486.o \
|
||||||
codegen_timing_686.o codegen_timing_pentium.o \
|
codegen_timing_686.o codegen_timing_pentium.o \
|
||||||
codegen_timing_winchip.o $(PLATCG) \
|
codegen_timing_winchip.o $(PLATCG) \
|
||||||
x86seg.o x87.o
|
x86seg.o x87.o
|
||||||
|
|||||||
21
src/mouse.c
21
src/mouse.c
@@ -8,10 +8,11 @@
|
|||||||
*
|
*
|
||||||
* Common driver module for MOUSE devices.
|
* Common driver module for MOUSE devices.
|
||||||
*
|
*
|
||||||
* Version: @(#)mouse.c 1.0.3 2017/06/21
|
* Version: @(#)mouse.c 1.0.4 2017/07/24
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
|
* TheCollector1995,
|
||||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Copyright 2008-2017 Sarah Walker.
|
* Copyright 2008-2017 Sarah Walker.
|
||||||
* Copyright 2016-2017 Miran Grca.
|
* Copyright 2016-2017 Miran Grca.
|
||||||
@@ -36,15 +37,15 @@ static mouse_t mouse_none = {
|
|||||||
static mouse_t *mouse_list[] = {
|
static mouse_t *mouse_list[] = {
|
||||||
&mouse_none,
|
&mouse_none,
|
||||||
&mouse_bus, /* 1 Microsoft/Logitech Bus Mouse 2-button */
|
&mouse_bus, /* 1 Microsoft/Logitech Bus Mouse 2-button */
|
||||||
&mouse_msystems, /* 2 Mouse Systems */
|
&mouse_inport, /* 2 Microsoft InPort Mouse */
|
||||||
&mouse_serial_microsoft, /* 3 Microsoft Serial Mouse */
|
&mouse_msystems, /* 3 Mouse Systems */
|
||||||
&mouse_serial_logitech, /* 4 Logitech 3-button Serial Mouse */
|
&mouse_serial_microsoft, /* 4 Microsoft Serial Mouse */
|
||||||
&mouse_serial_mswheel, /* 5 Microsoft Serial Wheel Mouse */
|
&mouse_serial_logitech, /* 5 Logitech 3-button Serial Mouse */
|
||||||
&mouse_ps2_2_button, /* 6 PS/2 Mouse 2-button */
|
&mouse_serial_mswheel, /* 6 Microsoft Serial Wheel Mouse */
|
||||||
&mouse_intellimouse, /* 7 PS/2 Intellimouse 3-button */
|
&mouse_ps2_2_button, /* 7 PS/2 Mouse 2-button */
|
||||||
&mouse_amstrad, /* 8 Amstrad PC System Mouse */
|
&mouse_intellimouse, /* 8 PS/2 Intellimouse 3-button */
|
||||||
&mouse_olim24, /* 9 Olivetti M24 System Mouse */
|
&mouse_amstrad, /* 9 Amstrad PC System Mouse */
|
||||||
&mouse_inport, /* 10 Microsoft InPort Mouse */
|
&mouse_olim24, /* 10 Olivetti M24 System Mouse */
|
||||||
#if 0
|
#if 0
|
||||||
&mouse_genius, /* 11 Genius Bus Mouse */
|
&mouse_genius, /* 11 Genius Bus Mouse */
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
18
src/mouse.h
18
src/mouse.h
@@ -25,15 +25,15 @@
|
|||||||
#define MOUSE_TYPE_GENIUS 11 /* Genius Bus Mouse */
|
#define MOUSE_TYPE_GENIUS 11 /* Genius Bus Mouse */
|
||||||
#endif
|
#endif
|
||||||
#define MOUSE_TYPE_BUS 1 /* Logitech/ATI Bus Mouse */
|
#define MOUSE_TYPE_BUS 1 /* Logitech/ATI Bus Mouse */
|
||||||
#define MOUSE_TYPE_MSYSTEMS 2 /* Mouse Systems mouse */
|
#define MOUSE_TYPE_INPORT 2 /* Microsoft InPort Mouse */
|
||||||
#define MOUSE_TYPE_SERIAL 3 /* Serial Mouse */
|
#define MOUSE_TYPE_MSYSTEMS 3 /* Mouse Systems mouse */
|
||||||
#define MOUSE_TYPE_LOGITECH 4 /* Logitech Serial Mouse */
|
#define MOUSE_TYPE_SERIAL 4 /* Serial Mouse */
|
||||||
#define MOUSE_TYPE_MSWHEEL 5 /* Serial Wheel Mouse */
|
#define MOUSE_TYPE_LOGITECH 5 /* Logitech Serial Mouse */
|
||||||
#define MOUSE_TYPE_PS2 6 /* IBM PS/2 series Bus Mouse */
|
#define MOUSE_TYPE_MSWHEEL 6 /* Serial Wheel Mouse */
|
||||||
#define MOUSE_TYPE_PS2_MS 7 /* Microsoft Intellimouse PS/2 */
|
#define MOUSE_TYPE_PS2 7 /* IBM PS/2 series Bus Mouse */
|
||||||
#define MOUSE_TYPE_AMSTRAD 8 /* Amstrad PC system mouse */
|
#define MOUSE_TYPE_PS2_MS 8 /* Microsoft Intellimouse PS/2 */
|
||||||
#define MOUSE_TYPE_OLIM24 9 /* Olivetti M24 system mouse */
|
#define MOUSE_TYPE_AMSTRAD 9 /* Amstrad PC system mouse */
|
||||||
#define MOUSE_TYPE_INPORT 10 /* Microsoft InPort Mouse */
|
#define MOUSE_TYPE_OLIM24 10 /* Olivetti M24 system mouse */
|
||||||
|
|
||||||
#define MOUSE_TYPE_MASK 0x0f
|
#define MOUSE_TYPE_MASK 0x0f
|
||||||
#define MOUSE_TYPE_3BUTTON (1<<7) /* device has 3+ buttons */
|
#define MOUSE_TYPE_3BUTTON (1<<7) /* device has 3+ buttons */
|
||||||
|
|||||||
@@ -32,10 +32,11 @@
|
|||||||
* Based on an early driver for MINIX 1.5.
|
* Based on an early driver for MINIX 1.5.
|
||||||
* Based on the 86Box PS/2 mouse driver as a framework.
|
* Based on the 86Box PS/2 mouse driver as a framework.
|
||||||
*
|
*
|
||||||
* Version: @(#)mouse_bus.c 1.0.5 2017/06/02
|
* Version: @(#)mouse_bus.c 1.0.6 2017/07/24
|
||||||
*
|
*
|
||||||
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Author: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Copyright 1989-2017 Fred N. van Kempen.
|
* TheCollector1995,
|
||||||
|
* Copyright 1989-2017 Fred N. van Kempen, TheCollector1995.
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|||||||
Reference in New Issue
Block a user