D979 - SDWA and DPP operand modifiers are one shared path over any eligible instruction

Status: decided Date: 2026-10-25 known_by: published

An SDWA or DPP modifier word changes how an instruction reads its sources and writes its result. It does not change what the instruction computes. So the modifiers are applied around the plain instruction in one place, for every instruction that has the form. Before, each instruction was listed with its own translation of the form.

SDWA (model/sdwa.rs), on any one- or two-source vector instruction whose operands are at most 32 bits wide:

A compare keeps its own path, since it writes a lane mask rather than a register. A part of a float source is now read as any source's part is. An accumulating form (fmac), one taking a literal, one writing a scalar, or one moving registers by index has no SDWA form, and is refused by what it is.

DPP is one shape for DPP16 and DPP8, on any one- or two-source vector instruction:

Why: Grand Theft Auto V's three ray-tracing programs were refused on v_min_u32_sdwa and v_mul_u32_u24_sdwa. Every such refusal so far had been answered by adding one more name to a list. The offline oracle had also called the wavefront emitter directly, which bypassed the crate's refusal of untranslated modifier words. There the model's fall-through treated a two-source SDWA form as its one-source plain form and dropped the second source's select. The oracle now translates through the crate's entry, as the pipeline does.

Sources: AMD's published RDNA 2 instruction set (SDWA, DPP16, DPP8); LLVM's AMDGPUModifierSyntax for each field's meaning (UNUSED_SEXT "sign-extend upper bits, zero lower bits"; DPP8 fi:0 "fetch zero when accessing data from inactive lanes"); llvm-mc for gfx1030 for the encodings and for which instructions have each form.

Rejected: