mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-23 18:20:30 +01:00
intel/compiler: Tighter src and dest size bounds checking for some opcodes
Enforce the sizes listed in the Skylake PRM:
BFREV:
source types: *D
destination types: *D
CBIT:
source types: UB, UW, UD
destination types: UD
FBH:
source types: D, UD
destination types: UD
FBL:
source types: UD
destination types: UD
LZD:
source types: D, UD
destination types: UD
v2: Update BFREV commit message documentation. Suggested by Ken.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19042>
This commit is contained in:
parent
0cc7bf63b7
commit
08ca862ef8
2 changed files with 19 additions and 9 deletions
|
|
@ -1666,28 +1666,33 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr,
|
|||
break;
|
||||
|
||||
case nir_op_bitfield_reverse:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
bld.BFREV(result, op[0]);
|
||||
break;
|
||||
|
||||
case nir_op_bit_count:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) < 64);
|
||||
bld.CBIT(result, op[0]);
|
||||
break;
|
||||
|
||||
case nir_op_ufind_msb: {
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
emit_find_msb_using_lzd(bld, result, op[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
case nir_op_uclz:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
bld.LZD(retype(result, BRW_REGISTER_TYPE_UD), op[0]);
|
||||
break;
|
||||
|
||||
case nir_op_ifind_msb: {
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
assert(devinfo->ver >= 7);
|
||||
|
||||
bld.FBH(retype(result, BRW_REGISTER_TYPE_UD), op[0]);
|
||||
|
|
@ -1706,7 +1711,8 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr,
|
|||
}
|
||||
|
||||
case nir_op_find_lsb:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
assert(devinfo->ver >= 7);
|
||||
bld.FBL(result, op[0]);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1623,12 +1623,14 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr)
|
|||
break;
|
||||
|
||||
case nir_op_bitfield_reverse:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
emit(BFREV(dst, op[0]));
|
||||
break;
|
||||
|
||||
case nir_op_bit_count:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) < 64);
|
||||
emit(CBIT(dst, op[0]));
|
||||
break;
|
||||
|
||||
|
|
@ -1638,7 +1640,8 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr)
|
|||
break;
|
||||
|
||||
case nir_op_ifind_msb: {
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
assert(devinfo->ver >= 7);
|
||||
|
||||
vec4_builder bld = vec4_builder(this).at_end();
|
||||
|
|
@ -1660,7 +1663,8 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr)
|
|||
}
|
||||
|
||||
case nir_op_find_lsb:
|
||||
assert(nir_dest_bit_size(instr->dest.dest) < 64);
|
||||
assert(nir_dest_bit_size(instr->dest.dest) == 32);
|
||||
assert(nir_src_bit_size(instr->src[0].src) == 32);
|
||||
assert(devinfo->ver >= 7);
|
||||
emit(FBL(dst, op[0]));
|
||||
break;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue