diff options
author | Jason Ekstrand <[email protected]> | 2018-10-20 08:36:21 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-10-22 14:24:15 -0500 |
commit | bca5c2c68830da8631a301b6c449810c1a8a4c3f (patch) | |
tree | a1432a4a2bf76cb582e1900c9ddb5569fbc3750b /src | |
parent | e0c267c7521acfa7923bf13b2ac769eac6e13230 (diff) |
nir: Add some new helpers for working with const sources
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir.c | 92 | ||||
-rw-r--r-- | src/compiler/nir/nir.h | 16 |
2 files changed, 108 insertions, 0 deletions
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 402fd2c7725..0be40d257f5 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -1198,6 +1198,98 @@ nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state) return nir_foreach_dest(instr, visit_dest_indirect, &dest_state); } +int64_t +nir_src_comp_as_int(nir_src src, unsigned comp) +{ + assert(nir_src_is_const(src)); + nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr); + + assert(comp < load->def.num_components); + switch (load->def.bit_size) { + case 8: return load->value.i8[comp]; + case 16: return load->value.i16[comp]; + case 32: return load->value.i32[comp]; + case 64: return load->value.i64[comp]; + default: + unreachable("Invalid bit size"); + } +} + +uint64_t +nir_src_comp_as_uint(nir_src src, unsigned comp) +{ + assert(nir_src_is_const(src)); + nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr); + + assert(comp < load->def.num_components); + switch (load->def.bit_size) { + case 8: return load->value.u8[comp]; + case 16: return load->value.u16[comp]; + case 32: return load->value.u32[comp]; + case 64: return load->value.u64[comp]; + default: + unreachable("Invalid bit size"); + } +} + +bool +nir_src_comp_as_bool(nir_src src, unsigned comp) +{ + assert(nir_src_is_const(src)); + nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr); + + assert(comp < load->def.num_components); + assert(load->def.bit_size == 32); + assert(load->value.u32[comp] == NIR_TRUE || + load->value.u32[comp] == NIR_FALSE); + + return load->value.u32[comp]; +} + +double +nir_src_comp_as_float(nir_src src, unsigned comp) +{ + assert(nir_src_is_const(src)); + nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr); + + assert(comp < load->def.num_components); + switch (load->def.bit_size) { + case 16: return _mesa_half_to_float(load->value.u16[comp]); + case 32: return load->value.f32[comp]; + case 64: return load->value.f64[comp]; + default: + unreachable("Invalid bit size"); + } +} + +int64_t +nir_src_as_int(nir_src src) +{ + assert(nir_src_num_components(src) == 1); + return nir_src_comp_as_int(src, 0); +} + +uint64_t +nir_src_as_uint(nir_src src) +{ + assert(nir_src_num_components(src) == 1); + return nir_src_comp_as_uint(src, 0); +} + +bool +nir_src_as_bool(nir_src src) +{ + assert(nir_src_num_components(src) == 1); + return nir_src_comp_as_bool(src, 0); +} + +double +nir_src_as_float(nir_src src) +{ + assert(nir_src_num_components(src) == 1); + return nir_src_comp_as_float(src, 0); +} + nir_const_value * nir_src_as_const_value(nir_src src) { diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 5b871812d46..0ba19cbb25d 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -700,6 +700,22 @@ nir_src_num_components(nir_src src) return src.is_ssa ? src.ssa->num_components : src.reg.reg->num_components; } +static inline bool +nir_src_is_const(nir_src src) +{ + return src.is_ssa && + src.ssa->parent_instr->type == nir_instr_type_load_const; +} + +int64_t nir_src_as_int(nir_src src); +uint64_t nir_src_as_uint(nir_src src); +bool nir_src_as_bool(nir_src src); +double nir_src_as_float(nir_src src); +int64_t nir_src_comp_as_int(nir_src src, unsigned component); +uint64_t nir_src_comp_as_uint(nir_src src, unsigned component); +bool nir_src_comp_as_bool(nir_src src, unsigned component); +double nir_src_comp_as_float(nir_src src, unsigned component); + static inline unsigned nir_dest_bit_size(nir_dest dest) { |