xref: /llvm-project/lldb/test/Shell/Register/Inputs/x86-fp-read.cpp (revision e8beb6988bab71ee4917288f07674b4982736109)
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