4 #include "pipe/p_compiler.h"
12 extern uint32_t util_half_to_float_mantissa_table
[2048];
13 extern uint32_t util_half_to_float_exponent_table
[64];
14 extern uint32_t util_half_to_float_offset_table
[64];
15 extern uint16_t util_float_to_half_base_table
[512];
16 extern uint8_t util_float_to_half_shift_table
[512];
19 * Note that if the half float is a signaling NaN, the x87 FPU will turn
20 * it into a quiet NaN immediately upon loading into a float.
22 * Additionally, denormals may be flushed to zero.
24 * To avoid this, use the floatui functions instead of the float ones
25 * when just doing conversion rather than computation on the resulting
29 static INLINE
uint32_t
30 util_half_to_floatui(half h
)
32 unsigned exp
= h
>> 10;
33 return util_half_to_float_mantissa_table
[util_half_to_float_offset_table
[exp
] + (h
& 0x3ff)]
34 + util_half_to_float_exponent_table
[exp
];
38 util_half_to_float(half h
)
41 r
.ui
= util_half_to_floatui(h
);
46 util_floatui_to_half(uint32_t v
)
48 unsigned signexp
= v
>> 23;
49 return util_float_to_half_base_table
[signexp
]
50 + ((v
& 0x007fffff) >> util_float_to_half_shift_table
[signexp
]);
54 util_float_to_half(float f
)
58 return util_floatui_to_half(i
.ui
);