12 #include "fp16_emu.cuh"
14 namespace faiss {
namespace gpu {
68 half1 cpu_float2half_rn(
float f)
80 unsigned u = (x & 0x7fffffff), remainder, shift, lsb, lsb_s1, lsb_m1;
81 unsigned sign, exponent, mantissa;
89 sign = ((x >> 16) & 0x8000);
93 ret.x = sign | 0x7c00U;
97 ret.x = (sign | 0x0000);
101 exponent = ((u >> 23) & 0xff);
102 mantissa = (u & 0x7fffff);
104 if (exponent > 0x70) {
108 shift = 0x7e - exponent;
110 mantissa |= 0x800000;
117 remainder = (mantissa & lsb_m1);
119 if (remainder > lsb_s1 || (remainder == lsb_s1 && (mantissa & 0x1))) {
121 if (!(mantissa & 0x3ff)) {
127 ret.x = (sign | (exponent << 10) | mantissa);
133 float cpu_half2float(half1 h)
135 unsigned sign = ((h.x >> 15) & 1);
136 unsigned exponent = ((h.x >> 10) & 0x1f);
137 unsigned mantissa = ((h.x & 0x3ff) << 13);
139 if (exponent == 0x1f) {
140 mantissa = (mantissa ? (sign = 0, 0x7fffff) : 0);
142 }
else if (!exponent) {
147 msb = (mantissa & 0x400000);
151 mantissa &= 0x7fffff;
162 un.i = ((sign << 31) | (exponent << 23) | mantissa);