iron: add buffer_get_f16
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "iron_string.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
void array_free(void *a) {
|
||||
u8_array_t *tmp = (u8_array_t *)a;
|
||||
@@ -319,6 +320,17 @@ int16_t buffer_get_i16(buffer_t *b, uint32_t p) {
|
||||
return *(int16_t *)(b->buffer + 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;
|
||||
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;
|
||||
result.u = sign | ((exp_frac << 13) + 0x38000000);
|
||||
return result.f;
|
||||
}
|
||||
|
||||
uint32_t buffer_get_u32(buffer_t *b, uint32_t p) {
|
||||
return *(uint32_t *)(b->buffer + p);
|
||||
}
|
||||
@@ -627,3 +639,12 @@ char_ptr_array_t *char_ptr_array_create(uint32_t length) {
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
uint16_t float_to_half_fast(float 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;
|
||||
return sign | ((v.u - 0x38000000) >> 13);
|
||||
}
|
||||
|
||||
@@ -103,6 +103,7 @@ uint8_t buffer_get_u8(buffer_t *b, uint32_t p);
|
||||
int8_t buffer_get_i8(buffer_t *b, uint32_t p);
|
||||
uint16_t buffer_get_u16(buffer_t *b, uint32_t p);
|
||||
int16_t buffer_get_i16(buffer_t *b, uint32_t p);
|
||||
float buffer_get_f16(buffer_t *b, uint32_t p);
|
||||
uint32_t buffer_get_u32(buffer_t *b, uint32_t p);
|
||||
int32_t buffer_get_i32(buffer_t *b, uint32_t p);
|
||||
float buffer_get_f32(buffer_t *b, uint32_t p);
|
||||
@@ -148,3 +149,4 @@ i8_array_t *i8_array_create_from_raw(int8_t *raw, uint32_t length);
|
||||
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);
|
||||
|
||||
@@ -115,6 +115,7 @@ declare function buffer_get_u8(b: buffer_t, p: u32): u8;
|
||||
declare function buffer_get_i8(b: buffer_t, p: u32): i8;
|
||||
declare function buffer_get_u16(b: buffer_t, p: u32): u16;
|
||||
declare function buffer_get_i16(b: buffer_t, p: u32): i16;
|
||||
declare function buffer_get_f16(b: buffer_t, p: u32): f32;
|
||||
declare function buffer_get_u32(b: buffer_t, p: u32): u32;
|
||||
declare function buffer_get_i32(b: buffer_t, p: u32): i32;
|
||||
declare function buffer_get_f32(b: buffer_t, p: u32): f32;
|
||||
|
||||
Reference in New Issue
Block a user