Implement Cyrix EMMI extensions and 4 FPU instructions
PADDSIW, PSUBSIW, PMULHRW (named PMULHRWC in the code as recognized by some assemblers), PMULHRIW, PDISTIB, PMACHRIW, PAVEB, PMAGW, PMVZB, PMVNZB, PMVLZB, PMVGEZB, FTSTP, FRINT2, FRINEAR, FRICHOP are implemented for Cyrix 6x86MX. Cyrix 6x86(L) only has the last 4 instructions.
This commit is contained in:
@@ -279,13 +279,14 @@ uint8_t do_translate2 = 0;
|
||||
|
||||
void (*cpu_exec)(int32_t cycs);
|
||||
|
||||
static uint8_t ccr0;
|
||||
static uint8_t ccr1;
|
||||
static uint8_t ccr2;
|
||||
static uint8_t ccr3;
|
||||
static uint8_t ccr4;
|
||||
static uint8_t ccr5;
|
||||
static uint8_t ccr6;
|
||||
uint8_t ccr0;
|
||||
uint8_t ccr1;
|
||||
uint8_t ccr2;
|
||||
uint8_t ccr3;
|
||||
uint8_t ccr4;
|
||||
uint8_t ccr5;
|
||||
uint8_t ccr6;
|
||||
uint8_t ccr7;
|
||||
|
||||
static int cyrix_addr;
|
||||
|
||||
@@ -557,7 +558,8 @@ cpu_set(void)
|
||||
cpu_busspeed = cpu_s->rspeed;
|
||||
cpu_multi = (int) ceil(cpu_s->multi);
|
||||
cpu_dmulti = cpu_s->multi;
|
||||
ccr0 = ccr1 = ccr2 = ccr3 = ccr4 = ccr5 = ccr6 = 0;
|
||||
ccr0 = ccr1 = ccr2 = ccr3 = ccr4 = ccr5 = ccr6 = ccr7 = 0;
|
||||
ccr4 = 0x85;
|
||||
|
||||
cpu_update_waitstates();
|
||||
|
||||
@@ -1442,19 +1444,27 @@ cpu_set(void)
|
||||
}
|
||||
# endif /* USE_DYNAREC */
|
||||
if (fpu_softfloat) {
|
||||
x86_opcodes_d9_a16 = ops_sf_fpu_cyrix_d9_a16;
|
||||
x86_opcodes_d9_a32 = ops_sf_fpu_cyrix_d9_a32;
|
||||
x86_opcodes_da_a16 = ops_sf_fpu_686_da_a16;
|
||||
x86_opcodes_da_a32 = ops_sf_fpu_686_da_a32;
|
||||
x86_opcodes_db_a16 = ops_sf_fpu_686_db_a16;
|
||||
x86_opcodes_db_a32 = ops_sf_fpu_686_db_a32;
|
||||
x86_opcodes_df_a16 = ops_sf_fpu_686_df_a16;
|
||||
x86_opcodes_df_a32 = ops_sf_fpu_686_df_a32;
|
||||
x86_opcodes_db_a16 = ops_sf_fpu_cyrix_686_db_a16;
|
||||
x86_opcodes_db_a32 = ops_sf_fpu_cyrix_686_db_a32;
|
||||
x86_opcodes_dd_a16 = ops_sf_fpu_cyrix_dd_a16;
|
||||
x86_opcodes_dd_a32 = ops_sf_fpu_cyrix_dd_a32;
|
||||
x86_opcodes_df_a16 = ops_sf_fpu_cyrix_686_df_a16;
|
||||
x86_opcodes_df_a32 = ops_sf_fpu_cyrix_686_df_a32;
|
||||
} else {
|
||||
x86_opcodes_d9_a16 = ops_fpu_cyrix_d9_a16;
|
||||
x86_opcodes_d9_a32 = ops_fpu_cyrix_d9_a32;
|
||||
x86_opcodes_da_a16 = ops_fpu_686_da_a16;
|
||||
x86_opcodes_da_a32 = ops_fpu_686_da_a32;
|
||||
x86_opcodes_db_a16 = ops_fpu_686_db_a16;
|
||||
x86_opcodes_db_a32 = ops_fpu_686_db_a32;
|
||||
x86_opcodes_df_a16 = ops_fpu_686_df_a16;
|
||||
x86_opcodes_df_a32 = ops_fpu_686_df_a32;
|
||||
x86_opcodes_db_a16 = ops_fpu_cyrix_686_db_a16;
|
||||
x86_opcodes_db_a32 = ops_fpu_cyrix_686_db_a32;
|
||||
x86_opcodes_dd_a16 = ops_fpu_cyrix_dd_a16;
|
||||
x86_opcodes_dd_a32 = ops_fpu_cyrix_dd_a32;
|
||||
x86_opcodes_df_a16 = ops_fpu_cyrix_686_df_a16;
|
||||
x86_opcodes_df_a32 = ops_fpu_cyrix_686_df_a32;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4291,6 +4301,9 @@ cpu_write(uint16_t addr, uint8_t val, UNUSED(void *priv))
|
||||
if ((ccr3 & 0xf0) == 0x10)
|
||||
ccr6 = val;
|
||||
break;
|
||||
case 0xeb: /* CCR7 */
|
||||
ccr7 = val & 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4319,6 +4332,8 @@ cpu_read(uint16_t addr, UNUSED(void *priv))
|
||||
return ((ccr3 & 0xf0) == 0x10) ? ccr5 : 0xff;
|
||||
case 0xea:
|
||||
return ((ccr3 & 0xf0) == 0x10) ? ccr6 : 0xff;
|
||||
case 0xeb:
|
||||
return ccr7;
|
||||
case 0xfe:
|
||||
return cpu_s->cyrix_id & 0xff;
|
||||
case 0xff:
|
||||
|
||||
Reference in New Issue
Block a user