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);