#version 450
// Element-wise comparison → 1.0 / 0.0 in the f32 arena.
// op: 0 eq 1 ne 2 lt 3 le 4 gt 5 ge.
layout(local_size_x = 256) in;
layout(std430, binding = 0) buffer Arena { float data[]; };
layout(push_constant) uniform PC {
uint n;
uint a_off;
uint b_off;
uint c_off;
uint a_mod;
uint b_mod;
uint op;
} pc;
void main() {
uint i = gl_GlobalInvocationID.x;
if (i >= pc.n) { return; }
uint ai = (pc.a_mod == 0u) ? i : (i % pc.a_mod);
uint bi = (pc.b_mod == 0u) ? i : (i % pc.b_mod);
float a = data[pc.a_off + ai];
float b = data[pc.b_off + bi];
bool r = false;
switch (pc.op) {
case 0u: r = (a == b); break;
case 1u: r = (a != b); break;
case 2u: r = (a < b); break;
case 3u: r = (a <= b); break;
case 4u: r = (a > b); break;
case 5u: r = (a >= b); break;
default: r = false; break;
}
data[pc.c_off + i] = r ? 1.0 : 0.0;
}