18 #ifndef _COBALT_X86_ASM_UAPI_FPTEST_H 19 #define _COBALT_X86_ASM_UAPI_FPTEST_H 21 #define __COBALT_HAVE_SSE2 0x1 22 #define __COBALT_HAVE_AVX 0x2 24 static inline void fp_regs_set(
int features,
unsigned int val)
26 unsigned long long vec[4] = { val, 0, val, 0 };
29 for (i = 0; i < 8; i++)
30 __asm__ __volatile__(
"fildl %0": :
"m"(val));
32 if (features & __COBALT_HAVE_AVX) {
42 : :
"m"(vec[0]),
"m"(vec[1]),
"m"(vec[2]),
"m"(vec[3]));
43 }
else if (features & __COBALT_HAVE_SSE2) {
53 : :
"m"(vec[0]),
"m"(vec[1]),
"m"(vec[2]),
"m"(vec[3]));
57 static inline unsigned int fp_regs_check(
int features,
unsigned int val,
58 int (*report)(
const char *fmt, ...))
60 unsigned long long vec[8][4];
61 unsigned int i, result = val;
64 for (i = 0; i < 8; i++)
65 __asm__ __volatile__(
"fistpl %0":
"=m"(e[7 - i]));
67 if (features & __COBALT_HAVE_AVX) {
77 :
"=m" (vec[0][0]),
"=m" (vec[1][0]),
78 "=m" (vec[2][0]),
"=m" (vec[3][0]),
79 "=m" (vec[4][0]),
"=m" (vec[5][0]),
80 "=m" (vec[6][0]),
"=m" (vec[7][0]));
81 }
else if (features & __COBALT_HAVE_SSE2) {
91 :
"=m" (vec[0][0]),
"=m" (vec[1][0]),
92 "=m" (vec[2][0]),
"=m" (vec[3][0]),
93 "=m" (vec[4][0]),
"=m" (vec[5][0]),
94 "=m" (vec[6][0]),
"=m" (vec[7][0]));
97 for (i = 0; i < 8; i++)
99 report(
"r%d: %u != %u\n", i, e[i], val);
103 if (features & __COBALT_HAVE_AVX) {
104 for (i = 0; i < 8; i++) {
106 if (vec[i][0] != val) {
110 if (vec[i][2] != val) {
115 report(
"ymm%d: %llu/%llu != %u/%u\n",
116 i, (
unsigned long long)vec[i][0],
117 (
unsigned long long)vec[i][2],
120 }
else if (features & __COBALT_HAVE_SSE2) {
121 for (i = 0; i < 8; i++)
122 if (vec[i][0] != val) {
123 report(
"xmm%d: %llu != %u\n",
124 i, (
unsigned long long)vec[i][0], val);