15#include <freerdp/config.h>
17#include <winpr/sysinfo.h>
21#define FUNC_TEST_SIZE 65536
23#define VALUE (0xA5A5A5A5U)
26static BOOL test_and_32u_impl(
const char* name, fn_andC_32u_t fkt,
const UINT32* src,
27 const UINT32 val, UINT32* dst,
size_t size)
29 pstatus_t status = fkt(src, val, dst, WINPR_ASSERTING_INT_CAST(int32_t, size));
30 if (status != PRIMITIVES_SUCCESS)
33 for (
size_t i = 0; i < size; ++i)
35 if (dst[i] != (src[i] & val))
38 printf(
"AND %s FAIL[%" PRIuz
"] 0x%08" PRIx32
"&0x%08" PRIx32
"=0x%08" PRIx32
39 ", got 0x%08" PRIx32
"\n",
40 name, i, src[i], val, (src[i] & val), dst[i]);
49static BOOL test_and_32u_func(
void)
51 UINT32 src[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
52 UINT32 dst[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
54 if (winpr_RAND(src,
sizeof(src)) < 0)
57 if (!test_and_32u_impl(
"generic->andC_32u aligned", generic->andC_32u, src + 1, VALUE, dst + 1,
60 if (!test_and_32u_impl(
"generic->andC_32u unaligned", generic->andC_32u, src + 1, VALUE,
61 dst + 2, FUNC_TEST_SIZE))
63 if (!test_and_32u_impl(
"optimized->andC_32u aligned", optimized->andC_32u, src + 1, VALUE,
64 dst + 1, FUNC_TEST_SIZE))
66 if (!test_and_32u_impl(
"optimized->andC_32u unaligned", optimized->andC_32u, src + 1, VALUE,
67 dst + 2, FUNC_TEST_SIZE))
74static BOOL test_and_32u_speed(
void)
76 UINT32 src[MAX_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
77 UINT32 dst[MAX_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
79 if (winpr_RAND(src,
sizeof(src)) < 0)
82 if (!speed_test(
"andC_32u",
"aligned", g_Iterations, (speed_test_fkt)generic->andC_32u,
83 (speed_test_fkt)optimized->andC_32u, src + 1, VALUE, dst + 1, MAX_TEST_SIZE))
85 if (!speed_test(
"andC_32u",
"unaligned", g_Iterations, (speed_test_fkt)generic->andC_32u,
86 (speed_test_fkt)optimized->andC_32u, src + 1, VALUE, dst + 2, MAX_TEST_SIZE))
93static BOOL check(
const UINT32* src,
const UINT32* dst, UINT32 size, UINT32 value)
95 for (UINT32 i = 0; i < size; ++i)
97 if (dst[i] != (src[i] | value))
99 printf(
"OR-general general FAIL[%" PRIu32
"] 0x%08" PRIx32
"&0x%08" PRIx32
100 "=0x%08" PRIx32
", got 0x%08" PRIx32
"\n",
101 i, src[i], value, src[i] | value, dst[i]);
109static BOOL test_or_32u_func(
void)
111 pstatus_t status = 0;
112 UINT32 src[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
113 UINT32 dst[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
115 if (winpr_RAND(src,
sizeof(src)) < 0)
118 status =
generic->orC_32u(src + 1, VALUE, dst + 1, FUNC_TEST_SIZE);
119 if (status != PRIMITIVES_SUCCESS)
122 if (!check(src + 1, dst + 1, FUNC_TEST_SIZE, VALUE))
125 status = optimized->orC_32u(src + 1, VALUE, dst + 1, FUNC_TEST_SIZE);
126 if (status != PRIMITIVES_SUCCESS)
129 if (!check(src + 1, dst + 1, FUNC_TEST_SIZE, VALUE))
136static BOOL test_or_32u_speed(
void)
138 UINT32 src[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
139 UINT32 dst[FUNC_TEST_SIZE + 3] = WINPR_C_ARRAY_INIT;
141 if (winpr_RAND(src,
sizeof(src)) < 0)
144 return (speed_test(
"add16s",
"aligned", g_Iterations, (speed_test_fkt)generic->orC_32u,
145 (speed_test_fkt)optimized->orC_32u, src + 1, VALUE, dst + 1,
149int TestPrimitivesAndOr(
int argc,
char* argv[])
154 prim_test_setup(FALSE);
156 if (!test_and_32u_func())
159 if (!test_or_32u_func())
162 if (g_TestPrimitivesPerformance)
164 if (!test_and_32u_speed())
166 if (!test_or_32u_speed())