Added initial timing model for K6 CPUs.
This commit is contained in:
parent
fd10fdd372
commit
cfd4ac3a4f
11 changed files with 2467 additions and 11 deletions
|
|
@ -18,7 +18,7 @@ uint16_t *codeblock_hash;
|
||||||
|
|
||||||
void (*codegen_timing_start)();
|
void (*codegen_timing_start)();
|
||||||
void (*codegen_timing_prefix)(uint8_t prefix, uint32_t fetchdat);
|
void (*codegen_timing_prefix)(uint8_t prefix, uint32_t fetchdat);
|
||||||
void (*codegen_timing_opcode)(uint8_t opcode, uint32_t fetchdat, int op_32);
|
void (*codegen_timing_opcode)(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc);
|
||||||
void (*codegen_timing_block_start)();
|
void (*codegen_timing_block_start)();
|
||||||
void (*codegen_timing_block_end)();
|
void (*codegen_timing_block_end)();
|
||||||
|
|
||||||
|
|
@ -495,7 +495,7 @@ void codegen_generate_call(uint8_t opcode, OpFn op, uint32_t fetchdat, uint32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_call:
|
generate_call:
|
||||||
codegen_timing_opcode(opcode, fetchdat, op_32);
|
codegen_timing_opcode(opcode, fetchdat, op_32, op_pc);
|
||||||
|
|
||||||
codegen_accumulate(ACCREG_ins, 1);
|
codegen_accumulate(ACCREG_ins, 1);
|
||||||
codegen_accumulate(ACCREG_cycles, -codegen_block_cycles);
|
codegen_accumulate(ACCREG_cycles, -codegen_block_cycles);
|
||||||
|
|
|
||||||
|
|
@ -317,7 +317,7 @@ extern int codegen_block_cycles;
|
||||||
|
|
||||||
extern void (*codegen_timing_start)();
|
extern void (*codegen_timing_start)();
|
||||||
extern void (*codegen_timing_prefix)(uint8_t prefix, uint32_t fetchdat);
|
extern void (*codegen_timing_prefix)(uint8_t prefix, uint32_t fetchdat);
|
||||||
extern void (*codegen_timing_opcode)(uint8_t opcode, uint32_t fetchdat, int op_32);
|
extern void (*codegen_timing_opcode)(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc);
|
||||||
extern void (*codegen_timing_block_start)();
|
extern void (*codegen_timing_block_start)();
|
||||||
extern void (*codegen_timing_block_end)();
|
extern void (*codegen_timing_block_end)();
|
||||||
|
|
||||||
|
|
@ -325,7 +325,7 @@ typedef struct codegen_timing_t
|
||||||
{
|
{
|
||||||
void (*start)();
|
void (*start)();
|
||||||
void (*prefix)(uint8_t prefix, uint32_t fetchdat);
|
void (*prefix)(uint8_t prefix, uint32_t fetchdat);
|
||||||
void (*opcode)(uint8_t opcode, uint32_t fetchdat, int op_32);
|
void (*opcode)(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc);
|
||||||
void (*block_start)();
|
void (*block_start)();
|
||||||
void (*block_end)();
|
void (*block_end)();
|
||||||
} codegen_timing_t;
|
} codegen_timing_t;
|
||||||
|
|
@ -335,6 +335,7 @@ extern codegen_timing_t codegen_timing_686;
|
||||||
extern codegen_timing_t codegen_timing_486;
|
extern codegen_timing_t codegen_timing_486;
|
||||||
extern codegen_timing_t codegen_timing_winchip;
|
extern codegen_timing_t codegen_timing_winchip;
|
||||||
extern codegen_timing_t codegen_timing_winchip2;
|
extern codegen_timing_t codegen_timing_winchip2;
|
||||||
|
extern codegen_timing_t codegen_timing_k6;
|
||||||
|
|
||||||
void codegen_timing_set(codegen_timing_t *timing);
|
void codegen_timing_set(codegen_timing_t *timing);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ void codegen_timing_486_prefix(uint8_t prefix, uint32_t fetchdat)
|
||||||
last_prefix = prefix;
|
last_prefix = prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
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, uint32_t op_pc)
|
||||||
{
|
{
|
||||||
int **timings;
|
int **timings;
|
||||||
uint64_t *deps;
|
uint64_t *deps;
|
||||||
|
|
|
||||||
|
|
@ -823,7 +823,7 @@ static int check_agi(uint64_t *deps, uint8_t opcode, uint32_t fetchdat, int op_3
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 op_pc)
|
||||||
{
|
{
|
||||||
uint32_t *timings;
|
uint32_t *timings;
|
||||||
uint64_t *deps;
|
uint64_t *deps;
|
||||||
|
|
|
||||||
|
|
@ -434,6 +434,171 @@ uint64_t opcode_deps_0f_mod3[256] =
|
||||||
MODRM, MODRM, MODRM, 0,
|
MODRM, MODRM, MODRM, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint64_t opcode_deps_0f0f[256] =
|
||||||
|
{
|
||||||
|
/*00*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, MODRM, 0, 0,
|
||||||
|
|
||||||
|
/*10*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, MODRM, 0, 0,
|
||||||
|
|
||||||
|
/*20*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*30*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*40*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*50*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*60*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*70*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*80*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*90*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, MODRM, 0,
|
||||||
|
0, 0, MODRM, 0,
|
||||||
|
|
||||||
|
/*a0*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*b0*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, MODRM,
|
||||||
|
|
||||||
|
/*c0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*d0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*e0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*f0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
};
|
||||||
|
uint64_t opcode_deps_0f0f_mod3[256] =
|
||||||
|
{
|
||||||
|
/*00*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, MODRM, 0, 0,
|
||||||
|
|
||||||
|
/*10*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, MODRM, 0, 0,
|
||||||
|
|
||||||
|
/*20*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*30*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*40*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*50*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*60*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*70*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*80*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*90*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, MODRM, 0,
|
||||||
|
0, 0, MODRM, 0,
|
||||||
|
|
||||||
|
/*a0*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*b0*/ MODRM, 0, 0, 0,
|
||||||
|
MODRM, 0, MODRM, MODRM,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, MODRM,
|
||||||
|
|
||||||
|
/*c0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*d0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*e0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
|
||||||
|
/*f0*/ 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0,
|
||||||
|
};
|
||||||
|
|
||||||
uint64_t opcode_deps_shift[8] =
|
uint64_t opcode_deps_shift[8] =
|
||||||
{
|
{
|
||||||
MODRM, MODRM, MODRM, MODRM,
|
MODRM, MODRM, MODRM, MODRM,
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,8 @@ extern uint64_t opcode_deps[256];
|
||||||
extern uint64_t opcode_deps_mod3[256];
|
extern uint64_t opcode_deps_mod3[256];
|
||||||
extern uint64_t opcode_deps_0f[256];
|
extern uint64_t opcode_deps_0f[256];
|
||||||
extern uint64_t opcode_deps_0f_mod3[256];
|
extern uint64_t opcode_deps_0f_mod3[256];
|
||||||
|
extern uint64_t opcode_deps_0f0f[256];
|
||||||
|
extern uint64_t opcode_deps_0f0f_mod3[256];
|
||||||
extern uint64_t opcode_deps_shift[8];
|
extern uint64_t opcode_deps_shift[8];
|
||||||
extern uint64_t opcode_deps_shift_mod3[8];
|
extern uint64_t opcode_deps_shift_mod3[8];
|
||||||
extern uint64_t opcode_deps_shift_cl[8];
|
extern uint64_t opcode_deps_shift_cl[8];
|
||||||
|
|
|
||||||
2288
src/codegen_timing_k6.c
Normal file
2288
src/codegen_timing_k6.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1075,7 +1075,7 @@ static void codegen_instruction(uint64_t *timings, uint64_t *deps, uint8_t opcod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
void codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc)
|
||||||
{
|
{
|
||||||
uint64_t *timings;
|
uint64_t *timings;
|
||||||
uint64_t *deps;
|
uint64_t *deps;
|
||||||
|
|
|
||||||
|
|
@ -296,7 +296,7 @@ void codegen_timing_winchip_prefix(uint8_t prefix, uint32_t fetchdat)
|
||||||
last_prefix = prefix;
|
last_prefix = prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
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, uint32_t op_pc)
|
||||||
{
|
{
|
||||||
int **timings;
|
int **timings;
|
||||||
uint64_t *deps;
|
uint64_t *deps;
|
||||||
|
|
|
||||||
|
|
@ -563,7 +563,7 @@ static void codegen_timing_winchip2_prefix(uint8_t prefix, uint32_t fetchdat)
|
||||||
last_prefix = prefix;
|
last_prefix = prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32)
|
static void codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc)
|
||||||
{
|
{
|
||||||
uint32_t *timings;
|
uint32_t *timings;
|
||||||
uint64_t *deps;
|
uint64_t *deps;
|
||||||
|
|
|
||||||
|
|
@ -1374,7 +1374,7 @@ void cpu_set()
|
||||||
cpu_hasCR4 = 1;
|
cpu_hasCR4 = 1;
|
||||||
cpu_hasVME = 1;
|
cpu_hasVME = 1;
|
||||||
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE;
|
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE;
|
||||||
codegen_timing_set(&codegen_timing_pentium);
|
codegen_timing_set(&codegen_timing_k6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CPU_K6_2:
|
case CPU_K6_2:
|
||||||
|
|
@ -1418,7 +1418,7 @@ void cpu_set()
|
||||||
cpu_hasCR4 = 1;
|
cpu_hasCR4 = 1;
|
||||||
cpu_hasVME = 1;
|
cpu_hasVME = 1;
|
||||||
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE;
|
cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE;
|
||||||
codegen_timing_set(&codegen_timing_pentium);
|
codegen_timing_set(&codegen_timing_k6);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue