vyre 0.3.0

GPU bytecode condition engine
Documentation
pub fn instruction_cases(stack_expr: &str, abort_stmt: &str) -> String {
    let template = r#"
        // === CORE PUSH GROUP ===
        case 1u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = 1u; sp = sp + 1u; }
        case 2u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = 0u; sp = sp + 1u; }
        case 3u: {
            if (sp >= STACK_SIZE) { __ABORT__ }
            let word_idx = inst.operand / 32u;
            if (word_idx >= 8u) { __ABORT__ }
            let bit_idx = inst.operand % 32u;
            let bit = 1u << bit_idx;
            __STACK__[sp] = select(0u, 1u, (rule_bitmaps[rule_id * 8u + word_idx] & bit) != 0u);
            sp = sp + 1u;
        }
        case 4u: {
            if (sp >= STACK_SIZE) { __ABORT__ }
            __STACK__[sp] = select(rule_counts[count_index(rule_id, inst.operand)], 0u, !pattern_is_valid(inst.operand));
            sp = sp + 1u;
        }
        case 5u: {
            if (sp == 0u) { __ABORT__ }
            let idx = __STACK__[sp - 1u];
            __STACK__[sp - 1u] = select(match_position(rule_id, inst.operand, idx), ABORT_SENTINEL, !pattern_is_valid(inst.operand));
        }
        case 6u: {
            if (sp == 0u) { __ABORT__ }
            let idx = __STACK__[sp - 1u];
            __STACK__[sp - 1u] = select(match_length(rule_id, inst.operand, idx), 0u, !pattern_is_valid(inst.operand));
        }
        case 7u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.file_size; sp = sp + 1u; }
        case 8u: {
            if (sp >= STACK_SIZE) { __ABORT__ }
            var count = 0u;
            for (var i = 0u; i < 8u; i = i + 1u) {
                count = count + popcount32(rule_bitmaps[rule_id * 8u + i]);
            }
            __STACK__[sp] = count;
            sp = sp + 1u;
        }
        case 9u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = inst.operand; sp = sp + 1u; }
        case 10u: {
            if (sp >= STACK_SIZE) { __ABORT__ }
            var count = 0u;
            for (var i = 0u; i < 8u; i = i + 1u) {
                count = count + popcount32(rule_bitmaps[rule_id * 8u + i]);
            }
            __STACK__[sp] = count;
            sp = sp + 1u;
        }

        // === BOOLEAN AND ARITHMETIC GROUP ===
        case 11u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] != 0u && __STACK__[sp] != 0u); }
        case 12u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] != 0u || __STACK__[sp] != 0u); }
        case 13u: { if (sp == 0u) { __ABORT__ } __STACK__[sp - 1u] = select(1u, 0u, __STACK__[sp - 1u] != 0u); }
        case 14u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] == __STACK__[sp]); }
        case 15u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] != __STACK__[sp]); }
        case 16u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] < __STACK__[sp]); }
        case 17u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] > __STACK__[sp]); }
        case 18u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] <= __STACK__[sp]); }
        case 19u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = select(0u, 1u, __STACK__[sp - 1u] >= __STACK__[sp]); }
        case 20u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] + __STACK__[sp]; }
        case 21u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] - __STACK__[sp]; }
        case 22u: {
            let threshold = inst.operand & 0xFFFFu;
            let count = inst.operand >> 16u;
            if (count == 0u || sp < count) { __ABORT__ }
            var matched = 0u;
            for (var i = 0u; i < count; i = i + 1u) {
                if (__STACK__[sp - 1u - i] != 0u) { matched = matched + 1u; }
            }
            sp = sp - count + 1u;
            __STACK__[sp - 1u] = select(0u, 1u, matched >= threshold);
        }
        case 23u: {
            if (inst.operand == 0u || sp < inst.operand) { __ABORT__ }
            var ok = 1u;
            for (var i = 0u; i < inst.operand; i = i + 1u) {
                if (__STACK__[sp - 1u - i] == 0u) { ok = 0u; }
            }
            sp = sp - inst.operand + 1u;
            __STACK__[sp - 1u] = ok;
        }
        case 24u: {
            if (inst.operand == 0u || sp < inst.operand) { __ABORT__ }
            var ok = 0u;
            for (var i = 0u; i < inst.operand; i = i + 1u) {
                if (__STACK__[sp - 1u - i] != 0u) { ok = 1u; }
            }
            sp = sp - inst.operand + 1u;
            __STACK__[sp - 1u] = ok;
        }
        case 31u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] * __STACK__[sp]; }
        case 32u: {
            if (sp < 2u) { __ABORT__ }
            sp = sp - 1u;
            let divisor = __STACK__[sp];
            __STACK__[sp - 1u] = select(__STACK__[sp - 1u] / divisor, 0u, divisor == 0u);
        }
        case 33u: {
            if (sp < 2u) { __ABORT__ }
            sp = sp - 1u;
            let divisor = __STACK__[sp];
            __STACK__[sp - 1u] = select(__STACK__[sp - 1u] % divisor, 0u, divisor == 0u);
        }
        case 34u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] & __STACK__[sp]; }
        case 35u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] | __STACK__[sp]; }
        case 36u: { if (sp < 2u) { __ABORT__ } sp = sp - 1u; __STACK__[sp - 1u] = __STACK__[sp - 1u] ^ __STACK__[sp]; }
        case 37u: {
            if (sp < 2u) { __ABORT__ }
            sp = sp - 1u;
            let shift_amt = min(__STACK__[sp], 31u);
            __STACK__[sp - 1u] = __STACK__[sp - 1u] << shift_amt;
        }
        case 38u: {
            if (sp < 2u) { __ABORT__ }
            sp = sp - 1u;
            let shift_amt = min(__STACK__[sp], 31u);
            __STACK__[sp - 1u] = __STACK__[sp - 1u] >> shift_amt;
        }

        // === STRING LOCATION GROUP ===
        case 25u: {
            if (sp == 0u) { __ABORT__ }
            let wanted = __STACK__[sp - 1u];
            let count = cached_match_count(rule_id, inst.operand);
            var ok = 0u;
            for (var i = 0u; i < count; i = i + 1u) {
                if (match_position(rule_id, inst.operand, i) == wanted) { ok = 1u; }
            }
            __STACK__[sp - 1u] = ok;
        }
        case 26u: {
            if (sp < 2u) { __ABORT__ }
            let hi = __STACK__[sp - 1u];
            let lo = __STACK__[sp - 2u];
            let count = cached_match_count(rule_id, inst.operand);
            var ok = 0u;
            for (var i = 0u; i < count; i = i + 1u) {
                let pos = match_position(rule_id, inst.operand, i);
                if (pos >= lo && pos <= hi) { ok = 1u; }
            }
            sp = sp - 1u;
            __STACK__[sp - 1u] = ok;
        }
        case 39u: {
            if (sp == 0u) { __ABORT__ }
            let offset = __STACK__[sp - 1u];
            let size = inst.operand & 0xFFu;
            let is_signed = ((inst.operand >> 8u) & 1u) != 0u;
            let is_be = ((inst.operand >> 9u) & 1u) != 0u;
            var value = 0u;
            if (size != 0u && offset + size <= file_ctx.file_size) {
                let b0 = read_byte(offset);
                if (size == 1u) {
                    if (is_signed && (b0 & 0x80u) != 0u) {
                        value = b0 | 0xFFFFFF00u;
                    } else {
                        value = b0;
                    }
                } else if (size == 2u) {
                    let b1 = read_byte(offset + 1u);
                    var v = 0u;
                    if (is_be) {
                        v = (b0 << 8u) | b1;
                    } else {
                        v = (b1 << 8u) | b0;
                    }
                    if (is_signed && (v & 0x8000u) != 0u) {
                        value = v | 0xFFFF0000u;
                    } else {
                        value = v;
                    }
                } else if (size == 4u) {
                    let b1 = read_byte(offset + 1u);
                    let b2 = read_byte(offset + 2u);
                    let b3 = read_byte(offset + 3u);
                    if (is_be) {
                        value = (b0 << 24u) | (b1 << 16u) | (b2 << 8u) | b3;
                    } else {
                        value = (b3 << 24u) | (b2 << 16u) | (b1 << 8u) | b0;
                    }
                }
            }
            __STACK__[sp - 1u] = value;
        }

        // === POSITIONAL GROUP ===
        case 50u: {
            if (sp < 2u) { __ABORT__ }
            let pattern_b = __STACK__[sp - 1u];
            let pattern_a = __STACK__[sp - 2u];
            let first_a = first_match_position(rule_id, pattern_a);
            let first_b = first_match_position(rule_id, pattern_b);
            sp = sp - 1u;
            __STACK__[sp - 1u] = select(0u, 1u, first_a != ABORT_SENTINEL && first_b != ABORT_SENTINEL && first_a < first_b);
        }
        case 51u: {
            if (sp < 2u) { __ABORT__ }
            let pattern_b = __STACK__[sp - 1u];
            let pattern_a = __STACK__[sp - 2u];
            let count_a = cached_match_count(rule_id, pattern_a);
            let count_b = cached_match_count(rule_id, pattern_b);
            var best = ABORT_SENTINEL;
            for (var i = 0u; i < count_a; i = i + 1u) {
                let a_start = match_position(rule_id, pattern_a, i);
                let a_end = match_end(rule_id, pattern_a, i);
                for (var j = 0u; j < count_b; j = j + 1u) {
                    let b_start = match_position(rule_id, pattern_b, j);
                    let b_end = match_end(rule_id, pattern_b, j);
                    var gap = 0u;
                    if (a_end < b_start) {
                        gap = b_start - a_end;
                    } else if (b_end < a_start) {
                        gap = a_start - b_end;
                    }
                    if (gap < best) {
                        best = gap;
                    }
                }
            }
            sp = sp - 1u;
            __STACK__[sp - 1u] = select(best, 0u, best == ABORT_SENTINEL);
        }
        case 52u: {
            if (sp < 3u) { __ABORT__ }
            let pattern_c = __STACK__[sp - 1u];
            let pattern_b = __STACK__[sp - 2u];
            let pattern_a = __STACK__[sp - 3u];
            let first_a = first_match_position(rule_id, pattern_a);
            let first_b = first_match_position(rule_id, pattern_b);
            let low = min(first_a, first_b);
            let high = max(first_a, first_b);
            let count_c = cached_match_count(rule_id, pattern_c);
            var ok = 0u;
            if (first_a != ABORT_SENTINEL && first_b != ABORT_SENTINEL) {
                for (var i = 0u; i < count_c; i = i + 1u) {
                    let candidate = match_position(rule_id, pattern_c, i);
                    if (candidate >= low && candidate <= high) { ok = 1u; }
                }
            }
            sp = sp - 2u;
            __STACK__[sp - 1u] = ok;
        }
        case 53u: {
            if (sp < 2u) { __ABORT__ }
            let pattern_b = __STACK__[sp - 1u];
            let pattern_a = __STACK__[sp - 2u];
            let count_a = cached_match_count(rule_id, pattern_a);
            let count_b = cached_match_count(rule_id, pattern_b);
            var ok = 0u;
            for (var i = 0u; i < count_a; i = i + 1u) {
                let depth_a = brace_depth(match_position(rule_id, pattern_a, i));
                for (var j = 0u; j < count_b; j = j + 1u) {
                    if (depth_a == brace_depth(match_position(rule_id, pattern_b, j))) { ok = 1u; }
                }
            }
            sp = sp - 1u;
            __STACK__[sp - 1u] = ok;
        }
        case 54u: {
            if (sp < 3u) { __ABORT__ }
            let max_distance = __STACK__[sp - 1u];
            let pattern_b = __STACK__[sp - 2u];
            let pattern_a = __STACK__[sp - 3u];
            let count_a = cached_match_count(rule_id, pattern_a);
            let count_b = cached_match_count(rule_id, pattern_b);
            var ok = 0u;
            for (var i = 0u; i < count_a; i = i + 1u) {
                let a_end = match_end(rule_id, pattern_a, i);
                for (var j = 0u; j < count_b; j = j + 1u) {
                    let b_start = match_position(rule_id, pattern_b, j);
                    if (a_end != ABORT_SENTINEL && b_start >= a_end && (b_start - a_end) <= max_distance) {
                        ok = 1u;
                    }
                }
            }
            sp = sp - 2u;
            __STACK__[sp - 1u] = ok;
        }

        // === STRING CONTENT GROUP ===
        case 55u: {
            if (sp == 0u) { __ABORT__ }
            let pattern_id = __STACK__[sp - 1u];
            let start = first_match_position(rule_id, pattern_id);
            let length = match_length(rule_id, pattern_id, 0u);
            __STACK__[sp - 1u] = select(region_entropy_bucket(start, length), 0u, start == ABORT_SENTINEL);
        }
        case 56u: {
            if (sp < 2u) { __ABORT__ }
            let index = __STACK__[sp - 1u];
            let pattern_id = __STACK__[sp - 2u];
            sp = sp - 1u;
            __STACK__[sp - 1u] = match_length(rule_id, pattern_id, index);
        }
        case 57u: {
            if (sp < 2u) { __ABORT__ }
            let window_size = __STACK__[sp - 1u];
            let pattern_id = __STACK__[sp - 2u];
            let count = cached_match_count(rule_id, pattern_id);
            var density = 0u;
            if (count != 0u) {
                density = 1u;
                for (var i = 0u; i < count; i = i + 1u) {
                    let start = match_position(rule_id, pattern_id, i);
                    var local = 1u;
                    for (var j = 0u; j < count; j = j + 1u) {
                        if (i != j) {
                            let other = match_position(rule_id, pattern_id, j);
                            if (other >= start && other - start <= window_size) {
                                local = local + 1u;
                            }
                        }
                    }
                    if (local > density) {
                        density = local;
                    }
                }
            }
            sp = sp - 1u;
            __STACK__[sp - 1u] = density;
        }
        case 58u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.unique_pattern_count; sp = sp + 1u; }
        case 59u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.total_match_count; sp = sp + 1u; }

        // === BYTE-LEVEL GROUP ===
        case 60u: {
            if (sp == 0u) { __ABORT__ }
            __STACK__[sp - 1u] = read_byte(__STACK__[sp - 1u]);
        }
        case 61u: {
            if (sp < 3u) { __ABORT__ }
            let expected_hash = __STACK__[sp - 1u];
            let length = __STACK__[sp - 2u];
            let offset = __STACK__[sp - 3u];
            let actual_hash = fnv1a_hash(offset, length);
            sp = sp - 2u;
            __STACK__[sp - 1u] = select(0u, 1u, actual_hash != 0u && actual_hash == expected_hash);
        }
        case 62u: {
            if (sp == 0u) { __ABORT__ }
            __STACK__[sp - 1u] = read_byte(__STACK__[sp - 1u]);
        }
        case 63u: {
            if (sp < 2u) { __ABORT__ }
            sp = sp - 1u;
            __STACK__[sp - 1u] = __STACK__[sp - 1u] ^ __STACK__[sp];
        }

        // === FILE CONTEXT GROUP ===
        case 41u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.entropy_bucket; sp = sp + 1u; }
        case 42u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.is_pe; sp = sp + 1u; }
        case 43u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.is_dll; sp = sp + 1u; }
        case 44u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.num_sections; sp = sp + 1u; }
        case 45u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.num_imports; sp = sp + 1u; }
        case 46u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.entry_point_rva; sp = sp + 1u; }
        case 47u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.has_signature; sp = sp + 1u; }
        case 48u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.magic_u32; sp = sp + 1u; }
        case 49u: { if (sp >= STACK_SIZE) { __ABORT__ } __STACK__[sp] = file_ctx.is_64bit; sp = sp + 1u; }
"#;
    template
        .replace("__STACK__", stack_expr)
        .replace("__ABORT__", abort_stmt)
}