1b8e80941Smrg   switch (this->operation) {
2b8e80941Smrg   case ir_unop_bit_not:
3b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
4b8e80941Smrg         switch (op[0]->type->base_type) {
5b8e80941Smrg         case GLSL_TYPE_UINT:
6b8e80941Smrg            data.u[c] = ~ op[0]->value.u[c];
7b8e80941Smrg            break;
8b8e80941Smrg         case GLSL_TYPE_INT:
9b8e80941Smrg            data.i[c] = ~ op[0]->value.i[c];
10b8e80941Smrg            break;
11b8e80941Smrg         case GLSL_TYPE_UINT64:
12b8e80941Smrg            data.u64[c] = ~ op[0]->value.u64[c];
13b8e80941Smrg            break;
14b8e80941Smrg         case GLSL_TYPE_INT64:
15b8e80941Smrg            data.i64[c] = ~ op[0]->value.i64[c];
16b8e80941Smrg            break;
17b8e80941Smrg         default:
18b8e80941Smrg            unreachable("invalid type");
19b8e80941Smrg         }
20b8e80941Smrg      }
21b8e80941Smrg      break;
22b8e80941Smrg
23b8e80941Smrg   case ir_unop_logic_not:
24b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
25b8e80941Smrg         switch (op[0]->type->base_type) {
26b8e80941Smrg         case GLSL_TYPE_BOOL:
27b8e80941Smrg            data.b[c] = !op[0]->value.b[c];
28b8e80941Smrg            break;
29b8e80941Smrg         default:
30b8e80941Smrg            unreachable("invalid type");
31b8e80941Smrg         }
32b8e80941Smrg      }
33b8e80941Smrg      break;
34b8e80941Smrg
35b8e80941Smrg   case ir_unop_neg:
36b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
37b8e80941Smrg         switch (op[0]->type->base_type) {
38b8e80941Smrg         case GLSL_TYPE_UINT:
39b8e80941Smrg            data.u[c] = -((int) op[0]->value.u[c]);
40b8e80941Smrg            break;
41b8e80941Smrg         case GLSL_TYPE_INT:
42b8e80941Smrg            data.i[c] = -op[0]->value.i[c];
43b8e80941Smrg            break;
44b8e80941Smrg         case GLSL_TYPE_FLOAT:
45b8e80941Smrg            data.f[c] = -op[0]->value.f[c];
46b8e80941Smrg            break;
47b8e80941Smrg         case GLSL_TYPE_DOUBLE:
48b8e80941Smrg            data.d[c] = -op[0]->value.d[c];
49b8e80941Smrg            break;
50b8e80941Smrg         case GLSL_TYPE_UINT64:
51b8e80941Smrg            data.u64[c] = -op[0]->value.u64[c];
52b8e80941Smrg            break;
53b8e80941Smrg         case GLSL_TYPE_INT64:
54b8e80941Smrg            data.i64[c] = -op[0]->value.i64[c];
55b8e80941Smrg            break;
56b8e80941Smrg         default:
57b8e80941Smrg            unreachable("invalid type");
58b8e80941Smrg         }
59b8e80941Smrg      }
60b8e80941Smrg      break;
61b8e80941Smrg
62b8e80941Smrg   case ir_unop_abs:
63b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
64b8e80941Smrg         switch (op[0]->type->base_type) {
65b8e80941Smrg         case GLSL_TYPE_INT:
66b8e80941Smrg            data.i[c] = op[0]->value.i[c] < 0 ? -op[0]->value.i[c] : op[0]->value.i[c];
67b8e80941Smrg            break;
68b8e80941Smrg         case GLSL_TYPE_FLOAT:
69b8e80941Smrg            data.f[c] = fabsf(op[0]->value.f[c]);
70b8e80941Smrg            break;
71b8e80941Smrg         case GLSL_TYPE_DOUBLE:
72b8e80941Smrg            data.d[c] = fabs(op[0]->value.d[c]);
73b8e80941Smrg            break;
74b8e80941Smrg         case GLSL_TYPE_INT64:
75b8e80941Smrg            data.i64[c] = op[0]->value.i64[c] < 0 ? -op[0]->value.i64[c] : op[0]->value.i64[c];
76b8e80941Smrg            break;
77b8e80941Smrg         default:
78b8e80941Smrg            unreachable("invalid type");
79b8e80941Smrg         }
80b8e80941Smrg      }
81b8e80941Smrg      break;
82b8e80941Smrg
83b8e80941Smrg   case ir_unop_sign:
84b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
85b8e80941Smrg         switch (op[0]->type->base_type) {
86b8e80941Smrg         case GLSL_TYPE_INT:
87b8e80941Smrg            data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0);
88b8e80941Smrg            break;
89b8e80941Smrg         case GLSL_TYPE_FLOAT:
90b8e80941Smrg            data.f[c] = float((op[0]->value.f[c] > 0.0F) - (op[0]->value.f[c] < 0.0F));
91b8e80941Smrg            break;
92b8e80941Smrg         case GLSL_TYPE_DOUBLE:
93b8e80941Smrg            data.d[c] = double((op[0]->value.d[c] > 0.0) - (op[0]->value.d[c] < 0.0));
94b8e80941Smrg            break;
95b8e80941Smrg         case GLSL_TYPE_INT64:
96b8e80941Smrg            data.i64[c] = (op[0]->value.i64[c] > 0) - (op[0]->value.i64[c] < 0);
97b8e80941Smrg            break;
98b8e80941Smrg         default:
99b8e80941Smrg            unreachable("invalid type");
100b8e80941Smrg         }
101b8e80941Smrg      }
102b8e80941Smrg      break;
103b8e80941Smrg
104b8e80941Smrg   case ir_unop_rcp:
105b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
106b8e80941Smrg         switch (op[0]->type->base_type) {
107b8e80941Smrg         case GLSL_TYPE_FLOAT:
108b8e80941Smrg            data.f[c] = 1.0F / op[0]->value.f[c];
109b8e80941Smrg            break;
110b8e80941Smrg         case GLSL_TYPE_DOUBLE:
111b8e80941Smrg            data.d[c] = 1.0 / op[0]->value.d[c];
112b8e80941Smrg            break;
113b8e80941Smrg         default:
114b8e80941Smrg            unreachable("invalid type");
115b8e80941Smrg         }
116b8e80941Smrg      }
117b8e80941Smrg      break;
118b8e80941Smrg
119b8e80941Smrg   case ir_unop_rsq:
120b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
121b8e80941Smrg         switch (op[0]->type->base_type) {
122b8e80941Smrg         case GLSL_TYPE_FLOAT:
123b8e80941Smrg            data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]);
124b8e80941Smrg            break;
125b8e80941Smrg         case GLSL_TYPE_DOUBLE:
126b8e80941Smrg            data.d[c] = 1.0 / sqrt(op[0]->value.d[c]);
127b8e80941Smrg            break;
128b8e80941Smrg         default:
129b8e80941Smrg            unreachable("invalid type");
130b8e80941Smrg         }
131b8e80941Smrg      }
132b8e80941Smrg      break;
133b8e80941Smrg
134b8e80941Smrg   case ir_unop_sqrt:
135b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
136b8e80941Smrg         switch (op[0]->type->base_type) {
137b8e80941Smrg         case GLSL_TYPE_FLOAT:
138b8e80941Smrg            data.f[c] = sqrtf(op[0]->value.f[c]);
139b8e80941Smrg            break;
140b8e80941Smrg         case GLSL_TYPE_DOUBLE:
141b8e80941Smrg            data.d[c] = sqrt(op[0]->value.d[c]);
142b8e80941Smrg            break;
143b8e80941Smrg         default:
144b8e80941Smrg            unreachable("invalid type");
145b8e80941Smrg         }
146b8e80941Smrg      }
147b8e80941Smrg      break;
148b8e80941Smrg
149b8e80941Smrg   case ir_unop_exp:
150b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
151b8e80941Smrg         switch (op[0]->type->base_type) {
152b8e80941Smrg         case GLSL_TYPE_FLOAT:
153b8e80941Smrg            data.f[c] = expf(op[0]->value.f[c]);
154b8e80941Smrg            break;
155b8e80941Smrg         default:
156b8e80941Smrg            unreachable("invalid type");
157b8e80941Smrg         }
158b8e80941Smrg      }
159b8e80941Smrg      break;
160b8e80941Smrg
161b8e80941Smrg   case ir_unop_log:
162b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
163b8e80941Smrg         switch (op[0]->type->base_type) {
164b8e80941Smrg         case GLSL_TYPE_FLOAT:
165b8e80941Smrg            data.f[c] = logf(op[0]->value.f[c]);
166b8e80941Smrg            break;
167b8e80941Smrg         default:
168b8e80941Smrg            unreachable("invalid type");
169b8e80941Smrg         }
170b8e80941Smrg      }
171b8e80941Smrg      break;
172b8e80941Smrg
173b8e80941Smrg   case ir_unop_exp2:
174b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
175b8e80941Smrg         switch (op[0]->type->base_type) {
176b8e80941Smrg         case GLSL_TYPE_FLOAT:
177b8e80941Smrg            data.f[c] = exp2f(op[0]->value.f[c]);
178b8e80941Smrg            break;
179b8e80941Smrg         default:
180b8e80941Smrg            unreachable("invalid type");
181b8e80941Smrg         }
182b8e80941Smrg      }
183b8e80941Smrg      break;
184b8e80941Smrg
185b8e80941Smrg   case ir_unop_log2:
186b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
187b8e80941Smrg         switch (op[0]->type->base_type) {
188b8e80941Smrg         case GLSL_TYPE_FLOAT:
189b8e80941Smrg            data.f[c] = log2f(op[0]->value.f[c]);
190b8e80941Smrg            break;
191b8e80941Smrg         default:
192b8e80941Smrg            unreachable("invalid type");
193b8e80941Smrg         }
194b8e80941Smrg      }
195b8e80941Smrg      break;
196b8e80941Smrg
197b8e80941Smrg   case ir_unop_f2i:
198b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
199b8e80941Smrg         switch (op[0]->type->base_type) {
200b8e80941Smrg         case GLSL_TYPE_FLOAT:
201b8e80941Smrg            data.i[c] = (int) op[0]->value.f[c];
202b8e80941Smrg            break;
203b8e80941Smrg         default:
204b8e80941Smrg            unreachable("invalid type");
205b8e80941Smrg         }
206b8e80941Smrg      }
207b8e80941Smrg      break;
208b8e80941Smrg
209b8e80941Smrg   case ir_unop_f2u:
210b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
211b8e80941Smrg         switch (op[0]->type->base_type) {
212b8e80941Smrg         case GLSL_TYPE_FLOAT:
213b8e80941Smrg            data.u[c] = (unsigned) op[0]->value.f[c];
214b8e80941Smrg            break;
215b8e80941Smrg         default:
216b8e80941Smrg            unreachable("invalid type");
217b8e80941Smrg         }
218b8e80941Smrg      }
219b8e80941Smrg      break;
220b8e80941Smrg
221b8e80941Smrg   case ir_unop_i2f:
222b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
223b8e80941Smrg         switch (op[0]->type->base_type) {
224b8e80941Smrg         case GLSL_TYPE_INT:
225b8e80941Smrg            data.f[c] = (float) op[0]->value.i[c];
226b8e80941Smrg            break;
227b8e80941Smrg         default:
228b8e80941Smrg            unreachable("invalid type");
229b8e80941Smrg         }
230b8e80941Smrg      }
231b8e80941Smrg      break;
232b8e80941Smrg
233b8e80941Smrg   case ir_unop_f2b:
234b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
235b8e80941Smrg         switch (op[0]->type->base_type) {
236b8e80941Smrg         case GLSL_TYPE_FLOAT:
237b8e80941Smrg            data.b[c] = op[0]->value.f[c] != 0.0F ? true : false;
238b8e80941Smrg            break;
239b8e80941Smrg         default:
240b8e80941Smrg            unreachable("invalid type");
241b8e80941Smrg         }
242b8e80941Smrg      }
243b8e80941Smrg      break;
244b8e80941Smrg
245b8e80941Smrg   case ir_unop_b2f:
246b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
247b8e80941Smrg         switch (op[0]->type->base_type) {
248b8e80941Smrg         case GLSL_TYPE_BOOL:
249b8e80941Smrg            data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F;
250b8e80941Smrg            break;
251b8e80941Smrg         default:
252b8e80941Smrg            unreachable("invalid type");
253b8e80941Smrg         }
254b8e80941Smrg      }
255b8e80941Smrg      break;
256b8e80941Smrg
257b8e80941Smrg   case ir_unop_i2b:
258b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
259b8e80941Smrg         switch (op[0]->type->base_type) {
260b8e80941Smrg         case GLSL_TYPE_UINT:
261b8e80941Smrg            data.b[c] = op[0]->value.u[c] ? true : false;
262b8e80941Smrg            break;
263b8e80941Smrg         case GLSL_TYPE_INT:
264b8e80941Smrg            data.b[c] = op[0]->value.i[c] ? true : false;
265b8e80941Smrg            break;
266b8e80941Smrg         default:
267b8e80941Smrg            unreachable("invalid type");
268b8e80941Smrg         }
269b8e80941Smrg      }
270b8e80941Smrg      break;
271b8e80941Smrg
272b8e80941Smrg   case ir_unop_b2i:
273b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
274b8e80941Smrg         switch (op[0]->type->base_type) {
275b8e80941Smrg         case GLSL_TYPE_BOOL:
276b8e80941Smrg            data.i[c] = op[0]->value.b[c] ? 1 : 0;
277b8e80941Smrg            break;
278b8e80941Smrg         default:
279b8e80941Smrg            unreachable("invalid type");
280b8e80941Smrg         }
281b8e80941Smrg      }
282b8e80941Smrg      break;
283b8e80941Smrg
284b8e80941Smrg   case ir_unop_u2f:
285b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
286b8e80941Smrg         switch (op[0]->type->base_type) {
287b8e80941Smrg         case GLSL_TYPE_UINT:
288b8e80941Smrg            data.f[c] = (float) op[0]->value.u[c];
289b8e80941Smrg            break;
290b8e80941Smrg         default:
291b8e80941Smrg            unreachable("invalid type");
292b8e80941Smrg         }
293b8e80941Smrg      }
294b8e80941Smrg      break;
295b8e80941Smrg
296b8e80941Smrg   case ir_unop_i2u:
297b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
298b8e80941Smrg         switch (op[0]->type->base_type) {
299b8e80941Smrg         case GLSL_TYPE_INT:
300b8e80941Smrg            data.u[c] = op[0]->value.i[c];
301b8e80941Smrg            break;
302b8e80941Smrg         default:
303b8e80941Smrg            unreachable("invalid type");
304b8e80941Smrg         }
305b8e80941Smrg      }
306b8e80941Smrg      break;
307b8e80941Smrg
308b8e80941Smrg   case ir_unop_u2i:
309b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
310b8e80941Smrg         switch (op[0]->type->base_type) {
311b8e80941Smrg         case GLSL_TYPE_UINT:
312b8e80941Smrg            data.i[c] = op[0]->value.u[c];
313b8e80941Smrg            break;
314b8e80941Smrg         default:
315b8e80941Smrg            unreachable("invalid type");
316b8e80941Smrg         }
317b8e80941Smrg      }
318b8e80941Smrg      break;
319b8e80941Smrg
320b8e80941Smrg   case ir_unop_d2f:
321b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
322b8e80941Smrg         switch (op[0]->type->base_type) {
323b8e80941Smrg         case GLSL_TYPE_DOUBLE:
324b8e80941Smrg            data.f[c] = op[0]->value.d[c];
325b8e80941Smrg            break;
326b8e80941Smrg         default:
327b8e80941Smrg            unreachable("invalid type");
328b8e80941Smrg         }
329b8e80941Smrg      }
330b8e80941Smrg      break;
331b8e80941Smrg
332b8e80941Smrg   case ir_unop_f2d:
333b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
334b8e80941Smrg         switch (op[0]->type->base_type) {
335b8e80941Smrg         case GLSL_TYPE_FLOAT:
336b8e80941Smrg            data.d[c] = op[0]->value.f[c];
337b8e80941Smrg            break;
338b8e80941Smrg         default:
339b8e80941Smrg            unreachable("invalid type");
340b8e80941Smrg         }
341b8e80941Smrg      }
342b8e80941Smrg      break;
343b8e80941Smrg
344b8e80941Smrg   case ir_unop_d2i:
345b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
346b8e80941Smrg         switch (op[0]->type->base_type) {
347b8e80941Smrg         case GLSL_TYPE_DOUBLE:
348b8e80941Smrg            data.i[c] = op[0]->value.d[c];
349b8e80941Smrg            break;
350b8e80941Smrg         default:
351b8e80941Smrg            unreachable("invalid type");
352b8e80941Smrg         }
353b8e80941Smrg      }
354b8e80941Smrg      break;
355b8e80941Smrg
356b8e80941Smrg   case ir_unop_i2d:
357b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
358b8e80941Smrg         switch (op[0]->type->base_type) {
359b8e80941Smrg         case GLSL_TYPE_INT:
360b8e80941Smrg            data.d[c] = op[0]->value.i[c];
361b8e80941Smrg            break;
362b8e80941Smrg         default:
363b8e80941Smrg            unreachable("invalid type");
364b8e80941Smrg         }
365b8e80941Smrg      }
366b8e80941Smrg      break;
367b8e80941Smrg
368b8e80941Smrg   case ir_unop_d2u:
369b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
370b8e80941Smrg         switch (op[0]->type->base_type) {
371b8e80941Smrg         case GLSL_TYPE_DOUBLE:
372b8e80941Smrg            data.u[c] = op[0]->value.d[c];
373b8e80941Smrg            break;
374b8e80941Smrg         default:
375b8e80941Smrg            unreachable("invalid type");
376b8e80941Smrg         }
377b8e80941Smrg      }
378b8e80941Smrg      break;
379b8e80941Smrg
380b8e80941Smrg   case ir_unop_u2d:
381b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
382b8e80941Smrg         switch (op[0]->type->base_type) {
383b8e80941Smrg         case GLSL_TYPE_UINT:
384b8e80941Smrg            data.d[c] = op[0]->value.u[c];
385b8e80941Smrg            break;
386b8e80941Smrg         default:
387b8e80941Smrg            unreachable("invalid type");
388b8e80941Smrg         }
389b8e80941Smrg      }
390b8e80941Smrg      break;
391b8e80941Smrg
392b8e80941Smrg   case ir_unop_d2b:
393b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
394b8e80941Smrg         switch (op[0]->type->base_type) {
395b8e80941Smrg         case GLSL_TYPE_DOUBLE:
396b8e80941Smrg            data.b[c] = op[0]->value.d[c] != 0.0;
397b8e80941Smrg            break;
398b8e80941Smrg         default:
399b8e80941Smrg            unreachable("invalid type");
400b8e80941Smrg         }
401b8e80941Smrg      }
402b8e80941Smrg      break;
403b8e80941Smrg
404b8e80941Smrg   case ir_unop_bitcast_i2f:
405b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
406b8e80941Smrg         switch (op[0]->type->base_type) {
407b8e80941Smrg         case GLSL_TYPE_INT:
408b8e80941Smrg            data.f[c] = bitcast_u2f(op[0]->value.i[c]);
409b8e80941Smrg            break;
410b8e80941Smrg         default:
411b8e80941Smrg            unreachable("invalid type");
412b8e80941Smrg         }
413b8e80941Smrg      }
414b8e80941Smrg      break;
415b8e80941Smrg
416b8e80941Smrg   case ir_unop_bitcast_f2i:
417b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
418b8e80941Smrg         switch (op[0]->type->base_type) {
419b8e80941Smrg         case GLSL_TYPE_FLOAT:
420b8e80941Smrg            data.i[c] = bitcast_f2u(op[0]->value.f[c]);
421b8e80941Smrg            break;
422b8e80941Smrg         default:
423b8e80941Smrg            unreachable("invalid type");
424b8e80941Smrg         }
425b8e80941Smrg      }
426b8e80941Smrg      break;
427b8e80941Smrg
428b8e80941Smrg   case ir_unop_bitcast_u2f:
429b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
430b8e80941Smrg         switch (op[0]->type->base_type) {
431b8e80941Smrg         case GLSL_TYPE_UINT:
432b8e80941Smrg            data.f[c] = bitcast_u2f(op[0]->value.u[c]);
433b8e80941Smrg            break;
434b8e80941Smrg         default:
435b8e80941Smrg            unreachable("invalid type");
436b8e80941Smrg         }
437b8e80941Smrg      }
438b8e80941Smrg      break;
439b8e80941Smrg
440b8e80941Smrg   case ir_unop_bitcast_f2u:
441b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
442b8e80941Smrg         switch (op[0]->type->base_type) {
443b8e80941Smrg         case GLSL_TYPE_FLOAT:
444b8e80941Smrg            data.u[c] = bitcast_f2u(op[0]->value.f[c]);
445b8e80941Smrg            break;
446b8e80941Smrg         default:
447b8e80941Smrg            unreachable("invalid type");
448b8e80941Smrg         }
449b8e80941Smrg      }
450b8e80941Smrg      break;
451b8e80941Smrg
452b8e80941Smrg   case ir_unop_bitcast_u642d:
453b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
454b8e80941Smrg         switch (op[0]->type->base_type) {
455b8e80941Smrg         case GLSL_TYPE_UINT64:
456b8e80941Smrg            data.d[c] = bitcast_u642d(op[0]->value.u64[c]);
457b8e80941Smrg            break;
458b8e80941Smrg         default:
459b8e80941Smrg            unreachable("invalid type");
460b8e80941Smrg         }
461b8e80941Smrg      }
462b8e80941Smrg      break;
463b8e80941Smrg
464b8e80941Smrg   case ir_unop_bitcast_i642d:
465b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
466b8e80941Smrg         switch (op[0]->type->base_type) {
467b8e80941Smrg         case GLSL_TYPE_INT64:
468b8e80941Smrg            data.d[c] = bitcast_i642d(op[0]->value.i64[c]);
469b8e80941Smrg            break;
470b8e80941Smrg         default:
471b8e80941Smrg            unreachable("invalid type");
472b8e80941Smrg         }
473b8e80941Smrg      }
474b8e80941Smrg      break;
475b8e80941Smrg
476b8e80941Smrg   case ir_unop_bitcast_d2u64:
477b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
478b8e80941Smrg         switch (op[0]->type->base_type) {
479b8e80941Smrg         case GLSL_TYPE_DOUBLE:
480b8e80941Smrg            data.u64[c] = bitcast_d2u64(op[0]->value.d[c]);
481b8e80941Smrg            break;
482b8e80941Smrg         default:
483b8e80941Smrg            unreachable("invalid type");
484b8e80941Smrg         }
485b8e80941Smrg      }
486b8e80941Smrg      break;
487b8e80941Smrg
488b8e80941Smrg   case ir_unop_bitcast_d2i64:
489b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
490b8e80941Smrg         switch (op[0]->type->base_type) {
491b8e80941Smrg         case GLSL_TYPE_DOUBLE:
492b8e80941Smrg            data.i64[c] = bitcast_d2i64(op[0]->value.d[c]);
493b8e80941Smrg            break;
494b8e80941Smrg         default:
495b8e80941Smrg            unreachable("invalid type");
496b8e80941Smrg         }
497b8e80941Smrg      }
498b8e80941Smrg      break;
499b8e80941Smrg
500b8e80941Smrg   case ir_unop_i642i:
501b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
502b8e80941Smrg         switch (op[0]->type->base_type) {
503b8e80941Smrg         case GLSL_TYPE_INT64:
504b8e80941Smrg            data.i[c] = op[0]->value.i64[c];
505b8e80941Smrg            break;
506b8e80941Smrg         default:
507b8e80941Smrg            unreachable("invalid type");
508b8e80941Smrg         }
509b8e80941Smrg      }
510b8e80941Smrg      break;
511b8e80941Smrg
512b8e80941Smrg   case ir_unop_u642i:
513b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
514b8e80941Smrg         switch (op[0]->type->base_type) {
515b8e80941Smrg         case GLSL_TYPE_UINT64:
516b8e80941Smrg            data.i[c] = op[0]->value.u64[c];
517b8e80941Smrg            break;
518b8e80941Smrg         default:
519b8e80941Smrg            unreachable("invalid type");
520b8e80941Smrg         }
521b8e80941Smrg      }
522b8e80941Smrg      break;
523b8e80941Smrg
524b8e80941Smrg   case ir_unop_i642u:
525b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
526b8e80941Smrg         switch (op[0]->type->base_type) {
527b8e80941Smrg         case GLSL_TYPE_INT64:
528b8e80941Smrg            data.u[c] = op[0]->value.i64[c];
529b8e80941Smrg            break;
530b8e80941Smrg         default:
531b8e80941Smrg            unreachable("invalid type");
532b8e80941Smrg         }
533b8e80941Smrg      }
534b8e80941Smrg      break;
535b8e80941Smrg
536b8e80941Smrg   case ir_unop_u642u:
537b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
538b8e80941Smrg         switch (op[0]->type->base_type) {
539b8e80941Smrg         case GLSL_TYPE_UINT64:
540b8e80941Smrg            data.u[c] = op[0]->value.u64[c];
541b8e80941Smrg            break;
542b8e80941Smrg         default:
543b8e80941Smrg            unreachable("invalid type");
544b8e80941Smrg         }
545b8e80941Smrg      }
546b8e80941Smrg      break;
547b8e80941Smrg
548b8e80941Smrg   case ir_unop_i642b:
549b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
550b8e80941Smrg         switch (op[0]->type->base_type) {
551b8e80941Smrg         case GLSL_TYPE_INT64:
552b8e80941Smrg            data.b[c] = op[0]->value.i64[c] != 0;
553b8e80941Smrg            break;
554b8e80941Smrg         default:
555b8e80941Smrg            unreachable("invalid type");
556b8e80941Smrg         }
557b8e80941Smrg      }
558b8e80941Smrg      break;
559b8e80941Smrg
560b8e80941Smrg   case ir_unop_i642f:
561b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
562b8e80941Smrg         switch (op[0]->type->base_type) {
563b8e80941Smrg         case GLSL_TYPE_INT64:
564b8e80941Smrg            data.f[c] = op[0]->value.i64[c];
565b8e80941Smrg            break;
566b8e80941Smrg         default:
567b8e80941Smrg            unreachable("invalid type");
568b8e80941Smrg         }
569b8e80941Smrg      }
570b8e80941Smrg      break;
571b8e80941Smrg
572b8e80941Smrg   case ir_unop_u642f:
573b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
574b8e80941Smrg         switch (op[0]->type->base_type) {
575b8e80941Smrg         case GLSL_TYPE_UINT64:
576b8e80941Smrg            data.f[c] = op[0]->value.u64[c];
577b8e80941Smrg            break;
578b8e80941Smrg         default:
579b8e80941Smrg            unreachable("invalid type");
580b8e80941Smrg         }
581b8e80941Smrg      }
582b8e80941Smrg      break;
583b8e80941Smrg
584b8e80941Smrg   case ir_unop_i642d:
585b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
586b8e80941Smrg         switch (op[0]->type->base_type) {
587b8e80941Smrg         case GLSL_TYPE_INT64:
588b8e80941Smrg            data.d[c] = op[0]->value.i64[c];
589b8e80941Smrg            break;
590b8e80941Smrg         default:
591b8e80941Smrg            unreachable("invalid type");
592b8e80941Smrg         }
593b8e80941Smrg      }
594b8e80941Smrg      break;
595b8e80941Smrg
596b8e80941Smrg   case ir_unop_u642d:
597b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
598b8e80941Smrg         switch (op[0]->type->base_type) {
599b8e80941Smrg         case GLSL_TYPE_UINT64:
600b8e80941Smrg            data.d[c] = op[0]->value.u64[c];
601b8e80941Smrg            break;
602b8e80941Smrg         default:
603b8e80941Smrg            unreachable("invalid type");
604b8e80941Smrg         }
605b8e80941Smrg      }
606b8e80941Smrg      break;
607b8e80941Smrg
608b8e80941Smrg   case ir_unop_i2i64:
609b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
610b8e80941Smrg         switch (op[0]->type->base_type) {
611b8e80941Smrg         case GLSL_TYPE_INT:
612b8e80941Smrg            data.i64[c] = op[0]->value.i[c];
613b8e80941Smrg            break;
614b8e80941Smrg         default:
615b8e80941Smrg            unreachable("invalid type");
616b8e80941Smrg         }
617b8e80941Smrg      }
618b8e80941Smrg      break;
619b8e80941Smrg
620b8e80941Smrg   case ir_unop_u2i64:
621b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
622b8e80941Smrg         switch (op[0]->type->base_type) {
623b8e80941Smrg         case GLSL_TYPE_UINT:
624b8e80941Smrg            data.i64[c] = op[0]->value.u[c];
625b8e80941Smrg            break;
626b8e80941Smrg         default:
627b8e80941Smrg            unreachable("invalid type");
628b8e80941Smrg         }
629b8e80941Smrg      }
630b8e80941Smrg      break;
631b8e80941Smrg
632b8e80941Smrg   case ir_unop_b2i64:
633b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
634b8e80941Smrg         switch (op[0]->type->base_type) {
635b8e80941Smrg         case GLSL_TYPE_BOOL:
636b8e80941Smrg            data.i64[c] = op[0]->value.b[c];
637b8e80941Smrg            break;
638b8e80941Smrg         default:
639b8e80941Smrg            unreachable("invalid type");
640b8e80941Smrg         }
641b8e80941Smrg      }
642b8e80941Smrg      break;
643b8e80941Smrg
644b8e80941Smrg   case ir_unop_f2i64:
645b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
646b8e80941Smrg         switch (op[0]->type->base_type) {
647b8e80941Smrg         case GLSL_TYPE_FLOAT:
648b8e80941Smrg            data.i64[c] = op[0]->value.f[c];
649b8e80941Smrg            break;
650b8e80941Smrg         default:
651b8e80941Smrg            unreachable("invalid type");
652b8e80941Smrg         }
653b8e80941Smrg      }
654b8e80941Smrg      break;
655b8e80941Smrg
656b8e80941Smrg   case ir_unop_d2i64:
657b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
658b8e80941Smrg         switch (op[0]->type->base_type) {
659b8e80941Smrg         case GLSL_TYPE_DOUBLE:
660b8e80941Smrg            data.i64[c] = op[0]->value.d[c];
661b8e80941Smrg            break;
662b8e80941Smrg         default:
663b8e80941Smrg            unreachable("invalid type");
664b8e80941Smrg         }
665b8e80941Smrg      }
666b8e80941Smrg      break;
667b8e80941Smrg
668b8e80941Smrg   case ir_unop_i2u64:
669b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
670b8e80941Smrg         switch (op[0]->type->base_type) {
671b8e80941Smrg         case GLSL_TYPE_INT:
672b8e80941Smrg            data.u64[c] = op[0]->value.i[c];
673b8e80941Smrg            break;
674b8e80941Smrg         default:
675b8e80941Smrg            unreachable("invalid type");
676b8e80941Smrg         }
677b8e80941Smrg      }
678b8e80941Smrg      break;
679b8e80941Smrg
680b8e80941Smrg   case ir_unop_u2u64:
681b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
682b8e80941Smrg         switch (op[0]->type->base_type) {
683b8e80941Smrg         case GLSL_TYPE_UINT:
684b8e80941Smrg            data.u64[c] = op[0]->value.u[c];
685b8e80941Smrg            break;
686b8e80941Smrg         default:
687b8e80941Smrg            unreachable("invalid type");
688b8e80941Smrg         }
689b8e80941Smrg      }
690b8e80941Smrg      break;
691b8e80941Smrg
692b8e80941Smrg   case ir_unop_f2u64:
693b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
694b8e80941Smrg         switch (op[0]->type->base_type) {
695b8e80941Smrg         case GLSL_TYPE_FLOAT:
696b8e80941Smrg            data.u64[c] = op[0]->value.f[c];
697b8e80941Smrg            break;
698b8e80941Smrg         default:
699b8e80941Smrg            unreachable("invalid type");
700b8e80941Smrg         }
701b8e80941Smrg      }
702b8e80941Smrg      break;
703b8e80941Smrg
704b8e80941Smrg   case ir_unop_d2u64:
705b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
706b8e80941Smrg         switch (op[0]->type->base_type) {
707b8e80941Smrg         case GLSL_TYPE_DOUBLE:
708b8e80941Smrg            data.u64[c] = op[0]->value.d[c];
709b8e80941Smrg            break;
710b8e80941Smrg         default:
711b8e80941Smrg            unreachable("invalid type");
712b8e80941Smrg         }
713b8e80941Smrg      }
714b8e80941Smrg      break;
715b8e80941Smrg
716b8e80941Smrg   case ir_unop_u642i64:
717b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
718b8e80941Smrg         switch (op[0]->type->base_type) {
719b8e80941Smrg         case GLSL_TYPE_UINT64:
720b8e80941Smrg            data.i64[c] = op[0]->value.u64[c];
721b8e80941Smrg            break;
722b8e80941Smrg         default:
723b8e80941Smrg            unreachable("invalid type");
724b8e80941Smrg         }
725b8e80941Smrg      }
726b8e80941Smrg      break;
727b8e80941Smrg
728b8e80941Smrg   case ir_unop_i642u64:
729b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
730b8e80941Smrg         switch (op[0]->type->base_type) {
731b8e80941Smrg         case GLSL_TYPE_INT64:
732b8e80941Smrg            data.u64[c] = op[0]->value.i64[c];
733b8e80941Smrg            break;
734b8e80941Smrg         default:
735b8e80941Smrg            unreachable("invalid type");
736b8e80941Smrg         }
737b8e80941Smrg      }
738b8e80941Smrg      break;
739b8e80941Smrg
740b8e80941Smrg   case ir_unop_trunc:
741b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
742b8e80941Smrg         switch (op[0]->type->base_type) {
743b8e80941Smrg         case GLSL_TYPE_FLOAT:
744b8e80941Smrg            data.f[c] = truncf(op[0]->value.f[c]);
745b8e80941Smrg            break;
746b8e80941Smrg         case GLSL_TYPE_DOUBLE:
747b8e80941Smrg            data.d[c] = trunc(op[0]->value.d[c]);
748b8e80941Smrg            break;
749b8e80941Smrg         default:
750b8e80941Smrg            unreachable("invalid type");
751b8e80941Smrg         }
752b8e80941Smrg      }
753b8e80941Smrg      break;
754b8e80941Smrg
755b8e80941Smrg   case ir_unop_ceil:
756b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
757b8e80941Smrg         switch (op[0]->type->base_type) {
758b8e80941Smrg         case GLSL_TYPE_FLOAT:
759b8e80941Smrg            data.f[c] = ceilf(op[0]->value.f[c]);
760b8e80941Smrg            break;
761b8e80941Smrg         case GLSL_TYPE_DOUBLE:
762b8e80941Smrg            data.d[c] = ceil(op[0]->value.d[c]);
763b8e80941Smrg            break;
764b8e80941Smrg         default:
765b8e80941Smrg            unreachable("invalid type");
766b8e80941Smrg         }
767b8e80941Smrg      }
768b8e80941Smrg      break;
769b8e80941Smrg
770b8e80941Smrg   case ir_unop_floor:
771b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
772b8e80941Smrg         switch (op[0]->type->base_type) {
773b8e80941Smrg         case GLSL_TYPE_FLOAT:
774b8e80941Smrg            data.f[c] = floorf(op[0]->value.f[c]);
775b8e80941Smrg            break;
776b8e80941Smrg         case GLSL_TYPE_DOUBLE:
777b8e80941Smrg            data.d[c] = floor(op[0]->value.d[c]);
778b8e80941Smrg            break;
779b8e80941Smrg         default:
780b8e80941Smrg            unreachable("invalid type");
781b8e80941Smrg         }
782b8e80941Smrg      }
783b8e80941Smrg      break;
784b8e80941Smrg
785b8e80941Smrg   case ir_unop_fract:
786b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
787b8e80941Smrg         switch (op[0]->type->base_type) {
788b8e80941Smrg         case GLSL_TYPE_FLOAT:
789b8e80941Smrg            data.f[c] = op[0]->value.f[c] - floorf(op[0]->value.f[c]);
790b8e80941Smrg            break;
791b8e80941Smrg         case GLSL_TYPE_DOUBLE:
792b8e80941Smrg            data.d[c] = op[0]->value.d[c] - floor(op[0]->value.d[c]);
793b8e80941Smrg            break;
794b8e80941Smrg         default:
795b8e80941Smrg            unreachable("invalid type");
796b8e80941Smrg         }
797b8e80941Smrg      }
798b8e80941Smrg      break;
799b8e80941Smrg
800b8e80941Smrg   case ir_unop_round_even:
801b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
802b8e80941Smrg         switch (op[0]->type->base_type) {
803b8e80941Smrg         case GLSL_TYPE_FLOAT:
804b8e80941Smrg            data.f[c] = _mesa_roundevenf(op[0]->value.f[c]);
805b8e80941Smrg            break;
806b8e80941Smrg         case GLSL_TYPE_DOUBLE:
807b8e80941Smrg            data.d[c] = _mesa_roundeven(op[0]->value.d[c]);
808b8e80941Smrg            break;
809b8e80941Smrg         default:
810b8e80941Smrg            unreachable("invalid type");
811b8e80941Smrg         }
812b8e80941Smrg      }
813b8e80941Smrg      break;
814b8e80941Smrg
815b8e80941Smrg   case ir_unop_sin:
816b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
817b8e80941Smrg         switch (op[0]->type->base_type) {
818b8e80941Smrg         case GLSL_TYPE_FLOAT:
819b8e80941Smrg            data.f[c] = sinf(op[0]->value.f[c]);
820b8e80941Smrg            break;
821b8e80941Smrg         default:
822b8e80941Smrg            unreachable("invalid type");
823b8e80941Smrg         }
824b8e80941Smrg      }
825b8e80941Smrg      break;
826b8e80941Smrg
827b8e80941Smrg   case ir_unop_cos:
828b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
829b8e80941Smrg         switch (op[0]->type->base_type) {
830b8e80941Smrg         case GLSL_TYPE_FLOAT:
831b8e80941Smrg            data.f[c] = cosf(op[0]->value.f[c]);
832b8e80941Smrg            break;
833b8e80941Smrg         default:
834b8e80941Smrg            unreachable("invalid type");
835b8e80941Smrg         }
836b8e80941Smrg      }
837b8e80941Smrg      break;
838b8e80941Smrg
839b8e80941Smrg   case ir_unop_dFdx:
840b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
841b8e80941Smrg         switch (op[0]->type->base_type) {
842b8e80941Smrg         case GLSL_TYPE_FLOAT:
843b8e80941Smrg            data.f[c] = 0.0f;
844b8e80941Smrg            break;
845b8e80941Smrg         default:
846b8e80941Smrg            unreachable("invalid type");
847b8e80941Smrg         }
848b8e80941Smrg      }
849b8e80941Smrg      break;
850b8e80941Smrg
851b8e80941Smrg   case ir_unop_dFdx_coarse:
852b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
853b8e80941Smrg         switch (op[0]->type->base_type) {
854b8e80941Smrg         case GLSL_TYPE_FLOAT:
855b8e80941Smrg            data.f[c] = 0.0f;
856b8e80941Smrg            break;
857b8e80941Smrg         default:
858b8e80941Smrg            unreachable("invalid type");
859b8e80941Smrg         }
860b8e80941Smrg      }
861b8e80941Smrg      break;
862b8e80941Smrg
863b8e80941Smrg   case ir_unop_dFdx_fine:
864b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
865b8e80941Smrg         switch (op[0]->type->base_type) {
866b8e80941Smrg         case GLSL_TYPE_FLOAT:
867b8e80941Smrg            data.f[c] = 0.0f;
868b8e80941Smrg            break;
869b8e80941Smrg         default:
870b8e80941Smrg            unreachable("invalid type");
871b8e80941Smrg         }
872b8e80941Smrg      }
873b8e80941Smrg      break;
874b8e80941Smrg
875b8e80941Smrg   case ir_unop_dFdy:
876b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
877b8e80941Smrg         switch (op[0]->type->base_type) {
878b8e80941Smrg         case GLSL_TYPE_FLOAT:
879b8e80941Smrg            data.f[c] = 0.0f;
880b8e80941Smrg            break;
881b8e80941Smrg         default:
882b8e80941Smrg            unreachable("invalid type");
883b8e80941Smrg         }
884b8e80941Smrg      }
885b8e80941Smrg      break;
886b8e80941Smrg
887b8e80941Smrg   case ir_unop_dFdy_coarse:
888b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
889b8e80941Smrg         switch (op[0]->type->base_type) {
890b8e80941Smrg         case GLSL_TYPE_FLOAT:
891b8e80941Smrg            data.f[c] = 0.0f;
892b8e80941Smrg            break;
893b8e80941Smrg         default:
894b8e80941Smrg            unreachable("invalid type");
895b8e80941Smrg         }
896b8e80941Smrg      }
897b8e80941Smrg      break;
898b8e80941Smrg
899b8e80941Smrg   case ir_unop_dFdy_fine:
900b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
901b8e80941Smrg         switch (op[0]->type->base_type) {
902b8e80941Smrg         case GLSL_TYPE_FLOAT:
903b8e80941Smrg            data.f[c] = 0.0f;
904b8e80941Smrg            break;
905b8e80941Smrg         default:
906b8e80941Smrg            unreachable("invalid type");
907b8e80941Smrg         }
908b8e80941Smrg      }
909b8e80941Smrg      break;
910b8e80941Smrg
911b8e80941Smrg   case ir_unop_pack_snorm_2x16:
912b8e80941Smrg      switch (op[0]->type->base_type) {
913b8e80941Smrg      case GLSL_TYPE_FLOAT:
914b8e80941Smrg         data.u[0] = pack_2x16(pack_snorm_1x16, op[0]->value.f[0], op[0]->value.f[1]);
915b8e80941Smrg         break;
916b8e80941Smrg      default:
917b8e80941Smrg         unreachable("invalid type");
918b8e80941Smrg      }
919b8e80941Smrg      break;
920b8e80941Smrg
921b8e80941Smrg   case ir_unop_pack_snorm_4x8:
922b8e80941Smrg      switch (op[0]->type->base_type) {
923b8e80941Smrg      case GLSL_TYPE_FLOAT:
924b8e80941Smrg         data.u[0] = pack_4x8(pack_snorm_1x8, op[0]->value.f[0], op[0]->value.f[1], op[0]->value.f[2], op[0]->value.f[3]);
925b8e80941Smrg         break;
926b8e80941Smrg      default:
927b8e80941Smrg         unreachable("invalid type");
928b8e80941Smrg      }
929b8e80941Smrg      break;
930b8e80941Smrg
931b8e80941Smrg   case ir_unop_pack_unorm_2x16:
932b8e80941Smrg      switch (op[0]->type->base_type) {
933b8e80941Smrg      case GLSL_TYPE_FLOAT:
934b8e80941Smrg         data.u[0] = pack_2x16(pack_unorm_1x16, op[0]->value.f[0], op[0]->value.f[1]);
935b8e80941Smrg         break;
936b8e80941Smrg      default:
937b8e80941Smrg         unreachable("invalid type");
938b8e80941Smrg      }
939b8e80941Smrg      break;
940b8e80941Smrg
941b8e80941Smrg   case ir_unop_pack_unorm_4x8:
942b8e80941Smrg      switch (op[0]->type->base_type) {
943b8e80941Smrg      case GLSL_TYPE_FLOAT:
944b8e80941Smrg         data.u[0] = pack_4x8(pack_unorm_1x8, op[0]->value.f[0], op[0]->value.f[1], op[0]->value.f[2], op[0]->value.f[3]);
945b8e80941Smrg         break;
946b8e80941Smrg      default:
947b8e80941Smrg         unreachable("invalid type");
948b8e80941Smrg      }
949b8e80941Smrg      break;
950b8e80941Smrg
951b8e80941Smrg   case ir_unop_pack_half_2x16:
952b8e80941Smrg      switch (op[0]->type->base_type) {
953b8e80941Smrg      case GLSL_TYPE_FLOAT:
954b8e80941Smrg         data.u[0] = pack_2x16(pack_half_1x16, op[0]->value.f[0], op[0]->value.f[1]);
955b8e80941Smrg         break;
956b8e80941Smrg      default:
957b8e80941Smrg         unreachable("invalid type");
958b8e80941Smrg      }
959b8e80941Smrg      break;
960b8e80941Smrg
961b8e80941Smrg   case ir_unop_unpack_snorm_2x16:
962b8e80941Smrg      unpack_2x16(unpack_snorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
963b8e80941Smrg      break;
964b8e80941Smrg
965b8e80941Smrg   case ir_unop_unpack_snorm_4x8:
966b8e80941Smrg      unpack_4x8(unpack_snorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]);
967b8e80941Smrg      break;
968b8e80941Smrg
969b8e80941Smrg   case ir_unop_unpack_unorm_2x16:
970b8e80941Smrg      unpack_2x16(unpack_unorm_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
971b8e80941Smrg      break;
972b8e80941Smrg
973b8e80941Smrg   case ir_unop_unpack_unorm_4x8:
974b8e80941Smrg      unpack_4x8(unpack_unorm_1x8, op[0]->value.u[0], &data.f[0], &data.f[1], &data.f[2], &data.f[3]);
975b8e80941Smrg      break;
976b8e80941Smrg
977b8e80941Smrg   case ir_unop_unpack_half_2x16:
978b8e80941Smrg      unpack_2x16(unpack_half_1x16, op[0]->value.u[0], &data.f[0], &data.f[1]);
979b8e80941Smrg      break;
980b8e80941Smrg
981b8e80941Smrg   case ir_unop_bitfield_reverse:
982b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
983b8e80941Smrg         switch (op[0]->type->base_type) {
984b8e80941Smrg         case GLSL_TYPE_UINT:
985b8e80941Smrg            data.u[c] = bitfield_reverse(op[0]->value.u[c]);
986b8e80941Smrg            break;
987b8e80941Smrg         case GLSL_TYPE_INT:
988b8e80941Smrg            data.i[c] = bitfield_reverse(op[0]->value.i[c]);
989b8e80941Smrg            break;
990b8e80941Smrg         default:
991b8e80941Smrg            unreachable("invalid type");
992b8e80941Smrg         }
993b8e80941Smrg      }
994b8e80941Smrg      break;
995b8e80941Smrg
996b8e80941Smrg   case ir_unop_bit_count:
997b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
998b8e80941Smrg         switch (op[0]->type->base_type) {
999b8e80941Smrg         case GLSL_TYPE_UINT:
1000b8e80941Smrg            data.i[c] = util_bitcount(op[0]->value.u[c]);
1001b8e80941Smrg            break;
1002b8e80941Smrg         case GLSL_TYPE_INT:
1003b8e80941Smrg            data.i[c] = util_bitcount(op[0]->value.i[c]);
1004b8e80941Smrg            break;
1005b8e80941Smrg         default:
1006b8e80941Smrg            unreachable("invalid type");
1007b8e80941Smrg         }
1008b8e80941Smrg      }
1009b8e80941Smrg      break;
1010b8e80941Smrg
1011b8e80941Smrg   case ir_unop_find_msb:
1012b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1013b8e80941Smrg         switch (op[0]->type->base_type) {
1014b8e80941Smrg         case GLSL_TYPE_UINT:
1015b8e80941Smrg            data.i[c] = find_msb_uint(op[0]->value.u[c]);
1016b8e80941Smrg            break;
1017b8e80941Smrg         case GLSL_TYPE_INT:
1018b8e80941Smrg            data.i[c] = find_msb_int(op[0]->value.i[c]);
1019b8e80941Smrg            break;
1020b8e80941Smrg         default:
1021b8e80941Smrg            unreachable("invalid type");
1022b8e80941Smrg         }
1023b8e80941Smrg      }
1024b8e80941Smrg      break;
1025b8e80941Smrg
1026b8e80941Smrg   case ir_unop_find_lsb:
1027b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1028b8e80941Smrg         switch (op[0]->type->base_type) {
1029b8e80941Smrg         case GLSL_TYPE_UINT:
1030b8e80941Smrg            data.i[c] = find_msb_uint(op[0]->value.u[c] & -op[0]->value.u[c]);
1031b8e80941Smrg            break;
1032b8e80941Smrg         case GLSL_TYPE_INT:
1033b8e80941Smrg            data.i[c] = find_msb_uint(op[0]->value.i[c] & -op[0]->value.i[c]);
1034b8e80941Smrg            break;
1035b8e80941Smrg         default:
1036b8e80941Smrg            unreachable("invalid type");
1037b8e80941Smrg         }
1038b8e80941Smrg      }
1039b8e80941Smrg      break;
1040b8e80941Smrg
1041b8e80941Smrg   case ir_unop_saturate:
1042b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1043b8e80941Smrg         switch (op[0]->type->base_type) {
1044b8e80941Smrg         case GLSL_TYPE_FLOAT:
1045b8e80941Smrg            data.f[c] = CLAMP(op[0]->value.f[c], 0.0f, 1.0f);
1046b8e80941Smrg            break;
1047b8e80941Smrg         default:
1048b8e80941Smrg            unreachable("invalid type");
1049b8e80941Smrg         }
1050b8e80941Smrg      }
1051b8e80941Smrg      break;
1052b8e80941Smrg
1053b8e80941Smrg   case ir_unop_pack_double_2x32:
1054b8e80941Smrg      memcpy(&data.d[0], &op[0]->value.u[0], sizeof(double));
1055b8e80941Smrg      break;
1056b8e80941Smrg
1057b8e80941Smrg   case ir_unop_unpack_double_2x32:
1058b8e80941Smrg      memcpy(&data.u[0], &op[0]->value.d[0], sizeof(double));
1059b8e80941Smrg      break;
1060b8e80941Smrg
1061b8e80941Smrg   case ir_unop_pack_sampler_2x32:
1062b8e80941Smrg      memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t));
1063b8e80941Smrg      break;
1064b8e80941Smrg
1065b8e80941Smrg   case ir_unop_pack_image_2x32:
1066b8e80941Smrg      memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t));
1067b8e80941Smrg      break;
1068b8e80941Smrg
1069b8e80941Smrg   case ir_unop_unpack_sampler_2x32:
1070b8e80941Smrg      memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t));
1071b8e80941Smrg      break;
1072b8e80941Smrg
1073b8e80941Smrg   case ir_unop_unpack_image_2x32:
1074b8e80941Smrg      memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t));
1075b8e80941Smrg      break;
1076b8e80941Smrg
1077b8e80941Smrg   case ir_unop_pack_int_2x32:
1078b8e80941Smrg      memcpy(&data.i64[0], &op[0]->value.i[0], sizeof(int64_t));
1079b8e80941Smrg      break;
1080b8e80941Smrg
1081b8e80941Smrg   case ir_unop_pack_uint_2x32:
1082b8e80941Smrg      memcpy(&data.u64[0], &op[0]->value.u[0], sizeof(uint64_t));
1083b8e80941Smrg      break;
1084b8e80941Smrg
1085b8e80941Smrg   case ir_unop_unpack_int_2x32:
1086b8e80941Smrg      memcpy(&data.i[0], &op[0]->value.i64[0], sizeof(int64_t));
1087b8e80941Smrg      break;
1088b8e80941Smrg
1089b8e80941Smrg   case ir_unop_unpack_uint_2x32:
1090b8e80941Smrg      memcpy(&data.u[0], &op[0]->value.u64[0], sizeof(uint64_t));
1091b8e80941Smrg      break;
1092b8e80941Smrg
1093b8e80941Smrg   case ir_binop_add:
1094b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1095b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1096b8e80941Smrg           c < components;
1097b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1098b8e80941Smrg
1099b8e80941Smrg         switch (op[0]->type->base_type) {
1100b8e80941Smrg         case GLSL_TYPE_UINT:
1101b8e80941Smrg            data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1];
1102b8e80941Smrg            break;
1103b8e80941Smrg         case GLSL_TYPE_INT:
1104b8e80941Smrg            data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1];
1105b8e80941Smrg            break;
1106b8e80941Smrg         case GLSL_TYPE_FLOAT:
1107b8e80941Smrg            data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1];
1108b8e80941Smrg            break;
1109b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1110b8e80941Smrg            data.d[c] = op[0]->value.d[c0] + op[1]->value.d[c1];
1111b8e80941Smrg            break;
1112b8e80941Smrg         case GLSL_TYPE_UINT64:
1113b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] + op[1]->value.u64[c1];
1114b8e80941Smrg            break;
1115b8e80941Smrg         case GLSL_TYPE_INT64:
1116b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] + op[1]->value.i64[c1];
1117b8e80941Smrg            break;
1118b8e80941Smrg         default:
1119b8e80941Smrg            unreachable("invalid type");
1120b8e80941Smrg         }
1121b8e80941Smrg      }
1122b8e80941Smrg      break;
1123b8e80941Smrg
1124b8e80941Smrg   case ir_binop_sub:
1125b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1126b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1127b8e80941Smrg           c < components;
1128b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1129b8e80941Smrg
1130b8e80941Smrg         switch (op[0]->type->base_type) {
1131b8e80941Smrg         case GLSL_TYPE_UINT:
1132b8e80941Smrg            data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1];
1133b8e80941Smrg            break;
1134b8e80941Smrg         case GLSL_TYPE_INT:
1135b8e80941Smrg            data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1];
1136b8e80941Smrg            break;
1137b8e80941Smrg         case GLSL_TYPE_FLOAT:
1138b8e80941Smrg            data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1];
1139b8e80941Smrg            break;
1140b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1141b8e80941Smrg            data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1];
1142b8e80941Smrg            break;
1143b8e80941Smrg         case GLSL_TYPE_UINT64:
1144b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] - op[1]->value.u64[c1];
1145b8e80941Smrg            break;
1146b8e80941Smrg         case GLSL_TYPE_INT64:
1147b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] - op[1]->value.i64[c1];
1148b8e80941Smrg            break;
1149b8e80941Smrg         default:
1150b8e80941Smrg            unreachable("invalid type");
1151b8e80941Smrg         }
1152b8e80941Smrg      }
1153b8e80941Smrg      break;
1154b8e80941Smrg
1155b8e80941Smrg   case ir_binop_mul:
1156b8e80941Smrg      /* Check for equal types, or unequal types involving scalars */
1157b8e80941Smrg      if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix())
1158b8e80941Smrg          || op0_scalar || op1_scalar) {
1159b8e80941Smrg         for (unsigned c = 0, c0 = 0, c1 = 0;
1160b8e80941Smrg              c < components;
1161b8e80941Smrg              c0 += c0_inc, c1 += c1_inc, c++) {
1162b8e80941Smrg
1163b8e80941Smrg            switch (op[0]->type->base_type) {
1164b8e80941Smrg            case GLSL_TYPE_UINT:
1165b8e80941Smrg               data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1];
1166b8e80941Smrg               break;
1167b8e80941Smrg            case GLSL_TYPE_INT:
1168b8e80941Smrg               data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1];
1169b8e80941Smrg               break;
1170b8e80941Smrg            case GLSL_TYPE_FLOAT:
1171b8e80941Smrg               data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1];
1172b8e80941Smrg               break;
1173b8e80941Smrg            case GLSL_TYPE_DOUBLE:
1174b8e80941Smrg               data.d[c] = op[0]->value.d[c0] * op[1]->value.d[c1];
1175b8e80941Smrg               break;
1176b8e80941Smrg            case GLSL_TYPE_UINT64:
1177b8e80941Smrg               data.u64[c] = op[0]->value.u64[c0] * op[1]->value.u64[c1];
1178b8e80941Smrg               break;
1179b8e80941Smrg            case GLSL_TYPE_INT64:
1180b8e80941Smrg               data.i64[c] = op[0]->value.i64[c0] * op[1]->value.i64[c1];
1181b8e80941Smrg               break;
1182b8e80941Smrg            default:
1183b8e80941Smrg               unreachable("invalid type");
1184b8e80941Smrg            }
1185b8e80941Smrg         }
1186b8e80941Smrg      } else {
1187b8e80941Smrg         assert(op[0]->type->is_matrix() || op[1]->type->is_matrix());
1188b8e80941Smrg
1189b8e80941Smrg         /* Multiply an N-by-M matrix with an M-by-P matrix.  Since either
1190b8e80941Smrg          * matrix can be a GLSL vector, either N or P can be 1.
1191b8e80941Smrg          *
1192b8e80941Smrg          * For vec*mat, the vector is treated as a row vector.  This
1193b8e80941Smrg          * means the vector is a 1-row x M-column matrix.
1194b8e80941Smrg          *
1195b8e80941Smrg          * For mat*vec, the vector is treated as a column vector.  Since
1196b8e80941Smrg          * matrix_columns is 1 for vectors, this just works.
1197b8e80941Smrg          */
1198b8e80941Smrg         const unsigned n = op[0]->type->is_vector()
1199b8e80941Smrg            ? 1 : op[0]->type->vector_elements;
1200b8e80941Smrg         const unsigned m = op[1]->type->vector_elements;
1201b8e80941Smrg         const unsigned p = op[1]->type->matrix_columns;
1202b8e80941Smrg         for (unsigned j = 0; j < p; j++) {
1203b8e80941Smrg            for (unsigned i = 0; i < n; i++) {
1204b8e80941Smrg               for (unsigned k = 0; k < m; k++) {
1205b8e80941Smrg                  if (op[0]->type->is_double())
1206b8e80941Smrg                     data.d[i+n*j] += op[0]->value.d[i+n*k]*op[1]->value.d[k+m*j];
1207b8e80941Smrg                  else
1208b8e80941Smrg                     data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j];
1209b8e80941Smrg               }
1210b8e80941Smrg            }
1211b8e80941Smrg         }
1212b8e80941Smrg      }
1213b8e80941Smrg      break;
1214b8e80941Smrg
1215b8e80941Smrg   case ir_binop_div:
1216b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1217b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1218b8e80941Smrg           c < components;
1219b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1220b8e80941Smrg
1221b8e80941Smrg         switch (op[0]->type->base_type) {
1222b8e80941Smrg         case GLSL_TYPE_UINT:
1223b8e80941Smrg            data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] / op[1]->value.u[c1];
1224b8e80941Smrg            break;
1225b8e80941Smrg         case GLSL_TYPE_INT:
1226b8e80941Smrg            data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] / op[1]->value.i[c1];
1227b8e80941Smrg            break;
1228b8e80941Smrg         case GLSL_TYPE_FLOAT:
1229b8e80941Smrg            data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1];
1230b8e80941Smrg            break;
1231b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1232b8e80941Smrg            data.d[c] = op[0]->value.d[c0] / op[1]->value.d[c1];
1233b8e80941Smrg            break;
1234b8e80941Smrg         case GLSL_TYPE_UINT64:
1235b8e80941Smrg            data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] / op[1]->value.u64[c1];
1236b8e80941Smrg            break;
1237b8e80941Smrg         case GLSL_TYPE_INT64:
1238b8e80941Smrg            data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] / op[1]->value.i64[c1];
1239b8e80941Smrg            break;
1240b8e80941Smrg         default:
1241b8e80941Smrg            unreachable("invalid type");
1242b8e80941Smrg         }
1243b8e80941Smrg      }
1244b8e80941Smrg      break;
1245b8e80941Smrg
1246b8e80941Smrg   case ir_binop_mod:
1247b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1248b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1249b8e80941Smrg           c < components;
1250b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1251b8e80941Smrg
1252b8e80941Smrg         switch (op[0]->type->base_type) {
1253b8e80941Smrg         case GLSL_TYPE_UINT:
1254b8e80941Smrg            data.u[c] = op[1]->value.u[c1] == 0 ? 0 : op[0]->value.u[c0] % op[1]->value.u[c1];
1255b8e80941Smrg            break;
1256b8e80941Smrg         case GLSL_TYPE_INT:
1257b8e80941Smrg            data.i[c] = op[1]->value.i[c1] == 0 ? 0 : op[0]->value.i[c0] % op[1]->value.i[c1];
1258b8e80941Smrg            break;
1259b8e80941Smrg         case GLSL_TYPE_FLOAT:
1260b8e80941Smrg            data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]);
1261b8e80941Smrg            break;
1262b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1263b8e80941Smrg            data.d[c] = op[0]->value.d[c0] - op[1]->value.d[c1] * floor(op[0]->value.d[c0] / op[1]->value.d[c1]);
1264b8e80941Smrg            break;
1265b8e80941Smrg         case GLSL_TYPE_UINT64:
1266b8e80941Smrg            data.u64[c] = op[1]->value.u64[c1] == 0 ? 0 : op[0]->value.u64[c0] % op[1]->value.u64[c1];
1267b8e80941Smrg            break;
1268b8e80941Smrg         case GLSL_TYPE_INT64:
1269b8e80941Smrg            data.i64[c] = op[1]->value.i64[c1] == 0 ? 0 : op[0]->value.i64[c0] % op[1]->value.i64[c1];
1270b8e80941Smrg            break;
1271b8e80941Smrg         default:
1272b8e80941Smrg            unreachable("invalid type");
1273b8e80941Smrg         }
1274b8e80941Smrg      }
1275b8e80941Smrg      break;
1276b8e80941Smrg
1277b8e80941Smrg   case ir_binop_less:
1278b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1279b8e80941Smrg         switch (op[0]->type->base_type) {
1280b8e80941Smrg         case GLSL_TYPE_UINT:
1281b8e80941Smrg            data.b[c] = op[0]->value.u[c] < op[1]->value.u[c];
1282b8e80941Smrg            break;
1283b8e80941Smrg         case GLSL_TYPE_INT:
1284b8e80941Smrg            data.b[c] = op[0]->value.i[c] < op[1]->value.i[c];
1285b8e80941Smrg            break;
1286b8e80941Smrg         case GLSL_TYPE_FLOAT:
1287b8e80941Smrg            data.b[c] = op[0]->value.f[c] < op[1]->value.f[c];
1288b8e80941Smrg            break;
1289b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1290b8e80941Smrg            data.b[c] = op[0]->value.d[c] < op[1]->value.d[c];
1291b8e80941Smrg            break;
1292b8e80941Smrg         case GLSL_TYPE_UINT64:
1293b8e80941Smrg            data.b[c] = op[0]->value.u64[c] < op[1]->value.u64[c];
1294b8e80941Smrg            break;
1295b8e80941Smrg         case GLSL_TYPE_INT64:
1296b8e80941Smrg            data.b[c] = op[0]->value.i64[c] < op[1]->value.i64[c];
1297b8e80941Smrg            break;
1298b8e80941Smrg         default:
1299b8e80941Smrg            unreachable("invalid type");
1300b8e80941Smrg         }
1301b8e80941Smrg      }
1302b8e80941Smrg      break;
1303b8e80941Smrg
1304b8e80941Smrg   case ir_binop_gequal:
1305b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1306b8e80941Smrg         switch (op[0]->type->base_type) {
1307b8e80941Smrg         case GLSL_TYPE_UINT:
1308b8e80941Smrg            data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c];
1309b8e80941Smrg            break;
1310b8e80941Smrg         case GLSL_TYPE_INT:
1311b8e80941Smrg            data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c];
1312b8e80941Smrg            break;
1313b8e80941Smrg         case GLSL_TYPE_FLOAT:
1314b8e80941Smrg            data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c];
1315b8e80941Smrg            break;
1316b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1317b8e80941Smrg            data.b[c] = op[0]->value.d[c] >= op[1]->value.d[c];
1318b8e80941Smrg            break;
1319b8e80941Smrg         case GLSL_TYPE_UINT64:
1320b8e80941Smrg            data.b[c] = op[0]->value.u64[c] >= op[1]->value.u64[c];
1321b8e80941Smrg            break;
1322b8e80941Smrg         case GLSL_TYPE_INT64:
1323b8e80941Smrg            data.b[c] = op[0]->value.i64[c] >= op[1]->value.i64[c];
1324b8e80941Smrg            break;
1325b8e80941Smrg         default:
1326b8e80941Smrg            unreachable("invalid type");
1327b8e80941Smrg         }
1328b8e80941Smrg      }
1329b8e80941Smrg      break;
1330b8e80941Smrg
1331b8e80941Smrg   case ir_binop_equal:
1332b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1333b8e80941Smrg         switch (op[0]->type->base_type) {
1334b8e80941Smrg         case GLSL_TYPE_UINT:
1335b8e80941Smrg            data.b[c] = op[0]->value.u[c] == op[1]->value.u[c];
1336b8e80941Smrg            break;
1337b8e80941Smrg         case GLSL_TYPE_INT:
1338b8e80941Smrg            data.b[c] = op[0]->value.i[c] == op[1]->value.i[c];
1339b8e80941Smrg            break;
1340b8e80941Smrg         case GLSL_TYPE_FLOAT:
1341b8e80941Smrg            data.b[c] = op[0]->value.f[c] == op[1]->value.f[c];
1342b8e80941Smrg            break;
1343b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1344b8e80941Smrg            data.b[c] = op[0]->value.d[c] == op[1]->value.d[c];
1345b8e80941Smrg            break;
1346b8e80941Smrg         case GLSL_TYPE_UINT64:
1347b8e80941Smrg            data.b[c] = op[0]->value.u64[c] == op[1]->value.u64[c];
1348b8e80941Smrg            break;
1349b8e80941Smrg         case GLSL_TYPE_INT64:
1350b8e80941Smrg            data.b[c] = op[0]->value.i64[c] == op[1]->value.i64[c];
1351b8e80941Smrg            break;
1352b8e80941Smrg         case GLSL_TYPE_BOOL:
1353b8e80941Smrg            data.b[c] = op[0]->value.b[c] == op[1]->value.b[c];
1354b8e80941Smrg            break;
1355b8e80941Smrg         default:
1356b8e80941Smrg            unreachable("invalid type");
1357b8e80941Smrg         }
1358b8e80941Smrg      }
1359b8e80941Smrg      break;
1360b8e80941Smrg
1361b8e80941Smrg   case ir_binop_nequal:
1362b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1363b8e80941Smrg         switch (op[0]->type->base_type) {
1364b8e80941Smrg         case GLSL_TYPE_UINT:
1365b8e80941Smrg            data.b[c] = op[0]->value.u[c] != op[1]->value.u[c];
1366b8e80941Smrg            break;
1367b8e80941Smrg         case GLSL_TYPE_INT:
1368b8e80941Smrg            data.b[c] = op[0]->value.i[c] != op[1]->value.i[c];
1369b8e80941Smrg            break;
1370b8e80941Smrg         case GLSL_TYPE_FLOAT:
1371b8e80941Smrg            data.b[c] = op[0]->value.f[c] != op[1]->value.f[c];
1372b8e80941Smrg            break;
1373b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1374b8e80941Smrg            data.b[c] = op[0]->value.d[c] != op[1]->value.d[c];
1375b8e80941Smrg            break;
1376b8e80941Smrg         case GLSL_TYPE_UINT64:
1377b8e80941Smrg            data.b[c] = op[0]->value.u64[c] != op[1]->value.u64[c];
1378b8e80941Smrg            break;
1379b8e80941Smrg         case GLSL_TYPE_INT64:
1380b8e80941Smrg            data.b[c] = op[0]->value.i64[c] != op[1]->value.i64[c];
1381b8e80941Smrg            break;
1382b8e80941Smrg         case GLSL_TYPE_BOOL:
1383b8e80941Smrg            data.b[c] = op[0]->value.b[c] != op[1]->value.b[c];
1384b8e80941Smrg            break;
1385b8e80941Smrg         default:
1386b8e80941Smrg            unreachable("invalid type");
1387b8e80941Smrg         }
1388b8e80941Smrg      }
1389b8e80941Smrg      break;
1390b8e80941Smrg
1391b8e80941Smrg   case ir_binop_all_equal:
1392b8e80941Smrg      data.b[0] = op[0]->has_value(op[1]);
1393b8e80941Smrg      break;
1394b8e80941Smrg
1395b8e80941Smrg   case ir_binop_any_nequal:
1396b8e80941Smrg      data.b[0] = !op[0]->has_value(op[1]);
1397b8e80941Smrg      break;
1398b8e80941Smrg
1399b8e80941Smrg   case ir_binop_lshift:
1400b8e80941Smrg      assert(op[0]->type->base_type == GLSL_TYPE_UINT ||
1401b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_INT ||
1402b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_UINT64 ||
1403b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_INT64);
1404b8e80941Smrg      assert(op[1]->type->base_type == GLSL_TYPE_UINT ||
1405b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_INT ||
1406b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_UINT64 ||
1407b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_INT64);
1408b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1409b8e80941Smrg           c < components;
1410b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1411b8e80941Smrg
1412b8e80941Smrg         switch (op[0]->type->base_type) {
1413b8e80941Smrg         case GLSL_TYPE_UINT:
1414b8e80941Smrg            data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1];
1415b8e80941Smrg            break;
1416b8e80941Smrg         case GLSL_TYPE_INT:
1417b8e80941Smrg            data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1];
1418b8e80941Smrg            break;
1419b8e80941Smrg         case GLSL_TYPE_UINT64:
1420b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] << op[1]->value.u64[c1];
1421b8e80941Smrg            break;
1422b8e80941Smrg         case GLSL_TYPE_INT64:
1423b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] << op[1]->value.i64[c1];
1424b8e80941Smrg            break;
1425b8e80941Smrg         default:
1426b8e80941Smrg            unreachable("invalid type");
1427b8e80941Smrg         }
1428b8e80941Smrg      }
1429b8e80941Smrg      break;
1430b8e80941Smrg
1431b8e80941Smrg   case ir_binop_rshift:
1432b8e80941Smrg      assert(op[0]->type->base_type == GLSL_TYPE_UINT ||
1433b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_INT ||
1434b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_UINT64 ||
1435b8e80941Smrg             op[0]->type->base_type == GLSL_TYPE_INT64);
1436b8e80941Smrg      assert(op[1]->type->base_type == GLSL_TYPE_UINT ||
1437b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_INT ||
1438b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_UINT64 ||
1439b8e80941Smrg             op[1]->type->base_type == GLSL_TYPE_INT64);
1440b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1441b8e80941Smrg           c < components;
1442b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1443b8e80941Smrg
1444b8e80941Smrg         switch (op[0]->type->base_type) {
1445b8e80941Smrg         case GLSL_TYPE_UINT:
1446b8e80941Smrg            data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1];
1447b8e80941Smrg            break;
1448b8e80941Smrg         case GLSL_TYPE_INT:
1449b8e80941Smrg            data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1];
1450b8e80941Smrg            break;
1451b8e80941Smrg         case GLSL_TYPE_UINT64:
1452b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] >> op[1]->value.u64[c1];
1453b8e80941Smrg            break;
1454b8e80941Smrg         case GLSL_TYPE_INT64:
1455b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] >> op[1]->value.i64[c1];
1456b8e80941Smrg            break;
1457b8e80941Smrg         default:
1458b8e80941Smrg            unreachable("invalid type");
1459b8e80941Smrg         }
1460b8e80941Smrg      }
1461b8e80941Smrg      break;
1462b8e80941Smrg
1463b8e80941Smrg   case ir_binop_bit_and:
1464b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1465b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1466b8e80941Smrg           c < components;
1467b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1468b8e80941Smrg
1469b8e80941Smrg         switch (op[0]->type->base_type) {
1470b8e80941Smrg         case GLSL_TYPE_UINT:
1471b8e80941Smrg            data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1];
1472b8e80941Smrg            break;
1473b8e80941Smrg         case GLSL_TYPE_INT:
1474b8e80941Smrg            data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1];
1475b8e80941Smrg            break;
1476b8e80941Smrg         case GLSL_TYPE_UINT64:
1477b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] & op[1]->value.u64[c1];
1478b8e80941Smrg            break;
1479b8e80941Smrg         case GLSL_TYPE_INT64:
1480b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] & op[1]->value.i64[c1];
1481b8e80941Smrg            break;
1482b8e80941Smrg         default:
1483b8e80941Smrg            unreachable("invalid type");
1484b8e80941Smrg         }
1485b8e80941Smrg      }
1486b8e80941Smrg      break;
1487b8e80941Smrg
1488b8e80941Smrg   case ir_binop_bit_xor:
1489b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1490b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1491b8e80941Smrg           c < components;
1492b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1493b8e80941Smrg
1494b8e80941Smrg         switch (op[0]->type->base_type) {
1495b8e80941Smrg         case GLSL_TYPE_UINT:
1496b8e80941Smrg            data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1];
1497b8e80941Smrg            break;
1498b8e80941Smrg         case GLSL_TYPE_INT:
1499b8e80941Smrg            data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1];
1500b8e80941Smrg            break;
1501b8e80941Smrg         case GLSL_TYPE_UINT64:
1502b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] ^ op[1]->value.u64[c1];
1503b8e80941Smrg            break;
1504b8e80941Smrg         case GLSL_TYPE_INT64:
1505b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] ^ op[1]->value.i64[c1];
1506b8e80941Smrg            break;
1507b8e80941Smrg         default:
1508b8e80941Smrg            unreachable("invalid type");
1509b8e80941Smrg         }
1510b8e80941Smrg      }
1511b8e80941Smrg      break;
1512b8e80941Smrg
1513b8e80941Smrg   case ir_binop_bit_or:
1514b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1515b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1516b8e80941Smrg           c < components;
1517b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1518b8e80941Smrg
1519b8e80941Smrg         switch (op[0]->type->base_type) {
1520b8e80941Smrg         case GLSL_TYPE_UINT:
1521b8e80941Smrg            data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1];
1522b8e80941Smrg            break;
1523b8e80941Smrg         case GLSL_TYPE_INT:
1524b8e80941Smrg            data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1];
1525b8e80941Smrg            break;
1526b8e80941Smrg         case GLSL_TYPE_UINT64:
1527b8e80941Smrg            data.u64[c] = op[0]->value.u64[c0] | op[1]->value.u64[c1];
1528b8e80941Smrg            break;
1529b8e80941Smrg         case GLSL_TYPE_INT64:
1530b8e80941Smrg            data.i64[c] = op[0]->value.i64[c0] | op[1]->value.i64[c1];
1531b8e80941Smrg            break;
1532b8e80941Smrg         default:
1533b8e80941Smrg            unreachable("invalid type");
1534b8e80941Smrg         }
1535b8e80941Smrg      }
1536b8e80941Smrg      break;
1537b8e80941Smrg
1538b8e80941Smrg   case ir_binop_logic_and:
1539b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1540b8e80941Smrg         switch (op[0]->type->base_type) {
1541b8e80941Smrg         case GLSL_TYPE_BOOL:
1542b8e80941Smrg            data.b[c] = op[0]->value.b[c] && op[1]->value.b[c];
1543b8e80941Smrg            break;
1544b8e80941Smrg         default:
1545b8e80941Smrg            unreachable("invalid type");
1546b8e80941Smrg         }
1547b8e80941Smrg      }
1548b8e80941Smrg      break;
1549b8e80941Smrg
1550b8e80941Smrg   case ir_binop_logic_xor:
1551b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1552b8e80941Smrg         switch (op[0]->type->base_type) {
1553b8e80941Smrg         case GLSL_TYPE_BOOL:
1554b8e80941Smrg            data.b[c] = op[0]->value.b[c] != op[1]->value.b[c];
1555b8e80941Smrg            break;
1556b8e80941Smrg         default:
1557b8e80941Smrg            unreachable("invalid type");
1558b8e80941Smrg         }
1559b8e80941Smrg      }
1560b8e80941Smrg      break;
1561b8e80941Smrg
1562b8e80941Smrg   case ir_binop_logic_or:
1563b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1564b8e80941Smrg         switch (op[0]->type->base_type) {
1565b8e80941Smrg         case GLSL_TYPE_BOOL:
1566b8e80941Smrg            data.b[c] = op[0]->value.b[c] || op[1]->value.b[c];
1567b8e80941Smrg            break;
1568b8e80941Smrg         default:
1569b8e80941Smrg            unreachable("invalid type");
1570b8e80941Smrg         }
1571b8e80941Smrg      }
1572b8e80941Smrg      break;
1573b8e80941Smrg
1574b8e80941Smrg   case ir_binop_dot:
1575b8e80941Smrg      switch (op[0]->type->base_type) {
1576b8e80941Smrg      case GLSL_TYPE_FLOAT:
1577b8e80941Smrg         data.f[0] = dot_f(op[0], op[1]);
1578b8e80941Smrg         break;
1579b8e80941Smrg      case GLSL_TYPE_DOUBLE:
1580b8e80941Smrg         data.d[0] = dot_d(op[0], op[1]);
1581b8e80941Smrg         break;
1582b8e80941Smrg      default:
1583b8e80941Smrg         unreachable("invalid type");
1584b8e80941Smrg      }
1585b8e80941Smrg      break;
1586b8e80941Smrg
1587b8e80941Smrg   case ir_binop_min:
1588b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1589b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1590b8e80941Smrg           c < components;
1591b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1592b8e80941Smrg
1593b8e80941Smrg         switch (op[0]->type->base_type) {
1594b8e80941Smrg         case GLSL_TYPE_UINT:
1595b8e80941Smrg            data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]);
1596b8e80941Smrg            break;
1597b8e80941Smrg         case GLSL_TYPE_INT:
1598b8e80941Smrg            data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]);
1599b8e80941Smrg            break;
1600b8e80941Smrg         case GLSL_TYPE_FLOAT:
1601b8e80941Smrg            data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]);
1602b8e80941Smrg            break;
1603b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1604b8e80941Smrg            data.d[c] = MIN2(op[0]->value.d[c0], op[1]->value.d[c1]);
1605b8e80941Smrg            break;
1606b8e80941Smrg         case GLSL_TYPE_UINT64:
1607b8e80941Smrg            data.u64[c] = MIN2(op[0]->value.u64[c0], op[1]->value.u64[c1]);
1608b8e80941Smrg            break;
1609b8e80941Smrg         case GLSL_TYPE_INT64:
1610b8e80941Smrg            data.i64[c] = MIN2(op[0]->value.i64[c0], op[1]->value.i64[c1]);
1611b8e80941Smrg            break;
1612b8e80941Smrg         default:
1613b8e80941Smrg            unreachable("invalid type");
1614b8e80941Smrg         }
1615b8e80941Smrg      }
1616b8e80941Smrg      break;
1617b8e80941Smrg
1618b8e80941Smrg   case ir_binop_max:
1619b8e80941Smrg      assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar);
1620b8e80941Smrg      for (unsigned c = 0, c0 = 0, c1 = 0;
1621b8e80941Smrg           c < components;
1622b8e80941Smrg           c0 += c0_inc, c1 += c1_inc, c++) {
1623b8e80941Smrg
1624b8e80941Smrg         switch (op[0]->type->base_type) {
1625b8e80941Smrg         case GLSL_TYPE_UINT:
1626b8e80941Smrg            data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]);
1627b8e80941Smrg            break;
1628b8e80941Smrg         case GLSL_TYPE_INT:
1629b8e80941Smrg            data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]);
1630b8e80941Smrg            break;
1631b8e80941Smrg         case GLSL_TYPE_FLOAT:
1632b8e80941Smrg            data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]);
1633b8e80941Smrg            break;
1634b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1635b8e80941Smrg            data.d[c] = MAX2(op[0]->value.d[c0], op[1]->value.d[c1]);
1636b8e80941Smrg            break;
1637b8e80941Smrg         case GLSL_TYPE_UINT64:
1638b8e80941Smrg            data.u64[c] = MAX2(op[0]->value.u64[c0], op[1]->value.u64[c1]);
1639b8e80941Smrg            break;
1640b8e80941Smrg         case GLSL_TYPE_INT64:
1641b8e80941Smrg            data.i64[c] = MAX2(op[0]->value.i64[c0], op[1]->value.i64[c1]);
1642b8e80941Smrg            break;
1643b8e80941Smrg         default:
1644b8e80941Smrg            unreachable("invalid type");
1645b8e80941Smrg         }
1646b8e80941Smrg      }
1647b8e80941Smrg      break;
1648b8e80941Smrg
1649b8e80941Smrg   case ir_binop_pow:
1650b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1651b8e80941Smrg         switch (op[0]->type->base_type) {
1652b8e80941Smrg         case GLSL_TYPE_FLOAT:
1653b8e80941Smrg            data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]);
1654b8e80941Smrg            break;
1655b8e80941Smrg         default:
1656b8e80941Smrg            unreachable("invalid type");
1657b8e80941Smrg         }
1658b8e80941Smrg      }
1659b8e80941Smrg      break;
1660b8e80941Smrg
1661b8e80941Smrg   case ir_binop_ldexp:
1662b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1663b8e80941Smrg         switch (op[0]->type->base_type) {
1664b8e80941Smrg         case GLSL_TYPE_FLOAT:
1665b8e80941Smrg            data.f[c] = ldexpf_flush_subnormal(op[0]->value.f[c], op[1]->value.i[c]);
1666b8e80941Smrg            break;
1667b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1668b8e80941Smrg            data.d[c] = ldexp_flush_subnormal(op[0]->value.d[c], op[1]->value.i[c]);
1669b8e80941Smrg            break;
1670b8e80941Smrg         default:
1671b8e80941Smrg            unreachable("invalid type");
1672b8e80941Smrg         }
1673b8e80941Smrg      }
1674b8e80941Smrg      break;
1675b8e80941Smrg
1676b8e80941Smrg   case ir_binop_vector_extract: {
1677b8e80941Smrg      const int c = CLAMP(op[1]->value.i[0], 0,
1678b8e80941Smrg                          (int) op[0]->type->vector_elements - 1);
1679b8e80941Smrg
1680b8e80941Smrg      switch (op[0]->type->base_type) {
1681b8e80941Smrg      case GLSL_TYPE_UINT:
1682b8e80941Smrg         data.u[0] = op[0]->value.u[c];
1683b8e80941Smrg         break;
1684b8e80941Smrg      case GLSL_TYPE_INT:
1685b8e80941Smrg         data.i[0] = op[0]->value.i[c];
1686b8e80941Smrg         break;
1687b8e80941Smrg      case GLSL_TYPE_FLOAT:
1688b8e80941Smrg         data.f[0] = op[0]->value.f[c];
1689b8e80941Smrg         break;
1690b8e80941Smrg      case GLSL_TYPE_DOUBLE:
1691b8e80941Smrg         data.d[0] = op[0]->value.d[c];
1692b8e80941Smrg         break;
1693b8e80941Smrg      case GLSL_TYPE_UINT64:
1694b8e80941Smrg         data.u64[0] = op[0]->value.u64[c];
1695b8e80941Smrg         break;
1696b8e80941Smrg      case GLSL_TYPE_INT64:
1697b8e80941Smrg         data.i64[0] = op[0]->value.i64[c];
1698b8e80941Smrg         break;
1699b8e80941Smrg      case GLSL_TYPE_BOOL:
1700b8e80941Smrg         data.b[0] = op[0]->value.b[c];
1701b8e80941Smrg         break;
1702b8e80941Smrg      default:
1703b8e80941Smrg         unreachable("invalid type");
1704b8e80941Smrg      }
1705b8e80941Smrg      break;
1706b8e80941Smrg   }
1707b8e80941Smrg
1708b8e80941Smrg   case ir_triop_fma:
1709b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1710b8e80941Smrg         switch (op[0]->type->base_type) {
1711b8e80941Smrg         case GLSL_TYPE_FLOAT:
1712b8e80941Smrg            data.f[c] = op[0]->value.f[c] * op[1]->value.f[c] + op[2]->value.f[c];
1713b8e80941Smrg            break;
1714b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1715b8e80941Smrg            data.d[c] = op[0]->value.d[c] * op[1]->value.d[c] + op[2]->value.d[c];
1716b8e80941Smrg            break;
1717b8e80941Smrg         default:
1718b8e80941Smrg            unreachable("invalid type");
1719b8e80941Smrg         }
1720b8e80941Smrg      }
1721b8e80941Smrg      break;
1722b8e80941Smrg
1723b8e80941Smrg   case ir_triop_lrp: {
1724b8e80941Smrg      assert(op[0]->type->is_float() || op[0]->type->is_double());
1725b8e80941Smrg      assert(op[1]->type->is_float() || op[1]->type->is_double());
1726b8e80941Smrg      assert(op[2]->type->is_float() || op[2]->type->is_double());
1727b8e80941Smrg
1728b8e80941Smrg      unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1;
1729b8e80941Smrg      for (unsigned c = 0, c2 = 0; c < components; c2 += c2_inc, c++) {
1730b8e80941Smrg         switch (this->type->base_type) {
1731b8e80941Smrg         case GLSL_TYPE_FLOAT:
1732b8e80941Smrg            data.f[c] = op[0]->value.f[c] * (1.0f - op[2]->value.f[c2]) + (op[1]->value.f[c] * op[2]->value.f[c2]);
1733b8e80941Smrg            break;
1734b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1735b8e80941Smrg            data.d[c] = op[0]->value.d[c] * (1.0 - op[2]->value.d[c2]) + (op[1]->value.d[c] * op[2]->value.d[c2]);
1736b8e80941Smrg            break;
1737b8e80941Smrg         default:
1738b8e80941Smrg            unreachable("invalid type");
1739b8e80941Smrg         }
1740b8e80941Smrg      }
1741b8e80941Smrg      break;
1742b8e80941Smrg   }
1743b8e80941Smrg
1744b8e80941Smrg   case ir_triop_csel:
1745b8e80941Smrg      for (unsigned c = 0; c < components; c++) {
1746b8e80941Smrg         switch (this->type->base_type) {
1747b8e80941Smrg         case GLSL_TYPE_UINT:
1748b8e80941Smrg            data.u[c] = op[0]->value.b[c] ? op[1]->value.u[c] : op[2]->value.u[c];
1749b8e80941Smrg            break;
1750b8e80941Smrg         case GLSL_TYPE_INT:
1751b8e80941Smrg            data.i[c] = op[0]->value.b[c] ? op[1]->value.i[c] : op[2]->value.i[c];
1752b8e80941Smrg            break;
1753b8e80941Smrg         case GLSL_TYPE_FLOAT:
1754b8e80941Smrg            data.f[c] = op[0]->value.b[c] ? op[1]->value.f[c] : op[2]->value.f[c];
1755b8e80941Smrg            break;
1756b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1757b8e80941Smrg            data.d[c] = op[0]->value.b[c] ? op[1]->value.d[c] : op[2]->value.d[c];
1758b8e80941Smrg            break;
1759b8e80941Smrg         case GLSL_TYPE_UINT64:
1760b8e80941Smrg            data.u64[c] = op[0]->value.b[c] ? op[1]->value.u64[c] : op[2]->value.u64[c];
1761b8e80941Smrg            break;
1762b8e80941Smrg         case GLSL_TYPE_INT64:
1763b8e80941Smrg            data.i64[c] = op[0]->value.b[c] ? op[1]->value.i64[c] : op[2]->value.i64[c];
1764b8e80941Smrg            break;
1765b8e80941Smrg         case GLSL_TYPE_BOOL:
1766b8e80941Smrg            data.b[c] = op[0]->value.b[c] ? op[1]->value.b[c] : op[2]->value.b[c];
1767b8e80941Smrg            break;
1768b8e80941Smrg         default:
1769b8e80941Smrg            unreachable("invalid type");
1770b8e80941Smrg         }
1771b8e80941Smrg      }
1772b8e80941Smrg      break;
1773b8e80941Smrg
1774b8e80941Smrg   case ir_triop_bitfield_extract:
1775b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1776b8e80941Smrg         switch (op[0]->type->base_type) {
1777b8e80941Smrg         case GLSL_TYPE_UINT:
1778b8e80941Smrg            data.i[c] = bitfield_extract_uint(op[0]->value.u[c], op[1]->value.i[c], op[2]->value.i[c]);
1779b8e80941Smrg            break;
1780b8e80941Smrg         case GLSL_TYPE_INT:
1781b8e80941Smrg            data.i[c] = bitfield_extract_int(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c]);
1782b8e80941Smrg            break;
1783b8e80941Smrg         default:
1784b8e80941Smrg            unreachable("invalid type");
1785b8e80941Smrg         }
1786b8e80941Smrg      }
1787b8e80941Smrg      break;
1788b8e80941Smrg
1789b8e80941Smrg   case ir_triop_vector_insert: {
1790b8e80941Smrg      const unsigned idx = op[2]->value.u[0];
1791b8e80941Smrg
1792b8e80941Smrg      memcpy(&data, &op[0]->value, sizeof(data));
1793b8e80941Smrg
1794b8e80941Smrg      switch (this->type->base_type) {
1795b8e80941Smrg      case GLSL_TYPE_UINT:
1796b8e80941Smrg         data.u[idx] = op[1]->value.u[0];
1797b8e80941Smrg         break;
1798b8e80941Smrg      case GLSL_TYPE_INT:
1799b8e80941Smrg         data.i[idx] = op[1]->value.i[0];
1800b8e80941Smrg         break;
1801b8e80941Smrg      case GLSL_TYPE_FLOAT:
1802b8e80941Smrg         data.f[idx] = op[1]->value.f[0];
1803b8e80941Smrg         break;
1804b8e80941Smrg      case GLSL_TYPE_DOUBLE:
1805b8e80941Smrg         data.d[idx] = op[1]->value.d[0];
1806b8e80941Smrg         break;
1807b8e80941Smrg      case GLSL_TYPE_UINT64:
1808b8e80941Smrg         data.u64[idx] = op[1]->value.u64[0];
1809b8e80941Smrg         break;
1810b8e80941Smrg      case GLSL_TYPE_INT64:
1811b8e80941Smrg         data.i64[idx] = op[1]->value.i64[0];
1812b8e80941Smrg         break;
1813b8e80941Smrg      case GLSL_TYPE_BOOL:
1814b8e80941Smrg         data.b[idx] = op[1]->value.b[0];
1815b8e80941Smrg         break;
1816b8e80941Smrg      default:
1817b8e80941Smrg         unreachable("invalid type");
1818b8e80941Smrg      }
1819b8e80941Smrg      break;
1820b8e80941Smrg   }
1821b8e80941Smrg
1822b8e80941Smrg   case ir_quadop_bitfield_insert:
1823b8e80941Smrg      for (unsigned c = 0; c < op[0]->type->components(); c++) {
1824b8e80941Smrg         switch (op[0]->type->base_type) {
1825b8e80941Smrg         case GLSL_TYPE_UINT:
1826b8e80941Smrg            data.u[c] = bitfield_insert(op[0]->value.u[c], op[1]->value.u[c], op[2]->value.i[c], op[3]->value.i[c]);
1827b8e80941Smrg            break;
1828b8e80941Smrg         case GLSL_TYPE_INT:
1829b8e80941Smrg            data.i[c] = bitfield_insert(op[0]->value.i[c], op[1]->value.i[c], op[2]->value.i[c], op[3]->value.i[c]);
1830b8e80941Smrg            break;
1831b8e80941Smrg         default:
1832b8e80941Smrg            unreachable("invalid type");
1833b8e80941Smrg         }
1834b8e80941Smrg      }
1835b8e80941Smrg      break;
1836b8e80941Smrg
1837b8e80941Smrg   case ir_quadop_vector:
1838b8e80941Smrg      for (unsigned c = 0; c < this->type->vector_elements; c++) {
1839b8e80941Smrg         switch (this->type->base_type) {
1840b8e80941Smrg         case GLSL_TYPE_UINT:
1841b8e80941Smrg            data.u[c] = op[c]->value.u[0];
1842b8e80941Smrg            break;
1843b8e80941Smrg         case GLSL_TYPE_INT:
1844b8e80941Smrg            data.i[c] = op[c]->value.i[0];
1845b8e80941Smrg            break;
1846b8e80941Smrg         case GLSL_TYPE_FLOAT:
1847b8e80941Smrg            data.f[c] = op[c]->value.f[0];
1848b8e80941Smrg            break;
1849b8e80941Smrg         case GLSL_TYPE_DOUBLE:
1850b8e80941Smrg            data.d[c] = op[c]->value.d[0];
1851b8e80941Smrg            break;
1852b8e80941Smrg         case GLSL_TYPE_UINT64:
1853b8e80941Smrg            data.u64[c] = op[c]->value.u64[0];
1854b8e80941Smrg            break;
1855b8e80941Smrg         case GLSL_TYPE_INT64:
1856b8e80941Smrg            data.i64[c] = op[c]->value.i64[0];
1857b8e80941Smrg            break;
1858b8e80941Smrg         case GLSL_TYPE_BOOL:
1859b8e80941Smrg            data.b[c] = op[c]->value.b[0];
1860b8e80941Smrg            break;
1861b8e80941Smrg         default:
1862b8e80941Smrg            unreachable("invalid type");
1863b8e80941Smrg         }
1864b8e80941Smrg      }
1865b8e80941Smrg      break;
1866b8e80941Smrg
1867b8e80941Smrg   default:
1868b8e80941Smrg      /* FINISHME: Should handle all expression types. */
1869b8e80941Smrg      return NULL;
1870b8e80941Smrg   }
1871b8e80941Smrg
1872