diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 54378b7a5..db74a7bfb 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -4540,7 +4540,7 @@ static enum vkd3d_shader_opcode map_binary_op(uint64_t code, const struct sm6_ty is_valid = is_int && !is_bool; break; case BINOP_UREM: - op = VSIR_OP_UDIV; + op = VSIR_OP_UREM; is_valid = is_int && !is_bool; break; case BINOP_XOR: @@ -4613,9 +4613,9 @@ static void sm6_parser_emit_binop(struct sm6_parser *sm6, const struct dxil_reco case VSIR_OP_ISHR: case VSIR_OP_USHR: case VSIR_OP_IDIV: - case VSIR_OP_UDIV: case VSIR_OP_UDIV_SIMPLE: case VSIR_OP_IREM: + case VSIR_OP_UREM: silence_warning = !(flags & ~PEB_EXACT); break; default: @@ -4642,27 +4642,14 @@ static void sm6_parser_emit_binop(struct sm6_parser *sm6, const struct dxil_reco dst->type = a->type; - if (handler_idx == VSIR_OP_UDIV) + if (handler_idx == VSIR_OP_ISHL || handler_idx == VSIR_OP_ISHR || handler_idx == VSIR_OP_USHR) { - struct vkd3d_shader_dst_param *dst_params = instruction_dst_params_alloc(ins, 2, sm6); - unsigned int index = code != BINOP_UDIV && code != BINOP_SDIV; - - dst_param_init(&dst_params[0]); - dst_param_init(&dst_params[1]); - sm6_parser_init_ssa_value(sm6, dst); - sm6_register_from_value(&dst_params[index].reg, dst, sm6); - vsir_dst_param_init_null(&dst_params[index ^ 1]); - } - else - { - if (handler_idx == VSIR_OP_ISHL || handler_idx == VSIR_OP_ISHR || handler_idx == VSIR_OP_USHR) - { - /* DXC emits AND instructions where necessary to mask shift counts. Shift binops - * do not imply masking the shift as the TPF equivalents do. */ - ins->flags |= VKD3DSI_SHIFT_UNMASKED; - } - instruction_dst_param_init_ssa_scalar(ins, sm6); + /* DXC emits AND instructions where necessary to mask shift counts. + * Shift binops do not imply masking the shift as the TPF equivalents + * do. */ + ins->flags |= VKD3DSI_SHIFT_UNMASKED; } + instruction_dst_param_init_ssa_scalar(ins, sm6); } static const struct sm6_block *sm6_function_get_block(const struct sm6_function *function, uint64_t index, diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 55e150a3f..0f69e37b1 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -339,6 +339,7 @@ const char *vsir_opcode_get_name(enum vkd3d_shader_opcode op, const char *error) [VSIR_OP_UMIN ] = "umin", [VSIR_OP_UMUL ] = "umul", [VSIR_OP_UNO ] = "uno", + [VSIR_OP_UREM ] = "urem", [VSIR_OP_USHR ] = "ushr", [VSIR_OP_UTOD ] = "utod", [VSIR_OP_UTOF ] = "utof", @@ -7935,6 +7936,7 @@ static bool vsir_src_is_masked(enum vkd3d_shader_opcode opcode, unsigned int src case VSIR_OP_UMIN: case VSIR_OP_UMUL: case VSIR_OP_UNO: + case VSIR_OP_UREM: case VSIR_OP_USHR: case VSIR_OP_UTOD: case VSIR_OP_UTOF: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 1abf55fba..9e47de4af 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7549,6 +7549,7 @@ static SpvOp spirv_compiler_map_alu_instruction(const struct vkd3d_shader_instru {VSIR_OP_NOT, SpvOpNot}, {VSIR_OP_OR, SpvOpBitwiseOr}, {VSIR_OP_UDIV_SIMPLE, SpvOpUDiv}, + {VSIR_OP_UREM, SpvOpUMod}, {VSIR_OP_USHR, SpvOpShiftRightLogical}, {VSIR_OP_UTOD, SpvOpConvertUToF}, {VSIR_OP_UTOF, SpvOpConvertUToF}, @@ -7675,6 +7676,7 @@ static enum vkd3d_result spirv_compiler_emit_alu_instruction(struct spirv_compil case VSIR_OP_IDIV: case VSIR_OP_IREM: case VSIR_OP_UDIV_SIMPLE: + case VSIR_OP_UREM: check_zero = true; break; @@ -10695,6 +10697,7 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, case VSIR_OP_NOT: case VSIR_OP_OR: case VSIR_OP_UDIV_SIMPLE: + case VSIR_OP_UREM: case VSIR_OP_USHR: case VSIR_OP_UTOD: case VSIR_OP_UTOF: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 41a30751d..9daa87e17 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -587,6 +587,7 @@ enum vkd3d_shader_opcode VSIR_OP_UMIN, VSIR_OP_UMUL, VSIR_OP_UNO, + VSIR_OP_UREM, VSIR_OP_USHR, VSIR_OP_UTOD, VSIR_OP_UTOF,