diff options
author | Ian Romanick <[email protected]> | 2016-07-12 17:32:24 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2016-08-30 16:28:00 -0700 |
commit | d75034b3a2194b43201be0d306383f4e03384856 (patch) | |
tree | ef2fe26df035a55435baba81701308b6fa7a1261 | |
parent | 4b0606e0a7c3260e761137246923f453dcf1efe1 (diff) |
glsl: Extract ir_unop_bitfield_reverse implementation to a separate function
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
-rw-r--r-- | src/compiler/glsl/ir_constant_expression.cpp | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/src/compiler/glsl/ir_constant_expression.cpp b/src/compiler/glsl/ir_constant_expression.cpp index 01a7224f470..a70c6600f5a 100644 --- a/src/compiler/glsl/ir_constant_expression.cpp +++ b/src/compiler/glsl/ir_constant_expression.cpp @@ -477,6 +477,23 @@ ir_rvalue::constant_expression_value(struct hash_table *) return NULL; } +static uint32_t +bitfield_reverse(uint32_t v) +{ + /* http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious */ + uint32_t r = v; // r will be reversed bits of v; first get LSB of v + int s = sizeof(v) * CHAR_BIT - 1; // extra shift needed at end + + for (v >>= 1; v; v >>= 1) { + r <<= 1; + r |= v & 1; + s--; + } + r <<= s; // shift when v's highest bits are zero + + return r; +} + ir_constant * ir_expression::constant_expression_value(struct hash_table *variable_context) { @@ -1482,20 +1499,17 @@ ir_expression::constant_expression_value(struct hash_table *variable_context) break; case ir_unop_bitfield_reverse: - /* http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious */ - for (unsigned c = 0; c < components; c++) { - unsigned int v = op[0]->value.u[c]; // input bits to be reversed - unsigned int r = v; // r will be reversed bits of v; first get LSB of v - int s = sizeof(v) * CHAR_BIT - 1; // extra shift needed at end - - for (v >>= 1; v; v >>= 1) { - r <<= 1; - r |= v & 1; - s--; + for (unsigned c = 0; c < op[0]->type->components(); c++) { + switch (this->type->base_type) { + case GLSL_TYPE_UINT: + data.u[c] = bitfield_reverse(op[0]->value.u[c]); + break; + case GLSL_TYPE_INT: + data.i[c] = bitfield_reverse(op[0]->value.i[c]); + break; + default: + assert(0); } - r <<= s; // shift when v's highest bits are zero - - data.u[c] = r; } break; |