Skip to content

Commit

Permalink
Add some SSE math operations used by Go
Browse files Browse the repository at this point in the history
  • Loading branch information
tbodt committed May 9, 2020
1 parent eb364ab commit aefdbcf
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 6 deletions.
15 changes: 9 additions & 6 deletions emu/decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -860,8 +860,6 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
case 0xff: TRACEI("lock grp5 modrm\t");
READMODRM_MEM; GRP5_ATOMIC(modrm_val,oz); break;

#undef GRP5_ATOMIC

default: TRACE("undefined"); UNDEFINED;
}
break;
Expand All @@ -873,11 +871,16 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) {
READINSN;
switch (insn) {
case 0x10: TRACEI("movsd xmm:modrm, xmm");
READMODRM; VLOAD_PADMEM(xmm_modrm_val, xmm_modrm_reg,64);
break;
READMODRM; VLOAD_PADMEM(xmm_modrm_val, xmm_modrm_reg,64); break;
case 0x11: TRACEI("movsd xmm, xmm:modrm");
READMODRM; VSTORE(xmm_modrm_reg, xmm_modrm_val,64);
break;
READMODRM; VSTORE(xmm_modrm_reg, xmm_modrm_val,64); break;

case 0x58: TRACEI("addsd xmm:modrm, xmm");
READMODRM; VS_FMATH(add, xmm_modrm_val, xmm_modrm_reg,64); break;
case 0x59: TRACEI("mulsd xmm:modrm, xmm");
READMODRM; VS_FMATH(mul, xmm_modrm_val, xmm_modrm_reg,64); break;
case 0x5c: TRACEI("subsd xmm:modrm, xmm");
READMODRM; VS_FMATH(sub, xmm_modrm_val, xmm_modrm_reg,64); break;

case 0x18 ... 0x1f: TRACEI("rep nop modrm\t"); READMODRM; break;
default: TRACE("undefined"); UNDEFINED;
Expand Down
10 changes: 10 additions & 0 deletions emu/vec.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,13 @@ void vec_xor128(struct cpu_state *UNUSED(cpu), union xmm_reg *src, union xmm_reg
dst->qw[0] ^= src->qw[0];
dst->qw[1] ^= src->qw[1];
}

void vec_fadds64(struct cpu_state *UNUSED(cpu), const double *src, double *dst) {
*dst += *src;
}
void vec_fmuls64(struct cpu_state *UNUSED(cpu), const double *src, double *dst) {
*dst *= *src;
}
void vec_fsubs64(struct cpu_state *UNUSED(cpu), const double *src, double *dst) {
*dst -= *src;
}
4 changes: 4 additions & 0 deletions emu/vec.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,8 @@ void vec_store128(struct cpu_state *UNUSED(cpu), union xmm_reg *src, const union
void vec_imm_shiftr64(struct cpu_state *UNUSED(cpu), const uint8_t amount, union xmm_reg *src);
void vec_xor128(struct cpu_state *cpu, union xmm_reg *src, union xmm_reg *dst);

void vec_fadds64(struct cpu_state *cpu, const double *src, double *dst);
void vec_fmuls64(struct cpu_state *cpu, const double *src, double *dst);
void vec_fsubs64(struct cpu_state *cpu, const double *src, double *dst);

#endif
1 change: 1 addition & 0 deletions jit/gen.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,7 @@ static inline bool gen_vec(enum arg rm, enum arg reg, void (*helper)(), gadget_t
#define VCOMPARE(src, dst,z) v(compare, src, dst,z)
#define VSHIFTR_IMM(src, dst, z) v_imm(imm_shiftr, src, dst,z)
#define VXOR(src, dst,z) v(xor, src, dst,z)
#define VS_FMATH(op, src, dst,z) v(f##op##s, src, dst,z)

#define DECODER_RET int
#define DECODER_NAME gen_step
Expand Down

0 comments on commit aefdbcf

Please sign in to comment.