mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-23 02:05:57 +01:00
60 lines
1.9 KiB
ArmAsm
60 lines
1.9 KiB
ArmAsm
/* https://github.com/cirosantilli/linux-kernel-module-cheat#ieee-754 */
|
|
|
|
#include <lkmc.h>
|
|
#include <lkmc/float.h>
|
|
|
|
.data
|
|
double_1_5: .quad LKMC_FLOAT_64(0x0, 0x0, 0x8000000000000)
|
|
double_2_5: .quad LKMC_FLOAT_64(0x0, 0x1, 0x4000000000000)
|
|
double_4_0: .quad LKMC_FLOAT_64(0x0, 0x2, 0x0000000000000)
|
|
double_minus_4_0: .quad LKMC_FLOAT_64(0x1, 0x2, 0x10000000000000)
|
|
double_plus_infinity: .quad LKMC_FLOAT_64_PLUS_INFINITY
|
|
double_nan: .quad LKMC_FLOAT_64_QNAN_DEFAULT
|
|
double_ref_1_5: .double 1.5
|
|
double_ref_2_5: .double 2.5
|
|
double_ref_4_0: .double 4.0
|
|
double_ref_minus_4_0: .double -4.0
|
|
double_ref_plus_infinity: .double inf
|
|
double_ref_nan: .double nan
|
|
LKMC_PROLOGUE
|
|
/* Check that our macros are correct. */
|
|
LKMC_ASSERT_EQ(double_1_5, double_ref_1_5)
|
|
LKMC_ASSERT_EQ(double_2_5, double_ref_2_5)
|
|
LKMC_ASSERT_EQ(double_4_0, double_ref_4_0)
|
|
LKMC_ASSERT_EQ(double_minus_4_0, double_ref_minus_4_0)
|
|
LKMC_ASSERT_EQ(double_plus_infinity, double_ref_plus_infinity)
|
|
/* TODO: GAS nan is a different NaN: 0x7FFFFFFF */
|
|
/*LKMC_ASSERT_EQ(double_nan, double_ref_nan)*/
|
|
|
|
/* x87 80-bit FPU: https://github.com/cirosantilli/linux-kernel-module-cheat#x86-x87-fpu-instructions */
|
|
|
|
/* 1.5 + 2.5 == 4.0. */
|
|
fldl double_1_5
|
|
fldl double_2_5
|
|
faddp %st, %st(1)
|
|
fldl double_4_0
|
|
fcomip %st(1)
|
|
LKMC_ASSERT(je)
|
|
|
|
/* 4.0 + -4.0 == 0.0. */
|
|
fldl double_minus_4_0
|
|
faddp %st, %st(1)
|
|
fldz
|
|
fcomip %st(1)
|
|
LKMC_ASSERT(je)
|
|
|
|
/* 0.0 + inf == inf */
|
|
fldl double_plus_infinity
|
|
faddp %st, %st(1)
|
|
fldl double_plus_infinity
|
|
fcomip %st(1)
|
|
LKMC_ASSERT(je)
|
|
|
|
/* inf + nan == nan */
|
|
fldl double_nan
|
|
faddp %st, %st(1)
|
|
fldl double_nan
|
|
fcomip %st(1)
|
|
LKMC_ASSERT(je)
|
|
LKMC_EPILOGUE
|