From 4bc45e28bac4af7e1932a9c532cfb66cd51957e9 Mon Sep 17 00:00:00 2001 From: Theodore Dubois Date: Sat, 22 Aug 2020 02:14:40 -0700 Subject: [PATCH] Implement sqrtsd Fixes #849 --- emu/decode.h | 2 ++ emu/vec.c | 2 ++ emu/vec.h | 1 + tests/e2e/qemu/expected.txt | 2 ++ tests/e2e/qemu/qemu-test.c | 2 +- 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/emu/decode.h b/emu/decode.h index ca7f8aaec7..42bab59a51 100644 --- a/emu/decode.h +++ b/emu/decode.h @@ -987,6 +987,8 @@ __no_instrument DECODER_RET glue(DECODER_NAME, OP_SIZE)(DECODER_ARGS) { case 0x5a: TRACEI("cvtsd2ss xmm:modrm, xmm"); READMODRM; V_OP(cvtsd2ss, xmm_modrm_val, xmm_modrm_reg,64); break; + case 0x51: TRACEI("sqrtsd xmm:modrm, xmm"); + READMODRM; V_OP(single_fsqrt, xmm_modrm_val, xmm_modrm_reg,64); break; case 0x58: TRACEI("addsd xmm:modrm, xmm"); READMODRM; V_OP(single_fadd, xmm_modrm_val, xmm_modrm_reg,64); break; case 0x59: TRACEI("mulsd xmm:modrm, xmm"); diff --git a/emu/vec.c b/emu/vec.c index 4d480c1481..81f620c3f1 100644 --- a/emu/vec.c +++ b/emu/vec.c @@ -161,6 +161,8 @@ void vec_single_fsub32(NO_CPU, const float *src, float *dst) { *dst -= *src; } void vec_single_fdiv64(NO_CPU, const double *src, double *dst) { *dst /= *src; } void vec_single_fdiv32(NO_CPU, const float *src, float *dst) { *dst /= *src; } +void vec_single_fsqrt64(NO_CPU, const double *src, double *dst) { *dst = sqrt(*src); } + void vec_single_fmax64(NO_CPU, const double *src, double *dst) { if (*src > *dst || isnan(*src) || isnan(*dst)) *dst = *src; } diff --git a/emu/vec.h b/emu/vec.h index f12743a6cd..9137ffc8f4 100644 --- a/emu/vec.h +++ b/emu/vec.h @@ -48,6 +48,7 @@ void vec_single_fsub64(NO_CPU, const double *src, double *dst); void vec_single_fsub32(NO_CPU, const float *src, float *dst); void vec_single_fdiv64(NO_CPU, const double *src, double *dst); void vec_single_fdiv32(NO_CPU, const float *src, float *dst); +void vec_single_fsqrt64(NO_CPU, const double *src, double *dst); void vec_single_fmax64(NO_CPU, const double *src, double *dst); void vec_single_fmin64(NO_CPU, const double *src, double *dst); diff --git a/tests/e2e/qemu/expected.txt b/tests/e2e/qemu/expected.txt index eebdea9347..13d2058119 100644 --- a/tests/e2e/qemu/expected.txt +++ b/tests/e2e/qemu/expected.txt @@ -4468,6 +4468,7 @@ subsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a minsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b333333333333400599999999999a divsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b3333333333333fae3fdc26178701 maxsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b3333333333334046d9999999999a +sqrtsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b333333333333401b0a6bf94cb839 cmpeqsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b3333333333330000000000000000 cmpltsd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b333333333333ffffffffffffffff cmplesd : a=c00b333333333333400599999999999a b=c04ab333333333334046d9999999999a r=c00b333333333333ffffffffffffffff @@ -4486,6 +4487,7 @@ subsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a minsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b3333333333334046d9999999999a divsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b333333333333fff8000000000000 maxsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b3333333333334046d9999999999a +sqrtsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b333333333333401b0a6bf94cb839 cmpeqsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b3333333333330000000000000000 cmpltsd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b3333333333330000000000000000 cmplesd : a=c00b333333333333fff8000000000000 b=fff80000000000004046d9999999999a r=c00b3333333333330000000000000000 diff --git a/tests/e2e/qemu/qemu-test.c b/tests/e2e/qemu/qemu-test.c index 4771c2981a..bd6aa4b659 100644 --- a/tests/e2e/qemu/qemu-test.c +++ b/tests/e2e/qemu/qemu-test.c @@ -2625,7 +2625,7 @@ void test_sse(void) SSE_OPD_S(min); SSE_OPD_S(div); SSE_OPD_S(max); - // SSE_OPD(sqrt); + SSE_OPD_S(sqrt); SSE_OPD_S(cmpeq); SSE_OPD_S(cmplt); SSE_OPD_S(cmple);