]>
git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/x86/fpu/test-fenv-sse-2.c
1 /* Test x86-specific floating-point environment (bug 16068): SSE part.
2 Copyright (C) 2015-2020 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
29 unsigned int eax
, ebx
, ecx
, edx
;
31 if (!__get_cpuid (1, &eax
, &ebx
, &ecx
, &edx
))
34 return (edx
& bit_SSE2
) != 0;
41 __asm__
__volatile__ ("stmxcsr %0" : "=m" (temp
));
46 set_sse_mxcsr (uint32_t val
)
48 __asm__
__volatile__ ("ldmxcsr %0" : : "m" (val
));
52 set_sse_mxcsr_bits (uint32_t mask
, uint32_t bits
)
54 uint32_t mxcsr
= get_sse_mxcsr ();
55 mxcsr
= (mxcsr
& ~mask
) | bits
;
56 set_sse_mxcsr (mxcsr
);
60 test_sse_mxcsr_bits (const char *test
, uint32_t mask
, uint32_t bits
)
62 uint32_t mxcsr
= get_sse_mxcsr ();
63 printf ("Testing %s: mxcsr = %x\n", test
, mxcsr
);
64 if ((mxcsr
& mask
) == bits
)
66 printf ("PASS: %s\n", test
);
71 printf ("FAIL: %s\n", test
);
76 #define MXCSR_FZ 0x8000
77 #define MXCSR_DAZ 0x40
79 #define MXCSR_DM 0x100
81 static __attribute__ ((noinline
)) int
88 set_sse_mxcsr_bits (MXCSR_FZ
, MXCSR_FZ
);
91 result
|= test_sse_mxcsr_bits ("fesetenv FZ restoration",
93 set_sse_mxcsr_bits (MXCSR_FZ
, 0);
95 result
|= test_sse_mxcsr_bits ("fesetenv FZ restoration 2",
97 set_sse_mxcsr_bits (MXCSR_FZ
, MXCSR_FZ
);
98 fesetenv (FE_NOMASK_ENV
);
99 result
|= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) FZ restoration",
101 set_sse_mxcsr_bits (MXCSR_FZ
, MXCSR_FZ
);
102 fesetenv (FE_DFL_ENV
);
103 result
|= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) FZ restoration",
106 set_sse_mxcsr_bits (MXCSR_DAZ
, MXCSR_DAZ
);
109 result
|= test_sse_mxcsr_bits ("fesetenv DAZ restoration",
111 set_sse_mxcsr_bits (MXCSR_DAZ
, 0);
113 result
|= test_sse_mxcsr_bits ("fesetenv DAZ restoration 2",
114 MXCSR_DAZ
, MXCSR_DAZ
);
115 set_sse_mxcsr_bits (MXCSR_DAZ
, MXCSR_DAZ
);
116 fesetenv (FE_NOMASK_ENV
);
117 result
|= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DAZ restoration",
119 set_sse_mxcsr_bits (MXCSR_DAZ
, MXCSR_DAZ
);
120 fesetenv (FE_DFL_ENV
);
121 result
|= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DAZ restoration",
124 set_sse_mxcsr_bits (MXCSR_DM
, 0);
127 result
|= test_sse_mxcsr_bits ("fesetenv DM restoration",
129 set_sse_mxcsr_bits (MXCSR_DM
, MXCSR_DM
);
131 result
|= test_sse_mxcsr_bits ("fesetenv DM restoration 2",
133 set_sse_mxcsr_bits (MXCSR_DM
, 0);
134 /* Presume FE_NOMASK_ENV should leave the "denormal operand"
135 exception masked, as not a standard exception. */
136 fesetenv (FE_NOMASK_ENV
);
137 result
|= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DM restoration",
139 set_sse_mxcsr_bits (MXCSR_DM
, 0);
140 fesetenv (FE_DFL_ENV
);
141 result
|= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DM restoration",
144 set_sse_mxcsr_bits (MXCSR_DE
, MXCSR_DE
);
147 result
|= test_sse_mxcsr_bits ("fesetenv DE restoration",
149 set_sse_mxcsr_bits (MXCSR_DE
, 0);
151 result
|= test_sse_mxcsr_bits ("fesetenv DE restoration 2",
153 set_sse_mxcsr_bits (MXCSR_DE
, MXCSR_DE
);
154 fesetenv (FE_NOMASK_ENV
);
155 result
|= test_sse_mxcsr_bits ("fesetenv (FE_NOMASK_ENV) DE restoration",
157 set_sse_mxcsr_bits (MXCSR_DE
, MXCSR_DE
);
158 fesetenv (FE_DFL_ENV
);
159 result
|= test_sse_mxcsr_bits ("fesetenv (FE_DFL_ENV) DE restoration",
169 puts ("CPU does not support SSE2, cannot test");
175 #define TEST_FUNCTION do_test ()
176 #include <test-skeleton.c>