diff options
author | Jason Ekstrand <[email protected]> | 2019-06-25 20:33:46 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-07-10 00:20:59 +0000 |
commit | 3acddc733f1b71c3b02c4f881f3b4326bd06c764 (patch) | |
tree | d78bda02471cd4db3df4dde8befbc6b8472e8704 /src/compiler | |
parent | ce5581e23e54be91e4c1ad6a6c5990eca6677ceb (diff) |
nir: Refactor nir_src_as_* constant functions
Now that we have the nir_const_value_as_* helpers, every one of these
functions is effectively the same except for the suffix they use so we
can easily define them with a repeated macro. This also means that
they're inline and the fact that the nir_src is being passed by-value
should no longer really hurt anything.
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir.c | 92 | ||||
-rw-r--r-- | src/compiler/nir/nir.h | 37 |
2 files changed, 28 insertions, 101 deletions
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index e0fcc17526c..c7413aa64b0 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -1239,98 +1239,6 @@ nir_const_value_as_float(nir_const_value value, unsigned bit_size) } } -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) { - /* int1_t uses 0/-1 convention */ - case 1: return -(int)load->value[comp].b; - case 8: return load->value[comp].i8; - case 16: return load->value[comp].i16; - case 32: return load->value[comp].i32; - case 64: return load->value[comp].i64; - 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 1: return load->value[comp].b; - case 8: return load->value[comp].u8; - case 16: return load->value[comp].u16; - case 32: return load->value[comp].u32; - case 64: return load->value[comp].u64; - default: - unreachable("Invalid bit size"); - } -} - -bool -nir_src_comp_as_bool(nir_src src, unsigned comp) -{ - int64_t i = nir_src_comp_as_int(src, comp); - - /* Booleans of any size use 0/-1 convention */ - assert(i == 0 || i == -1); - - return i; -} - -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[comp].u16); - case 32: return load->value[comp].f32; - case 64: return load->value[comp].f64; - 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 5983da2e2fe..7a8d4425e92 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -807,15 +807,6 @@ nir_src_is_const(nir_src src) 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) { @@ -1983,6 +1974,34 @@ NIR_DEFINE_CAST(nir_instr_as_parallel_copy, nir_instr, nir_parallel_copy_instr, instr, type, nir_instr_type_parallel_copy) + +#define NIR_DEFINE_SRC_AS_CONST(type, suffix) \ +static inline type \ +nir_src_comp_as_##suffix(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); \ + return nir_const_value_as_##suffix(load->value[comp], \ + load->def.bit_size); \ +} \ + \ +static inline type \ +nir_src_as_##suffix(nir_src src) \ +{ \ + assert(nir_src_num_components(src) == 1); \ + return nir_src_comp_as_##suffix(src, 0); \ +} + +NIR_DEFINE_SRC_AS_CONST(int64_t, int) +NIR_DEFINE_SRC_AS_CONST(uint64_t, uint) +NIR_DEFINE_SRC_AS_CONST(bool, bool) +NIR_DEFINE_SRC_AS_CONST(double, float) + +#undef NIR_DEFINE_SRC_AS_CONST + + /* * Control flow * |