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)
}