1381bdc75SMichał Górny #include <cstdint>
2381bdc75SMichał Górny
3381bdc75SMichał Górny struct alignas(16) float80_raw {
4381bdc75SMichał Górny uint64_t mantissa;
5381bdc75SMichał Górny uint16_t sign_exp;
6381bdc75SMichał Górny };
7381bdc75SMichał Górny
main()8381bdc75SMichał Górny int main() {
9381bdc75SMichał Górny float80_raw st[] = {
10381bdc75SMichał Górny {0x8000000000000000, 0x4000}, // +2.0
11381bdc75SMichał Górny {0x3f00000000000000, 0x0000}, // 1.654785e-4932 (denormal)
12381bdc75SMichał Górny {0x0000000000000000, 0x0000}, // +0
13381bdc75SMichał Górny {0x0000000000000000, 0x8000}, // -0
14381bdc75SMichał Górny {0x8000000000000000, 0x7fff}, // +inf
15381bdc75SMichał Górny {0x8000000000000000, 0xffff}, // -inf
16381bdc75SMichał Górny {0xc000000000000000, 0xffff}, // nan
17*e8beb698SMichał Górny // st7 will be freed to test tag word better
18*e8beb698SMichał Górny {0x0000000000000000, 0x0000}, // +0
19381bdc75SMichał Górny };
20381bdc75SMichał Górny
21381bdc75SMichał Górny // unmask divide-by-zero exception
22381bdc75SMichał Górny uint16_t cw = 0x037b;
23381bdc75SMichał Górny // used as single-precision float
24381bdc75SMichał Górny uint32_t zero = 0;
25381bdc75SMichał Górny
26381bdc75SMichał Górny asm volatile(
27381bdc75SMichał Górny "finit\n\t"
28381bdc75SMichał Górny "fldcw %1\n\t"
29381bdc75SMichał Górny // load on stack in reverse order to make the result easier to read
30*e8beb698SMichał Górny "fldt 0x70(%0)\n\t"
31381bdc75SMichał Górny "fldt 0x60(%0)\n\t"
32381bdc75SMichał Górny "fldt 0x50(%0)\n\t"
33381bdc75SMichał Górny "fldt 0x40(%0)\n\t"
34381bdc75SMichał Górny "fldt 0x30(%0)\n\t"
35381bdc75SMichał Górny "fldt 0x20(%0)\n\t"
36381bdc75SMichał Górny "fldt 0x10(%0)\n\t"
37381bdc75SMichał Górny "fldt 0x00(%0)\n\t"
38*e8beb698SMichał Górny // free st7
39*e8beb698SMichał Górny "ffree %%st(7)\n\t"
40381bdc75SMichał Górny // this should trigger a divide-by-zero
41381bdc75SMichał Górny "fdivs (%2)\n\t"
42381bdc75SMichał Górny "int3\n\t"
43381bdc75SMichał Górny :
44381bdc75SMichał Górny : "a"(st), "m"(cw), "b"(&zero)
45381bdc75SMichał Górny : "st"
46381bdc75SMichał Górny );
47381bdc75SMichał Górny
48381bdc75SMichał Górny return 0;
49381bdc75SMichał Górny }
50