aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-06-25 20:33:46 -0500
committerJason Ekstrand <[email protected]>2019-07-10 00:20:59 +0000
commit3acddc733f1b71c3b02c4f881f3b4326bd06c764 (patch)
treed78bda02471cd4db3df4dde8befbc6b8472e8704 /src/compiler
parentce5581e23e54be91e4c1ad6a6c5990eca6677ceb (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.c92
-rw-r--r--src/compiler/nir/nir.h37
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
*