Comparisons, and a conditional shader with no branch in it

Float comparisons translate. v_cmp_lt_f32, v_cmp_eq_f32 and v_cmp_gt_f32 compare every lane and assemble the answers into the condition mask, which a shader then ands into the execution mask - and that is an if-branch, complete, with no branch instruction involved. Predicated execution needs the mask, not the jump. Thirty-six execution tests, all on a real device.

Two of those tests exist because a plausible translation passes without them.

The lane model refuses comparisons for the same reason it refuses mask writes - a comparison produces one bit per lane and that model has nowhere to put sixty-four of them. Answering with the one lane it has would be a mask claiming the other sixty-three agree. Fidelity::Auto routes such a shader to the wavefront model, which is now tested rather than asserted.

Surprises.

Not done. Branching. The mask can be computed, honoured, and now derived from a comparison, but a jump taken when no lane survives cannot be expressed - SPIR-V demands structured control flow and the guest's is implied. That remains the substance of D098 and it is a design problem. Comparisons are also uniform across lanes for now: every lane compares the same registers because no instruction yields a lane index, so the mask is all-ones or all-zero. Per-lane divergence needs that source first.