Skip to content
Snippets Groups Projects
Commit 0868638a authored by Rhys Perry's avatar Rhys Perry Committed by Marge Bot
Browse files

nir/lower_int64: lower 64-bit amul


Fixes an issue with Renderdoc's shader debugging with ACO.

If nir_opt_algebraic isn't called in-between nir_lower_explicit_io and
nir_lower_int64, we can end up with 64-bit multiplications.

Signed-off-by: default avatarRhys Perry <pendingchaos02@gmail.com>
Reviewed-by: default avatarDaniel Schürmann <daniel@schuermann.dev>
Fixes: 6320e37d ('nir: add amul instruction')
Part-of: <mesa/mesa!5709>
parent 4d44848c
No related branches found
No related tags found
No related merge requests found
...@@ -675,6 +675,7 @@ nir_lower_int64_op_to_options_mask(nir_op opcode) ...@@ -675,6 +675,7 @@ nir_lower_int64_op_to_options_mask(nir_op opcode)
{ {
switch (opcode) { switch (opcode) {
case nir_op_imul: case nir_op_imul:
case nir_op_amul:
return nir_lower_imul64; return nir_lower_imul64;
case nir_op_imul_2x32_64: case nir_op_imul_2x32_64:
case nir_op_umul_2x32_64: case nir_op_umul_2x32_64:
...@@ -759,6 +760,7 @@ lower_int64_alu_instr(nir_builder *b, nir_instr *instr, void *_state) ...@@ -759,6 +760,7 @@ lower_int64_alu_instr(nir_builder *b, nir_instr *instr, void *_state)
switch (alu->op) { switch (alu->op) {
case nir_op_imul: case nir_op_imul:
case nir_op_amul:
return lower_imul64(b, src[0], src[1]); return lower_imul64(b, src[0], src[1]);
case nir_op_imul_2x32_64: case nir_op_imul_2x32_64:
return lower_mul_2x32_64(b, src[0], src[1], true); return lower_mul_2x32_64(b, src[0], src[1], true);
...@@ -864,11 +866,16 @@ lower_int64_alu_instr(nir_builder *b, nir_instr *instr, void *_state) ...@@ -864,11 +866,16 @@ lower_int64_alu_instr(nir_builder *b, nir_instr *instr, void *_state)
} }
} }
typedef struct {
const nir_shader_compiler_options *shader_options;
nir_lower_int64_options options;
} should_lower_cb_data;
static bool static bool
should_lower_int64_alu_instr(const nir_instr *instr, const void *_options) should_lower_int64_alu_instr(const nir_instr *instr, const void *_data)
{ {
const nir_lower_int64_options options = const should_lower_cb_data *cb_data = (const should_lower_cb_data *)_data;
*(const nir_lower_int64_options *)_options; const nir_lower_int64_options options = cb_data->options;
if (instr->type != nir_instr_type_alu) if (instr->type != nir_instr_type_alu)
return false; return false;
...@@ -913,6 +920,13 @@ should_lower_int64_alu_instr(const nir_instr *instr, const void *_options) ...@@ -913,6 +920,13 @@ should_lower_int64_alu_instr(const nir_instr *instr, const void *_options)
if (alu->src[0].src.ssa->bit_size != 64) if (alu->src[0].src.ssa->bit_size != 64)
return false; return false;
break; break;
case nir_op_amul:
assert(alu->dest.dest.is_ssa);
if (cb_data->shader_options->has_imul24)
return false;
if (alu->dest.dest.ssa.bit_size != 64)
return false;
break;
default: default:
assert(alu->dest.dest.is_ssa); assert(alu->dest.dest.is_ssa);
if (alu->dest.dest.ssa.bit_size != 64) if (alu->dest.dest.ssa.bit_size != 64)
...@@ -926,8 +940,12 @@ should_lower_int64_alu_instr(const nir_instr *instr, const void *_options) ...@@ -926,8 +940,12 @@ should_lower_int64_alu_instr(const nir_instr *instr, const void *_options)
bool bool
nir_lower_int64(nir_shader *shader, nir_lower_int64_options options) nir_lower_int64(nir_shader *shader, nir_lower_int64_options options)
{ {
should_lower_cb_data cb_data;
cb_data.shader_options = shader->options;
cb_data.options = options;
return nir_shader_lower_instructions(shader, return nir_shader_lower_instructions(shader,
should_lower_int64_alu_instr, should_lower_int64_alu_instr,
lower_int64_alu_instr, lower_int64_alu_instr,
&options); &cb_data);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment