2 * Copyright © 2013 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
27 * Helper for checking equality when one instruction might be NULL, since you
28 * can't access a's vtable in that case.
31 possibly_null_equals(const ir_instruction
*a
, const ir_instruction
*b
,
32 enum ir_node_type ignore
)
37 return a
->equals(b
, ignore
);
41 * The base equality function: Return not equal for anything we don't know
45 ir_instruction::equals(const ir_instruction
*, enum ir_node_type
) const
51 ir_constant::equals(const ir_instruction
*ir
, enum ir_node_type
) const
53 const ir_constant
*other
= ir
->as_constant();
57 if (type
!= other
->type
)
60 for (unsigned i
= 0; i
< type
->components(); i
++) {
61 if (type
->is_double()) {
62 if (value
.d
[i
] != other
->value
.d
[i
])
65 if (value
.u
[i
] != other
->value
.u
[i
])
74 ir_dereference_variable::equals(const ir_instruction
*ir
,
75 enum ir_node_type
) const
77 const ir_dereference_variable
*other
= ir
->as_dereference_variable();
81 return var
== other
->var
;
85 ir_dereference_array::equals(const ir_instruction
*ir
,
86 enum ir_node_type ignore
) const
88 const ir_dereference_array
*other
= ir
->as_dereference_array();
92 if (type
!= other
->type
)
95 if (!array
->equals(other
->array
, ignore
))
98 if (!array_index
->equals(other
->array_index
, ignore
))
105 ir_swizzle::equals(const ir_instruction
*ir
,
106 enum ir_node_type ignore
) const
108 const ir_swizzle
*other
= ir
->as_swizzle();
112 if (type
!= other
->type
)
115 if (ignore
!= ir_type_swizzle
) {
116 if (mask
.x
!= other
->mask
.x
||
117 mask
.y
!= other
->mask
.y
||
118 mask
.z
!= other
->mask
.z
||
119 mask
.w
!= other
->mask
.w
) {
124 return val
->equals(other
->val
, ignore
);
128 ir_texture::equals(const ir_instruction
*ir
, enum ir_node_type ignore
) const
130 const ir_texture
*other
= ir
->as_texture();
134 if (type
!= other
->type
)
140 if (!possibly_null_equals(coordinate
, other
->coordinate
, ignore
))
143 if (!possibly_null_equals(projector
, other
->projector
, ignore
))
146 if (!possibly_null_equals(shadow_comparator
, other
->shadow_comparator
, ignore
))
149 if (!possibly_null_equals(offset
, other
->offset
, ignore
))
152 if (!sampler
->equals(other
->sampler
, ignore
))
158 case ir_query_levels
:
159 case ir_texture_samples
:
160 case ir_samples_identical
:
163 if (!lod_info
.bias
->equals(other
->lod_info
.bias
, ignore
))
169 if (!lod_info
.lod
->equals(other
->lod_info
.lod
, ignore
))
173 if (!lod_info
.grad
.dPdx
->equals(other
->lod_info
.grad
.dPdx
, ignore
) ||
174 !lod_info
.grad
.dPdy
->equals(other
->lod_info
.grad
.dPdy
, ignore
))
178 if (!lod_info
.sample_index
->equals(other
->lod_info
.sample_index
, ignore
))
182 if (!lod_info
.component
->equals(other
->lod_info
.component
, ignore
))
186 assert(!"Unrecognized texture op");
193 ir_expression::equals(const ir_instruction
*ir
, enum ir_node_type ignore
) const
195 const ir_expression
*other
= ir
->as_expression();
199 if (type
!= other
->type
)
202 if (operation
!= other
->operation
)
205 for (unsigned i
= 0; i
< num_operands
; i
++) {
206 if (!operands
[i
]->equals(other
->operands
[i
], ignore
))