From 4a39db797b99bd845dd0ff7d5875b5c6fa2e8794 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Tue, 10 Jun 2025 16:57:57 +0200 Subject: [PATCH] vkd3d-shader/ir: Introduce VKD3DSIH_IMUL_LOW. It is meant to compute the lower word of an integer multiplication. --- libs/vkd3d-shader/dxil.c | 6 +++--- libs/vkd3d-shader/glsl.c | 3 +++ libs/vkd3d-shader/ir.c | 2 ++ libs/vkd3d-shader/spirv.c | 2 ++ libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 71fa81ec1..194c51a6f 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -4516,7 +4516,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_MUL: - op = is_int ? VKD3DSIH_UMUL : (is_double ? VKD3DSIH_DMUL : VKD3DSIH_MUL); + op = is_int ? VKD3DSIH_IMUL_LOW : (is_double ? VKD3DSIH_DMUL : VKD3DSIH_MUL); is_valid = !is_bool; break; case BINOP_OR: @@ -4603,7 +4603,7 @@ static void sm6_parser_emit_binop(struct sm6_parser *sm6, const struct dxil_reco silence_warning = !(flags & ~(FP_NO_NAN | FP_NO_INF | FP_NO_SIGNED_ZEROS | FP_ALLOW_RECIPROCAL)); break; case VKD3DSIH_IADD: - case VKD3DSIH_UMUL: + case VKD3DSIH_IMUL_LOW: case VKD3DSIH_ISHL: silence_warning = !(flags & ~(OB_NO_UNSIGNED_WRAP | OB_NO_SIGNED_WRAP)); break; @@ -4637,7 +4637,7 @@ static void sm6_parser_emit_binop(struct sm6_parser *sm6, const struct dxil_reco dst->type = a->type; - if (handler_idx == VKD3DSIH_UMUL || handler_idx == VKD3DSIH_UDIV || handler_idx == VKD3DSIH_IDIV) + if (handler_idx == VKD3DSIH_UDIV || handler_idx == VKD3DSIH_IDIV) { struct vkd3d_shader_dst_param *dst_params = instruction_dst_params_alloc(ins, 2, sm6); unsigned int index = code != BINOP_UDIV && code != BINOP_SDIV; diff --git a/libs/vkd3d-shader/glsl.c b/libs/vkd3d-shader/glsl.c index 214632c00..bf47474f3 100644 --- a/libs/vkd3d-shader/glsl.c +++ b/libs/vkd3d-shader/glsl.c @@ -1587,6 +1587,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen, case VKD3DSIH_IMUL: shader_glsl_mul_extended(gen, ins); break; + case VKD3DSIH_IMUL_LOW: + shader_glsl_binop(gen, ins, "*"); + break; case VKD3DSIH_INE: case VKD3DSIH_NEU: shader_glsl_relop(gen, ins, "!=", "notEqual"); diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 8489d0b5e..7d56c0c1e 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -208,6 +208,7 @@ const char *vsir_opcode_get_name(enum vkd3d_shader_opcode op, const char *error) [VKD3DSIH_IMM_ATOMIC_UMIN ] = "imm_atomic_umin", [VKD3DSIH_IMM_ATOMIC_XOR ] = "imm_atomic_xor", [VKD3DSIH_IMUL ] = "imul", + [VKD3DSIH_IMUL_LOW ] = "imul_low", [VKD3DSIH_INE ] = "ine", [VKD3DSIH_INEG ] = "ineg", [VKD3DSIH_ISFINITE ] = "isfinite", @@ -7841,6 +7842,7 @@ static bool vsir_src_is_masked(enum vkd3d_shader_opcode opcode, unsigned int src case VKD3DSIH_IMAX: case VKD3DSIH_IMIN: case VKD3DSIH_IMUL: + case VKD3DSIH_IMUL_LOW: case VKD3DSIH_INE: case VKD3DSIH_INEG: case VKD3DSIH_ISFINITE: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index dc8465432..dd4c9743d 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7534,6 +7534,7 @@ static SpvOp spirv_compiler_map_alu_instruction(const struct vkd3d_shader_instru {VKD3DSIH_FREM, SpvOpFRem}, {VKD3DSIH_FTOD, SpvOpFConvert}, {VKD3DSIH_IADD, SpvOpIAdd}, + {VKD3DSIH_IMUL_LOW, SpvOpIMul}, {VKD3DSIH_INEG, SpvOpSNegate}, {VKD3DSIH_ISHL, SpvOpShiftLeftLogical}, {VKD3DSIH_ISHR, SpvOpShiftRightArithmetic}, @@ -10671,6 +10672,7 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, case VKD3DSIH_FREM: case VKD3DSIH_FTOD: case VKD3DSIH_IADD: + case VKD3DSIH_IMUL_LOW: case VKD3DSIH_INEG: case VKD3DSIH_ISHL: case VKD3DSIH_ISHR: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 32cee4c78..6c940f1ed 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -456,6 +456,7 @@ enum vkd3d_shader_opcode VKD3DSIH_IMM_ATOMIC_UMIN, VKD3DSIH_IMM_ATOMIC_XOR, VKD3DSIH_IMUL, + VKD3DSIH_IMUL_LOW, VKD3DSIH_INE, VKD3DSIH_INEG, VKD3DSIH_ISFINITE,