goosedump 0.12.7

Coding agent context data browser
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (C) Jarkko Sakkinen 2026

use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;

fn fp16_bits_to_f32_bits(value: u16) -> u32 {
    let sign = u32::from(value & 0x8000) << 16;
    let exponent = (value >> 10) & 0x1f;
    let fraction = value & 0x03ff;
    match exponent {
        0 if fraction == 0 => sign,
        0 => {
            let sign_multiplier = if sign == 0 { 1.0_f32 } else { -1.0_f32 };
            let val = sign_multiplier * f32::from(fraction) * 2.0_f32.powi(-24);
            val.to_bits()
        }
        0x1f => sign | 0x7f80_0000 | (u32::from(fraction) << 13),
        _ => sign | ((u32::from(exponent) + 112) << 23) | (u32::from(fraction) << 13),
    }
}

fn e8m0_bits_to_f32_bits(value: u8) -> u32 {
    if value < 2 {
        0x0020_0000_u32 << value
    } else {
        u32::from(value - 1) << 23
    }
}

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    let out_dir = env::var_os("OUT_DIR").expect("OUT_DIR not set");
    let dest_path = Path::new(&out_dir).join("generated_lut.rs");
    let file = File::create(&dest_path).expect("failed to create generated_lut.rs");
    let mut writer = BufWriter::new(file);

    writeln!(writer, "pub static FP16_TO_F32_LUT: [f32; 65536] = [").unwrap();
    for i in 0..65536_u32 {
        let u16_val = u16::try_from(i).expect("index fits u16");
        let bits = fp16_bits_to_f32_bits(u16_val);
        let hi = bits >> 16;
        let lo = bits & 0xffff;
        writeln!(writer, "    f32::from_bits(0x{hi:04x}_{lo:04x}),").unwrap();
    }
    writeln!(writer, "];\n").unwrap();

    writeln!(writer, "pub static E8M0_TO_F32_LUT: [f32; 256] = [").unwrap();
    for i in 0..256_u32 {
        let u8_val = u8::try_from(i).expect("index fits u8");
        let bits = e8m0_bits_to_f32_bits(u8_val);
        let hi = bits >> 16;
        let lo = bits & 0xffff;
        writeln!(writer, "    f32::from_bits(0x{hi:04x}_{lo:04x}),").unwrap();
    }
    writeln!(writer, "];").unwrap();
}