From 4f734c60ec074a96972a94b4c49c2245e974a20d Mon Sep 17 00:00:00 2001 From: Lander Gallastegi Date: Thu, 3 Apr 2025 18:52:02 +0200 Subject: [PATCH] Composite --- .../backend/asm_x64/emit_x64_composite.cpp | 282 ++++++++++++------ .../backend/asm_x64/emit_x64_instructions.h | 108 ++++--- 2 files changed, 245 insertions(+), 145 deletions(-) diff --git a/src/shader_recompiler/backend/asm_x64/emit_x64_composite.cpp b/src/shader_recompiler/backend/asm_x64/emit_x64_composite.cpp index d03516dec..910fd2cec 100644 --- a/src/shader_recompiler/backend/asm_x64/emit_x64_composite.cpp +++ b/src/shader_recompiler/backend/asm_x64/emit_x64_composite.cpp @@ -6,9 +6,12 @@ namespace Shader::Backend::X64 { +using namespace Xbyak; +using namespace Xbyak::util; + namespace { -template +template static const Operand& GetSuffleOperand(const Operands& comp1, const Operands& comp2, u32 index) { if (index < N) { return comp1[index]; @@ -55,16 +58,34 @@ void EmitCompositeExtractU32x4(EmitContext& ctx, const Operands& dest, const Ope MovGP(ctx, dest[0], composite[index]); } -void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& object, u32 index) { - MovGP(ctx, dest[index], object[0]); +void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + if (index == 0) { + MovGP(ctx, dest[0], object[0]); + MovGP(ctx, dest[1], composite[1]); + } else { + MovGP(ctx, dest[0], composite[0]); + MovGP(ctx, dest[1], object[0]); + } } -void EmitCompositeInsertU32x3(EmitContext& ctx, const Operands& dest, const Operands& object, u32 index) { - MovGP(ctx, dest[index], object[0]); +void EmitCompositeInsertU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 3; ++i) { + if (i == index) { + MovGP(ctx, dest[i], object[0]); + } else { + MovGP(ctx, dest[i], composite[i]); + } + } } -void EmitCompositeInsertU32x4(EmitContext& ctx, const Operands& dest, const Operands& object, u32 index) { - MovGP(ctx, dest[index], object[0]); +void EmitCompositeInsertU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 3; ++i) { + if (i == index) { + MovGP(ctx, dest[i], object[0]); + } else { + MovGP(ctx, dest[i], composite[i]); + } + } } void EmitCompositeShuffleU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) { @@ -85,158 +106,245 @@ void EmitCompositeShuffleU32x4(EmitContext& ctx, const Operands& dest, const Ope MovGP(ctx, dest[3], GetSuffleOperand<4>(composite1, composite2, idx4)); } -Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { - return EmitCompositeConstruct(ctx, inst, ctx.F16[2], e1, e2); +void EmitCompositeConstructF16x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) { + MovGP(ctx, dest[0], src1[0]); + MovGP(ctx, dest[1], src2[0]); } -Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3) { - return EmitCompositeConstruct(ctx, inst, ctx.F16[3], e1, e2, e3); +void EmitCompositeConstructF16x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) { + MovGP(ctx, dest[0], src1[0]); + MovGP(ctx, dest[1], src2[0]); + MovGP(ctx, dest[2], src3[0]); } -Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) { - return EmitCompositeConstruct(ctx, inst, ctx.F16[4], e1, e2, e3, e4); +void EmitCompositeConstructF16x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) { + MovGP(ctx, dest[0], src1[0]); + MovGP(ctx, dest[1], src2[0]); + MovGP(ctx, dest[2], src3[0]); + MovGP(ctx, dest[3], src4[0]); } -Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F16[1], composite, index); +void EmitCompositeExtractF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovGP(ctx, dest[0], composite[index]); } -Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F16[1], composite, index); +void EmitCompositeExtractF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovGP(ctx, dest[0], composite[index]); } -Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F16[1], composite, index); +void EmitCompositeExtractF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovGP(ctx, dest[0], composite[index]); } -Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F16[2], object, composite, index); +void EmitCompositeInsertF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + if (index == 0) { + MovGP(ctx, dest[0], object[0]); + MovGP(ctx, dest[1], composite[1]); + } else { + MovGP(ctx, dest[0], composite[0]); + MovGP(ctx, dest[1], object[0]); + } } -Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F16[3], object, composite, index); +void EmitCompositeInsertF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 3; ++i) { + if (i == index) { + MovGP(ctx, dest[i], object[0]); + } else { + MovGP(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F16[4], object, composite, index); +void EmitCompositeInsertF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 4; ++i) { + if (i == index) { + MovGP(ctx, dest[i], object[0]); + } else { + MovGP(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeShuffleF16x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) { - return ctx.OpVectorShuffle(ctx.F16[2], composite1, composite2, comp0, comp1); +void EmitCompositeShuffleF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) { + MovGP(ctx, dest[0], GetSuffleOperand<2>(composite1, composite2, idx1)); + MovGP(ctx, dest[1], GetSuffleOperand<2>(composite1, composite2, idx2)); } -Id EmitCompositeShuffleF16x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2) { - return ctx.OpVectorShuffle(ctx.F16[3], composite1, composite2, comp0, comp1, comp2); +void EmitCompositeShuffleF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) { + MovGP(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1)); + MovGP(ctx, dest[1], GetSuffleOperand<3>(composite1, composite2, idx2)); + MovGP(ctx, dest[2], GetSuffleOperand<3>(composite1, composite2, idx3)); } -Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3) { - return ctx.OpVectorShuffle(ctx.F16[4], composite1, composite2, comp0, comp1, comp2, comp3); +void EmitCompositeShuffleF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) { + MovGP(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1)); + MovGP(ctx, dest[1], GetSuffleOperand<4>(composite1, composite2, idx2)); + MovGP(ctx, dest[2], GetSuffleOperand<4>(composite1, composite2, idx3)); + MovGP(ctx, dest[3], GetSuffleOperand<4>(composite1, composite2, idx4)); } -Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { - return EmitCompositeConstruct(ctx, inst, ctx.F32[2], e1, e2); +void EmitCompositeConstructF32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) { + MovFloat(ctx, dest[0], src1[0]); + MovFloat(ctx, dest[1], src2[0]); } -Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3) { - return EmitCompositeConstruct(ctx, inst, ctx.F32[3], e1, e2, e3); +void EmitCompositeConstructF32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) { + MovFloat(ctx, dest[0], src1[0]); + MovFloat(ctx, dest[1], src2[0]); + MovFloat(ctx, dest[2], src3[0]); } -Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4) { - return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2, e3, e4); +void EmitCompositeConstructF32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) { + MovFloat(ctx, dest[0], src1[0]); + MovFloat(ctx, dest[1], src2[0]); + MovFloat(ctx, dest[2], src3[0]); + MovFloat(ctx, dest[3], src4[0]); } -Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { - return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2); +void EmitCompositeConstructF32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) { + MovFloat(ctx, dest[0], src1[0]); + MovFloat(ctx, dest[1], src2[0]); + MovFloat(ctx, dest[2], src1[1]); + MovFloat(ctx, dest[3], src2[1]); } -Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F32[1], composite, index); +void EmitCompositeExtractF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovFloat(ctx, dest[0], composite[index]); } -Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F32[1], composite, index); +void EmitCompositeExtractF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovFloat(ctx, dest[0], composite[index]); } -Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index) { - return ctx.OpCompositeExtract(ctx.F32[1], composite, index); +void EmitCompositeExtractF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovFloat(ctx, dest[0], composite[index]); } -Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F32[2], object, composite, index); +void EmitCompositeInsertF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + if (index == 0) { + MovFloat(ctx, dest[0], object[0]); + MovFloat(ctx, dest[1], composite[1]); + } else { + MovFloat(ctx, dest[0], composite[0]); + MovFloat(ctx, dest[1], object[0]); + } } -Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F32[3], object, composite, index); +void EmitCompositeInsertF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 3; ++i) { + if (i == index) { + MovFloat(ctx, dest[i], object[0]); + } else { + MovFloat(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F32[4], object, composite, index); +void EmitCompositeInsertF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 4; ++i) { + if (i == index) { + MovFloat(ctx, dest[i], object[0]); + } else { + MovFloat(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeShuffleF32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) { - return ctx.OpVectorShuffle(ctx.F32[2], composite1, composite2, comp0, comp1); +void EmitCompositeShuffleF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) { + MovFloat(ctx, dest[0], GetSuffleOperand<2>(composite1, composite2, idx1)); + MovFloat(ctx, dest[1], GetSuffleOperand<2>(composite1, composite2, idx2)); } -Id EmitCompositeShuffleF32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2) { - return ctx.OpVectorShuffle(ctx.F32[3], composite1, composite2, comp0, comp1, comp2); +void EmitCompositeShuffleF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) { + MovFloat(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1)); + MovFloat(ctx, dest[1], GetSuffleOperand<3>(composite1, composite2, idx2)); + MovFloat(ctx, dest[2], GetSuffleOperand<3>(composite1, composite2, idx3)); } -Id EmitCompositeShuffleF32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3) { - return ctx.OpVectorShuffle(ctx.F32[4], composite1, composite2, comp0, comp1, comp2, comp3); +void EmitCompositeShuffleF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) { + MovFloat(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1)); + MovFloat(ctx, dest[1], GetSuffleOperand<4>(composite1, composite2, idx2)); + MovFloat(ctx, dest[2], GetSuffleOperand<4>(composite1, composite2, idx3)); + MovFloat(ctx, dest[3], GetSuffleOperand<4>(composite1, composite2, idx4)); } -void EmitCompositeConstructF64x2(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeConstructF64x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) { + MovDouble(ctx, dest[0], src1[0]); + MovDouble(ctx, dest[1], src2[0]); } -void EmitCompositeConstructF64x3(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeConstructF64x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) { + MovDouble(ctx, dest[0], src1[0]); + MovDouble(ctx, dest[1], src2[0]); + MovDouble(ctx, dest[2], src3[0]); } -void EmitCompositeConstructF64x4(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeConstructF64x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) { + MovDouble(ctx, dest[0], src1[0]); + MovDouble(ctx, dest[1], src2[0]); + MovDouble(ctx, dest[2], src3[0]); + MovDouble(ctx, dest[3], src4[0]); } -void EmitCompositeExtractF64x2(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeExtractF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovDouble(ctx, dest[0], composite[index]); } -void EmitCompositeExtractF64x3(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeExtractF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovDouble(ctx, dest[0], composite[index]); } -void EmitCompositeExtractF64x4(EmitContext&) { - UNREACHABLE_MSG("SPIR-V Instruction"); +void EmitCompositeExtractF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) { + MovDouble(ctx, dest[0], composite[index]); } -Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F64[2], object, composite, index); +void EmitCompositeInsertF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + if (index == 0) { + MovDouble(ctx, dest[0], object[0]); + MovDouble(ctx, dest[1], composite[1]); + } else { + MovDouble(ctx, dest[0], composite[0]); + MovDouble(ctx, dest[1], object[0]); + } } -Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F64[3], object, composite, index); +void EmitCompositeInsertF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 3; ++i) { + if (i == index) { + MovDouble(ctx, dest[i], object[0]); + } else { + MovDouble(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index) { - return ctx.OpCompositeInsert(ctx.F64[4], object, composite, index); +void EmitCompositeInsertF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) { + for (u32 i = 0; i < 4; ++i) { + if (i == index) { + MovDouble(ctx, dest[i], object[0]); + } else { + MovDouble(ctx, dest[i], composite[i]); + } + } } -Id EmitCompositeShuffleF64x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) { - return ctx.OpVectorShuffle(ctx.F64[2], composite1, composite2, comp0, comp1); +void EmitCompositeShuffleF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) { + MovDouble(ctx, dest[0], GetSuffleOperand<2>(composite1, composite2, idx1)); + MovDouble(ctx, dest[1], GetSuffleOperand<2>(composite1, composite2, idx2)); } -Id EmitCompositeShuffleF64x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2) { - return ctx.OpVectorShuffle(ctx.F64[3], composite1, composite2, comp0, comp1, comp2); +void EmitCompositeShuffleF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) { + MovDouble(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1)); + MovDouble(ctx, dest[1], GetSuffleOperand<3>(composite1, composite2, idx2)); + MovDouble(ctx, dest[2], GetSuffleOperand<3>(composite1, composite2, idx3)); } -Id EmitCompositeShuffleF64x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3) { - return ctx.OpVectorShuffle(ctx.F64[4], composite1, composite2, comp0, comp1, comp2, comp3); +void EmitCompositeShuffleF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) { + MovDouble(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1)); + MovDouble(ctx, dest[1], GetSuffleOperand<4>(composite1, composite2, idx2)); + MovDouble(ctx, dest[2], GetSuffleOperand<4>(composite1, composite2, idx3)); + MovDouble(ctx, dest[3], GetSuffleOperand<4>(composite1, composite2, idx4)); } } \ No newline at end of file diff --git a/src/shader_recompiler/backend/asm_x64/emit_x64_instructions.h b/src/shader_recompiler/backend/asm_x64/emit_x64_instructions.h index 51970986d..6c086553b 100644 --- a/src/shader_recompiler/backend/asm_x64/emit_x64_instructions.h +++ b/src/shader_recompiler/backend/asm_x64/emit_x64_instructions.h @@ -132,64 +132,56 @@ void EmitSharedAtomicSMin32(EmitContext& ctx); void EmitSharedAtomicAnd32(EmitContext& ctx); void EmitSharedAtomicOr32(EmitContext& ctx); void EmitSharedAtomicXor32(EmitContext& ctx); -Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); -Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); -Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); -Id EmitCompositeConstructU32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); -Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeShuffleU32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); -Id EmitCompositeShuffleU32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2); -Id EmitCompositeShuffleU32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3); -Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); -Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); -Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); -Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeShuffleF16x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); -Id EmitCompositeShuffleF16x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2); -Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3); -Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); -Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); -Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); -Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); -Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index); -Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeShuffleF32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); -Id EmitCompositeShuffleF32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2); -Id EmitCompositeShuffleF32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3); -void EmitCompositeConstructF64x2(EmitContext& ctx); -void EmitCompositeConstructF64x3(EmitContext& ctx); -void EmitCompositeConstructF64x4(EmitContext& ctx); -void EmitCompositeExtractF64x2(EmitContext& ctx); -void EmitCompositeExtractF64x3(EmitContext& ctx); -void EmitCompositeExtractF64x4(EmitContext& ctx); -Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index); -Id EmitCompositeShuffleF64x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); -Id EmitCompositeShuffleF64x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2); -Id EmitCompositeShuffleF64x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, - u32 comp2, u32 comp3); +void EmitCompositeConstructU32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeConstructU32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3); +void EmitCompositeConstructU32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4); +void EmitCompositeConstructU32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeExtractU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeShuffleU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2); +void EmitCompositeShuffleU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3); +void EmitCompositeShuffleU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4); +void EmitCompositeConstructF16x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeConstructF16x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3); +void EmitCompositeConstructF16x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4); +void EmitCompositeExtractF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeInsertF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeShuffleF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2); +void EmitCompositeShuffleF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3); +void EmitCompositeShuffleF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4); +void EmitCompositeConstructF32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeConstructF32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3); +void EmitCompositeConstructF32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4); +void EmitCompositeConstructF32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeExtractF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeInsertF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeShuffleF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2); +void EmitCompositeShuffleF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3); +void EmitCompositeShuffleF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4); +void EmitCompositeConstructF64x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2); +void EmitCompositeConstructF64x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3); +void EmitCompositeConstructF64x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4); +void EmitCompositeExtractF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeExtractF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index); +void EmitCompositeInsertF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeInsertF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index); +void EmitCompositeShuffleF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2); +void EmitCompositeShuffleF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3); +void EmitCompositeShuffleF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4); Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value); Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value); Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);