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(ir_instruction
*a
, ir_instruction
*b
, enum ir_node_type ignore
)
36 return a
->equals(b
, ignore
);
40 * The base equality function: Return not equal for anything we don't know
44 ir_instruction::equals(ir_instruction
*ir
, enum ir_node_type
)
50 ir_constant::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
52 const ir_constant
*other
= ir
->as_constant();
56 if (type
!= other
->type
)
59 for (unsigned i
= 0; i
< type
->components(); i
++) {
60 if (value
.u
[i
] != other
->value
.u
[i
])
68 ir_dereference_variable::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
70 const ir_dereference_variable
*other
= ir
->as_dereference_variable();
74 return var
== other
->var
;
78 ir_dereference_array::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
80 const ir_dereference_array
*other
= ir
->as_dereference_array();
84 if (type
!= other
->type
)
87 if (!array
->equals(other
->array
, ignore
))
90 if (!array_index
->equals(other
->array_index
, ignore
))
97 ir_swizzle::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
99 const ir_swizzle
*other
= ir
->as_swizzle();
103 if (type
!= other
->type
)
106 if (ignore
!= ir_type_swizzle
) {
107 if (mask
.x
!= other
->mask
.x
||
108 mask
.y
!= other
->mask
.y
||
109 mask
.z
!= other
->mask
.z
||
110 mask
.w
!= other
->mask
.w
) {
115 return val
->equals(other
->val
, ignore
);
119 ir_texture::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
121 const ir_texture
*other
= ir
->as_texture();
125 if (type
!= other
->type
)
131 if (!possibly_null_equals(coordinate
, other
->coordinate
, ignore
))
134 if (!possibly_null_equals(projector
, other
->projector
, ignore
))
137 if (!possibly_null_equals(shadow_comparitor
, other
->shadow_comparitor
, ignore
))
140 if (!possibly_null_equals(offset
, other
->offset
, ignore
))
143 if (!sampler
->equals(other
->sampler
, ignore
))
149 case ir_query_levels
:
152 if (!lod_info
.bias
->equals(other
->lod_info
.bias
, ignore
))
158 if (!lod_info
.lod
->equals(other
->lod_info
.lod
, ignore
))
162 if (!lod_info
.grad
.dPdx
->equals(other
->lod_info
.grad
.dPdx
, ignore
) ||
163 !lod_info
.grad
.dPdy
->equals(other
->lod_info
.grad
.dPdy
, ignore
))
167 if (!lod_info
.sample_index
->equals(other
->lod_info
.sample_index
, ignore
))
171 if (!lod_info
.component
->equals(other
->lod_info
.component
, ignore
))
175 assert(!"Unrecognized texture op");
182 ir_expression::equals(ir_instruction
*ir
, enum ir_node_type ignore
)
184 const ir_expression
*other
= ir
->as_expression();
188 if (type
!= other
->type
)
191 if (operation
!= other
->operation
)
194 for (unsigned i
= 0; i
< get_num_operands(); i
++) {
195 if (!operands
[i
]->equals(other
->operands
[i
], ignore
))