base: add half_to_u8_fast

This commit is contained in:
luboslenco
2026-02-12 17:12:23 +01:00
parent 33ffea41ff
commit f36e861608
2 changed files with 33 additions and 9 deletions
+32 -9
View File
@@ -2,9 +2,9 @@
#include "iron_gc.h"
#include "iron_string.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void array_free(void *a) {
u8_array_t *tmp = (u8_array_t *)a;
@@ -321,12 +321,17 @@ int16_t buffer_get_i16(buffer_t *b, uint32_t p) {
}
float buffer_get_f16(buffer_t *b, uint32_t p) {
uint16_t half = *(uint16_t *)(b->buffer + p);
uint32_t sign = (half & 0x8000) << 16;
uint16_t half = *(uint16_t *)(b->buffer + p);
uint32_t sign = (half & 0x8000) << 16;
uint32_t exp_frac = half & 0x7FFF;
if (exp_frac == 0) return 0.0;
if ((half & 0x7C00) == 0x7C00) return NAN;
union { float f; uint32_t u; } result;
if (exp_frac == 0)
return 0.0;
if ((half & 0x7C00) == 0x7C00)
return NAN;
union {
float f;
uint32_t u;
} result;
result.u = sign | ((exp_frac << 13) + 0x38000000);
return result.f;
}
@@ -641,10 +646,28 @@ char_ptr_array_t *char_ptr_array_create(uint32_t length) {
}
uint16_t float_to_half_fast(float value) {
union { float f; uint32_t u; } v = {value};
union {
float f;
uint32_t u;
} v = {value};
uint32_t sign = (v.u >> 16) & 0x8000;
v.u &= 0x7FFFFFFF;
if (v.u >= 0x47800000) return sign | 0x7C00;
if (v.u < 0x38800000) return sign;
if (v.u >= 0x47800000)
return sign | 0x7C00;
if (v.u < 0x38800000)
return sign;
return sign | ((v.u - 0x38000000) >> 13);
}
uint8_t half_to_u8_fast(uint16_t h) {
uint32_t exp = (h >> 10) & 0x1F;
uint32_t mantissa = h & 0x03FF;
if (exp == 0)
return 0;
if (exp >= 15)
return 255;
uint32_t val = mantissa | 0x0400;
int shift = 25 - exp;
uint32_t res = (val * 255) >> shift;
return (uint8_t)res;
}
+1
View File
@@ -150,3 +150,4 @@ any_array_t *any_array_create(uint32_t length);
any_array_t *any_array_create_from_raw(void **raw, uint32_t length);
char_ptr_array_t *char_ptr_array_create(uint32_t length);
uint16_t float_to_half_fast(float value);
uint8_t half_to_u8_fast(uint16_t h);