|
| 1 | +/* https://github.com/cirosantilli/linux-kernel-module-cheat#ieee-754 */ |
| 2 | + |
| 3 | +#include <lkmc.h> |
| 4 | +#include <lkmc/float.h> |
| 5 | + |
| 6 | +.data |
| 7 | + double_1_5: .quad LKMC_FLOAT_64(0x0, 0x0, 0x8000000000000) |
| 8 | + double_2_5: .quad LKMC_FLOAT_64(0x0, 0x1, 0x4000000000000) |
| 9 | + double_4_0: .quad LKMC_FLOAT_64(0x0, 0x2, 0x0000000000000) |
| 10 | + double_minus_4_0: .quad LKMC_FLOAT_64(0x1, 0x2, 0x10000000000000) |
| 11 | + double_plus_infinity: .quad LKMC_FLOAT_64_PLUS_INFINITY |
| 12 | + double_nan: .quad LKMC_FLOAT_64_QNAN_DEFAULT |
| 13 | + double_ref_1_5: .double 1.5 |
| 14 | + double_ref_2_5: .double 2.5 |
| 15 | + double_ref_4_0: .double 4.0 |
| 16 | + double_ref_minus_4_0: .double -4.0 |
| 17 | + double_ref_plus_infinity: .double inf |
| 18 | + double_ref_nan: .double nan |
| 19 | +LKMC_PROLOGUE |
| 20 | + /* Check that our macros are correct. */ |
| 21 | + LKMC_ASSERT_EQ(double_1_5, double_ref_1_5) |
| 22 | + LKMC_ASSERT_EQ(double_2_5, double_ref_2_5) |
| 23 | + LKMC_ASSERT_EQ(double_4_0, double_ref_4_0) |
| 24 | + LKMC_ASSERT_EQ(double_minus_4_0, double_ref_minus_4_0) |
| 25 | + LKMC_ASSERT_EQ(double_plus_infinity, double_ref_plus_infinity) |
| 26 | + /* TODO: GAS nan is a different NaN: 0x7FFFFFFF */ |
| 27 | + /*LKMC_ASSERT_EQ(double_nan, double_ref_nan)*/ |
| 28 | + |
| 29 | + /* x87 80-bit FPU: https://github.com/cirosantilli/linux-kernel-module-cheat#x86-x87-fpu-instructions */ |
| 30 | + |
| 31 | + /* 1.5 + 2.5 == 4.0. */ |
| 32 | + fldl double_1_5 |
| 33 | + fldl double_2_5 |
| 34 | + faddp %st, %st(1) |
| 35 | + fldl double_4_0 |
| 36 | + fcomip %st(1) |
| 37 | + LKMC_ASSERT(je) |
| 38 | + |
| 39 | + /* 4.0 + -4.0 == 0.0. */ |
| 40 | + fldl double_minus_4_0 |
| 41 | + faddp %st, %st(1) |
| 42 | + fldz |
| 43 | + fcomip %st(1) |
| 44 | + LKMC_ASSERT(je) |
| 45 | + |
| 46 | + /* 0.0 + inf == inf */ |
| 47 | + fldl double_plus_infinity |
| 48 | + faddp %st, %st(1) |
| 49 | + fldl double_plus_infinity |
| 50 | + fcomip %st(1) |
| 51 | + LKMC_ASSERT(je) |
| 52 | + |
| 53 | + /* inf + nan == nan */ |
| 54 | + fldl double_nan |
| 55 | + faddp %st, %st(1) |
| 56 | + fldl double_nan |
| 57 | + fcomip %st(1) |
| 58 | + LKMC_ASSERT(je) |
| 59 | +LKMC_EPILOGUE |
0 commit comments