fpu: Have opcode 0xD8 use fixed_g and the regular instruction decoder

This commit is contained in:
Amaan Cheval 2018-03-13 15:01:40 +05:30 committed by Fabian
parent e437cb4b2b
commit 173be47658
4 changed files with 27 additions and 101 deletions

View file

@ -163,7 +163,6 @@ const encodings = [
{ opcode: 0xD6, nonfaulting: 1, },
{ opcode: 0xD7, skip: 1, },
{ opcode: 0xD8, e: 1, skip: 1, },
{ opcode: 0xD9, e: 1, skip: 1, },
{ opcode: 0xDA, e: 1, skip: 1, },
{ opcode: 0xDB, e: 1, skip: 1, },
@ -664,6 +663,8 @@ for(let i = 0; i < 8; i++)
{ opcode: 0xD1, nonfaulting: 1, os: 1, e: 1, fixed_g: i, mask_flags: af, },
{ opcode: 0xD2, nonfaulting: 1, e: 1, fixed_g: i, mask_flags: of | af, },
{ opcode: 0xD3, nonfaulting: 1, os: 1, e: 1, fixed_g: i, mask_flags: of | af, },
{ opcode: 0xD8, e: 1, fixed_g: i, skip: 1, },
]);
}

View file

@ -627,102 +627,6 @@ void fpu_fdivr(double_t val)
fpu_st[*fpu_stack_ptr] = val / st0;
}
void fpu_op_D8_reg(int32_t imm8)
{
dbg_log_fpu_op(0xD8, imm8);
int32_t mod = imm8 >> 3 & 7;
int32_t low = imm8 & 7;
double_t sti = fpu_get_sti(low);
double_t st0 = fpu_get_st0();
switch(mod)
{
case 0:
// fadd
fpu_st[*fpu_stack_ptr] = st0 + sti;
break;
case 1:
// fmul
fpu_st[*fpu_stack_ptr] = st0 * sti;
break;
case 2:
// fcom
fpu_fcom(sti);
break;
case 3:
// fcomp
fpu_fcom(sti);
fpu_pop();
break;
case 4:
// fsub
fpu_st[*fpu_stack_ptr] = st0 - sti;
break;
case 5:
// fsubr
fpu_st[*fpu_stack_ptr] = sti - st0;
break;
case 6:
// fdiv
fpu_st[*fpu_stack_ptr] = st0 / sti;
break;
case 7:
// fdivr
fpu_st[*fpu_stack_ptr] = sti / st0;
break;
default:
dbg_assert(false);
}
}
void fpu_op_D8_mem(int32_t mod, int32_t addr)
{
dbg_log_fpu_op(0xD8, mod);
double_t m32 = fpu_load_m32(addr);
double_t st0 = fpu_get_st0();
switch(mod)
{
case 0:
// fadd
fpu_st[*fpu_stack_ptr] = st0 + m32;
break;
case 1:
// fmul
fpu_st[*fpu_stack_ptr] = st0 * m32;
break;
case 2:
// fcom
fpu_fcom(m32);
break;
case 3:
// fcomp
fpu_fcom(m32);
fpu_pop();
break;
case 4:
// fsub
fpu_st[*fpu_stack_ptr] = st0 - m32;
break;
case 5:
// fsubr
fpu_st[*fpu_stack_ptr] = m32 - st0;
break;
case 6:
// fdiv
fpu_st[*fpu_stack_ptr] = st0 / m32;
break;
case 7:
// fdivr
fpu_st[*fpu_stack_ptr] = m32 / st0;
break;
default:
dbg_assert(false);
}
}
void fpu_op_D9_reg(int32_t imm8)
{
dbg_log_fpu_op(0xD9, imm8);

View file

@ -1073,8 +1073,15 @@ void instr_D7() {
}
}
void instr_D8_mem(int32_t addr, int32_t r) { task_switch_test(); fpu_op_D8_mem(r, addr); }
void instr_D8_reg(int32_t r2, int32_t r) { task_switch_test(); fpu_op_D8_reg(0xC0 | r2 | r << 3); }
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_0, fpu_fadd(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_1, fpu_fmul(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_2, fpu_fcom(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_3, fpu_fcomp(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_4, fpu_fsub(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_5, fpu_fsubr(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_6, fpu_fdiv(___))
DEFINE_MODRM_INSTR_FPU_READ32(instr_D8_7, fpu_fdivr(___))
void instr_D9_mem(int32_t addr, int32_t r) { task_switch_test(); fpu_op_D9_mem(r, addr); }
void instr_D9_reg(int32_t r2, int32_t r) { task_switch_test(); fpu_op_D9_reg(0xC0 | r2 | r << 3); }
void instr_DA_mem(int32_t addr, int32_t r) { task_switch_test(); fpu_op_DA_mem(r, addr); }

View file

@ -786,8 +786,22 @@ void instr_D4(int32_t arg);
void instr_D5(int32_t arg);
void instr_D6(void);
void instr_D7(void);
void instr_D8_mem(int32_t addr, int32_t r);
void instr_D8_reg(int32_t r2, int32_t r);
void instr_D8_0_mem(int32_t addr);
void instr_D8_0_reg(int32_t r);
void instr_D8_1_mem(int32_t addr);
void instr_D8_1_reg(int32_t r);
void instr_D8_2_mem(int32_t addr);
void instr_D8_2_reg(int32_t r);
void instr_D8_3_mem(int32_t addr);
void instr_D8_3_reg(int32_t r);
void instr_D8_4_mem(int32_t addr);
void instr_D8_4_reg(int32_t r);
void instr_D8_5_mem(int32_t addr);
void instr_D8_5_reg(int32_t r);
void instr_D8_6_mem(int32_t addr);
void instr_D8_6_reg(int32_t r);
void instr_D8_7_mem(int32_t addr);
void instr_D8_7_reg(int32_t r);
void instr_D9_mem(int32_t addr, int32_t r);
void instr_D9_reg(int32_t r2, int32_t r);
void instr_DA_mem(int32_t addr, int32_t r);