summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_search.c
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-10-20 12:17:30 -0500
committerJason Ekstrand <[email protected]>2018-10-22 14:24:15 -0500
commit7bae7828aabc93bc575d637794ee4b236af62bc8 (patch)
treeb14387e6c1acc42ed8ca24d26443a7fc7aad290d /src/compiler/nir/nir_search.c
parentbca5c2c68830da8631a301b6c449810c1a8a4c3f (diff)
nir/search: Use nir_src_is_const and friends
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_search.c')
-rw-r--r--src/compiler/nir/nir_search.c70
1 files changed, 13 insertions, 57 deletions
diff --git a/src/compiler/nir/nir_search.c b/src/compiler/nir/nir_search.c
index 21fcbe7aaec..9c5cb547a70 100644
--- a/src/compiler/nir/nir_search.c
+++ b/src/compiler/nir/nir_search.c
@@ -181,33 +181,14 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
case nir_search_value_constant: {
nir_search_constant *const_val = nir_search_value_as_constant(value);
- if (!instr->src[src].src.is_ssa)
+ if (!nir_src_is_const(instr->src[src].src))
return false;
- if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const)
- return false;
-
- nir_load_const_instr *load =
- nir_instr_as_load_const(instr->src[src].src.ssa->parent_instr);
-
switch (const_val->type) {
case nir_type_float:
for (unsigned i = 0; i < num_components; ++i) {
- double val;
- switch (load->def.bit_size) {
- case 16:
- val = _mesa_half_to_float(load->value.u16[new_swizzle[i]]);
- break;
- case 32:
- val = load->value.f32[new_swizzle[i]];
- break;
- case 64:
- val = load->value.f64[new_swizzle[i]];
- break;
- default:
- unreachable("unknown bit size");
- }
-
+ double val = nir_src_comp_as_float(instr->src[src].src,
+ new_swizzle[i]);
if (val != const_val->data.d)
return false;
}
@@ -215,42 +196,17 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
case nir_type_int:
case nir_type_uint:
- case nir_type_bool32:
- switch (load->def.bit_size) {
- case 8:
- for (unsigned i = 0; i < num_components; ++i) {
- if (load->value.u8[new_swizzle[i]] !=
- (uint8_t)const_val->data.u)
- return false;
- }
- return true;
-
- case 16:
- for (unsigned i = 0; i < num_components; ++i) {
- if (load->value.u16[new_swizzle[i]] !=
- (uint16_t)const_val->data.u)
- return false;
- }
- return true;
-
- case 32:
- for (unsigned i = 0; i < num_components; ++i) {
- if (load->value.u32[new_swizzle[i]] !=
- (uint32_t)const_val->data.u)
- return false;
- }
- return true;
-
- case 64:
- for (unsigned i = 0; i < num_components; ++i) {
- if (load->value.u64[new_swizzle[i]] != const_val->data.u)
- return false;
- }
- return true;
-
- default:
- unreachable("unknown bit size");
+ case nir_type_bool32: {
+ unsigned bit_size = nir_src_bit_size(instr->src[src].src);
+ uint64_t mask = bit_size == 64 ? UINT64_MAX : (1ull << bit_size) - 1;
+ for (unsigned i = 0; i < num_components; ++i) {
+ uint64_t val = nir_src_comp_as_uint(instr->src[src].src,
+ new_swizzle[i]);
+ if ((val & mask) != (const_val->data.u & mask))
+ return false;
}
+ return true;
+ }
default:
unreachable("Invalid alu source type");