Sebastian Lackner : vcomp: Implement _vcomp_reduction_r8 and add tests.
Alexandre Julliard
julliard at winehq.org
Thu Sep 8 10:39:21 CDT 2016
Module: wine
Branch: master
Commit: 0c4c6d603bad5c24ccf54439ae9e5c2f6c436f1a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c4c6d603bad5c24ccf54439ae9e5c2f6c436f1a
Author: Sebastian Lackner <sebastian at fds-team.de>
Date: Thu Sep 8 08:22:11 2016 +0200
vcomp: Implement _vcomp_reduction_r8 and add tests.
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/vcomp/main.c | 40 ++++++++++++++++++++++++++++++++++++++++
dlls/vcomp/tests/vcomp.c | 13 +++++++++++--
dlls/vcomp/vcomp.spec | 2 +-
dlls/vcomp100/vcomp100.spec | 2 +-
dlls/vcomp110/vcomp110.spec | 2 +-
dlls/vcomp120/vcomp120.spec | 2 +-
dlls/vcomp140/vcomp140.spec | 2 +-
dlls/vcomp90/vcomp90.spec | 2 +-
8 files changed, 57 insertions(+), 8 deletions(-)
diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c
index d4c9366..34e327e 100644
--- a/dlls/vcomp/main.c
+++ b/dlls/vcomp/main.c
@@ -894,6 +894,46 @@ void CDECL _vcomp_atomic_sub_r8(double *dest, double val)
while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
}
+static void CDECL _vcomp_atomic_bool_and_r8(double *dest, double val)
+{
+ LONG64 old, new;
+ do
+ {
+ old = *(LONG64 *)dest;
+ *(double *)&new = (*(double *)&old != 0.0) ? (val != 0.0) : 0.0;
+ }
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
+}
+
+static void CDECL _vcomp_atomic_bool_or_r8(double *dest, double val)
+{
+ LONG64 old, new;
+ do
+ {
+ old = *(LONG64 *)dest;
+ *(double *)&new = (*(double *)&old != 0.0) ? *(double *)&old : (val != 0.0);
+ }
+ while (interlocked_cmpxchg64((LONG64 *)dest, new, old) != old);
+}
+
+void CDECL _vcomp_reduction_r8(unsigned int flags, double *dest, double val)
+{
+ static void (CDECL * const funcs[])(double *, double) =
+ {
+ _vcomp_atomic_add_r8,
+ _vcomp_atomic_add_r8,
+ _vcomp_atomic_mul_r8,
+ _vcomp_atomic_bool_or_r8,
+ _vcomp_atomic_bool_or_r8,
+ _vcomp_atomic_bool_or_r8,
+ _vcomp_atomic_bool_and_r8,
+ _vcomp_atomic_bool_or_r8,
+ };
+ unsigned int op = (flags >> 8) & 0xf;
+ op = min(op, sizeof(funcs)/sizeof(funcs[0]) - 1);
+ funcs[op](dest, val);
+}
+
int CDECL omp_get_dynamic(void)
{
TRACE("stub\n");
diff --git a/dlls/vcomp/tests/vcomp.c b/dlls/vcomp/tests/vcomp.c
index 15fc473..96a3d9c 100644
--- a/dlls/vcomp/tests/vcomp.c
+++ b/dlls/vcomp/tests/vcomp.c
@@ -108,6 +108,7 @@ static void (CDECL *p_vcomp_reduction_i2)(unsigned int flags, short *dest, sh
static void (CDECL *p_vcomp_reduction_i4)(unsigned int flags, int *dest, int val);
static void (CDECL *p_vcomp_reduction_i8)(unsigned int flags, LONG64 *dest, LONG64 val);
static void (CDECL *p_vcomp_reduction_r4)(unsigned int flags, float *dest, float val);
+static void (CDECL *p_vcomp_reduction_r8)(unsigned int flags, double *dest, double val);
static void (CDECL *p_vcomp_reduction_u1)(unsigned int flags, unsigned char *dest, unsigned char val);
static void (CDECL *p_vcomp_reduction_u2)(unsigned int flags, unsigned short *dest, unsigned short val);
static void (CDECL *p_vcomp_reduction_u4)(unsigned int flags, unsigned int *dest, unsigned int val);
@@ -358,6 +359,7 @@ static BOOL init_vcomp(void)
VCOMP_GET_PROC(_vcomp_reduction_i4);
VCOMP_GET_PROC(_vcomp_reduction_i8);
VCOMP_GET_PROC(_vcomp_reduction_r4);
+ VCOMP_GET_PROC(_vcomp_reduction_r8);
VCOMP_GET_PROC(_vcomp_reduction_u1);
VCOMP_GET_PROC(_vcomp_reduction_u2);
VCOMP_GET_PROC(_vcomp_reduction_u4);
@@ -2110,7 +2112,7 @@ static void test_reduction_integer64(void)
}
}
-static void test_reduction_float(void)
+static void test_reduction_float_double(void)
{
static const struct
{
@@ -2161,6 +2163,13 @@ static void test_reduction_float(void)
ok(tests[i].expected - 0.001 < val && val < tests[i].expected + 0.001,
"test %d: expected val == %f, got %f\n", i, tests[i].expected, val);
}
+ for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
+ {
+ double val = tests[i].v1;
+ p_vcomp_reduction_r8(tests[i].flags, &val, tests[i].v2);
+ ok(tests[i].expected - 0.001 < val && val < tests[i].expected + 0.001,
+ "test %d: expected val == %f, got %f\n", i, tests[i].expected, val);
+ }
}
START_TEST(vcomp)
@@ -2191,7 +2200,7 @@ START_TEST(vcomp)
test_reduction_integer16();
test_reduction_integer32();
test_reduction_integer64();
- test_reduction_float();
+ test_reduction_float_double();
release_vcomp();
}
diff --git a/dlls/vcomp/vcomp.spec b/dlls/vcomp/vcomp.spec
index 22f06cb..f2231c0 100644
--- a/dlls/vcomp/vcomp.spec
+++ b/dlls/vcomp/vcomp.spec
@@ -78,7 +78,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long)
@ cdecl _vcomp_reduction_i8(long ptr int64)
@ cdecl _vcomp_reduction_r4(long ptr float)
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double)
@ cdecl _vcomp_reduction_u1(long ptr long) _vcomp_reduction_i1
@ cdecl _vcomp_reduction_u2(long ptr long) _vcomp_reduction_i2
@ cdecl _vcomp_reduction_u4(long ptr long) _vcomp_reduction_i4
diff --git a/dlls/vcomp100/vcomp100.spec b/dlls/vcomp100/vcomp100.spec
index b87bd8b..afea2f2 100644
--- a/dlls/vcomp100/vcomp100.spec
+++ b/dlls/vcomp100/vcomp100.spec
@@ -78,7 +78,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long) vcomp._vcomp_reduction_i4
@ cdecl _vcomp_reduction_i8(long ptr int64) vcomp._vcomp_reduction_i8
@ cdecl _vcomp_reduction_r4(long ptr float) vcomp._vcomp_reduction_r4
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double) vcomp._vcomp_reduction_r8
@ cdecl _vcomp_reduction_u1(long ptr long) vcomp._vcomp_reduction_u1
@ cdecl _vcomp_reduction_u2(long ptr long) vcomp._vcomp_reduction_u2
@ cdecl _vcomp_reduction_u4(long ptr long) vcomp._vcomp_reduction_u4
diff --git a/dlls/vcomp110/vcomp110.spec b/dlls/vcomp110/vcomp110.spec
index e86d50b..cec1c99 100644
--- a/dlls/vcomp110/vcomp110.spec
+++ b/dlls/vcomp110/vcomp110.spec
@@ -79,7 +79,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long) vcomp._vcomp_reduction_i4
@ cdecl _vcomp_reduction_i8(long ptr int64) vcomp._vcomp_reduction_i8
@ cdecl _vcomp_reduction_r4(long ptr float) vcomp._vcomp_reduction_r4
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double) vcomp._vcomp_reduction_r8
@ cdecl _vcomp_reduction_u1(long ptr long) vcomp._vcomp_reduction_u1
@ cdecl _vcomp_reduction_u2(long ptr long) vcomp._vcomp_reduction_u2
@ cdecl _vcomp_reduction_u4(long ptr long) vcomp._vcomp_reduction_u4
diff --git a/dlls/vcomp120/vcomp120.spec b/dlls/vcomp120/vcomp120.spec
index e86d50b..cec1c99 100644
--- a/dlls/vcomp120/vcomp120.spec
+++ b/dlls/vcomp120/vcomp120.spec
@@ -79,7 +79,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long) vcomp._vcomp_reduction_i4
@ cdecl _vcomp_reduction_i8(long ptr int64) vcomp._vcomp_reduction_i8
@ cdecl _vcomp_reduction_r4(long ptr float) vcomp._vcomp_reduction_r4
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double) vcomp._vcomp_reduction_r8
@ cdecl _vcomp_reduction_u1(long ptr long) vcomp._vcomp_reduction_u1
@ cdecl _vcomp_reduction_u2(long ptr long) vcomp._vcomp_reduction_u2
@ cdecl _vcomp_reduction_u4(long ptr long) vcomp._vcomp_reduction_u4
diff --git a/dlls/vcomp140/vcomp140.spec b/dlls/vcomp140/vcomp140.spec
index e86d50b..cec1c99 100644
--- a/dlls/vcomp140/vcomp140.spec
+++ b/dlls/vcomp140/vcomp140.spec
@@ -79,7 +79,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long) vcomp._vcomp_reduction_i4
@ cdecl _vcomp_reduction_i8(long ptr int64) vcomp._vcomp_reduction_i8
@ cdecl _vcomp_reduction_r4(long ptr float) vcomp._vcomp_reduction_r4
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double) vcomp._vcomp_reduction_r8
@ cdecl _vcomp_reduction_u1(long ptr long) vcomp._vcomp_reduction_u1
@ cdecl _vcomp_reduction_u2(long ptr long) vcomp._vcomp_reduction_u2
@ cdecl _vcomp_reduction_u4(long ptr long) vcomp._vcomp_reduction_u4
diff --git a/dlls/vcomp90/vcomp90.spec b/dlls/vcomp90/vcomp90.spec
index b87bd8b..afea2f2 100644
--- a/dlls/vcomp90/vcomp90.spec
+++ b/dlls/vcomp90/vcomp90.spec
@@ -78,7 +78,7 @@
@ cdecl _vcomp_reduction_i4(long ptr long) vcomp._vcomp_reduction_i4
@ cdecl _vcomp_reduction_i8(long ptr int64) vcomp._vcomp_reduction_i8
@ cdecl _vcomp_reduction_r4(long ptr float) vcomp._vcomp_reduction_r4
-@ stub _vcomp_reduction_r8
+@ cdecl _vcomp_reduction_r8(long ptr double) vcomp._vcomp_reduction_r8
@ cdecl _vcomp_reduction_u1(long ptr long) vcomp._vcomp_reduction_u1
@ cdecl _vcomp_reduction_u2(long ptr long) vcomp._vcomp_reduction_u2
@ cdecl _vcomp_reduction_u4(long ptr long) vcomp._vcomp_reduction_u4
More information about the wine-cvs
mailing list