summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-06-06 10:09:01 -0500
committerJason Ekstrand <[email protected]>2019-06-19 21:05:54 +0000
commit96bb9c9277383ddcd5920d066bdfec4aa009d733 (patch)
tree44fe4f38d4028afc32b0698d7f2d40347225637c /src
parent280e5442e5d98a4967a35a5c1cadf5a1f786af6a (diff)
spirv: Use a single path for OpSpecConstantOp of OpVectorShuffle
Now that nir_const_value is a scalar, there's no reason why we need multiple paths here and it's just extra paths to keep working. While we're here, we also add a vtn_fail_if check that component indices are in-bounds. Reviewed-by: Karol Herbst <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/spirv/spirv_to_nir.c56
1 files changed, 19 insertions, 37 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 559408e3a08..aa3ab303ac4 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -1793,48 +1793,30 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
vtn_assert(bit_size == bit_size0 && bit_size == bit_size1);
(void)bit_size0; (void)bit_size1;
- if (bit_size == 64) {
- uint64_t u64[8];
- if (v0->value_type == vtn_value_type_constant) {
- for (unsigned i = 0; i < len0; i++)
- u64[i] = v0->constant->values[0][i].u64;
- }
- if (v1->value_type == vtn_value_type_constant) {
- for (unsigned i = 0; i < len1; i++)
- u64[len0 + i] = v1->constant->values[0][i].u64;
- }
+ nir_const_value undef = { .u64 = 0xdeadbeefdeadbeef };
+ nir_const_value combined[NIR_MAX_VEC_COMPONENTS * 2];
- for (unsigned i = 0, j = 0; i < count - 6; i++, j++) {
- uint32_t comp = w[i + 6];
- /* If component is not used, set the value to a known constant
- * to detect if it is wrongly used.
- */
- if (comp == (uint32_t)-1)
- val->constant->values[0][j].u64 = 0xdeadbeefdeadbeef;
- else
- val->constant->values[0][j].u64 = u64[comp];
- }
- } else {
- /* This is for both 32-bit and 16-bit values */
- uint32_t u32[8];
- if (v0->value_type == vtn_value_type_constant) {
- for (unsigned i = 0; i < len0; i++)
- u32[i] = v0->constant->values[0][i].u32;
- }
- if (v1->value_type == vtn_value_type_constant) {
- for (unsigned i = 0; i < len1; i++)
- u32[len0 + i] = v1->constant->values[0][i].u32;
- }
+ if (v0->value_type == vtn_value_type_constant) {
+ for (unsigned i = 0; i < len0; i++)
+ combined[i] = v0->constant->values[0][i];
+ }
+ if (v1->value_type == vtn_value_type_constant) {
+ for (unsigned i = 0; i < len1; i++)
+ combined[len0 + i] = v1->constant->values[0][i];
+ }
- for (unsigned i = 0, j = 0; i < count - 6; i++, j++) {
- uint32_t comp = w[i + 6];
+ for (unsigned i = 0, j = 0; i < count - 6; i++, j++) {
+ uint32_t comp = w[i + 6];
+ if (comp == (uint32_t)-1) {
/* If component is not used, set the value to a known constant
* to detect if it is wrongly used.
*/
- if (comp == (uint32_t)-1)
- val->constant->values[0][j].u32 = 0xdeadbeef;
- else
- val->constant->values[0][j].u32 = u32[comp];
+ val->constant->values[0][j] = undef;
+ } else {
+ vtn_fail_if(comp >= len0 + len1,
+ "All Component literals must either be FFFFFFFF "
+ "or in [0, N - 1] (inclusive).");
+ val->constant->values[0][j] = combined[comp];
}
}
break;