nir/lower_int64: add bitfield_extract lowering
This will be used by RADV for ACO/LLVM. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35187>
This commit is contained in:
@@ -876,6 +876,18 @@ lower_bitfield_reverse64(nir_builder *b, nir_def *x)
|
||||
return nir_pack_64_2x32_split(b, hi_rev, lo_rev);
|
||||
}
|
||||
|
||||
static nir_def *
|
||||
lower_bitfield_extract64(nir_builder *b, nir_def *base, nir_def *offset, nir_def *bits, bool is_signed)
|
||||
{
|
||||
nir_def *tmp0 = nir_isub_imm(b, 64, bits);
|
||||
nir_def *tmp1 = nir_isub(b, tmp0, offset);
|
||||
nir_def *tmp2 = nir_ishl(b, base, tmp1);
|
||||
|
||||
nir_def *res = is_signed ? nir_ishr(b, tmp2, tmp0) : nir_ushr(b, tmp2, tmp0);
|
||||
|
||||
return nir_bcsel(b, nir_ieq_imm(b, bits, 0), nir_imm_int64(b, 0), res);
|
||||
}
|
||||
|
||||
nir_lower_int64_options
|
||||
nir_lower_int64_op_to_options_mask(nir_op opcode)
|
||||
{
|
||||
@@ -958,6 +970,9 @@ nir_lower_int64_op_to_options_mask(nir_op opcode)
|
||||
return nir_lower_bit_count64;
|
||||
case nir_op_bitfield_reverse:
|
||||
return nir_lower_bitfield_reverse64;
|
||||
case nir_op_ibitfield_extract:
|
||||
case nir_op_ubitfield_extract:
|
||||
return nir_lower_bitfield_extract64;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -1064,6 +1079,9 @@ lower_int64_alu_instr(nir_builder *b, nir_alu_instr *alu)
|
||||
return lower_bit_count64(b, src[0]);
|
||||
case nir_op_bitfield_reverse:
|
||||
return lower_bitfield_reverse64(b, src[0]);
|
||||
case nir_op_ibitfield_extract:
|
||||
case nir_op_ubitfield_extract:
|
||||
return lower_bitfield_extract64(b, src[0], src[1], src[2], alu->op == nir_op_ibitfield_extract);
|
||||
case nir_op_i2f64:
|
||||
case nir_op_i2f32:
|
||||
case nir_op_i2f16:
|
||||
|
||||
@@ -45,6 +45,7 @@ typedef enum {
|
||||
nir_lower_uadd_sat64 = (1 << 24),
|
||||
nir_lower_iadd3_64 = (1 << 25),
|
||||
nir_lower_bitfield_reverse64 = (1 << 26),
|
||||
nir_lower_bitfield_extract64 = (1 << 27),
|
||||
} nir_lower_int64_options;
|
||||
|
||||
typedef enum {
|
||||
|
||||
Reference in New Issue
Block a user