Skip to content

Commit

Permalink
Implement a bunch of fpu instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
tbodt committed Oct 31, 2018
1 parent 15d365a commit 1cc4a53
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 8 deletions.
4 changes: 4 additions & 0 deletions emu/decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,11 +573,15 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
case 0xdb5: TRACE("fld mem80"); FLDM(mem_addr_real,80); break;
case 0xdc0: TRACE("fadd mem64"); FADDM(mem_addr_real,64); break;
case 0xdc1: TRACE("fmul mem64"); FMULM(mem_addr_real,64); break;
case 0xdc3: TRACE("fcomp mem64"); FCOMM(mem_addr_real,64); FPOP; break;
case 0xdd0: TRACE("fld mem64"); FLDM(mem_addr_real,64); break;
case 0xdc4: TRACE("fsub mem64"); FSUBM(mem_addr_real,64); break;
case 0xdc5: TRACE("fsubr mem64"); FSUBRM(mem_addr_real,64); break;
case 0xdc6: TRACE("fdiv mem64"); FDIVM(mem_addr_real,64); break;
case 0xdc7: TRACE("fdivr mem64"); FDIVRM(mem_addr_real,64); break;
case 0xdd2: TRACE("fst mem64"); FSTM(mem_addr_real,64); break;
case 0xdd3: TRACE("fstp mem64"); FSTM(mem_addr_real,64); FPOP; break;
case 0xdf0: TRACE("fild mem16"); FILD(mem_addr,16); break;
case 0xdf5: TRACE("fild mem64"); FILD(mem_addr,64); break;
case 0xdf7: TRACE("fistp mem64"); FIST(mem_addr,64); FPOP; break;
default: TRACE("undefined"); UNDEFINED;
Expand Down
17 changes: 13 additions & 4 deletions emu/fpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ void fpu_ldc(struct cpu_state *cpu, enum fpu_const c) {
fpush(fpu_consts[c]);
}

void fpu_ild16(struct cpu_state *cpu, int16_t *i) {
fpush(f80_from_int(*i));
}
void fpu_ild32(struct cpu_state *cpu, int32_t *i) {
fpush(f80_from_int(*i));
}
Expand Down Expand Up @@ -91,13 +94,19 @@ void fpu_yl2x(struct cpu_state *cpu) {
fpu_pop(cpu);
}

void fpu_ucom(struct cpu_state *cpu, int i) {
static void fpu_compare(struct cpu_state *cpu, float80 x) {
cpu->c1 = 0;
cpu->c0 = f80_lt(ST(0), ST(i));
cpu->c3 = f80_eq(ST(0), ST(i));
if (f80_uncomparable(ST(0), ST(i)))
cpu->c0 = f80_lt(ST(0), x);
cpu->c3 = f80_eq(ST(0), x);
if (f80_uncomparable(ST(0), x))
cpu->c0 = cpu->c2 = cpu->c3 = 1;
}
void fpu_com(struct cpu_state *cpu, int i) {
fpu_compare(cpu, ST(i));
}
void fpu_comm64(struct cpu_state *cpu, double *f) {
fpu_compare(cpu, f80_from_double(*f));
}

void fpu_abs(struct cpu_state *cpu) {
ST(0) = f80_abs(ST(0));
Expand Down
5 changes: 4 additions & 1 deletion emu/fpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ void fpu_stm80(struct cpu_state *cpu, float80 *f);

void fpu_ld(struct cpu_state *cpu, int i);
void fpu_ldc(struct cpu_state *cpu, enum fpu_const c);
void fpu_ild16(struct cpu_state *cpu, int16_t *i);
void fpu_ild32(struct cpu_state *cpu, int32_t *i);
void fpu_ild64(struct cpu_state *cpu, int64_t *i);
void fpu_ldm32(struct cpu_state *cpu, float *f);
Expand All @@ -39,7 +40,9 @@ void fpu_ldm80(struct cpu_state *cpu, float80 *f);
void fpu_prem(struct cpu_state *cpu);
void fpu_rndint(struct cpu_state *cpu);
void fpu_yl2x(struct cpu_state *cpu);
void fpu_ucom(struct cpu_state *cpu, int i);
void fpu_com(struct cpu_state *cpu, int i);
void fpu_comm64(struct cpu_state *cpu, double *f);
#define fpu_ucom fpu_com
void fpu_abs(struct cpu_state *cpu);
void fpu_chs(struct cpu_state *cpu);

Expand Down
9 changes: 6 additions & 3 deletions emu/interp/fpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,14 @@
cpu->pf = 0; cpu->pf_res = 0
// not worrying about nans and shit yet

#define FUCOM() \
cpu->c0 = f80_lt(ST(0), ST_i); \
#define F_COMPARE(x) \
cpu->c0 = f80_lt(ST(0), x); \
cpu->c1 = 0; \
cpu->c2 = 0; /* again, not worrying about nans */ \
cpu->c3 = f80_eq(ST(0), ST_i)
cpu->c3 = f80_eq(ST(0), x)
#define FCOM() F_COMPARE(ST_i)
#define FUCOM FCOM
#define FCOMM(val,z) F_COMPARE(f80_from_float(get(val,z),z))

#define FILD(val,z) \
FPUSH(f80_from_int((sint(z)) get(val,z)))
Expand Down
2 changes: 2 additions & 0 deletions jit/gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,8 @@ static inline bool gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a
#define FSTM(dst,z) h_write(fpu_stm, z)
#define FIST(dst,z) h_write(fpu_ist, z)
#define FXCH() hh(fpu_xch, st_i)
#define FCOM() hh(fpu_com, st_i)
#define FCOMM(val,z) h_read(fpu_comm, z)
#define FUCOM() hh(fpu_ucom, st_i)
#define FUCOMI() UNDEFINED
#define FST() hh(fpu_st, st_i)
Expand Down

0 comments on commit 1cc4a53

Please sign in to comment.