vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
fn vyre_packed_byte(words: ptr<storage, array<u32>, read>, index: u32) -> u32 {
    let word = (*words)[index >> 2u];
    let shift = (index & 3u) << 3u;
    return (word >> shift) & 0xffu;
}

fn vyre_store_packed_byte(words: ptr<storage, array<u32>, read_write>, index: u32, byte: u32) {
    let word_index = index >> 2u;
    let shift = (index & 3u) << 3u;
    let mask = 0xffu << shift;
    let old_word = (*words)[word_index];
    (*words)[word_index] = (old_word & ~mask) | ((byte & 0xffu) << shift);
}

fn vyre_low_byte_mask(byte_len: u32) -> u32 {
    let rem = byte_len & 3u;
    if (rem == 0u) {
        return 0xffffffffu;
    }
    return (1u << (rem << 3u)) - 1u;
}

fn vyre_repeated_byte(byte: u32) -> u32 {
    let b = byte & 0xffu;
    return b | (b << 8u) | (b << 16u) | (b << 24u);
}

fn vyre_hex_value(byte: u32) -> u32 {
    if (byte >= 48u && byte <= 57u) {
        return byte - 48u;
    }
    if (byte >= 65u && byte <= 70u) {
        return byte - 55u;
    }
    if (byte >= 97u && byte <= 102u) {
        return byte - 87u;
    }
    return 0xffffffffu;
}

fn vyre_hex_upper(nibble: u32) -> u32 {
    let n = nibble & 0x0fu;
    if (n < 10u) {
        return 48u + n;
    }
    return 55u + n;
}

fn vyre_hex_lower(nibble: u32) -> u32 {
    let n = nibble & 0x0fu;
    if (n < 10u) {
        return 48u + n;
    }
    return 87u + n;
}