Composite

This commit is contained in:
Lander Gallastegi 2025-04-03 18:52:02 +02:00 committed by Lander Gallastegi
parent 20f7a7231e
commit 35d3ee8ecd
2 changed files with 245 additions and 145 deletions

View File

@ -6,9 +6,12 @@
namespace Shader::Backend::X64 { namespace Shader::Backend::X64 {
using namespace Xbyak;
using namespace Xbyak::util;
namespace { namespace {
template <u32t N> template <u32 N>
static const Operand& GetSuffleOperand(const Operands& comp1, const Operands& comp2, u32 index) { static const Operand& GetSuffleOperand(const Operands& comp1, const Operands& comp2, u32 index) {
if (index < N) { if (index < N) {
return comp1[index]; return comp1[index];
@ -55,16 +58,34 @@ void EmitCompositeExtractU32x4(EmitContext& ctx, const Operands& dest, const Ope
MovGP(ctx, dest[0], composite[index]); MovGP(ctx, dest[0], composite[index]);
} }
void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& object, u32 index) { void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
MovGP(ctx, dest[index], object[0]); 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) { void EmitCompositeInsertU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
MovGP(ctx, dest[index], object[0]); 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) { void EmitCompositeInsertU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
MovGP(ctx, dest[index], object[0]); 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) { 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)); MovGP(ctx, dest[3], GetSuffleOperand<4>(composite1, composite2, idx4));
} }
Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2) { void EmitCompositeConstructF16x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) {
return EmitCompositeConstruct(ctx, inst, ctx.F16[2], e1, e2); 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) { void EmitCompositeConstructF16x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) {
return EmitCompositeConstruct(ctx, inst, ctx.F16[3], e1, e2, e3); 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) { void EmitCompositeConstructF16x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) {
return EmitCompositeConstruct(ctx, inst, ctx.F16[4], e1, e2, e3, e4); 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) { void EmitCompositeExtractF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F16[1], composite, index); MovGP(ctx, dest[0], composite[index]);
} }
Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index) { void EmitCompositeExtractF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F16[1], composite, index); MovGP(ctx, dest[0], composite[index]);
} }
Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index) { void EmitCompositeExtractF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F16[1], composite, index); MovGP(ctx, dest[0], composite[index]);
} }
Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index) { void EmitCompositeInsertF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F16[2], object, composite, 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) { void EmitCompositeInsertF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F16[3], object, composite, 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) { void EmitCompositeInsertF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F16[4], object, composite, 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) { void EmitCompositeShuffleF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) {
return ctx.OpVectorShuffle(ctx.F16[2], composite1, composite2, comp0, comp1); 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, void EmitCompositeShuffleF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) {
u32 comp2) { MovGP(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F16[3], composite1, composite2, comp0, comp1, comp2); 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, void EmitCompositeShuffleF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) {
u32 comp2, u32 comp3) { MovGP(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F16[4], composite1, composite2, comp0, comp1, comp2, comp3); 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) { void EmitCompositeConstructF32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) {
return EmitCompositeConstruct(ctx, inst, ctx.F32[2], e1, e2); 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) { void EmitCompositeConstructF32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) {
return EmitCompositeConstruct(ctx, inst, ctx.F32[3], e1, e2, e3); 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) { void EmitCompositeConstructF32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) {
return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2, e3, e4); 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) { void EmitCompositeConstructF32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) {
return EmitCompositeConstruct(ctx, inst, ctx.F32[4], e1, e2); 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) { void EmitCompositeExtractF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F32[1], composite, index); MovFloat(ctx, dest[0], composite[index]);
} }
Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index) { void EmitCompositeExtractF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F32[1], composite, index); MovFloat(ctx, dest[0], composite[index]);
} }
Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index) { void EmitCompositeExtractF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
return ctx.OpCompositeExtract(ctx.F32[1], composite, index); MovFloat(ctx, dest[0], composite[index]);
} }
Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index) { void EmitCompositeInsertF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F32[2], object, composite, 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) { void EmitCompositeInsertF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F32[3], object, composite, 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) { void EmitCompositeInsertF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F32[4], object, composite, 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) { void EmitCompositeShuffleF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) {
return ctx.OpVectorShuffle(ctx.F32[2], composite1, composite2, comp0, comp1); 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, void EmitCompositeShuffleF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) {
u32 comp2) { MovFloat(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F32[3], composite1, composite2, comp0, comp1, comp2); 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, void EmitCompositeShuffleF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) {
u32 comp2, u32 comp3) { MovFloat(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F32[4], composite1, composite2, comp0, comp1, comp2, comp3); 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&) { void EmitCompositeConstructF64x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2) {
UNREACHABLE_MSG("SPIR-V Instruction"); MovDouble(ctx, dest[0], src1[0]);
MovDouble(ctx, dest[1], src2[0]);
} }
void EmitCompositeConstructF64x3(EmitContext&) { void EmitCompositeConstructF64x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3) {
UNREACHABLE_MSG("SPIR-V Instruction"); MovDouble(ctx, dest[0], src1[0]);
MovDouble(ctx, dest[1], src2[0]);
MovDouble(ctx, dest[2], src3[0]);
} }
void EmitCompositeConstructF64x4(EmitContext&) { void EmitCompositeConstructF64x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4) {
UNREACHABLE_MSG("SPIR-V Instruction"); 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&) { void EmitCompositeExtractF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
UNREACHABLE_MSG("SPIR-V Instruction"); MovDouble(ctx, dest[0], composite[index]);
} }
void EmitCompositeExtractF64x3(EmitContext&) { void EmitCompositeExtractF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
UNREACHABLE_MSG("SPIR-V Instruction"); MovDouble(ctx, dest[0], composite[index]);
} }
void EmitCompositeExtractF64x4(EmitContext&) { void EmitCompositeExtractF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index) {
UNREACHABLE_MSG("SPIR-V Instruction"); MovDouble(ctx, dest[0], composite[index]);
} }
Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index) { void EmitCompositeInsertF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F64[2], object, composite, 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) { void EmitCompositeInsertF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F64[3], object, composite, 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) { void EmitCompositeInsertF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index) {
return ctx.OpCompositeInsert(ctx.F64[4], object, composite, 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) { void EmitCompositeShuffleF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2) {
return ctx.OpVectorShuffle(ctx.F64[2], composite1, composite2, comp0, comp1); 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, void EmitCompositeShuffleF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3) {
u32 comp2) { MovDouble(ctx, dest[0], GetSuffleOperand<3>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F64[3], composite1, composite2, comp0, comp1, comp2); 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, void EmitCompositeShuffleF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4) {
u32 comp2, u32 comp3) { MovDouble(ctx, dest[0], GetSuffleOperand<4>(composite1, composite2, idx1));
return ctx.OpVectorShuffle(ctx.F64[4], composite1, composite2, comp0, comp1, comp2, comp3); 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));
} }
} }

View File

@ -132,64 +132,56 @@ void EmitSharedAtomicSMin32(EmitContext& ctx);
void EmitSharedAtomicAnd32(EmitContext& ctx); void EmitSharedAtomicAnd32(EmitContext& ctx);
void EmitSharedAtomicOr32(EmitContext& ctx); void EmitSharedAtomicOr32(EmitContext& ctx);
void EmitSharedAtomicXor32(EmitContext& ctx); void EmitSharedAtomicXor32(EmitContext& ctx);
Id EmitCompositeConstructU32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); void EmitCompositeConstructU32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
Id EmitCompositeConstructU32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); void EmitCompositeConstructU32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3);
Id EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); void EmitCompositeConstructU32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4);
Id EmitCompositeConstructU32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); void EmitCompositeConstructU32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index); void EmitCompositeExtractU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index); void EmitCompositeExtractU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index); void EmitCompositeExtractU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeInsertU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeInsertU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeInsertU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeShuffleU32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); void EmitCompositeShuffleU32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2);
Id EmitCompositeShuffleU32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeShuffleU32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3);
u32 comp2); void EmitCompositeShuffleU32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4);
Id EmitCompositeShuffleU32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeConstructF16x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
u32 comp2, u32 comp3); void EmitCompositeConstructF16x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3);
Id EmitCompositeConstructF16x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); void EmitCompositeConstructF16x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4);
Id EmitCompositeConstructF16x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); void EmitCompositeExtractF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeConstructF16x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); void EmitCompositeExtractF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index); void EmitCompositeExtractF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index); void EmitCompositeInsertF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index); void EmitCompositeInsertF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeInsertF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeShuffleF16x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2);
Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeShuffleF16x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3);
Id EmitCompositeShuffleF16x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); void EmitCompositeShuffleF16x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4);
Id EmitCompositeShuffleF16x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeConstructF32x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
u32 comp2); void EmitCompositeConstructF32x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3);
Id EmitCompositeShuffleF16x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeConstructF32x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4);
u32 comp2, u32 comp3); void EmitCompositeConstructF32x2x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
Id EmitCompositeConstructF32x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); void EmitCompositeExtractF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeConstructF32x3(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3); void EmitCompositeExtractF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2, Id e3, Id e4); void EmitCompositeExtractF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeConstructF32x2x2(EmitContext& ctx, IR::Inst* inst, Id e1, Id e2); void EmitCompositeInsertF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index); void EmitCompositeInsertF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index); void EmitCompositeInsertF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index); void EmitCompositeShuffleF32x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2);
Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeShuffleF32x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3);
Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeShuffleF32x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4);
Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index); void EmitCompositeConstructF64x2(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2);
Id EmitCompositeShuffleF32x2(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1); void EmitCompositeConstructF64x3(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3);
Id EmitCompositeShuffleF32x3(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeConstructF64x4(EmitContext& ctx, const Operands& dest, const Operands& src1, const Operands& src2, const Operands& src3, const Operands& src4);
u32 comp2); void EmitCompositeExtractF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
Id EmitCompositeShuffleF32x4(EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1, void EmitCompositeExtractF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
u32 comp2, u32 comp3); void EmitCompositeExtractF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, u32 index);
void EmitCompositeConstructF64x2(EmitContext& ctx); void EmitCompositeInsertF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
void EmitCompositeConstructF64x3(EmitContext& ctx); void EmitCompositeInsertF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
void EmitCompositeConstructF64x4(EmitContext& ctx); void EmitCompositeInsertF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite, const Operands& object, u32 index);
void EmitCompositeExtractF64x2(EmitContext& ctx); void EmitCompositeShuffleF64x2(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2);
void EmitCompositeExtractF64x3(EmitContext& ctx); void EmitCompositeShuffleF64x3(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3);
void EmitCompositeExtractF64x4(EmitContext& ctx); void EmitCompositeShuffleF64x4(EmitContext& ctx, const Operands& dest, const Operands& composite1, const Operands& composite2, u32 idx1, u32 idx2, u32 idx3, u32 idx4);
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);
Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value); 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 EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value); Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);