From: "Zebediah Figura (she/her)" Subject: Re: [PATCH vkd3d v3 3/6] vkd3d-shader/hlsl: Write SM4 unsigned multiplication instructions. Message-Id: <6f27b70d-e85a-5514-c9ea-b58cf79e7d8e@codeweavers.com> Date: Thu, 27 Jan 2022 16:36:50 -0600 In-Reply-To: <20220127140945.636918-3-gmascellani@codeweavers.com> References: <20220127140945.636918-1-gmascellani@codeweavers.com> <20220127140945.636918-3-gmascellani@codeweavers.com> On 1/27/22 08:09, Giovanni Mascellani wrote: > @@ -1266,6 +1266,31 @@ static void write_sm4_binary_op(struct vkd3d_bytecode_buffer *buffer, enum vkd3d > write_sm4_instruction(buffer, &instr); > } > > +static void write_sm4_binary_op_with_two_destinations(struct vkd3d_bytecode_buffer *buffer, > + enum vkd3d_sm4_opcode opcode, const struct hlsl_ir_node *dst, unsigned dst_idx, > + const struct hlsl_ir_node *src1, const struct hlsl_ir_node *src2) > +{ > + struct sm4_instruction instr; > + unsigned int writemask; > + > + memset(&instr, 0, sizeof(instr)); > + instr.opcode = opcode; > + > + instr.dsts[1 - dst_idx].reg.type = VKD3D_SM4_RT_NULL; > + instr.dsts[1 - dst_idx].reg.dim = VKD3D_SM4_DIMENSION_NONE; > + instr.dsts[1 - dst_idx].reg.idx_count = 0; > + sm4_register_from_node(&instr.dsts[dst_idx].reg, &instr.dsts[dst_idx].writemask, NULL, dst); > + instr.dst_count = 2; > + > + sm4_register_from_node(&instr.srcs[0].reg, &writemask, &instr.srcs[0].swizzle_type, src1); > + instr.srcs[0].swizzle = hlsl_map_swizzle(hlsl_swizzle_from_writemask(writemask), instr.dsts[dst_idx].writemask); > + sm4_register_from_node(&instr.srcs[1].reg, &writemask, &instr.srcs[1].swizzle_type, src2); > + instr.srcs[1].swizzle = hlsl_map_swizzle(hlsl_swizzle_from_writemask(writemask), instr.dsts[dst_idx].writemask); > + instr.src_count = 2; > + > + write_sm4_instruction(buffer, &instr); > +} > + This crashes now, because sm4_register_from_node() doesn't treat the swizzle_type parameter as optional. I would recommend using the new sm4_src_from_node() and sm4_dst_from_node() helpers.