Go to the documentation of this file.
13 uint64_t
flags = SELFTEST_CPU_FLAG_X86;
15 checkasm_cpu_cpuid(&
r, 0, 0);
16 const uint32_t max_leaf =
r.eax;
20 checkasm_cpu_cpuid(&
r, 1, 0);
21 if (
r.edx & 0x00800000)
22 flags |= SELFTEST_CPU_FLAG_MMX;
23 if (
r.edx & 0x02000000)
24 flags |= SELFTEST_CPU_FLAG_SSE2;
25 if (~
r.ecx & 0x18000000)
28 const uint64_t xcr0 = checkasm_cpu_xgetbv(0);
29 if (max_leaf < 7 || ~xcr0 & 0x6)
32 checkasm_cpu_cpuid(&
r, 7, 0);
33 if (
r.ebx & 0x00000020)
34 flags |= SELFTEST_CPU_FLAG_AVX2;
39 if (
r.ebx & 0x00000020)
40 flags |= SELFTEST_CPU_FLAG_AVX512;
78 if (
flags & SELFTEST_CPU_FLAG_AVX512)
79 return selftest_copy_avx512;
80 if (
flags & SELFTEST_CPU_FLAG_AVX2)
81 return selftest_copy_avx2;
82 if (
flags & SELFTEST_CPU_FLAG_SSE2)
83 return selftest_copy_sse2;
84 if (
flags & SELFTEST_CPU_FLAG_MMX)
85 return selftest_copy_mmx;
86 if (
flags & SELFTEST_CPU_FLAG_X86)
87 return selftest_copy_x86;
89 return selftest_copy_c;
99 #define STACK_ALIGN 16
103 #define STACK_ALIGN 4
112 case 0:
return selftest_clobber_r0;
113 case 1:
return selftest_clobber_r1;
114 case 2:
return selftest_clobber_r2;
115 case 3:
return selftest_clobber_r3;
116 case 4:
return selftest_clobber_r4;
117 case 5:
return selftest_clobber_r5;
118 case 6:
return selftest_clobber_r6;
120 case 7:
return selftest_clobber_r7;
121 case 8:
return selftest_clobber_r8;
122 case 9:
return selftest_clobber_r9;
123 case 10:
return selftest_clobber_r10;
124 case 11:
return selftest_clobber_r11;
125 case 12:
return selftest_clobber_r12;
126 case 13:
return selftest_clobber_r13;
127 case 14:
return selftest_clobber_r14;
130 default:
return NULL;
139 uintptr_t selftest_get_stack_pointer_x86(
int unused);
141 static void check_stack_alignment(
void)
150 if (sp & (STACK_ALIGN - 1)) {
152 fprintf(stderr,
"stack pointer not %d-byte aligned: 0x%" PRIxPTR
"\n",
159 static void check_clobber(
int from,
int to)
163 for (
int reg =
from; reg <
to; reg++) {
184 const uint8_t *
src,
size_t n);
186 for (
size_t w = 8;
w <= 256;
w *= 2) {
193 checkasm_check(uint8_t, c_dst, 0, a_dst, 0, 256, 1,
"dst data");
204 test_copy_emms(get_copy_noemms_mmx(),
"copy_noemms");
205 check_stack_alignment();
206 check_clobber(0, NUM_SAFE);
214 check_clobber(NUM_SAFE, NUM_REGS);
216 if (checkasm_get_check_vzeroupper())
#define DEF_COPY_FUNC(NAME)
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
#define checkasm_declare_emms(cpu_flags, ret,...)
#define checkasm_check_func(func,...)
Check if a function should be tested and set up function references.
#define DEF_COPY_GETTER(FLAG, NAME)
#define CHECKASM_ALIGN(x)
Declare a variable with platform-specific alignment requirements.
#define INITIALIZE_BUF(buf)
Fill a fixed size buffer with pathological test data (convenience macro)
void selftest_check_x86(void)
#define CLEAR_BUF(buf)
Clear a fixed size buffer (convenience macro)
#define checkasm_call_ref(...)
Call the reference implementation.
void() noop_func(int unused)
Do nothing.
void selftest_test_copy(copy_func fun, const char *name, const int min_width)
#define checkasm_fail()
Mark the current test as failed.
#define checkasm_declare(ret,...)
Declare a function signature for testing.
CHECKASM_API void checkasm_report(const char *name,...) CHECKASM_PRINTF(1
Report test outcome for a named group of functions.
CHECKASM_API CheckasmCpu checkasm_get_cpu_flags(void)
Get the current active set of CPU flags.
#define DEF_NOOP_GETTER(FLAG, NAME)
void selftest_test_noop(noop_func fun, const char *name)
#define DEF_NOOP_FUNC(NAME)
CHECKASM_API int checkasm_should_fail(CheckasmCpu cpu_flags)
Mark a block of tests as expected to fail.
#define checkasm_call_new(...)
Call the implementation being tested with validation.
uint64_t selftest_get_cpu_flags_x86(void)
void() copy_func(uint8_t *dst, const uint8_t *src, size_t size)
Copy size (power-of-two) bytes from aligned buffers src to dst.
#define checkasm_bench_new(...)
Benchmark the optimized implementation.