Stage 1 of the iterate-3O resume plan: make the P7 translator actually
compile the splash's real VS/PS so real per-vertex POSITIONS render via the
host wgpu pipeline, instead of every draw falling to the interpreter (which
emits a placeholder triangle). Two coupled fixes, both faithful (Route A):
1. ucode/control_flow.rs (GPUBUG-103): clause-level predication was decoded
from payload bits 28/29, which fall inside the exec clause's `sequence_`/
`vc_hi_` fields, NOT the predicate flag. That stamped `predicated=true`
on plain `kExec` clauses, so the translator rejected EVERY splash VS as
`cf_cond`. Per canary ucode.h, clause predication is determined by the
*opcode* (only kCondExecPred* = 5/6/13/14 are predicate-register-gated;
their `condition_` is at word1 bit 9 = payload bit 41). kExec/kExecEnd
(1/2) run unconditionally; kCondExec (3/4) is bool-constant-gated (not
modeled). Diagnosed live in --ui: reject reason cf_cond on all 7 splash
shader pairs → after fix, predicated=false and CF passes.
2. translator.rs: with CF passing, the next reject was `scl_op_unsupported`
for scalar opcodes 4 (kMulsPrev2 / LIT emul) and 8 (kSgts), plus thin
vector coverage. Expanded vector_expr + scalar_expr to mirror the runtime
interpreter's op set (which mirrors canary AluVectorOpcode/AluScalarOpcode):
CND_EQ/GE/GT, TRUNC, MAX4, DST for vectors; the full SEQS/SGTS/SGES/SNES,
MULS_PREV2 (with the -FLT_MAX / non-finite / b<=0 guard), SUBS(_PREV),
EXP/LOG/RCP/RSQ/SQRT/SIN/COS, FRCS/TRUNCS/FLOORS for scalars. Side-effecting
ops (setp*/kills*/maxas*) still reject → interpreter fallback (honest).
Result (--ui, measured): xlated-pipelines 0→6, all draws served by the
translator (served_interp=0) — real VS/PS now run on the host GPU. The
splash is still not visibly correct because the captured guest vertex
windows read all-zero: the vertex-buffer base VA (~0x0adf_xxxx) is UNMAPPED
in guest memory (mem.translate()==None). That is a CPU/kernel memory-mapping
gap, not a GPU-render gap — the next stage.
Determinism: both files are in xenia-gpu core but the CF `predicated` field
only feeds the UI translator + a metric tag, never deterministic state.
Verified: `check -n50000000 --gpu-inline --stable-digest` matches the golden
byte-for-byte (exit 0); 679 tests green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>