• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 Intel Corporation
3  *
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:
10  *
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
13  * Software.
14  *
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 DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Jason Ekstrand (jason@jlekstrand.net)
25  */
26 
27 #include <math.h>
28 #include "main/core.h"
29 #include "util/rounding.h" /* for _mesa_roundeven */
30 #include "util/half_float.h"
31 #include "nir_constant_expressions.h"
32 
33 /**
34  * Evaluate one component of packSnorm4x8.
35  */
36 static uint8_t
pack_snorm_1x8(float x)37 pack_snorm_1x8(float x)
38 {
39     /* From section 8.4 of the GLSL 4.30 spec:
40      *
41      *    packSnorm4x8
42      *    ------------
43      *    The conversion for component c of v to fixed point is done as
44      *    follows:
45      *
46      *      packSnorm4x8: round(clamp(c, -1, +1) * 127.0)
47      *
48      * We must first cast the float to an int, because casting a negative
49      * float to a uint is undefined.
50      */
51    return (uint8_t) (int)
52           _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 127.0f);
53 }
54 
55 /**
56  * Evaluate one component of packSnorm2x16.
57  */
58 static uint16_t
pack_snorm_1x16(float x)59 pack_snorm_1x16(float x)
60 {
61     /* From section 8.4 of the GLSL ES 3.00 spec:
62      *
63      *    packSnorm2x16
64      *    -------------
65      *    The conversion for component c of v to fixed point is done as
66      *    follows:
67      *
68      *      packSnorm2x16: round(clamp(c, -1, +1) * 32767.0)
69      *
70      * We must first cast the float to an int, because casting a negative
71      * float to a uint is undefined.
72      */
73    return (uint16_t) (int)
74           _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 32767.0f);
75 }
76 
77 /**
78  * Evaluate one component of unpackSnorm4x8.
79  */
80 static float
unpack_snorm_1x8(uint8_t u)81 unpack_snorm_1x8(uint8_t u)
82 {
83     /* From section 8.4 of the GLSL 4.30 spec:
84      *
85      *    unpackSnorm4x8
86      *    --------------
87      *    The conversion for unpacked fixed-point value f to floating point is
88      *    done as follows:
89      *
90      *       unpackSnorm4x8: clamp(f / 127.0, -1, +1)
91      */
92    return CLAMP((int8_t) u / 127.0f, -1.0f, +1.0f);
93 }
94 
95 /**
96  * Evaluate one component of unpackSnorm2x16.
97  */
98 static float
unpack_snorm_1x16(uint16_t u)99 unpack_snorm_1x16(uint16_t u)
100 {
101     /* From section 8.4 of the GLSL ES 3.00 spec:
102      *
103      *    unpackSnorm2x16
104      *    ---------------
105      *    The conversion for unpacked fixed-point value f to floating point is
106      *    done as follows:
107      *
108      *       unpackSnorm2x16: clamp(f / 32767.0, -1, +1)
109      */
110    return CLAMP((int16_t) u / 32767.0f, -1.0f, +1.0f);
111 }
112 
113 /**
114  * Evaluate one component packUnorm4x8.
115  */
116 static uint8_t
pack_unorm_1x8(float x)117 pack_unorm_1x8(float x)
118 {
119     /* From section 8.4 of the GLSL 4.30 spec:
120      *
121      *    packUnorm4x8
122      *    ------------
123      *    The conversion for component c of v to fixed point is done as
124      *    follows:
125      *
126      *       packUnorm4x8: round(clamp(c, 0, +1) * 255.0)
127      */
128    return (uint8_t) (int)
129           _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 255.0f);
130 }
131 
132 /**
133  * Evaluate one component packUnorm2x16.
134  */
135 static uint16_t
pack_unorm_1x16(float x)136 pack_unorm_1x16(float x)
137 {
138     /* From section 8.4 of the GLSL ES 3.00 spec:
139      *
140      *    packUnorm2x16
141      *    -------------
142      *    The conversion for component c of v to fixed point is done as
143      *    follows:
144      *
145      *       packUnorm2x16: round(clamp(c, 0, +1) * 65535.0)
146      */
147    return (uint16_t) (int)
148           _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 65535.0f);
149 }
150 
151 /**
152  * Evaluate one component of unpackUnorm4x8.
153  */
154 static float
unpack_unorm_1x8(uint8_t u)155 unpack_unorm_1x8(uint8_t u)
156 {
157     /* From section 8.4 of the GLSL 4.30 spec:
158      *
159      *    unpackUnorm4x8
160      *    --------------
161      *    The conversion for unpacked fixed-point value f to floating point is
162      *    done as follows:
163      *
164      *       unpackUnorm4x8: f / 255.0
165      */
166    return (float) u / 255.0f;
167 }
168 
169 /**
170  * Evaluate one component of unpackUnorm2x16.
171  */
172 static float
unpack_unorm_1x16(uint16_t u)173 unpack_unorm_1x16(uint16_t u)
174 {
175     /* From section 8.4 of the GLSL ES 3.00 spec:
176      *
177      *    unpackUnorm2x16
178      *    ---------------
179      *    The conversion for unpacked fixed-point value f to floating point is
180      *    done as follows:
181      *
182      *       unpackUnorm2x16: f / 65535.0
183      */
184    return (float) u / 65535.0f;
185 }
186 
187 /**
188  * Evaluate one component of packHalf2x16.
189  */
190 static uint16_t
pack_half_1x16(float x)191 pack_half_1x16(float x)
192 {
193    return _mesa_float_to_half(x);
194 }
195 
196 /**
197  * Evaluate one component of unpackHalf2x16.
198  */
199 static float
unpack_half_1x16(uint16_t u)200 unpack_half_1x16(uint16_t u)
201 {
202    return _mesa_half_to_float(u);
203 }
204 
205 /* Some typed vector structures to make things like src0.y work */
206 typedef float float32_t;
207 typedef double float64_t;
208 typedef bool bool32_t;
209 struct float32_vec {
210    float32_t x;
211    float32_t y;
212    float32_t z;
213    float32_t w;
214 };
215 struct float64_vec {
216    float64_t x;
217    float64_t y;
218    float64_t z;
219    float64_t w;
220 };
221 struct int32_vec {
222    int32_t x;
223    int32_t y;
224    int32_t z;
225    int32_t w;
226 };
227 struct int64_vec {
228    int64_t x;
229    int64_t y;
230    int64_t z;
231    int64_t w;
232 };
233 struct uint32_vec {
234    uint32_t x;
235    uint32_t y;
236    uint32_t z;
237    uint32_t w;
238 };
239 struct uint64_vec {
240    uint64_t x;
241    uint64_t y;
242    uint64_t z;
243    uint64_t w;
244 };
245 
246 struct bool32_vec {
247     bool x;
248     bool y;
249     bool z;
250     bool w;
251 };
252 
253 static nir_const_value
evaluate_b2f(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)254 evaluate_b2f(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
255                  MAYBE_UNUSED nir_const_value *_src)
256 {
257    nir_const_value _dst_val = { {0, } };
258 
259    switch (bit_size) {
260    case 32: {
261 
262 
263 
264          for (unsigned _i = 0; _i < num_components; _i++) {
265                   const bool src0 = _src[0].u32[_i] != 0;
266 
267                float32_t dst = src0 ? 1.0f : 0.0f;
268 
269                _dst_val.f32[_i] = dst;
270          }
271 
272       break;
273    }
274    case 64: {
275 
276 
277 
278          for (unsigned _i = 0; _i < num_components; _i++) {
279                   const bool src0 = _src[0].u32[_i] != 0;
280 
281                float32_t dst = src0 ? 1.0f : 0.0f;
282 
283                _dst_val.f32[_i] = dst;
284          }
285 
286       break;
287    }
288 
289    default:
290       unreachable("unknown bit width");
291    }
292 
293    return _dst_val;
294 }
295 static nir_const_value
evaluate_b2i(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)296 evaluate_b2i(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
297                  MAYBE_UNUSED nir_const_value *_src)
298 {
299    nir_const_value _dst_val = { {0, } };
300 
301    switch (bit_size) {
302    case 32: {
303 
304 
305 
306          for (unsigned _i = 0; _i < num_components; _i++) {
307                   const bool src0 = _src[0].u32[_i] != 0;
308 
309                int32_t dst = src0 ? 1 : 0;
310 
311                _dst_val.i32[_i] = dst;
312          }
313 
314       break;
315    }
316    case 64: {
317 
318 
319 
320          for (unsigned _i = 0; _i < num_components; _i++) {
321                   const bool src0 = _src[0].u32[_i] != 0;
322 
323                int32_t dst = src0 ? 1 : 0;
324 
325                _dst_val.i32[_i] = dst;
326          }
327 
328       break;
329    }
330 
331    default:
332       unreachable("unknown bit width");
333    }
334 
335    return _dst_val;
336 }
337 static nir_const_value
evaluate_ball_fequal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)338 evaluate_ball_fequal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
339                  MAYBE_UNUSED nir_const_value *_src)
340 {
341    nir_const_value _dst_val = { {0, } };
342 
343    switch (bit_size) {
344    case 32: {
345 
346 
347 
348          const struct float32_vec src0 = {
349                _src[0].f32[0],
350                _src[0].f32[1],
351             0,
352             0,
353          };
354 
355          const struct float32_vec src1 = {
356                _src[1].f32[0],
357                _src[1].f32[1],
358             0,
359             0,
360          };
361 
362          struct bool32_vec dst;
363 
364             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y));
365 
366                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
367 
368       break;
369    }
370    case 64: {
371 
372 
373 
374          const struct float64_vec src0 = {
375                _src[0].f64[0],
376                _src[0].f64[1],
377             0,
378             0,
379          };
380 
381          const struct float64_vec src1 = {
382                _src[1].f64[0],
383                _src[1].f64[1],
384             0,
385             0,
386          };
387 
388          struct bool32_vec dst;
389 
390             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y));
391 
392                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
393 
394       break;
395    }
396 
397    default:
398       unreachable("unknown bit width");
399    }
400 
401    return _dst_val;
402 }
403 static nir_const_value
evaluate_ball_fequal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)404 evaluate_ball_fequal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
405                  MAYBE_UNUSED nir_const_value *_src)
406 {
407    nir_const_value _dst_val = { {0, } };
408 
409    switch (bit_size) {
410    case 32: {
411 
412 
413 
414          const struct float32_vec src0 = {
415                _src[0].f32[0],
416                _src[0].f32[1],
417                _src[0].f32[2],
418             0,
419          };
420 
421          const struct float32_vec src1 = {
422                _src[1].f32[0],
423                _src[1].f32[1],
424                _src[1].f32[2],
425             0,
426          };
427 
428          struct bool32_vec dst;
429 
430             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z));
431 
432                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
433 
434       break;
435    }
436    case 64: {
437 
438 
439 
440          const struct float64_vec src0 = {
441                _src[0].f64[0],
442                _src[0].f64[1],
443                _src[0].f64[2],
444             0,
445          };
446 
447          const struct float64_vec src1 = {
448                _src[1].f64[0],
449                _src[1].f64[1],
450                _src[1].f64[2],
451             0,
452          };
453 
454          struct bool32_vec dst;
455 
456             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z));
457 
458                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
459 
460       break;
461    }
462 
463    default:
464       unreachable("unknown bit width");
465    }
466 
467    return _dst_val;
468 }
469 static nir_const_value
evaluate_ball_fequal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)470 evaluate_ball_fequal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
471                  MAYBE_UNUSED nir_const_value *_src)
472 {
473    nir_const_value _dst_val = { {0, } };
474 
475    switch (bit_size) {
476    case 32: {
477 
478 
479 
480          const struct float32_vec src0 = {
481                _src[0].f32[0],
482                _src[0].f32[1],
483                _src[0].f32[2],
484                _src[0].f32[3],
485          };
486 
487          const struct float32_vec src1 = {
488                _src[1].f32[0],
489                _src[1].f32[1],
490                _src[1].f32[2],
491                _src[1].f32[3],
492          };
493 
494          struct bool32_vec dst;
495 
496             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w));
497 
498                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
499 
500       break;
501    }
502    case 64: {
503 
504 
505 
506          const struct float64_vec src0 = {
507                _src[0].f64[0],
508                _src[0].f64[1],
509                _src[0].f64[2],
510                _src[0].f64[3],
511          };
512 
513          const struct float64_vec src1 = {
514                _src[1].f64[0],
515                _src[1].f64[1],
516                _src[1].f64[2],
517                _src[1].f64[3],
518          };
519 
520          struct bool32_vec dst;
521 
522             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w));
523 
524                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
525 
526       break;
527    }
528 
529    default:
530       unreachable("unknown bit width");
531    }
532 
533    return _dst_val;
534 }
535 static nir_const_value
evaluate_ball_iequal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)536 evaluate_ball_iequal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
537                  MAYBE_UNUSED nir_const_value *_src)
538 {
539    nir_const_value _dst_val = { {0, } };
540 
541    switch (bit_size) {
542    case 32: {
543 
544 
545 
546          const struct int32_vec src0 = {
547                _src[0].i32[0],
548                _src[0].i32[1],
549             0,
550             0,
551          };
552 
553          const struct int32_vec src1 = {
554                _src[1].i32[0],
555                _src[1].i32[1],
556             0,
557             0,
558          };
559 
560          struct bool32_vec dst;
561 
562             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y));
563 
564                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
565 
566       break;
567    }
568    case 64: {
569 
570 
571 
572          const struct int64_vec src0 = {
573                _src[0].i64[0],
574                _src[0].i64[1],
575             0,
576             0,
577          };
578 
579          const struct int64_vec src1 = {
580                _src[1].i64[0],
581                _src[1].i64[1],
582             0,
583             0,
584          };
585 
586          struct bool32_vec dst;
587 
588             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y));
589 
590                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
591 
592       break;
593    }
594 
595    default:
596       unreachable("unknown bit width");
597    }
598 
599    return _dst_val;
600 }
601 static nir_const_value
evaluate_ball_iequal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)602 evaluate_ball_iequal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
603                  MAYBE_UNUSED nir_const_value *_src)
604 {
605    nir_const_value _dst_val = { {0, } };
606 
607    switch (bit_size) {
608    case 32: {
609 
610 
611 
612          const struct int32_vec src0 = {
613                _src[0].i32[0],
614                _src[0].i32[1],
615                _src[0].i32[2],
616             0,
617          };
618 
619          const struct int32_vec src1 = {
620                _src[1].i32[0],
621                _src[1].i32[1],
622                _src[1].i32[2],
623             0,
624          };
625 
626          struct bool32_vec dst;
627 
628             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z));
629 
630                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
631 
632       break;
633    }
634    case 64: {
635 
636 
637 
638          const struct int64_vec src0 = {
639                _src[0].i64[0],
640                _src[0].i64[1],
641                _src[0].i64[2],
642             0,
643          };
644 
645          const struct int64_vec src1 = {
646                _src[1].i64[0],
647                _src[1].i64[1],
648                _src[1].i64[2],
649             0,
650          };
651 
652          struct bool32_vec dst;
653 
654             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z));
655 
656                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
657 
658       break;
659    }
660 
661    default:
662       unreachable("unknown bit width");
663    }
664 
665    return _dst_val;
666 }
667 static nir_const_value
evaluate_ball_iequal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)668 evaluate_ball_iequal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
669                  MAYBE_UNUSED nir_const_value *_src)
670 {
671    nir_const_value _dst_val = { {0, } };
672 
673    switch (bit_size) {
674    case 32: {
675 
676 
677 
678          const struct int32_vec src0 = {
679                _src[0].i32[0],
680                _src[0].i32[1],
681                _src[0].i32[2],
682                _src[0].i32[3],
683          };
684 
685          const struct int32_vec src1 = {
686                _src[1].i32[0],
687                _src[1].i32[1],
688                _src[1].i32[2],
689                _src[1].i32[3],
690          };
691 
692          struct bool32_vec dst;
693 
694             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w));
695 
696                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
697 
698       break;
699    }
700    case 64: {
701 
702 
703 
704          const struct int64_vec src0 = {
705                _src[0].i64[0],
706                _src[0].i64[1],
707                _src[0].i64[2],
708                _src[0].i64[3],
709          };
710 
711          const struct int64_vec src1 = {
712                _src[1].i64[0],
713                _src[1].i64[1],
714                _src[1].i64[2],
715                _src[1].i64[3],
716          };
717 
718          struct bool32_vec dst;
719 
720             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w));
721 
722                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
723 
724       break;
725    }
726 
727    default:
728       unreachable("unknown bit width");
729    }
730 
731    return _dst_val;
732 }
733 static nir_const_value
evaluate_bany_fnequal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)734 evaluate_bany_fnequal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
735                  MAYBE_UNUSED nir_const_value *_src)
736 {
737    nir_const_value _dst_val = { {0, } };
738 
739    switch (bit_size) {
740    case 32: {
741 
742 
743 
744          const struct float32_vec src0 = {
745                _src[0].f32[0],
746                _src[0].f32[1],
747             0,
748             0,
749          };
750 
751          const struct float32_vec src1 = {
752                _src[1].f32[0],
753                _src[1].f32[1],
754             0,
755             0,
756          };
757 
758          struct bool32_vec dst;
759 
760             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y));
761 
762                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
763 
764       break;
765    }
766    case 64: {
767 
768 
769 
770          const struct float64_vec src0 = {
771                _src[0].f64[0],
772                _src[0].f64[1],
773             0,
774             0,
775          };
776 
777          const struct float64_vec src1 = {
778                _src[1].f64[0],
779                _src[1].f64[1],
780             0,
781             0,
782          };
783 
784          struct bool32_vec dst;
785 
786             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y));
787 
788                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
789 
790       break;
791    }
792 
793    default:
794       unreachable("unknown bit width");
795    }
796 
797    return _dst_val;
798 }
799 static nir_const_value
evaluate_bany_fnequal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)800 evaluate_bany_fnequal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
801                  MAYBE_UNUSED nir_const_value *_src)
802 {
803    nir_const_value _dst_val = { {0, } };
804 
805    switch (bit_size) {
806    case 32: {
807 
808 
809 
810          const struct float32_vec src0 = {
811                _src[0].f32[0],
812                _src[0].f32[1],
813                _src[0].f32[2],
814             0,
815          };
816 
817          const struct float32_vec src1 = {
818                _src[1].f32[0],
819                _src[1].f32[1],
820                _src[1].f32[2],
821             0,
822          };
823 
824          struct bool32_vec dst;
825 
826             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z));
827 
828                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
829 
830       break;
831    }
832    case 64: {
833 
834 
835 
836          const struct float64_vec src0 = {
837                _src[0].f64[0],
838                _src[0].f64[1],
839                _src[0].f64[2],
840             0,
841          };
842 
843          const struct float64_vec src1 = {
844                _src[1].f64[0],
845                _src[1].f64[1],
846                _src[1].f64[2],
847             0,
848          };
849 
850          struct bool32_vec dst;
851 
852             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z));
853 
854                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
855 
856       break;
857    }
858 
859    default:
860       unreachable("unknown bit width");
861    }
862 
863    return _dst_val;
864 }
865 static nir_const_value
evaluate_bany_fnequal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)866 evaluate_bany_fnequal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
867                  MAYBE_UNUSED nir_const_value *_src)
868 {
869    nir_const_value _dst_val = { {0, } };
870 
871    switch (bit_size) {
872    case 32: {
873 
874 
875 
876          const struct float32_vec src0 = {
877                _src[0].f32[0],
878                _src[0].f32[1],
879                _src[0].f32[2],
880                _src[0].f32[3],
881          };
882 
883          const struct float32_vec src1 = {
884                _src[1].f32[0],
885                _src[1].f32[1],
886                _src[1].f32[2],
887                _src[1].f32[3],
888          };
889 
890          struct bool32_vec dst;
891 
892             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w));
893 
894                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
895 
896       break;
897    }
898    case 64: {
899 
900 
901 
902          const struct float64_vec src0 = {
903                _src[0].f64[0],
904                _src[0].f64[1],
905                _src[0].f64[2],
906                _src[0].f64[3],
907          };
908 
909          const struct float64_vec src1 = {
910                _src[1].f64[0],
911                _src[1].f64[1],
912                _src[1].f64[2],
913                _src[1].f64[3],
914          };
915 
916          struct bool32_vec dst;
917 
918             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w));
919 
920                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
921 
922       break;
923    }
924 
925    default:
926       unreachable("unknown bit width");
927    }
928 
929    return _dst_val;
930 }
931 static nir_const_value
evaluate_bany_inequal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)932 evaluate_bany_inequal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
933                  MAYBE_UNUSED nir_const_value *_src)
934 {
935    nir_const_value _dst_val = { {0, } };
936 
937    switch (bit_size) {
938    case 32: {
939 
940 
941 
942          const struct int32_vec src0 = {
943                _src[0].i32[0],
944                _src[0].i32[1],
945             0,
946             0,
947          };
948 
949          const struct int32_vec src1 = {
950                _src[1].i32[0],
951                _src[1].i32[1],
952             0,
953             0,
954          };
955 
956          struct bool32_vec dst;
957 
958             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y));
959 
960                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
961 
962       break;
963    }
964    case 64: {
965 
966 
967 
968          const struct int64_vec src0 = {
969                _src[0].i64[0],
970                _src[0].i64[1],
971             0,
972             0,
973          };
974 
975          const struct int64_vec src1 = {
976                _src[1].i64[0],
977                _src[1].i64[1],
978             0,
979             0,
980          };
981 
982          struct bool32_vec dst;
983 
984             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y));
985 
986                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
987 
988       break;
989    }
990 
991    default:
992       unreachable("unknown bit width");
993    }
994 
995    return _dst_val;
996 }
997 static nir_const_value
evaluate_bany_inequal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)998 evaluate_bany_inequal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
999                  MAYBE_UNUSED nir_const_value *_src)
1000 {
1001    nir_const_value _dst_val = { {0, } };
1002 
1003    switch (bit_size) {
1004    case 32: {
1005 
1006 
1007 
1008          const struct int32_vec src0 = {
1009                _src[0].i32[0],
1010                _src[0].i32[1],
1011                _src[0].i32[2],
1012             0,
1013          };
1014 
1015          const struct int32_vec src1 = {
1016                _src[1].i32[0],
1017                _src[1].i32[1],
1018                _src[1].i32[2],
1019             0,
1020          };
1021 
1022          struct bool32_vec dst;
1023 
1024             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z));
1025 
1026                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
1027 
1028       break;
1029    }
1030    case 64: {
1031 
1032 
1033 
1034          const struct int64_vec src0 = {
1035                _src[0].i64[0],
1036                _src[0].i64[1],
1037                _src[0].i64[2],
1038             0,
1039          };
1040 
1041          const struct int64_vec src1 = {
1042                _src[1].i64[0],
1043                _src[1].i64[1],
1044                _src[1].i64[2],
1045             0,
1046          };
1047 
1048          struct bool32_vec dst;
1049 
1050             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z));
1051 
1052                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
1053 
1054       break;
1055    }
1056 
1057    default:
1058       unreachable("unknown bit width");
1059    }
1060 
1061    return _dst_val;
1062 }
1063 static nir_const_value
evaluate_bany_inequal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1064 evaluate_bany_inequal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1065                  MAYBE_UNUSED nir_const_value *_src)
1066 {
1067    nir_const_value _dst_val = { {0, } };
1068 
1069    switch (bit_size) {
1070    case 32: {
1071 
1072 
1073 
1074          const struct int32_vec src0 = {
1075                _src[0].i32[0],
1076                _src[0].i32[1],
1077                _src[0].i32[2],
1078                _src[0].i32[3],
1079          };
1080 
1081          const struct int32_vec src1 = {
1082                _src[1].i32[0],
1083                _src[1].i32[1],
1084                _src[1].i32[2],
1085                _src[1].i32[3],
1086          };
1087 
1088          struct bool32_vec dst;
1089 
1090             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w));
1091 
1092                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
1093 
1094       break;
1095    }
1096    case 64: {
1097 
1098 
1099 
1100          const struct int64_vec src0 = {
1101                _src[0].i64[0],
1102                _src[0].i64[1],
1103                _src[0].i64[2],
1104                _src[0].i64[3],
1105          };
1106 
1107          const struct int64_vec src1 = {
1108                _src[1].i64[0],
1109                _src[1].i64[1],
1110                _src[1].i64[2],
1111                _src[1].i64[3],
1112          };
1113 
1114          struct bool32_vec dst;
1115 
1116             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w));
1117 
1118                _dst_val.u32[0] = dst.x ? NIR_TRUE : NIR_FALSE;
1119 
1120       break;
1121    }
1122 
1123    default:
1124       unreachable("unknown bit width");
1125    }
1126 
1127    return _dst_val;
1128 }
1129 static nir_const_value
evaluate_bcsel(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1130 evaluate_bcsel(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1131                  MAYBE_UNUSED nir_const_value *_src)
1132 {
1133    nir_const_value _dst_val = { {0, } };
1134 
1135    switch (bit_size) {
1136    case 32: {
1137 
1138 
1139 
1140          for (unsigned _i = 0; _i < num_components; _i++) {
1141                   const bool src0 = _src[0].u32[_i] != 0;
1142                   const uint32_t src1 =
1143                      _src[1].u32[_i];
1144                   const uint32_t src2 =
1145                      _src[2].u32[_i];
1146 
1147                uint32_t dst = src0 ? src1 : src2;
1148 
1149                _dst_val.u32[_i] = dst;
1150          }
1151 
1152       break;
1153    }
1154    case 64: {
1155 
1156 
1157 
1158          for (unsigned _i = 0; _i < num_components; _i++) {
1159                   const bool src0 = _src[0].u32[_i] != 0;
1160                   const uint64_t src1 =
1161                      _src[1].u64[_i];
1162                   const uint64_t src2 =
1163                      _src[2].u64[_i];
1164 
1165                uint64_t dst = src0 ? src1 : src2;
1166 
1167                _dst_val.u64[_i] = dst;
1168          }
1169 
1170       break;
1171    }
1172 
1173    default:
1174       unreachable("unknown bit width");
1175    }
1176 
1177    return _dst_val;
1178 }
1179 static nir_const_value
evaluate_bfi(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1180 evaluate_bfi(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1181                  MAYBE_UNUSED nir_const_value *_src)
1182 {
1183    nir_const_value _dst_val = { {0, } };
1184 
1185    switch (bit_size) {
1186    case 32: {
1187 
1188 
1189 
1190          for (unsigned _i = 0; _i < num_components; _i++) {
1191                   const uint32_t src0 =
1192                      _src[0].u32[_i];
1193                   const uint32_t src1 =
1194                      _src[1].u32[_i];
1195                   const uint32_t src2 =
1196                      _src[2].u32[_i];
1197 
1198                uint32_t dst;
1199 
1200 
1201 unsigned mask = src0, insert = src1, base = src2;
1202 if (mask == 0) {
1203    dst = base;
1204 } else {
1205    unsigned tmp = mask;
1206    while (!(tmp & 1)) {
1207       tmp >>= 1;
1208       insert <<= 1;
1209    }
1210    dst = (base & ~mask) | (insert & mask);
1211 }
1212 
1213 
1214                _dst_val.u32[_i] = dst;
1215          }
1216 
1217       break;
1218    }
1219    case 64: {
1220 
1221 
1222 
1223          for (unsigned _i = 0; _i < num_components; _i++) {
1224                   const uint32_t src0 =
1225                      _src[0].u32[_i];
1226                   const uint32_t src1 =
1227                      _src[1].u32[_i];
1228                   const uint32_t src2 =
1229                      _src[2].u32[_i];
1230 
1231                uint32_t dst;
1232 
1233 
1234 unsigned mask = src0, insert = src1, base = src2;
1235 if (mask == 0) {
1236    dst = base;
1237 } else {
1238    unsigned tmp = mask;
1239    while (!(tmp & 1)) {
1240       tmp >>= 1;
1241       insert <<= 1;
1242    }
1243    dst = (base & ~mask) | (insert & mask);
1244 }
1245 
1246 
1247                _dst_val.u32[_i] = dst;
1248          }
1249 
1250       break;
1251    }
1252 
1253    default:
1254       unreachable("unknown bit width");
1255    }
1256 
1257    return _dst_val;
1258 }
1259 static nir_const_value
evaluate_bfm(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1260 evaluate_bfm(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1261                  MAYBE_UNUSED nir_const_value *_src)
1262 {
1263    nir_const_value _dst_val = { {0, } };
1264 
1265    switch (bit_size) {
1266    case 32: {
1267 
1268 
1269 
1270          for (unsigned _i = 0; _i < num_components; _i++) {
1271                   const int32_t src0 =
1272                      _src[0].i32[_i];
1273                   const int32_t src1 =
1274                      _src[1].i32[_i];
1275 
1276                uint32_t dst;
1277 
1278 
1279 int bits = src0, offset = src1;
1280 if (offset < 0 || bits < 0 || offset > 31 || bits > 31 || offset + bits > 32)
1281    dst = 0; /* undefined */
1282 else
1283    dst = ((1u << bits) - 1) << offset;
1284 
1285 
1286                _dst_val.u32[_i] = dst;
1287          }
1288 
1289       break;
1290    }
1291    case 64: {
1292 
1293 
1294 
1295          for (unsigned _i = 0; _i < num_components; _i++) {
1296                   const int32_t src0 =
1297                      _src[0].i32[_i];
1298                   const int32_t src1 =
1299                      _src[1].i32[_i];
1300 
1301                uint32_t dst;
1302 
1303 
1304 int bits = src0, offset = src1;
1305 if (offset < 0 || bits < 0 || offset > 31 || bits > 31 || offset + bits > 32)
1306    dst = 0; /* undefined */
1307 else
1308    dst = ((1u << bits) - 1) << offset;
1309 
1310 
1311                _dst_val.u32[_i] = dst;
1312          }
1313 
1314       break;
1315    }
1316 
1317    default:
1318       unreachable("unknown bit width");
1319    }
1320 
1321    return _dst_val;
1322 }
1323 static nir_const_value
evaluate_bit_count(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1324 evaluate_bit_count(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1325                  MAYBE_UNUSED nir_const_value *_src)
1326 {
1327    nir_const_value _dst_val = { {0, } };
1328 
1329    switch (bit_size) {
1330    case 32: {
1331 
1332 
1333 
1334          for (unsigned _i = 0; _i < num_components; _i++) {
1335                   const uint32_t src0 =
1336                      _src[0].u32[_i];
1337 
1338                uint32_t dst;
1339 
1340 
1341 dst = 0;
1342 for (unsigned bit = 0; bit < 32; bit++) {
1343    if ((src0 >> bit) & 1)
1344       dst++;
1345 }
1346 
1347 
1348                _dst_val.u32[_i] = dst;
1349          }
1350 
1351       break;
1352    }
1353    case 64: {
1354 
1355 
1356 
1357          for (unsigned _i = 0; _i < num_components; _i++) {
1358                   const uint32_t src0 =
1359                      _src[0].u32[_i];
1360 
1361                uint32_t dst;
1362 
1363 
1364 dst = 0;
1365 for (unsigned bit = 0; bit < 32; bit++) {
1366    if ((src0 >> bit) & 1)
1367       dst++;
1368 }
1369 
1370 
1371                _dst_val.u32[_i] = dst;
1372          }
1373 
1374       break;
1375    }
1376 
1377    default:
1378       unreachable("unknown bit width");
1379    }
1380 
1381    return _dst_val;
1382 }
1383 static nir_const_value
evaluate_bitfield_insert(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1384 evaluate_bitfield_insert(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1385                  MAYBE_UNUSED nir_const_value *_src)
1386 {
1387    nir_const_value _dst_val = { {0, } };
1388 
1389    switch (bit_size) {
1390    case 32: {
1391 
1392 
1393 
1394          for (unsigned _i = 0; _i < num_components; _i++) {
1395                   const uint32_t src0 =
1396                      _src[0].u32[_i];
1397                   const uint32_t src1 =
1398                      _src[1].u32[_i];
1399                   const int32_t src2 =
1400                      _src[2].i32[_i];
1401                   const int32_t src3 =
1402                      _src[3].i32[_i];
1403 
1404                uint32_t dst;
1405 
1406 
1407 unsigned base = src0, insert = src1;
1408 int offset = src2, bits = src3;
1409 if (bits == 0) {
1410    dst = 0;
1411 } else if (offset < 0 || bits < 0 || bits + offset > 32) {
1412    dst = 0;
1413 } else {
1414    unsigned mask = ((1ull << bits) - 1) << offset;
1415    dst = (base & ~mask) | ((insert << bits) & mask);
1416 }
1417 
1418 
1419                _dst_val.u32[_i] = dst;
1420          }
1421 
1422       break;
1423    }
1424    case 64: {
1425 
1426 
1427 
1428          for (unsigned _i = 0; _i < num_components; _i++) {
1429                   const uint32_t src0 =
1430                      _src[0].u32[_i];
1431                   const uint32_t src1 =
1432                      _src[1].u32[_i];
1433                   const int32_t src2 =
1434                      _src[2].i32[_i];
1435                   const int32_t src3 =
1436                      _src[3].i32[_i];
1437 
1438                uint32_t dst;
1439 
1440 
1441 unsigned base = src0, insert = src1;
1442 int offset = src2, bits = src3;
1443 if (bits == 0) {
1444    dst = 0;
1445 } else if (offset < 0 || bits < 0 || bits + offset > 32) {
1446    dst = 0;
1447 } else {
1448    unsigned mask = ((1ull << bits) - 1) << offset;
1449    dst = (base & ~mask) | ((insert << bits) & mask);
1450 }
1451 
1452 
1453                _dst_val.u32[_i] = dst;
1454          }
1455 
1456       break;
1457    }
1458 
1459    default:
1460       unreachable("unknown bit width");
1461    }
1462 
1463    return _dst_val;
1464 }
1465 static nir_const_value
evaluate_bitfield_reverse(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1466 evaluate_bitfield_reverse(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1467                  MAYBE_UNUSED nir_const_value *_src)
1468 {
1469    nir_const_value _dst_val = { {0, } };
1470 
1471    switch (bit_size) {
1472    case 32: {
1473 
1474 
1475 
1476          for (unsigned _i = 0; _i < num_components; _i++) {
1477                   const uint32_t src0 =
1478                      _src[0].u32[_i];
1479 
1480                uint32_t dst;
1481 
1482 
1483 /* we're not winning any awards for speed here, but that's ok */
1484 dst = 0;
1485 for (unsigned bit = 0; bit < 32; bit++)
1486    dst |= ((src0 >> bit) & 1) << (31 - bit);
1487 
1488 
1489                _dst_val.u32[_i] = dst;
1490          }
1491 
1492       break;
1493    }
1494    case 64: {
1495 
1496 
1497 
1498          for (unsigned _i = 0; _i < num_components; _i++) {
1499                   const uint32_t src0 =
1500                      _src[0].u32[_i];
1501 
1502                uint32_t dst;
1503 
1504 
1505 /* we're not winning any awards for speed here, but that's ok */
1506 dst = 0;
1507 for (unsigned bit = 0; bit < 32; bit++)
1508    dst |= ((src0 >> bit) & 1) << (31 - bit);
1509 
1510 
1511                _dst_val.u32[_i] = dst;
1512          }
1513 
1514       break;
1515    }
1516 
1517    default:
1518       unreachable("unknown bit width");
1519    }
1520 
1521    return _dst_val;
1522 }
1523 static nir_const_value
evaluate_d2b(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1524 evaluate_d2b(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1525                  MAYBE_UNUSED nir_const_value *_src)
1526 {
1527    nir_const_value _dst_val = { {0, } };
1528 
1529    switch (bit_size) {
1530    case 32: {
1531 
1532 
1533 
1534          for (unsigned _i = 0; _i < num_components; _i++) {
1535                   const float64_t src0 =
1536                      _src[0].f64[_i];
1537 
1538                bool32_t dst = src0 != 0.0;
1539 
1540                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
1541          }
1542 
1543       break;
1544    }
1545    case 64: {
1546 
1547 
1548 
1549          for (unsigned _i = 0; _i < num_components; _i++) {
1550                   const float64_t src0 =
1551                      _src[0].f64[_i];
1552 
1553                bool32_t dst = src0 != 0.0;
1554 
1555                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
1556          }
1557 
1558       break;
1559    }
1560 
1561    default:
1562       unreachable("unknown bit width");
1563    }
1564 
1565    return _dst_val;
1566 }
1567 static nir_const_value
evaluate_d2f(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1568 evaluate_d2f(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1569                  MAYBE_UNUSED nir_const_value *_src)
1570 {
1571    nir_const_value _dst_val = { {0, } };
1572 
1573    switch (bit_size) {
1574    case 32: {
1575 
1576 
1577 
1578          for (unsigned _i = 0; _i < num_components; _i++) {
1579                   const float64_t src0 =
1580                      _src[0].f64[_i];
1581 
1582                float32_t dst = src0;
1583 
1584                _dst_val.f32[_i] = dst;
1585          }
1586 
1587       break;
1588    }
1589    case 64: {
1590 
1591 
1592 
1593          for (unsigned _i = 0; _i < num_components; _i++) {
1594                   const float64_t src0 =
1595                      _src[0].f64[_i];
1596 
1597                float32_t dst = src0;
1598 
1599                _dst_val.f32[_i] = dst;
1600          }
1601 
1602       break;
1603    }
1604 
1605    default:
1606       unreachable("unknown bit width");
1607    }
1608 
1609    return _dst_val;
1610 }
1611 static nir_const_value
evaluate_d2i(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1612 evaluate_d2i(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1613                  MAYBE_UNUSED nir_const_value *_src)
1614 {
1615    nir_const_value _dst_val = { {0, } };
1616 
1617    switch (bit_size) {
1618    case 32: {
1619 
1620 
1621 
1622          for (unsigned _i = 0; _i < num_components; _i++) {
1623                   const float64_t src0 =
1624                      _src[0].f64[_i];
1625 
1626                int32_t dst = src0;
1627 
1628                _dst_val.i32[_i] = dst;
1629          }
1630 
1631       break;
1632    }
1633    case 64: {
1634 
1635 
1636 
1637          for (unsigned _i = 0; _i < num_components; _i++) {
1638                   const float64_t src0 =
1639                      _src[0].f64[_i];
1640 
1641                int32_t dst = src0;
1642 
1643                _dst_val.i32[_i] = dst;
1644          }
1645 
1646       break;
1647    }
1648 
1649    default:
1650       unreachable("unknown bit width");
1651    }
1652 
1653    return _dst_val;
1654 }
1655 static nir_const_value
evaluate_d2u(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1656 evaluate_d2u(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1657                  MAYBE_UNUSED nir_const_value *_src)
1658 {
1659    nir_const_value _dst_val = { {0, } };
1660 
1661    switch (bit_size) {
1662    case 32: {
1663 
1664 
1665 
1666          for (unsigned _i = 0; _i < num_components; _i++) {
1667                   const float64_t src0 =
1668                      _src[0].f64[_i];
1669 
1670                uint32_t dst = src0;
1671 
1672                _dst_val.u32[_i] = dst;
1673          }
1674 
1675       break;
1676    }
1677    case 64: {
1678 
1679 
1680 
1681          for (unsigned _i = 0; _i < num_components; _i++) {
1682                   const float64_t src0 =
1683                      _src[0].f64[_i];
1684 
1685                uint32_t dst = src0;
1686 
1687                _dst_val.u32[_i] = dst;
1688          }
1689 
1690       break;
1691    }
1692 
1693    default:
1694       unreachable("unknown bit width");
1695    }
1696 
1697    return _dst_val;
1698 }
1699 static nir_const_value
evaluate_extract_i16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1700 evaluate_extract_i16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1701                  MAYBE_UNUSED nir_const_value *_src)
1702 {
1703    nir_const_value _dst_val = { {0, } };
1704 
1705    switch (bit_size) {
1706    case 32: {
1707 
1708 
1709 
1710          for (unsigned _i = 0; _i < num_components; _i++) {
1711                   const int32_t src0 =
1712                      _src[0].i32[_i];
1713                   const int32_t src1 =
1714                      _src[1].i32[_i];
1715 
1716                int32_t dst = (int16_t)(src0 >> (src1 * 16));
1717 
1718                _dst_val.i32[_i] = dst;
1719          }
1720 
1721       break;
1722    }
1723    case 64: {
1724 
1725 
1726 
1727          for (unsigned _i = 0; _i < num_components; _i++) {
1728                   const int64_t src0 =
1729                      _src[0].i64[_i];
1730                   const int64_t src1 =
1731                      _src[1].i64[_i];
1732 
1733                int64_t dst = (int16_t)(src0 >> (src1 * 16));
1734 
1735                _dst_val.i64[_i] = dst;
1736          }
1737 
1738       break;
1739    }
1740 
1741    default:
1742       unreachable("unknown bit width");
1743    }
1744 
1745    return _dst_val;
1746 }
1747 static nir_const_value
evaluate_extract_i8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1748 evaluate_extract_i8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1749                  MAYBE_UNUSED nir_const_value *_src)
1750 {
1751    nir_const_value _dst_val = { {0, } };
1752 
1753    switch (bit_size) {
1754    case 32: {
1755 
1756 
1757 
1758          for (unsigned _i = 0; _i < num_components; _i++) {
1759                   const int32_t src0 =
1760                      _src[0].i32[_i];
1761                   const int32_t src1 =
1762                      _src[1].i32[_i];
1763 
1764                int32_t dst = (int8_t)(src0 >> (src1 * 8));
1765 
1766                _dst_val.i32[_i] = dst;
1767          }
1768 
1769       break;
1770    }
1771    case 64: {
1772 
1773 
1774 
1775          for (unsigned _i = 0; _i < num_components; _i++) {
1776                   const int64_t src0 =
1777                      _src[0].i64[_i];
1778                   const int64_t src1 =
1779                      _src[1].i64[_i];
1780 
1781                int64_t dst = (int8_t)(src0 >> (src1 * 8));
1782 
1783                _dst_val.i64[_i] = dst;
1784          }
1785 
1786       break;
1787    }
1788 
1789    default:
1790       unreachable("unknown bit width");
1791    }
1792 
1793    return _dst_val;
1794 }
1795 static nir_const_value
evaluate_extract_u16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1796 evaluate_extract_u16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1797                  MAYBE_UNUSED nir_const_value *_src)
1798 {
1799    nir_const_value _dst_val = { {0, } };
1800 
1801    switch (bit_size) {
1802    case 32: {
1803 
1804 
1805 
1806          for (unsigned _i = 0; _i < num_components; _i++) {
1807                   const uint32_t src0 =
1808                      _src[0].u32[_i];
1809                   const uint32_t src1 =
1810                      _src[1].u32[_i];
1811 
1812                uint32_t dst = (uint16_t)(src0 >> (src1 * 16));
1813 
1814                _dst_val.u32[_i] = dst;
1815          }
1816 
1817       break;
1818    }
1819    case 64: {
1820 
1821 
1822 
1823          for (unsigned _i = 0; _i < num_components; _i++) {
1824                   const uint64_t src0 =
1825                      _src[0].u64[_i];
1826                   const uint64_t src1 =
1827                      _src[1].u64[_i];
1828 
1829                uint64_t dst = (uint16_t)(src0 >> (src1 * 16));
1830 
1831                _dst_val.u64[_i] = dst;
1832          }
1833 
1834       break;
1835    }
1836 
1837    default:
1838       unreachable("unknown bit width");
1839    }
1840 
1841    return _dst_val;
1842 }
1843 static nir_const_value
evaluate_extract_u8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1844 evaluate_extract_u8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1845                  MAYBE_UNUSED nir_const_value *_src)
1846 {
1847    nir_const_value _dst_val = { {0, } };
1848 
1849    switch (bit_size) {
1850    case 32: {
1851 
1852 
1853 
1854          for (unsigned _i = 0; _i < num_components; _i++) {
1855                   const uint32_t src0 =
1856                      _src[0].u32[_i];
1857                   const uint32_t src1 =
1858                      _src[1].u32[_i];
1859 
1860                uint32_t dst = (uint8_t)(src0 >> (src1 * 8));
1861 
1862                _dst_val.u32[_i] = dst;
1863          }
1864 
1865       break;
1866    }
1867    case 64: {
1868 
1869 
1870 
1871          for (unsigned _i = 0; _i < num_components; _i++) {
1872                   const uint64_t src0 =
1873                      _src[0].u64[_i];
1874                   const uint64_t src1 =
1875                      _src[1].u64[_i];
1876 
1877                uint64_t dst = (uint8_t)(src0 >> (src1 * 8));
1878 
1879                _dst_val.u64[_i] = dst;
1880          }
1881 
1882       break;
1883    }
1884 
1885    default:
1886       unreachable("unknown bit width");
1887    }
1888 
1889    return _dst_val;
1890 }
1891 static nir_const_value
evaluate_f2b(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1892 evaluate_f2b(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1893                  MAYBE_UNUSED nir_const_value *_src)
1894 {
1895    nir_const_value _dst_val = { {0, } };
1896 
1897    switch (bit_size) {
1898    case 32: {
1899 
1900 
1901 
1902          for (unsigned _i = 0; _i < num_components; _i++) {
1903                   const float32_t src0 =
1904                      _src[0].f32[_i];
1905 
1906                bool32_t dst = src0 != 0.0f;
1907 
1908                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
1909          }
1910 
1911       break;
1912    }
1913    case 64: {
1914 
1915 
1916 
1917          for (unsigned _i = 0; _i < num_components; _i++) {
1918                   const float32_t src0 =
1919                      _src[0].f32[_i];
1920 
1921                bool32_t dst = src0 != 0.0f;
1922 
1923                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
1924          }
1925 
1926       break;
1927    }
1928 
1929    default:
1930       unreachable("unknown bit width");
1931    }
1932 
1933    return _dst_val;
1934 }
1935 static nir_const_value
evaluate_f2d(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1936 evaluate_f2d(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1937                  MAYBE_UNUSED nir_const_value *_src)
1938 {
1939    nir_const_value _dst_val = { {0, } };
1940 
1941    switch (bit_size) {
1942    case 32: {
1943 
1944 
1945 
1946          for (unsigned _i = 0; _i < num_components; _i++) {
1947                   const float32_t src0 =
1948                      _src[0].f32[_i];
1949 
1950                float64_t dst = src0;
1951 
1952                _dst_val.f64[_i] = dst;
1953          }
1954 
1955       break;
1956    }
1957    case 64: {
1958 
1959 
1960 
1961          for (unsigned _i = 0; _i < num_components; _i++) {
1962                   const float32_t src0 =
1963                      _src[0].f32[_i];
1964 
1965                float64_t dst = src0;
1966 
1967                _dst_val.f64[_i] = dst;
1968          }
1969 
1970       break;
1971    }
1972 
1973    default:
1974       unreachable("unknown bit width");
1975    }
1976 
1977    return _dst_val;
1978 }
1979 static nir_const_value
evaluate_f2i(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)1980 evaluate_f2i(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
1981                  MAYBE_UNUSED nir_const_value *_src)
1982 {
1983    nir_const_value _dst_val = { {0, } };
1984 
1985    switch (bit_size) {
1986    case 32: {
1987 
1988 
1989 
1990          for (unsigned _i = 0; _i < num_components; _i++) {
1991                   const float32_t src0 =
1992                      _src[0].f32[_i];
1993 
1994                int32_t dst = src0;
1995 
1996                _dst_val.i32[_i] = dst;
1997          }
1998 
1999       break;
2000    }
2001    case 64: {
2002 
2003 
2004 
2005          for (unsigned _i = 0; _i < num_components; _i++) {
2006                   const float32_t src0 =
2007                      _src[0].f32[_i];
2008 
2009                int32_t dst = src0;
2010 
2011                _dst_val.i32[_i] = dst;
2012          }
2013 
2014       break;
2015    }
2016 
2017    default:
2018       unreachable("unknown bit width");
2019    }
2020 
2021    return _dst_val;
2022 }
2023 static nir_const_value
evaluate_f2u(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2024 evaluate_f2u(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2025                  MAYBE_UNUSED nir_const_value *_src)
2026 {
2027    nir_const_value _dst_val = { {0, } };
2028 
2029    switch (bit_size) {
2030    case 32: {
2031 
2032 
2033 
2034          for (unsigned _i = 0; _i < num_components; _i++) {
2035                   const float32_t src0 =
2036                      _src[0].f32[_i];
2037 
2038                uint32_t dst = src0;
2039 
2040                _dst_val.u32[_i] = dst;
2041          }
2042 
2043       break;
2044    }
2045    case 64: {
2046 
2047 
2048 
2049          for (unsigned _i = 0; _i < num_components; _i++) {
2050                   const float32_t src0 =
2051                      _src[0].f32[_i];
2052 
2053                uint32_t dst = src0;
2054 
2055                _dst_val.u32[_i] = dst;
2056          }
2057 
2058       break;
2059    }
2060 
2061    default:
2062       unreachable("unknown bit width");
2063    }
2064 
2065    return _dst_val;
2066 }
2067 static nir_const_value
evaluate_fabs(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2068 evaluate_fabs(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2069                  MAYBE_UNUSED nir_const_value *_src)
2070 {
2071    nir_const_value _dst_val = { {0, } };
2072 
2073    switch (bit_size) {
2074    case 32: {
2075 
2076 
2077 
2078          for (unsigned _i = 0; _i < num_components; _i++) {
2079                   const float32_t src0 =
2080                      _src[0].f32[_i];
2081 
2082                float32_t dst = bit_size == 64 ? fabs(src0) : fabsf(src0);
2083 
2084                _dst_val.f32[_i] = dst;
2085          }
2086 
2087       break;
2088    }
2089    case 64: {
2090 
2091 
2092 
2093          for (unsigned _i = 0; _i < num_components; _i++) {
2094                   const float64_t src0 =
2095                      _src[0].f64[_i];
2096 
2097                float64_t dst = bit_size == 64 ? fabs(src0) : fabsf(src0);
2098 
2099                _dst_val.f64[_i] = dst;
2100          }
2101 
2102       break;
2103    }
2104 
2105    default:
2106       unreachable("unknown bit width");
2107    }
2108 
2109    return _dst_val;
2110 }
2111 static nir_const_value
evaluate_fadd(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2112 evaluate_fadd(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2113                  MAYBE_UNUSED nir_const_value *_src)
2114 {
2115    nir_const_value _dst_val = { {0, } };
2116 
2117    switch (bit_size) {
2118    case 32: {
2119 
2120 
2121 
2122          for (unsigned _i = 0; _i < num_components; _i++) {
2123                   const float32_t src0 =
2124                      _src[0].f32[_i];
2125                   const float32_t src1 =
2126                      _src[1].f32[_i];
2127 
2128                float32_t dst = src0 + src1;
2129 
2130                _dst_val.f32[_i] = dst;
2131          }
2132 
2133       break;
2134    }
2135    case 64: {
2136 
2137 
2138 
2139          for (unsigned _i = 0; _i < num_components; _i++) {
2140                   const float64_t src0 =
2141                      _src[0].f64[_i];
2142                   const float64_t src1 =
2143                      _src[1].f64[_i];
2144 
2145                float64_t dst = src0 + src1;
2146 
2147                _dst_val.f64[_i] = dst;
2148          }
2149 
2150       break;
2151    }
2152 
2153    default:
2154       unreachable("unknown bit width");
2155    }
2156 
2157    return _dst_val;
2158 }
2159 static nir_const_value
evaluate_fall_equal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2160 evaluate_fall_equal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2161                  MAYBE_UNUSED nir_const_value *_src)
2162 {
2163    nir_const_value _dst_val = { {0, } };
2164 
2165    switch (bit_size) {
2166    case 32: {
2167 
2168 
2169 
2170          const struct float32_vec src0 = {
2171                _src[0].f32[0],
2172                _src[0].f32[1],
2173             0,
2174             0,
2175          };
2176 
2177          const struct float32_vec src1 = {
2178                _src[1].f32[0],
2179                _src[1].f32[1],
2180             0,
2181             0,
2182          };
2183 
2184          struct float32_vec dst;
2185 
2186             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y)) ? 1.0f : 0.0f;
2187 
2188                _dst_val.f32[0] = dst.x;
2189 
2190       break;
2191    }
2192    case 64: {
2193 
2194 
2195 
2196          const struct float32_vec src0 = {
2197                _src[0].f32[0],
2198                _src[0].f32[1],
2199             0,
2200             0,
2201          };
2202 
2203          const struct float32_vec src1 = {
2204                _src[1].f32[0],
2205                _src[1].f32[1],
2206             0,
2207             0,
2208          };
2209 
2210          struct float32_vec dst;
2211 
2212             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y)) ? 1.0f : 0.0f;
2213 
2214                _dst_val.f32[0] = dst.x;
2215 
2216       break;
2217    }
2218 
2219    default:
2220       unreachable("unknown bit width");
2221    }
2222 
2223    return _dst_val;
2224 }
2225 static nir_const_value
evaluate_fall_equal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2226 evaluate_fall_equal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2227                  MAYBE_UNUSED nir_const_value *_src)
2228 {
2229    nir_const_value _dst_val = { {0, } };
2230 
2231    switch (bit_size) {
2232    case 32: {
2233 
2234 
2235 
2236          const struct float32_vec src0 = {
2237                _src[0].f32[0],
2238                _src[0].f32[1],
2239                _src[0].f32[2],
2240             0,
2241          };
2242 
2243          const struct float32_vec src1 = {
2244                _src[1].f32[0],
2245                _src[1].f32[1],
2246                _src[1].f32[2],
2247             0,
2248          };
2249 
2250          struct float32_vec dst;
2251 
2252             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z)) ? 1.0f : 0.0f;
2253 
2254                _dst_val.f32[0] = dst.x;
2255 
2256       break;
2257    }
2258    case 64: {
2259 
2260 
2261 
2262          const struct float32_vec src0 = {
2263                _src[0].f32[0],
2264                _src[0].f32[1],
2265                _src[0].f32[2],
2266             0,
2267          };
2268 
2269          const struct float32_vec src1 = {
2270                _src[1].f32[0],
2271                _src[1].f32[1],
2272                _src[1].f32[2],
2273             0,
2274          };
2275 
2276          struct float32_vec dst;
2277 
2278             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z)) ? 1.0f : 0.0f;
2279 
2280                _dst_val.f32[0] = dst.x;
2281 
2282       break;
2283    }
2284 
2285    default:
2286       unreachable("unknown bit width");
2287    }
2288 
2289    return _dst_val;
2290 }
2291 static nir_const_value
evaluate_fall_equal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2292 evaluate_fall_equal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2293                  MAYBE_UNUSED nir_const_value *_src)
2294 {
2295    nir_const_value _dst_val = { {0, } };
2296 
2297    switch (bit_size) {
2298    case 32: {
2299 
2300 
2301 
2302          const struct float32_vec src0 = {
2303                _src[0].f32[0],
2304                _src[0].f32[1],
2305                _src[0].f32[2],
2306                _src[0].f32[3],
2307          };
2308 
2309          const struct float32_vec src1 = {
2310                _src[1].f32[0],
2311                _src[1].f32[1],
2312                _src[1].f32[2],
2313                _src[1].f32[3],
2314          };
2315 
2316          struct float32_vec dst;
2317 
2318             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w)) ? 1.0f : 0.0f;
2319 
2320                _dst_val.f32[0] = dst.x;
2321 
2322       break;
2323    }
2324    case 64: {
2325 
2326 
2327 
2328          const struct float32_vec src0 = {
2329                _src[0].f32[0],
2330                _src[0].f32[1],
2331                _src[0].f32[2],
2332                _src[0].f32[3],
2333          };
2334 
2335          const struct float32_vec src1 = {
2336                _src[1].f32[0],
2337                _src[1].f32[1],
2338                _src[1].f32[2],
2339                _src[1].f32[3],
2340          };
2341 
2342          struct float32_vec dst;
2343 
2344             dst.x = dst.y = dst.z = dst.w = ((src0.x == src1.x) && (src0.y == src1.y) && (src0.z == src1.z) && (src0.w == src1.w)) ? 1.0f : 0.0f;
2345 
2346                _dst_val.f32[0] = dst.x;
2347 
2348       break;
2349    }
2350 
2351    default:
2352       unreachable("unknown bit width");
2353    }
2354 
2355    return _dst_val;
2356 }
2357 static nir_const_value
evaluate_fand(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2358 evaluate_fand(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2359                  MAYBE_UNUSED nir_const_value *_src)
2360 {
2361    nir_const_value _dst_val = { {0, } };
2362 
2363    switch (bit_size) {
2364    case 32: {
2365 
2366 
2367 
2368          for (unsigned _i = 0; _i < num_components; _i++) {
2369                   const float32_t src0 =
2370                      _src[0].f32[_i];
2371                   const float32_t src1 =
2372                      _src[1].f32[_i];
2373 
2374                float32_t dst = ((src0 != 0.0f) && (src1 != 0.0f)) ? 1.0f : 0.0f;
2375 
2376                _dst_val.f32[_i] = dst;
2377          }
2378 
2379       break;
2380    }
2381    case 64: {
2382 
2383 
2384 
2385          for (unsigned _i = 0; _i < num_components; _i++) {
2386                   const float32_t src0 =
2387                      _src[0].f32[_i];
2388                   const float32_t src1 =
2389                      _src[1].f32[_i];
2390 
2391                float32_t dst = ((src0 != 0.0f) && (src1 != 0.0f)) ? 1.0f : 0.0f;
2392 
2393                _dst_val.f32[_i] = dst;
2394          }
2395 
2396       break;
2397    }
2398 
2399    default:
2400       unreachable("unknown bit width");
2401    }
2402 
2403    return _dst_val;
2404 }
2405 static nir_const_value
evaluate_fany_nequal2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2406 evaluate_fany_nequal2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2407                  MAYBE_UNUSED nir_const_value *_src)
2408 {
2409    nir_const_value _dst_val = { {0, } };
2410 
2411    switch (bit_size) {
2412    case 32: {
2413 
2414 
2415 
2416          const struct float32_vec src0 = {
2417                _src[0].f32[0],
2418                _src[0].f32[1],
2419             0,
2420             0,
2421          };
2422 
2423          const struct float32_vec src1 = {
2424                _src[1].f32[0],
2425                _src[1].f32[1],
2426             0,
2427             0,
2428          };
2429 
2430          struct float32_vec dst;
2431 
2432             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y)) ? 1.0f : 0.0f;
2433 
2434                _dst_val.f32[0] = dst.x;
2435 
2436       break;
2437    }
2438    case 64: {
2439 
2440 
2441 
2442          const struct float32_vec src0 = {
2443                _src[0].f32[0],
2444                _src[0].f32[1],
2445             0,
2446             0,
2447          };
2448 
2449          const struct float32_vec src1 = {
2450                _src[1].f32[0],
2451                _src[1].f32[1],
2452             0,
2453             0,
2454          };
2455 
2456          struct float32_vec dst;
2457 
2458             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y)) ? 1.0f : 0.0f;
2459 
2460                _dst_val.f32[0] = dst.x;
2461 
2462       break;
2463    }
2464 
2465    default:
2466       unreachable("unknown bit width");
2467    }
2468 
2469    return _dst_val;
2470 }
2471 static nir_const_value
evaluate_fany_nequal3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2472 evaluate_fany_nequal3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2473                  MAYBE_UNUSED nir_const_value *_src)
2474 {
2475    nir_const_value _dst_val = { {0, } };
2476 
2477    switch (bit_size) {
2478    case 32: {
2479 
2480 
2481 
2482          const struct float32_vec src0 = {
2483                _src[0].f32[0],
2484                _src[0].f32[1],
2485                _src[0].f32[2],
2486             0,
2487          };
2488 
2489          const struct float32_vec src1 = {
2490                _src[1].f32[0],
2491                _src[1].f32[1],
2492                _src[1].f32[2],
2493             0,
2494          };
2495 
2496          struct float32_vec dst;
2497 
2498             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z)) ? 1.0f : 0.0f;
2499 
2500                _dst_val.f32[0] = dst.x;
2501 
2502       break;
2503    }
2504    case 64: {
2505 
2506 
2507 
2508          const struct float32_vec src0 = {
2509                _src[0].f32[0],
2510                _src[0].f32[1],
2511                _src[0].f32[2],
2512             0,
2513          };
2514 
2515          const struct float32_vec src1 = {
2516                _src[1].f32[0],
2517                _src[1].f32[1],
2518                _src[1].f32[2],
2519             0,
2520          };
2521 
2522          struct float32_vec dst;
2523 
2524             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z)) ? 1.0f : 0.0f;
2525 
2526                _dst_val.f32[0] = dst.x;
2527 
2528       break;
2529    }
2530 
2531    default:
2532       unreachable("unknown bit width");
2533    }
2534 
2535    return _dst_val;
2536 }
2537 static nir_const_value
evaluate_fany_nequal4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2538 evaluate_fany_nequal4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2539                  MAYBE_UNUSED nir_const_value *_src)
2540 {
2541    nir_const_value _dst_val = { {0, } };
2542 
2543    switch (bit_size) {
2544    case 32: {
2545 
2546 
2547 
2548          const struct float32_vec src0 = {
2549                _src[0].f32[0],
2550                _src[0].f32[1],
2551                _src[0].f32[2],
2552                _src[0].f32[3],
2553          };
2554 
2555          const struct float32_vec src1 = {
2556                _src[1].f32[0],
2557                _src[1].f32[1],
2558                _src[1].f32[2],
2559                _src[1].f32[3],
2560          };
2561 
2562          struct float32_vec dst;
2563 
2564             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w)) ? 1.0f : 0.0f;
2565 
2566                _dst_val.f32[0] = dst.x;
2567 
2568       break;
2569    }
2570    case 64: {
2571 
2572 
2573 
2574          const struct float32_vec src0 = {
2575                _src[0].f32[0],
2576                _src[0].f32[1],
2577                _src[0].f32[2],
2578                _src[0].f32[3],
2579          };
2580 
2581          const struct float32_vec src1 = {
2582                _src[1].f32[0],
2583                _src[1].f32[1],
2584                _src[1].f32[2],
2585                _src[1].f32[3],
2586          };
2587 
2588          struct float32_vec dst;
2589 
2590             dst.x = dst.y = dst.z = dst.w = ((src0.x != src1.x) || (src0.y != src1.y) || (src0.z != src1.z) || (src0.w != src1.w)) ? 1.0f : 0.0f;
2591 
2592                _dst_val.f32[0] = dst.x;
2593 
2594       break;
2595    }
2596 
2597    default:
2598       unreachable("unknown bit width");
2599    }
2600 
2601    return _dst_val;
2602 }
2603 static nir_const_value
evaluate_fceil(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2604 evaluate_fceil(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2605                  MAYBE_UNUSED nir_const_value *_src)
2606 {
2607    nir_const_value _dst_val = { {0, } };
2608 
2609    switch (bit_size) {
2610    case 32: {
2611 
2612 
2613 
2614          for (unsigned _i = 0; _i < num_components; _i++) {
2615                   const float32_t src0 =
2616                      _src[0].f32[_i];
2617 
2618                float32_t dst = bit_size == 64 ? ceil(src0) : ceilf(src0);
2619 
2620                _dst_val.f32[_i] = dst;
2621          }
2622 
2623       break;
2624    }
2625    case 64: {
2626 
2627 
2628 
2629          for (unsigned _i = 0; _i < num_components; _i++) {
2630                   const float64_t src0 =
2631                      _src[0].f64[_i];
2632 
2633                float64_t dst = bit_size == 64 ? ceil(src0) : ceilf(src0);
2634 
2635                _dst_val.f64[_i] = dst;
2636          }
2637 
2638       break;
2639    }
2640 
2641    default:
2642       unreachable("unknown bit width");
2643    }
2644 
2645    return _dst_val;
2646 }
2647 static nir_const_value
evaluate_fcos(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2648 evaluate_fcos(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2649                  MAYBE_UNUSED nir_const_value *_src)
2650 {
2651    nir_const_value _dst_val = { {0, } };
2652 
2653    switch (bit_size) {
2654    case 32: {
2655 
2656 
2657 
2658          for (unsigned _i = 0; _i < num_components; _i++) {
2659                   const float32_t src0 =
2660                      _src[0].f32[_i];
2661 
2662                float32_t dst = bit_size == 64 ? cos(src0) : cosf(src0);
2663 
2664                _dst_val.f32[_i] = dst;
2665          }
2666 
2667       break;
2668    }
2669    case 64: {
2670 
2671 
2672 
2673          for (unsigned _i = 0; _i < num_components; _i++) {
2674                   const float64_t src0 =
2675                      _src[0].f64[_i];
2676 
2677                float64_t dst = bit_size == 64 ? cos(src0) : cosf(src0);
2678 
2679                _dst_val.f64[_i] = dst;
2680          }
2681 
2682       break;
2683    }
2684 
2685    default:
2686       unreachable("unknown bit width");
2687    }
2688 
2689    return _dst_val;
2690 }
2691 static nir_const_value
evaluate_fcsel(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2692 evaluate_fcsel(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2693                  MAYBE_UNUSED nir_const_value *_src)
2694 {
2695    nir_const_value _dst_val = { {0, } };
2696 
2697    switch (bit_size) {
2698    case 32: {
2699 
2700 
2701 
2702          for (unsigned _i = 0; _i < num_components; _i++) {
2703                   const float32_t src0 =
2704                      _src[0].f32[_i];
2705                   const float32_t src1 =
2706                      _src[1].f32[_i];
2707                   const float32_t src2 =
2708                      _src[2].f32[_i];
2709 
2710                float32_t dst = (src0 != 0.0f) ? src1 : src2;
2711 
2712                _dst_val.f32[_i] = dst;
2713          }
2714 
2715       break;
2716    }
2717    case 64: {
2718 
2719 
2720 
2721          for (unsigned _i = 0; _i < num_components; _i++) {
2722                   const float32_t src0 =
2723                      _src[0].f32[_i];
2724                   const float32_t src1 =
2725                      _src[1].f32[_i];
2726                   const float32_t src2 =
2727                      _src[2].f32[_i];
2728 
2729                float32_t dst = (src0 != 0.0f) ? src1 : src2;
2730 
2731                _dst_val.f32[_i] = dst;
2732          }
2733 
2734       break;
2735    }
2736 
2737    default:
2738       unreachable("unknown bit width");
2739    }
2740 
2741    return _dst_val;
2742 }
2743 static nir_const_value
evaluate_fddx(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2744 evaluate_fddx(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2745                  MAYBE_UNUSED nir_const_value *_src)
2746 {
2747    nir_const_value _dst_val = { {0, } };
2748 
2749    switch (bit_size) {
2750    case 32: {
2751 
2752 
2753 
2754          for (unsigned _i = 0; _i < num_components; _i++) {
2755 
2756                float32_t dst = 0.0;
2757 
2758                _dst_val.f32[_i] = dst;
2759          }
2760 
2761       break;
2762    }
2763    case 64: {
2764 
2765 
2766 
2767          for (unsigned _i = 0; _i < num_components; _i++) {
2768 
2769                float64_t dst = 0.0;
2770 
2771                _dst_val.f64[_i] = dst;
2772          }
2773 
2774       break;
2775    }
2776 
2777    default:
2778       unreachable("unknown bit width");
2779    }
2780 
2781    return _dst_val;
2782 }
2783 static nir_const_value
evaluate_fddx_coarse(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2784 evaluate_fddx_coarse(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2785                  MAYBE_UNUSED nir_const_value *_src)
2786 {
2787    nir_const_value _dst_val = { {0, } };
2788 
2789    switch (bit_size) {
2790    case 32: {
2791 
2792 
2793 
2794          for (unsigned _i = 0; _i < num_components; _i++) {
2795 
2796                float32_t dst = 0.0;
2797 
2798                _dst_val.f32[_i] = dst;
2799          }
2800 
2801       break;
2802    }
2803    case 64: {
2804 
2805 
2806 
2807          for (unsigned _i = 0; _i < num_components; _i++) {
2808 
2809                float64_t dst = 0.0;
2810 
2811                _dst_val.f64[_i] = dst;
2812          }
2813 
2814       break;
2815    }
2816 
2817    default:
2818       unreachable("unknown bit width");
2819    }
2820 
2821    return _dst_val;
2822 }
2823 static nir_const_value
evaluate_fddx_fine(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2824 evaluate_fddx_fine(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2825                  MAYBE_UNUSED nir_const_value *_src)
2826 {
2827    nir_const_value _dst_val = { {0, } };
2828 
2829    switch (bit_size) {
2830    case 32: {
2831 
2832 
2833 
2834          for (unsigned _i = 0; _i < num_components; _i++) {
2835 
2836                float32_t dst = 0.0;
2837 
2838                _dst_val.f32[_i] = dst;
2839          }
2840 
2841       break;
2842    }
2843    case 64: {
2844 
2845 
2846 
2847          for (unsigned _i = 0; _i < num_components; _i++) {
2848 
2849                float64_t dst = 0.0;
2850 
2851                _dst_val.f64[_i] = dst;
2852          }
2853 
2854       break;
2855    }
2856 
2857    default:
2858       unreachable("unknown bit width");
2859    }
2860 
2861    return _dst_val;
2862 }
2863 static nir_const_value
evaluate_fddy(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2864 evaluate_fddy(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2865                  MAYBE_UNUSED nir_const_value *_src)
2866 {
2867    nir_const_value _dst_val = { {0, } };
2868 
2869    switch (bit_size) {
2870    case 32: {
2871 
2872 
2873 
2874          for (unsigned _i = 0; _i < num_components; _i++) {
2875 
2876                float32_t dst = 0.0;
2877 
2878                _dst_val.f32[_i] = dst;
2879          }
2880 
2881       break;
2882    }
2883    case 64: {
2884 
2885 
2886 
2887          for (unsigned _i = 0; _i < num_components; _i++) {
2888 
2889                float64_t dst = 0.0;
2890 
2891                _dst_val.f64[_i] = dst;
2892          }
2893 
2894       break;
2895    }
2896 
2897    default:
2898       unreachable("unknown bit width");
2899    }
2900 
2901    return _dst_val;
2902 }
2903 static nir_const_value
evaluate_fddy_coarse(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2904 evaluate_fddy_coarse(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2905                  MAYBE_UNUSED nir_const_value *_src)
2906 {
2907    nir_const_value _dst_val = { {0, } };
2908 
2909    switch (bit_size) {
2910    case 32: {
2911 
2912 
2913 
2914          for (unsigned _i = 0; _i < num_components; _i++) {
2915 
2916                float32_t dst = 0.0;
2917 
2918                _dst_val.f32[_i] = dst;
2919          }
2920 
2921       break;
2922    }
2923    case 64: {
2924 
2925 
2926 
2927          for (unsigned _i = 0; _i < num_components; _i++) {
2928 
2929                float64_t dst = 0.0;
2930 
2931                _dst_val.f64[_i] = dst;
2932          }
2933 
2934       break;
2935    }
2936 
2937    default:
2938       unreachable("unknown bit width");
2939    }
2940 
2941    return _dst_val;
2942 }
2943 static nir_const_value
evaluate_fddy_fine(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2944 evaluate_fddy_fine(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2945                  MAYBE_UNUSED nir_const_value *_src)
2946 {
2947    nir_const_value _dst_val = { {0, } };
2948 
2949    switch (bit_size) {
2950    case 32: {
2951 
2952 
2953 
2954          for (unsigned _i = 0; _i < num_components; _i++) {
2955 
2956                float32_t dst = 0.0;
2957 
2958                _dst_val.f32[_i] = dst;
2959          }
2960 
2961       break;
2962    }
2963    case 64: {
2964 
2965 
2966 
2967          for (unsigned _i = 0; _i < num_components; _i++) {
2968 
2969                float64_t dst = 0.0;
2970 
2971                _dst_val.f64[_i] = dst;
2972          }
2973 
2974       break;
2975    }
2976 
2977    default:
2978       unreachable("unknown bit width");
2979    }
2980 
2981    return _dst_val;
2982 }
2983 static nir_const_value
evaluate_fdiv(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)2984 evaluate_fdiv(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2985                  MAYBE_UNUSED nir_const_value *_src)
2986 {
2987    nir_const_value _dst_val = { {0, } };
2988 
2989    switch (bit_size) {
2990    case 32: {
2991 
2992 
2993 
2994          for (unsigned _i = 0; _i < num_components; _i++) {
2995                   const float32_t src0 =
2996                      _src[0].f32[_i];
2997                   const float32_t src1 =
2998                      _src[1].f32[_i];
2999 
3000                float32_t dst = src0 / src1;
3001 
3002                _dst_val.f32[_i] = dst;
3003          }
3004 
3005       break;
3006    }
3007    case 64: {
3008 
3009 
3010 
3011          for (unsigned _i = 0; _i < num_components; _i++) {
3012                   const float64_t src0 =
3013                      _src[0].f64[_i];
3014                   const float64_t src1 =
3015                      _src[1].f64[_i];
3016 
3017                float64_t dst = src0 / src1;
3018 
3019                _dst_val.f64[_i] = dst;
3020          }
3021 
3022       break;
3023    }
3024 
3025    default:
3026       unreachable("unknown bit width");
3027    }
3028 
3029    return _dst_val;
3030 }
3031 static nir_const_value
evaluate_fdot2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3032 evaluate_fdot2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3033                  MAYBE_UNUSED nir_const_value *_src)
3034 {
3035    nir_const_value _dst_val = { {0, } };
3036 
3037    switch (bit_size) {
3038    case 32: {
3039 
3040 
3041 
3042          const struct float32_vec src0 = {
3043                _src[0].f32[0],
3044                _src[0].f32[1],
3045             0,
3046             0,
3047          };
3048 
3049          const struct float32_vec src1 = {
3050                _src[1].f32[0],
3051                _src[1].f32[1],
3052             0,
3053             0,
3054          };
3055 
3056          struct float32_vec dst;
3057 
3058             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y));
3059 
3060                _dst_val.f32[0] = dst.x;
3061 
3062       break;
3063    }
3064    case 64: {
3065 
3066 
3067 
3068          const struct float64_vec src0 = {
3069                _src[0].f64[0],
3070                _src[0].f64[1],
3071             0,
3072             0,
3073          };
3074 
3075          const struct float64_vec src1 = {
3076                _src[1].f64[0],
3077                _src[1].f64[1],
3078             0,
3079             0,
3080          };
3081 
3082          struct float64_vec dst;
3083 
3084             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y));
3085 
3086                _dst_val.f64[0] = dst.x;
3087 
3088       break;
3089    }
3090 
3091    default:
3092       unreachable("unknown bit width");
3093    }
3094 
3095    return _dst_val;
3096 }
3097 static nir_const_value
evaluate_fdot3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3098 evaluate_fdot3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3099                  MAYBE_UNUSED nir_const_value *_src)
3100 {
3101    nir_const_value _dst_val = { {0, } };
3102 
3103    switch (bit_size) {
3104    case 32: {
3105 
3106 
3107 
3108          const struct float32_vec src0 = {
3109                _src[0].f32[0],
3110                _src[0].f32[1],
3111                _src[0].f32[2],
3112             0,
3113          };
3114 
3115          const struct float32_vec src1 = {
3116                _src[1].f32[0],
3117                _src[1].f32[1],
3118                _src[1].f32[2],
3119             0,
3120          };
3121 
3122          struct float32_vec dst;
3123 
3124             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z));
3125 
3126                _dst_val.f32[0] = dst.x;
3127 
3128       break;
3129    }
3130    case 64: {
3131 
3132 
3133 
3134          const struct float64_vec src0 = {
3135                _src[0].f64[0],
3136                _src[0].f64[1],
3137                _src[0].f64[2],
3138             0,
3139          };
3140 
3141          const struct float64_vec src1 = {
3142                _src[1].f64[0],
3143                _src[1].f64[1],
3144                _src[1].f64[2],
3145             0,
3146          };
3147 
3148          struct float64_vec dst;
3149 
3150             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z));
3151 
3152                _dst_val.f64[0] = dst.x;
3153 
3154       break;
3155    }
3156 
3157    default:
3158       unreachable("unknown bit width");
3159    }
3160 
3161    return _dst_val;
3162 }
3163 static nir_const_value
evaluate_fdot4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3164 evaluate_fdot4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3165                  MAYBE_UNUSED nir_const_value *_src)
3166 {
3167    nir_const_value _dst_val = { {0, } };
3168 
3169    switch (bit_size) {
3170    case 32: {
3171 
3172 
3173 
3174          const struct float32_vec src0 = {
3175                _src[0].f32[0],
3176                _src[0].f32[1],
3177                _src[0].f32[2],
3178                _src[0].f32[3],
3179          };
3180 
3181          const struct float32_vec src1 = {
3182                _src[1].f32[0],
3183                _src[1].f32[1],
3184                _src[1].f32[2],
3185                _src[1].f32[3],
3186          };
3187 
3188          struct float32_vec dst;
3189 
3190             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + (src0.w * src1.w));
3191 
3192                _dst_val.f32[0] = dst.x;
3193 
3194       break;
3195    }
3196    case 64: {
3197 
3198 
3199 
3200          const struct float64_vec src0 = {
3201                _src[0].f64[0],
3202                _src[0].f64[1],
3203                _src[0].f64[2],
3204                _src[0].f64[3],
3205          };
3206 
3207          const struct float64_vec src1 = {
3208                _src[1].f64[0],
3209                _src[1].f64[1],
3210                _src[1].f64[2],
3211                _src[1].f64[3],
3212          };
3213 
3214          struct float64_vec dst;
3215 
3216             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + (src0.w * src1.w));
3217 
3218                _dst_val.f64[0] = dst.x;
3219 
3220       break;
3221    }
3222 
3223    default:
3224       unreachable("unknown bit width");
3225    }
3226 
3227    return _dst_val;
3228 }
3229 static nir_const_value
evaluate_fdot_replicated2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3230 evaluate_fdot_replicated2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3231                  MAYBE_UNUSED nir_const_value *_src)
3232 {
3233    nir_const_value _dst_val = { {0, } };
3234 
3235    switch (bit_size) {
3236    case 32: {
3237 
3238 
3239 
3240          const struct float32_vec src0 = {
3241                _src[0].f32[0],
3242                _src[0].f32[1],
3243             0,
3244             0,
3245          };
3246 
3247          const struct float32_vec src1 = {
3248                _src[1].f32[0],
3249                _src[1].f32[1],
3250             0,
3251             0,
3252          };
3253 
3254          struct float32_vec dst;
3255 
3256             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y));
3257 
3258                _dst_val.f32[0] = dst.x;
3259                _dst_val.f32[1] = dst.y;
3260                _dst_val.f32[2] = dst.z;
3261                _dst_val.f32[3] = dst.w;
3262 
3263       break;
3264    }
3265    case 64: {
3266 
3267 
3268 
3269          const struct float64_vec src0 = {
3270                _src[0].f64[0],
3271                _src[0].f64[1],
3272             0,
3273             0,
3274          };
3275 
3276          const struct float64_vec src1 = {
3277                _src[1].f64[0],
3278                _src[1].f64[1],
3279             0,
3280             0,
3281          };
3282 
3283          struct float64_vec dst;
3284 
3285             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y));
3286 
3287                _dst_val.f64[0] = dst.x;
3288                _dst_val.f64[1] = dst.y;
3289                _dst_val.f64[2] = dst.z;
3290                _dst_val.f64[3] = dst.w;
3291 
3292       break;
3293    }
3294 
3295    default:
3296       unreachable("unknown bit width");
3297    }
3298 
3299    return _dst_val;
3300 }
3301 static nir_const_value
evaluate_fdot_replicated3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3302 evaluate_fdot_replicated3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3303                  MAYBE_UNUSED nir_const_value *_src)
3304 {
3305    nir_const_value _dst_val = { {0, } };
3306 
3307    switch (bit_size) {
3308    case 32: {
3309 
3310 
3311 
3312          const struct float32_vec src0 = {
3313                _src[0].f32[0],
3314                _src[0].f32[1],
3315                _src[0].f32[2],
3316             0,
3317          };
3318 
3319          const struct float32_vec src1 = {
3320                _src[1].f32[0],
3321                _src[1].f32[1],
3322                _src[1].f32[2],
3323             0,
3324          };
3325 
3326          struct float32_vec dst;
3327 
3328             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z));
3329 
3330                _dst_val.f32[0] = dst.x;
3331                _dst_val.f32[1] = dst.y;
3332                _dst_val.f32[2] = dst.z;
3333                _dst_val.f32[3] = dst.w;
3334 
3335       break;
3336    }
3337    case 64: {
3338 
3339 
3340 
3341          const struct float64_vec src0 = {
3342                _src[0].f64[0],
3343                _src[0].f64[1],
3344                _src[0].f64[2],
3345             0,
3346          };
3347 
3348          const struct float64_vec src1 = {
3349                _src[1].f64[0],
3350                _src[1].f64[1],
3351                _src[1].f64[2],
3352             0,
3353          };
3354 
3355          struct float64_vec dst;
3356 
3357             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z));
3358 
3359                _dst_val.f64[0] = dst.x;
3360                _dst_val.f64[1] = dst.y;
3361                _dst_val.f64[2] = dst.z;
3362                _dst_val.f64[3] = dst.w;
3363 
3364       break;
3365    }
3366 
3367    default:
3368       unreachable("unknown bit width");
3369    }
3370 
3371    return _dst_val;
3372 }
3373 static nir_const_value
evaluate_fdot_replicated4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3374 evaluate_fdot_replicated4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3375                  MAYBE_UNUSED nir_const_value *_src)
3376 {
3377    nir_const_value _dst_val = { {0, } };
3378 
3379    switch (bit_size) {
3380    case 32: {
3381 
3382 
3383 
3384          const struct float32_vec src0 = {
3385                _src[0].f32[0],
3386                _src[0].f32[1],
3387                _src[0].f32[2],
3388                _src[0].f32[3],
3389          };
3390 
3391          const struct float32_vec src1 = {
3392                _src[1].f32[0],
3393                _src[1].f32[1],
3394                _src[1].f32[2],
3395                _src[1].f32[3],
3396          };
3397 
3398          struct float32_vec dst;
3399 
3400             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + (src0.w * src1.w));
3401 
3402                _dst_val.f32[0] = dst.x;
3403                _dst_val.f32[1] = dst.y;
3404                _dst_val.f32[2] = dst.z;
3405                _dst_val.f32[3] = dst.w;
3406 
3407       break;
3408    }
3409    case 64: {
3410 
3411 
3412 
3413          const struct float64_vec src0 = {
3414                _src[0].f64[0],
3415                _src[0].f64[1],
3416                _src[0].f64[2],
3417                _src[0].f64[3],
3418          };
3419 
3420          const struct float64_vec src1 = {
3421                _src[1].f64[0],
3422                _src[1].f64[1],
3423                _src[1].f64[2],
3424                _src[1].f64[3],
3425          };
3426 
3427          struct float64_vec dst;
3428 
3429             dst.x = dst.y = dst.z = dst.w = ((src0.x * src1.x) + (src0.y * src1.y) + (src0.z * src1.z) + (src0.w * src1.w));
3430 
3431                _dst_val.f64[0] = dst.x;
3432                _dst_val.f64[1] = dst.y;
3433                _dst_val.f64[2] = dst.z;
3434                _dst_val.f64[3] = dst.w;
3435 
3436       break;
3437    }
3438 
3439    default:
3440       unreachable("unknown bit width");
3441    }
3442 
3443    return _dst_val;
3444 }
3445 static nir_const_value
evaluate_fdph(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3446 evaluate_fdph(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3447                  MAYBE_UNUSED nir_const_value *_src)
3448 {
3449    nir_const_value _dst_val = { {0, } };
3450 
3451    switch (bit_size) {
3452    case 32: {
3453 
3454 
3455 
3456          const struct float32_vec src0 = {
3457                _src[0].f32[0],
3458                _src[0].f32[1],
3459                _src[0].f32[2],
3460             0,
3461          };
3462 
3463          const struct float32_vec src1 = {
3464                _src[1].f32[0],
3465                _src[1].f32[1],
3466                _src[1].f32[2],
3467                _src[1].f32[3],
3468          };
3469 
3470          struct float32_vec dst;
3471 
3472             dst.x = dst.y = dst.z = dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w;
3473 
3474                _dst_val.f32[0] = dst.x;
3475 
3476       break;
3477    }
3478    case 64: {
3479 
3480 
3481 
3482          const struct float64_vec src0 = {
3483                _src[0].f64[0],
3484                _src[0].f64[1],
3485                _src[0].f64[2],
3486             0,
3487          };
3488 
3489          const struct float64_vec src1 = {
3490                _src[1].f64[0],
3491                _src[1].f64[1],
3492                _src[1].f64[2],
3493                _src[1].f64[3],
3494          };
3495 
3496          struct float64_vec dst;
3497 
3498             dst.x = dst.y = dst.z = dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w;
3499 
3500                _dst_val.f64[0] = dst.x;
3501 
3502       break;
3503    }
3504 
3505    default:
3506       unreachable("unknown bit width");
3507    }
3508 
3509    return _dst_val;
3510 }
3511 static nir_const_value
evaluate_fdph_replicated(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3512 evaluate_fdph_replicated(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3513                  MAYBE_UNUSED nir_const_value *_src)
3514 {
3515    nir_const_value _dst_val = { {0, } };
3516 
3517    switch (bit_size) {
3518    case 32: {
3519 
3520 
3521 
3522          const struct float32_vec src0 = {
3523                _src[0].f32[0],
3524                _src[0].f32[1],
3525                _src[0].f32[2],
3526             0,
3527          };
3528 
3529          const struct float32_vec src1 = {
3530                _src[1].f32[0],
3531                _src[1].f32[1],
3532                _src[1].f32[2],
3533                _src[1].f32[3],
3534          };
3535 
3536          struct float32_vec dst;
3537 
3538             dst.x = dst.y = dst.z = dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w;
3539 
3540                _dst_val.f32[0] = dst.x;
3541                _dst_val.f32[1] = dst.y;
3542                _dst_val.f32[2] = dst.z;
3543                _dst_val.f32[3] = dst.w;
3544 
3545       break;
3546    }
3547    case 64: {
3548 
3549 
3550 
3551          const struct float64_vec src0 = {
3552                _src[0].f64[0],
3553                _src[0].f64[1],
3554                _src[0].f64[2],
3555             0,
3556          };
3557 
3558          const struct float64_vec src1 = {
3559                _src[1].f64[0],
3560                _src[1].f64[1],
3561                _src[1].f64[2],
3562                _src[1].f64[3],
3563          };
3564 
3565          struct float64_vec dst;
3566 
3567             dst.x = dst.y = dst.z = dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w;
3568 
3569                _dst_val.f64[0] = dst.x;
3570                _dst_val.f64[1] = dst.y;
3571                _dst_val.f64[2] = dst.z;
3572                _dst_val.f64[3] = dst.w;
3573 
3574       break;
3575    }
3576 
3577    default:
3578       unreachable("unknown bit width");
3579    }
3580 
3581    return _dst_val;
3582 }
3583 static nir_const_value
evaluate_feq(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3584 evaluate_feq(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3585                  MAYBE_UNUSED nir_const_value *_src)
3586 {
3587    nir_const_value _dst_val = { {0, } };
3588 
3589    switch (bit_size) {
3590    case 32: {
3591 
3592 
3593 
3594          for (unsigned _i = 0; _i < num_components; _i++) {
3595                   const float32_t src0 =
3596                      _src[0].f32[_i];
3597                   const float32_t src1 =
3598                      _src[1].f32[_i];
3599 
3600                bool32_t dst = src0 == src1;
3601 
3602                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
3603          }
3604 
3605       break;
3606    }
3607    case 64: {
3608 
3609 
3610 
3611          for (unsigned _i = 0; _i < num_components; _i++) {
3612                   const float64_t src0 =
3613                      _src[0].f64[_i];
3614                   const float64_t src1 =
3615                      _src[1].f64[_i];
3616 
3617                bool32_t dst = src0 == src1;
3618 
3619                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
3620          }
3621 
3622       break;
3623    }
3624 
3625    default:
3626       unreachable("unknown bit width");
3627    }
3628 
3629    return _dst_val;
3630 }
3631 static nir_const_value
evaluate_fexp2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3632 evaluate_fexp2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3633                  MAYBE_UNUSED nir_const_value *_src)
3634 {
3635    nir_const_value _dst_val = { {0, } };
3636 
3637    switch (bit_size) {
3638    case 32: {
3639 
3640 
3641 
3642          for (unsigned _i = 0; _i < num_components; _i++) {
3643                   const float32_t src0 =
3644                      _src[0].f32[_i];
3645 
3646                float32_t dst = exp2f(src0);
3647 
3648                _dst_val.f32[_i] = dst;
3649          }
3650 
3651       break;
3652    }
3653    case 64: {
3654 
3655 
3656 
3657          for (unsigned _i = 0; _i < num_components; _i++) {
3658                   const float64_t src0 =
3659                      _src[0].f64[_i];
3660 
3661                float64_t dst = exp2f(src0);
3662 
3663                _dst_val.f64[_i] = dst;
3664          }
3665 
3666       break;
3667    }
3668 
3669    default:
3670       unreachable("unknown bit width");
3671    }
3672 
3673    return _dst_val;
3674 }
3675 static nir_const_value
evaluate_ffloor(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3676 evaluate_ffloor(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3677                  MAYBE_UNUSED nir_const_value *_src)
3678 {
3679    nir_const_value _dst_val = { {0, } };
3680 
3681    switch (bit_size) {
3682    case 32: {
3683 
3684 
3685 
3686          for (unsigned _i = 0; _i < num_components; _i++) {
3687                   const float32_t src0 =
3688                      _src[0].f32[_i];
3689 
3690                float32_t dst = bit_size == 64 ? floor(src0) : floorf(src0);
3691 
3692                _dst_val.f32[_i] = dst;
3693          }
3694 
3695       break;
3696    }
3697    case 64: {
3698 
3699 
3700 
3701          for (unsigned _i = 0; _i < num_components; _i++) {
3702                   const float64_t src0 =
3703                      _src[0].f64[_i];
3704 
3705                float64_t dst = bit_size == 64 ? floor(src0) : floorf(src0);
3706 
3707                _dst_val.f64[_i] = dst;
3708          }
3709 
3710       break;
3711    }
3712 
3713    default:
3714       unreachable("unknown bit width");
3715    }
3716 
3717    return _dst_val;
3718 }
3719 static nir_const_value
evaluate_ffma(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3720 evaluate_ffma(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3721                  MAYBE_UNUSED nir_const_value *_src)
3722 {
3723    nir_const_value _dst_val = { {0, } };
3724 
3725    switch (bit_size) {
3726    case 32: {
3727 
3728 
3729 
3730          for (unsigned _i = 0; _i < num_components; _i++) {
3731                   const float32_t src0 =
3732                      _src[0].f32[_i];
3733                   const float32_t src1 =
3734                      _src[1].f32[_i];
3735                   const float32_t src2 =
3736                      _src[2].f32[_i];
3737 
3738                float32_t dst = src0 * src1 + src2;
3739 
3740                _dst_val.f32[_i] = dst;
3741          }
3742 
3743       break;
3744    }
3745    case 64: {
3746 
3747 
3748 
3749          for (unsigned _i = 0; _i < num_components; _i++) {
3750                   const float64_t src0 =
3751                      _src[0].f64[_i];
3752                   const float64_t src1 =
3753                      _src[1].f64[_i];
3754                   const float64_t src2 =
3755                      _src[2].f64[_i];
3756 
3757                float64_t dst = src0 * src1 + src2;
3758 
3759                _dst_val.f64[_i] = dst;
3760          }
3761 
3762       break;
3763    }
3764 
3765    default:
3766       unreachable("unknown bit width");
3767    }
3768 
3769    return _dst_val;
3770 }
3771 static nir_const_value
evaluate_ffract(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3772 evaluate_ffract(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3773                  MAYBE_UNUSED nir_const_value *_src)
3774 {
3775    nir_const_value _dst_val = { {0, } };
3776 
3777    switch (bit_size) {
3778    case 32: {
3779 
3780 
3781 
3782          for (unsigned _i = 0; _i < num_components; _i++) {
3783                   const float32_t src0 =
3784                      _src[0].f32[_i];
3785 
3786                float32_t dst = src0 - (bit_size == 64 ? floor(src0) : floorf(src0));
3787 
3788                _dst_val.f32[_i] = dst;
3789          }
3790 
3791       break;
3792    }
3793    case 64: {
3794 
3795 
3796 
3797          for (unsigned _i = 0; _i < num_components; _i++) {
3798                   const float64_t src0 =
3799                      _src[0].f64[_i];
3800 
3801                float64_t dst = src0 - (bit_size == 64 ? floor(src0) : floorf(src0));
3802 
3803                _dst_val.f64[_i] = dst;
3804          }
3805 
3806       break;
3807    }
3808 
3809    default:
3810       unreachable("unknown bit width");
3811    }
3812 
3813    return _dst_val;
3814 }
3815 static nir_const_value
evaluate_fge(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3816 evaluate_fge(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3817                  MAYBE_UNUSED nir_const_value *_src)
3818 {
3819    nir_const_value _dst_val = { {0, } };
3820 
3821    switch (bit_size) {
3822    case 32: {
3823 
3824 
3825 
3826          for (unsigned _i = 0; _i < num_components; _i++) {
3827                   const float32_t src0 =
3828                      _src[0].f32[_i];
3829                   const float32_t src1 =
3830                      _src[1].f32[_i];
3831 
3832                bool32_t dst = src0 >= src1;
3833 
3834                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
3835          }
3836 
3837       break;
3838    }
3839    case 64: {
3840 
3841 
3842 
3843          for (unsigned _i = 0; _i < num_components; _i++) {
3844                   const float64_t src0 =
3845                      _src[0].f64[_i];
3846                   const float64_t src1 =
3847                      _src[1].f64[_i];
3848 
3849                bool32_t dst = src0 >= src1;
3850 
3851                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
3852          }
3853 
3854       break;
3855    }
3856 
3857    default:
3858       unreachable("unknown bit width");
3859    }
3860 
3861    return _dst_val;
3862 }
3863 static nir_const_value
evaluate_find_lsb(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3864 evaluate_find_lsb(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3865                  MAYBE_UNUSED nir_const_value *_src)
3866 {
3867    nir_const_value _dst_val = { {0, } };
3868 
3869    switch (bit_size) {
3870    case 32: {
3871 
3872 
3873 
3874          for (unsigned _i = 0; _i < num_components; _i++) {
3875                   const int32_t src0 =
3876                      _src[0].i32[_i];
3877 
3878                int32_t dst;
3879 
3880 
3881 dst = -1;
3882 for (unsigned bit = 0; bit < 32; bit++) {
3883    if ((src0 >> bit) & 1) {
3884       dst = bit;
3885       break;
3886    }
3887 }
3888 
3889 
3890                _dst_val.i32[_i] = dst;
3891          }
3892 
3893       break;
3894    }
3895    case 64: {
3896 
3897 
3898 
3899          for (unsigned _i = 0; _i < num_components; _i++) {
3900                   const int32_t src0 =
3901                      _src[0].i32[_i];
3902 
3903                int32_t dst;
3904 
3905 
3906 dst = -1;
3907 for (unsigned bit = 0; bit < 32; bit++) {
3908    if ((src0 >> bit) & 1) {
3909       dst = bit;
3910       break;
3911    }
3912 }
3913 
3914 
3915                _dst_val.i32[_i] = dst;
3916          }
3917 
3918       break;
3919    }
3920 
3921    default:
3922       unreachable("unknown bit width");
3923    }
3924 
3925    return _dst_val;
3926 }
3927 static nir_const_value
evaluate_flog2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3928 evaluate_flog2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3929                  MAYBE_UNUSED nir_const_value *_src)
3930 {
3931    nir_const_value _dst_val = { {0, } };
3932 
3933    switch (bit_size) {
3934    case 32: {
3935 
3936 
3937 
3938          for (unsigned _i = 0; _i < num_components; _i++) {
3939                   const float32_t src0 =
3940                      _src[0].f32[_i];
3941 
3942                float32_t dst = log2f(src0);
3943 
3944                _dst_val.f32[_i] = dst;
3945          }
3946 
3947       break;
3948    }
3949    case 64: {
3950 
3951 
3952 
3953          for (unsigned _i = 0; _i < num_components; _i++) {
3954                   const float64_t src0 =
3955                      _src[0].f64[_i];
3956 
3957                float64_t dst = log2f(src0);
3958 
3959                _dst_val.f64[_i] = dst;
3960          }
3961 
3962       break;
3963    }
3964 
3965    default:
3966       unreachable("unknown bit width");
3967    }
3968 
3969    return _dst_val;
3970 }
3971 static nir_const_value
evaluate_flrp(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)3972 evaluate_flrp(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
3973                  MAYBE_UNUSED nir_const_value *_src)
3974 {
3975    nir_const_value _dst_val = { {0, } };
3976 
3977    switch (bit_size) {
3978    case 32: {
3979 
3980 
3981 
3982          for (unsigned _i = 0; _i < num_components; _i++) {
3983                   const float32_t src0 =
3984                      _src[0].f32[_i];
3985                   const float32_t src1 =
3986                      _src[1].f32[_i];
3987                   const float32_t src2 =
3988                      _src[2].f32[_i];
3989 
3990                float32_t dst = src0 * (1 - src2) + src1 * src2;
3991 
3992                _dst_val.f32[_i] = dst;
3993          }
3994 
3995       break;
3996    }
3997    case 64: {
3998 
3999 
4000 
4001          for (unsigned _i = 0; _i < num_components; _i++) {
4002                   const float64_t src0 =
4003                      _src[0].f64[_i];
4004                   const float64_t src1 =
4005                      _src[1].f64[_i];
4006                   const float64_t src2 =
4007                      _src[2].f64[_i];
4008 
4009                float64_t dst = src0 * (1 - src2) + src1 * src2;
4010 
4011                _dst_val.f64[_i] = dst;
4012          }
4013 
4014       break;
4015    }
4016 
4017    default:
4018       unreachable("unknown bit width");
4019    }
4020 
4021    return _dst_val;
4022 }
4023 static nir_const_value
evaluate_flt(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4024 evaluate_flt(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4025                  MAYBE_UNUSED nir_const_value *_src)
4026 {
4027    nir_const_value _dst_val = { {0, } };
4028 
4029    switch (bit_size) {
4030    case 32: {
4031 
4032 
4033 
4034          for (unsigned _i = 0; _i < num_components; _i++) {
4035                   const float32_t src0 =
4036                      _src[0].f32[_i];
4037                   const float32_t src1 =
4038                      _src[1].f32[_i];
4039 
4040                bool32_t dst = src0 < src1;
4041 
4042                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
4043          }
4044 
4045       break;
4046    }
4047    case 64: {
4048 
4049 
4050 
4051          for (unsigned _i = 0; _i < num_components; _i++) {
4052                   const float64_t src0 =
4053                      _src[0].f64[_i];
4054                   const float64_t src1 =
4055                      _src[1].f64[_i];
4056 
4057                bool32_t dst = src0 < src1;
4058 
4059                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
4060          }
4061 
4062       break;
4063    }
4064 
4065    default:
4066       unreachable("unknown bit width");
4067    }
4068 
4069    return _dst_val;
4070 }
4071 static nir_const_value
evaluate_fmax(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4072 evaluate_fmax(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4073                  MAYBE_UNUSED nir_const_value *_src)
4074 {
4075    nir_const_value _dst_val = { {0, } };
4076 
4077    switch (bit_size) {
4078    case 32: {
4079 
4080 
4081 
4082          for (unsigned _i = 0; _i < num_components; _i++) {
4083                   const float32_t src0 =
4084                      _src[0].f32[_i];
4085                   const float32_t src1 =
4086                      _src[1].f32[_i];
4087 
4088                float32_t dst = fmaxf(src0, src1);
4089 
4090                _dst_val.f32[_i] = dst;
4091          }
4092 
4093       break;
4094    }
4095    case 64: {
4096 
4097 
4098 
4099          for (unsigned _i = 0; _i < num_components; _i++) {
4100                   const float64_t src0 =
4101                      _src[0].f64[_i];
4102                   const float64_t src1 =
4103                      _src[1].f64[_i];
4104 
4105                float64_t dst = fmaxf(src0, src1);
4106 
4107                _dst_val.f64[_i] = dst;
4108          }
4109 
4110       break;
4111    }
4112 
4113    default:
4114       unreachable("unknown bit width");
4115    }
4116 
4117    return _dst_val;
4118 }
4119 static nir_const_value
evaluate_fmin(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4120 evaluate_fmin(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4121                  MAYBE_UNUSED nir_const_value *_src)
4122 {
4123    nir_const_value _dst_val = { {0, } };
4124 
4125    switch (bit_size) {
4126    case 32: {
4127 
4128 
4129 
4130          for (unsigned _i = 0; _i < num_components; _i++) {
4131                   const float32_t src0 =
4132                      _src[0].f32[_i];
4133                   const float32_t src1 =
4134                      _src[1].f32[_i];
4135 
4136                float32_t dst = fminf(src0, src1);
4137 
4138                _dst_val.f32[_i] = dst;
4139          }
4140 
4141       break;
4142    }
4143    case 64: {
4144 
4145 
4146 
4147          for (unsigned _i = 0; _i < num_components; _i++) {
4148                   const float64_t src0 =
4149                      _src[0].f64[_i];
4150                   const float64_t src1 =
4151                      _src[1].f64[_i];
4152 
4153                float64_t dst = fminf(src0, src1);
4154 
4155                _dst_val.f64[_i] = dst;
4156          }
4157 
4158       break;
4159    }
4160 
4161    default:
4162       unreachable("unknown bit width");
4163    }
4164 
4165    return _dst_val;
4166 }
4167 static nir_const_value
evaluate_fmod(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4168 evaluate_fmod(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4169                  MAYBE_UNUSED nir_const_value *_src)
4170 {
4171    nir_const_value _dst_val = { {0, } };
4172 
4173    switch (bit_size) {
4174    case 32: {
4175 
4176 
4177 
4178          for (unsigned _i = 0; _i < num_components; _i++) {
4179                   const float32_t src0 =
4180                      _src[0].f32[_i];
4181                   const float32_t src1 =
4182                      _src[1].f32[_i];
4183 
4184                float32_t dst = src0 - src1 * floorf(src0 / src1);
4185 
4186                _dst_val.f32[_i] = dst;
4187          }
4188 
4189       break;
4190    }
4191    case 64: {
4192 
4193 
4194 
4195          for (unsigned _i = 0; _i < num_components; _i++) {
4196                   const float64_t src0 =
4197                      _src[0].f64[_i];
4198                   const float64_t src1 =
4199                      _src[1].f64[_i];
4200 
4201                float64_t dst = src0 - src1 * floorf(src0 / src1);
4202 
4203                _dst_val.f64[_i] = dst;
4204          }
4205 
4206       break;
4207    }
4208 
4209    default:
4210       unreachable("unknown bit width");
4211    }
4212 
4213    return _dst_val;
4214 }
4215 static nir_const_value
evaluate_fmov(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4216 evaluate_fmov(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4217                  MAYBE_UNUSED nir_const_value *_src)
4218 {
4219    nir_const_value _dst_val = { {0, } };
4220 
4221    switch (bit_size) {
4222    case 32: {
4223 
4224 
4225 
4226          for (unsigned _i = 0; _i < num_components; _i++) {
4227                   const float32_t src0 =
4228                      _src[0].f32[_i];
4229 
4230                float32_t dst = src0;
4231 
4232                _dst_val.f32[_i] = dst;
4233          }
4234 
4235       break;
4236    }
4237    case 64: {
4238 
4239 
4240 
4241          for (unsigned _i = 0; _i < num_components; _i++) {
4242                   const float64_t src0 =
4243                      _src[0].f64[_i];
4244 
4245                float64_t dst = src0;
4246 
4247                _dst_val.f64[_i] = dst;
4248          }
4249 
4250       break;
4251    }
4252 
4253    default:
4254       unreachable("unknown bit width");
4255    }
4256 
4257    return _dst_val;
4258 }
4259 static nir_const_value
evaluate_fmul(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4260 evaluate_fmul(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4261                  MAYBE_UNUSED nir_const_value *_src)
4262 {
4263    nir_const_value _dst_val = { {0, } };
4264 
4265    switch (bit_size) {
4266    case 32: {
4267 
4268 
4269 
4270          for (unsigned _i = 0; _i < num_components; _i++) {
4271                   const float32_t src0 =
4272                      _src[0].f32[_i];
4273                   const float32_t src1 =
4274                      _src[1].f32[_i];
4275 
4276                float32_t dst = src0 * src1;
4277 
4278                _dst_val.f32[_i] = dst;
4279          }
4280 
4281       break;
4282    }
4283    case 64: {
4284 
4285 
4286 
4287          for (unsigned _i = 0; _i < num_components; _i++) {
4288                   const float64_t src0 =
4289                      _src[0].f64[_i];
4290                   const float64_t src1 =
4291                      _src[1].f64[_i];
4292 
4293                float64_t dst = src0 * src1;
4294 
4295                _dst_val.f64[_i] = dst;
4296          }
4297 
4298       break;
4299    }
4300 
4301    default:
4302       unreachable("unknown bit width");
4303    }
4304 
4305    return _dst_val;
4306 }
4307 static nir_const_value
evaluate_fne(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4308 evaluate_fne(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4309                  MAYBE_UNUSED nir_const_value *_src)
4310 {
4311    nir_const_value _dst_val = { {0, } };
4312 
4313    switch (bit_size) {
4314    case 32: {
4315 
4316 
4317 
4318          for (unsigned _i = 0; _i < num_components; _i++) {
4319                   const float32_t src0 =
4320                      _src[0].f32[_i];
4321                   const float32_t src1 =
4322                      _src[1].f32[_i];
4323 
4324                bool32_t dst = src0 != src1;
4325 
4326                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
4327          }
4328 
4329       break;
4330    }
4331    case 64: {
4332 
4333 
4334 
4335          for (unsigned _i = 0; _i < num_components; _i++) {
4336                   const float64_t src0 =
4337                      _src[0].f64[_i];
4338                   const float64_t src1 =
4339                      _src[1].f64[_i];
4340 
4341                bool32_t dst = src0 != src1;
4342 
4343                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
4344          }
4345 
4346       break;
4347    }
4348 
4349    default:
4350       unreachable("unknown bit width");
4351    }
4352 
4353    return _dst_val;
4354 }
4355 static nir_const_value
evaluate_fneg(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4356 evaluate_fneg(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4357                  MAYBE_UNUSED nir_const_value *_src)
4358 {
4359    nir_const_value _dst_val = { {0, } };
4360 
4361    switch (bit_size) {
4362    case 32: {
4363 
4364 
4365 
4366          for (unsigned _i = 0; _i < num_components; _i++) {
4367                   const float32_t src0 =
4368                      _src[0].f32[_i];
4369 
4370                float32_t dst = -src0;
4371 
4372                _dst_val.f32[_i] = dst;
4373          }
4374 
4375       break;
4376    }
4377    case 64: {
4378 
4379 
4380 
4381          for (unsigned _i = 0; _i < num_components; _i++) {
4382                   const float64_t src0 =
4383                      _src[0].f64[_i];
4384 
4385                float64_t dst = -src0;
4386 
4387                _dst_val.f64[_i] = dst;
4388          }
4389 
4390       break;
4391    }
4392 
4393    default:
4394       unreachable("unknown bit width");
4395    }
4396 
4397    return _dst_val;
4398 }
4399 static nir_const_value
evaluate_fnoise1_1(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4400 evaluate_fnoise1_1(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4401                  MAYBE_UNUSED nir_const_value *_src)
4402 {
4403    nir_const_value _dst_val = { {0, } };
4404 
4405    switch (bit_size) {
4406    case 32: {
4407 
4408 
4409 
4410          struct float32_vec dst;
4411 
4412             dst.x = dst.y = dst.z = dst.w = 0.0f;
4413 
4414                _dst_val.f32[0] = dst.x;
4415 
4416       break;
4417    }
4418    case 64: {
4419 
4420 
4421 
4422          struct float64_vec dst;
4423 
4424             dst.x = dst.y = dst.z = dst.w = 0.0f;
4425 
4426                _dst_val.f64[0] = dst.x;
4427 
4428       break;
4429    }
4430 
4431    default:
4432       unreachable("unknown bit width");
4433    }
4434 
4435    return _dst_val;
4436 }
4437 static nir_const_value
evaluate_fnoise1_2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4438 evaluate_fnoise1_2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4439                  MAYBE_UNUSED nir_const_value *_src)
4440 {
4441    nir_const_value _dst_val = { {0, } };
4442 
4443    switch (bit_size) {
4444    case 32: {
4445 
4446 
4447 
4448          struct float32_vec dst;
4449 
4450             dst.x = dst.y = dst.z = dst.w = 0.0f;
4451 
4452                _dst_val.f32[0] = dst.x;
4453 
4454       break;
4455    }
4456    case 64: {
4457 
4458 
4459 
4460          struct float64_vec dst;
4461 
4462             dst.x = dst.y = dst.z = dst.w = 0.0f;
4463 
4464                _dst_val.f64[0] = dst.x;
4465 
4466       break;
4467    }
4468 
4469    default:
4470       unreachable("unknown bit width");
4471    }
4472 
4473    return _dst_val;
4474 }
4475 static nir_const_value
evaluate_fnoise1_3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4476 evaluate_fnoise1_3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4477                  MAYBE_UNUSED nir_const_value *_src)
4478 {
4479    nir_const_value _dst_val = { {0, } };
4480 
4481    switch (bit_size) {
4482    case 32: {
4483 
4484 
4485 
4486          struct float32_vec dst;
4487 
4488             dst.x = dst.y = dst.z = dst.w = 0.0f;
4489 
4490                _dst_val.f32[0] = dst.x;
4491 
4492       break;
4493    }
4494    case 64: {
4495 
4496 
4497 
4498          struct float64_vec dst;
4499 
4500             dst.x = dst.y = dst.z = dst.w = 0.0f;
4501 
4502                _dst_val.f64[0] = dst.x;
4503 
4504       break;
4505    }
4506 
4507    default:
4508       unreachable("unknown bit width");
4509    }
4510 
4511    return _dst_val;
4512 }
4513 static nir_const_value
evaluate_fnoise1_4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4514 evaluate_fnoise1_4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4515                  MAYBE_UNUSED nir_const_value *_src)
4516 {
4517    nir_const_value _dst_val = { {0, } };
4518 
4519    switch (bit_size) {
4520    case 32: {
4521 
4522 
4523 
4524          struct float32_vec dst;
4525 
4526             dst.x = dst.y = dst.z = dst.w = 0.0f;
4527 
4528                _dst_val.f32[0] = dst.x;
4529 
4530       break;
4531    }
4532    case 64: {
4533 
4534 
4535 
4536          struct float64_vec dst;
4537 
4538             dst.x = dst.y = dst.z = dst.w = 0.0f;
4539 
4540                _dst_val.f64[0] = dst.x;
4541 
4542       break;
4543    }
4544 
4545    default:
4546       unreachable("unknown bit width");
4547    }
4548 
4549    return _dst_val;
4550 }
4551 static nir_const_value
evaluate_fnoise2_1(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4552 evaluate_fnoise2_1(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4553                  MAYBE_UNUSED nir_const_value *_src)
4554 {
4555    nir_const_value _dst_val = { {0, } };
4556 
4557    switch (bit_size) {
4558    case 32: {
4559 
4560 
4561 
4562          struct float32_vec dst;
4563 
4564             dst.x = dst.y = dst.z = dst.w = 0.0f;
4565 
4566                _dst_val.f32[0] = dst.x;
4567                _dst_val.f32[1] = dst.y;
4568 
4569       break;
4570    }
4571    case 64: {
4572 
4573 
4574 
4575          struct float64_vec dst;
4576 
4577             dst.x = dst.y = dst.z = dst.w = 0.0f;
4578 
4579                _dst_val.f64[0] = dst.x;
4580                _dst_val.f64[1] = dst.y;
4581 
4582       break;
4583    }
4584 
4585    default:
4586       unreachable("unknown bit width");
4587    }
4588 
4589    return _dst_val;
4590 }
4591 static nir_const_value
evaluate_fnoise2_2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4592 evaluate_fnoise2_2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4593                  MAYBE_UNUSED nir_const_value *_src)
4594 {
4595    nir_const_value _dst_val = { {0, } };
4596 
4597    switch (bit_size) {
4598    case 32: {
4599 
4600 
4601 
4602          struct float32_vec dst;
4603 
4604             dst.x = dst.y = dst.z = dst.w = 0.0f;
4605 
4606                _dst_val.f32[0] = dst.x;
4607                _dst_val.f32[1] = dst.y;
4608 
4609       break;
4610    }
4611    case 64: {
4612 
4613 
4614 
4615          struct float64_vec dst;
4616 
4617             dst.x = dst.y = dst.z = dst.w = 0.0f;
4618 
4619                _dst_val.f64[0] = dst.x;
4620                _dst_val.f64[1] = dst.y;
4621 
4622       break;
4623    }
4624 
4625    default:
4626       unreachable("unknown bit width");
4627    }
4628 
4629    return _dst_val;
4630 }
4631 static nir_const_value
evaluate_fnoise2_3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4632 evaluate_fnoise2_3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4633                  MAYBE_UNUSED nir_const_value *_src)
4634 {
4635    nir_const_value _dst_val = { {0, } };
4636 
4637    switch (bit_size) {
4638    case 32: {
4639 
4640 
4641 
4642          struct float32_vec dst;
4643 
4644             dst.x = dst.y = dst.z = dst.w = 0.0f;
4645 
4646                _dst_val.f32[0] = dst.x;
4647                _dst_val.f32[1] = dst.y;
4648 
4649       break;
4650    }
4651    case 64: {
4652 
4653 
4654 
4655          struct float64_vec dst;
4656 
4657             dst.x = dst.y = dst.z = dst.w = 0.0f;
4658 
4659                _dst_val.f64[0] = dst.x;
4660                _dst_val.f64[1] = dst.y;
4661 
4662       break;
4663    }
4664 
4665    default:
4666       unreachable("unknown bit width");
4667    }
4668 
4669    return _dst_val;
4670 }
4671 static nir_const_value
evaluate_fnoise2_4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4672 evaluate_fnoise2_4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4673                  MAYBE_UNUSED nir_const_value *_src)
4674 {
4675    nir_const_value _dst_val = { {0, } };
4676 
4677    switch (bit_size) {
4678    case 32: {
4679 
4680 
4681 
4682          struct float32_vec dst;
4683 
4684             dst.x = dst.y = dst.z = dst.w = 0.0f;
4685 
4686                _dst_val.f32[0] = dst.x;
4687                _dst_val.f32[1] = dst.y;
4688 
4689       break;
4690    }
4691    case 64: {
4692 
4693 
4694 
4695          struct float64_vec dst;
4696 
4697             dst.x = dst.y = dst.z = dst.w = 0.0f;
4698 
4699                _dst_val.f64[0] = dst.x;
4700                _dst_val.f64[1] = dst.y;
4701 
4702       break;
4703    }
4704 
4705    default:
4706       unreachable("unknown bit width");
4707    }
4708 
4709    return _dst_val;
4710 }
4711 static nir_const_value
evaluate_fnoise3_1(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4712 evaluate_fnoise3_1(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4713                  MAYBE_UNUSED nir_const_value *_src)
4714 {
4715    nir_const_value _dst_val = { {0, } };
4716 
4717    switch (bit_size) {
4718    case 32: {
4719 
4720 
4721 
4722          struct float32_vec dst;
4723 
4724             dst.x = dst.y = dst.z = dst.w = 0.0f;
4725 
4726                _dst_val.f32[0] = dst.x;
4727                _dst_val.f32[1] = dst.y;
4728                _dst_val.f32[2] = dst.z;
4729 
4730       break;
4731    }
4732    case 64: {
4733 
4734 
4735 
4736          struct float64_vec dst;
4737 
4738             dst.x = dst.y = dst.z = dst.w = 0.0f;
4739 
4740                _dst_val.f64[0] = dst.x;
4741                _dst_val.f64[1] = dst.y;
4742                _dst_val.f64[2] = dst.z;
4743 
4744       break;
4745    }
4746 
4747    default:
4748       unreachable("unknown bit width");
4749    }
4750 
4751    return _dst_val;
4752 }
4753 static nir_const_value
evaluate_fnoise3_2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4754 evaluate_fnoise3_2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4755                  MAYBE_UNUSED nir_const_value *_src)
4756 {
4757    nir_const_value _dst_val = { {0, } };
4758 
4759    switch (bit_size) {
4760    case 32: {
4761 
4762 
4763 
4764          struct float32_vec dst;
4765 
4766             dst.x = dst.y = dst.z = dst.w = 0.0f;
4767 
4768                _dst_val.f32[0] = dst.x;
4769                _dst_val.f32[1] = dst.y;
4770                _dst_val.f32[2] = dst.z;
4771 
4772       break;
4773    }
4774    case 64: {
4775 
4776 
4777 
4778          struct float64_vec dst;
4779 
4780             dst.x = dst.y = dst.z = dst.w = 0.0f;
4781 
4782                _dst_val.f64[0] = dst.x;
4783                _dst_val.f64[1] = dst.y;
4784                _dst_val.f64[2] = dst.z;
4785 
4786       break;
4787    }
4788 
4789    default:
4790       unreachable("unknown bit width");
4791    }
4792 
4793    return _dst_val;
4794 }
4795 static nir_const_value
evaluate_fnoise3_3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4796 evaluate_fnoise3_3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4797                  MAYBE_UNUSED nir_const_value *_src)
4798 {
4799    nir_const_value _dst_val = { {0, } };
4800 
4801    switch (bit_size) {
4802    case 32: {
4803 
4804 
4805 
4806          struct float32_vec dst;
4807 
4808             dst.x = dst.y = dst.z = dst.w = 0.0f;
4809 
4810                _dst_val.f32[0] = dst.x;
4811                _dst_val.f32[1] = dst.y;
4812                _dst_val.f32[2] = dst.z;
4813 
4814       break;
4815    }
4816    case 64: {
4817 
4818 
4819 
4820          struct float64_vec dst;
4821 
4822             dst.x = dst.y = dst.z = dst.w = 0.0f;
4823 
4824                _dst_val.f64[0] = dst.x;
4825                _dst_val.f64[1] = dst.y;
4826                _dst_val.f64[2] = dst.z;
4827 
4828       break;
4829    }
4830 
4831    default:
4832       unreachable("unknown bit width");
4833    }
4834 
4835    return _dst_val;
4836 }
4837 static nir_const_value
evaluate_fnoise3_4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4838 evaluate_fnoise3_4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4839                  MAYBE_UNUSED nir_const_value *_src)
4840 {
4841    nir_const_value _dst_val = { {0, } };
4842 
4843    switch (bit_size) {
4844    case 32: {
4845 
4846 
4847 
4848          struct float32_vec dst;
4849 
4850             dst.x = dst.y = dst.z = dst.w = 0.0f;
4851 
4852                _dst_val.f32[0] = dst.x;
4853                _dst_val.f32[1] = dst.y;
4854                _dst_val.f32[2] = dst.z;
4855 
4856       break;
4857    }
4858    case 64: {
4859 
4860 
4861 
4862          struct float64_vec dst;
4863 
4864             dst.x = dst.y = dst.z = dst.w = 0.0f;
4865 
4866                _dst_val.f64[0] = dst.x;
4867                _dst_val.f64[1] = dst.y;
4868                _dst_val.f64[2] = dst.z;
4869 
4870       break;
4871    }
4872 
4873    default:
4874       unreachable("unknown bit width");
4875    }
4876 
4877    return _dst_val;
4878 }
4879 static nir_const_value
evaluate_fnoise4_1(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4880 evaluate_fnoise4_1(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4881                  MAYBE_UNUSED nir_const_value *_src)
4882 {
4883    nir_const_value _dst_val = { {0, } };
4884 
4885    switch (bit_size) {
4886    case 32: {
4887 
4888 
4889 
4890          struct float32_vec dst;
4891 
4892             dst.x = dst.y = dst.z = dst.w = 0.0f;
4893 
4894                _dst_val.f32[0] = dst.x;
4895                _dst_val.f32[1] = dst.y;
4896                _dst_val.f32[2] = dst.z;
4897                _dst_val.f32[3] = dst.w;
4898 
4899       break;
4900    }
4901    case 64: {
4902 
4903 
4904 
4905          struct float64_vec dst;
4906 
4907             dst.x = dst.y = dst.z = dst.w = 0.0f;
4908 
4909                _dst_val.f64[0] = dst.x;
4910                _dst_val.f64[1] = dst.y;
4911                _dst_val.f64[2] = dst.z;
4912                _dst_val.f64[3] = dst.w;
4913 
4914       break;
4915    }
4916 
4917    default:
4918       unreachable("unknown bit width");
4919    }
4920 
4921    return _dst_val;
4922 }
4923 static nir_const_value
evaluate_fnoise4_2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4924 evaluate_fnoise4_2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4925                  MAYBE_UNUSED nir_const_value *_src)
4926 {
4927    nir_const_value _dst_val = { {0, } };
4928 
4929    switch (bit_size) {
4930    case 32: {
4931 
4932 
4933 
4934          struct float32_vec dst;
4935 
4936             dst.x = dst.y = dst.z = dst.w = 0.0f;
4937 
4938                _dst_val.f32[0] = dst.x;
4939                _dst_val.f32[1] = dst.y;
4940                _dst_val.f32[2] = dst.z;
4941                _dst_val.f32[3] = dst.w;
4942 
4943       break;
4944    }
4945    case 64: {
4946 
4947 
4948 
4949          struct float64_vec dst;
4950 
4951             dst.x = dst.y = dst.z = dst.w = 0.0f;
4952 
4953                _dst_val.f64[0] = dst.x;
4954                _dst_val.f64[1] = dst.y;
4955                _dst_val.f64[2] = dst.z;
4956                _dst_val.f64[3] = dst.w;
4957 
4958       break;
4959    }
4960 
4961    default:
4962       unreachable("unknown bit width");
4963    }
4964 
4965    return _dst_val;
4966 }
4967 static nir_const_value
evaluate_fnoise4_3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)4968 evaluate_fnoise4_3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
4969                  MAYBE_UNUSED nir_const_value *_src)
4970 {
4971    nir_const_value _dst_val = { {0, } };
4972 
4973    switch (bit_size) {
4974    case 32: {
4975 
4976 
4977 
4978          struct float32_vec dst;
4979 
4980             dst.x = dst.y = dst.z = dst.w = 0.0f;
4981 
4982                _dst_val.f32[0] = dst.x;
4983                _dst_val.f32[1] = dst.y;
4984                _dst_val.f32[2] = dst.z;
4985                _dst_val.f32[3] = dst.w;
4986 
4987       break;
4988    }
4989    case 64: {
4990 
4991 
4992 
4993          struct float64_vec dst;
4994 
4995             dst.x = dst.y = dst.z = dst.w = 0.0f;
4996 
4997                _dst_val.f64[0] = dst.x;
4998                _dst_val.f64[1] = dst.y;
4999                _dst_val.f64[2] = dst.z;
5000                _dst_val.f64[3] = dst.w;
5001 
5002       break;
5003    }
5004 
5005    default:
5006       unreachable("unknown bit width");
5007    }
5008 
5009    return _dst_val;
5010 }
5011 static nir_const_value
evaluate_fnoise4_4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5012 evaluate_fnoise4_4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5013                  MAYBE_UNUSED nir_const_value *_src)
5014 {
5015    nir_const_value _dst_val = { {0, } };
5016 
5017    switch (bit_size) {
5018    case 32: {
5019 
5020 
5021 
5022          struct float32_vec dst;
5023 
5024             dst.x = dst.y = dst.z = dst.w = 0.0f;
5025 
5026                _dst_val.f32[0] = dst.x;
5027                _dst_val.f32[1] = dst.y;
5028                _dst_val.f32[2] = dst.z;
5029                _dst_val.f32[3] = dst.w;
5030 
5031       break;
5032    }
5033    case 64: {
5034 
5035 
5036 
5037          struct float64_vec dst;
5038 
5039             dst.x = dst.y = dst.z = dst.w = 0.0f;
5040 
5041                _dst_val.f64[0] = dst.x;
5042                _dst_val.f64[1] = dst.y;
5043                _dst_val.f64[2] = dst.z;
5044                _dst_val.f64[3] = dst.w;
5045 
5046       break;
5047    }
5048 
5049    default:
5050       unreachable("unknown bit width");
5051    }
5052 
5053    return _dst_val;
5054 }
5055 static nir_const_value
evaluate_fnot(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5056 evaluate_fnot(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5057                  MAYBE_UNUSED nir_const_value *_src)
5058 {
5059    nir_const_value _dst_val = { {0, } };
5060 
5061    switch (bit_size) {
5062    case 32: {
5063 
5064 
5065 
5066          for (unsigned _i = 0; _i < num_components; _i++) {
5067                   const float32_t src0 =
5068                      _src[0].f32[_i];
5069 
5070                float32_t dst = bit_size == 64 ? ((src0 == 0.0) ? 1.0 : 0.0f) : ((src0 == 0.0f) ? 1.0f : 0.0f);
5071 
5072                _dst_val.f32[_i] = dst;
5073          }
5074 
5075       break;
5076    }
5077    case 64: {
5078 
5079 
5080 
5081          for (unsigned _i = 0; _i < num_components; _i++) {
5082                   const float64_t src0 =
5083                      _src[0].f64[_i];
5084 
5085                float64_t dst = bit_size == 64 ? ((src0 == 0.0) ? 1.0 : 0.0f) : ((src0 == 0.0f) ? 1.0f : 0.0f);
5086 
5087                _dst_val.f64[_i] = dst;
5088          }
5089 
5090       break;
5091    }
5092 
5093    default:
5094       unreachable("unknown bit width");
5095    }
5096 
5097    return _dst_val;
5098 }
5099 static nir_const_value
evaluate_for(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5100 evaluate_for(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5101                  MAYBE_UNUSED nir_const_value *_src)
5102 {
5103    nir_const_value _dst_val = { {0, } };
5104 
5105    switch (bit_size) {
5106    case 32: {
5107 
5108 
5109 
5110          for (unsigned _i = 0; _i < num_components; _i++) {
5111                   const float32_t src0 =
5112                      _src[0].f32[_i];
5113                   const float32_t src1 =
5114                      _src[1].f32[_i];
5115 
5116                float32_t dst = ((src0 != 0.0f) || (src1 != 0.0f)) ? 1.0f : 0.0f;
5117 
5118                _dst_val.f32[_i] = dst;
5119          }
5120 
5121       break;
5122    }
5123    case 64: {
5124 
5125 
5126 
5127          for (unsigned _i = 0; _i < num_components; _i++) {
5128                   const float32_t src0 =
5129                      _src[0].f32[_i];
5130                   const float32_t src1 =
5131                      _src[1].f32[_i];
5132 
5133                float32_t dst = ((src0 != 0.0f) || (src1 != 0.0f)) ? 1.0f : 0.0f;
5134 
5135                _dst_val.f32[_i] = dst;
5136          }
5137 
5138       break;
5139    }
5140 
5141    default:
5142       unreachable("unknown bit width");
5143    }
5144 
5145    return _dst_val;
5146 }
5147 static nir_const_value
evaluate_fpow(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5148 evaluate_fpow(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5149                  MAYBE_UNUSED nir_const_value *_src)
5150 {
5151    nir_const_value _dst_val = { {0, } };
5152 
5153    switch (bit_size) {
5154    case 32: {
5155 
5156 
5157 
5158          for (unsigned _i = 0; _i < num_components; _i++) {
5159                   const float32_t src0 =
5160                      _src[0].f32[_i];
5161                   const float32_t src1 =
5162                      _src[1].f32[_i];
5163 
5164                float32_t dst = bit_size == 64 ? powf(src0, src1) : pow(src0, src1);
5165 
5166                _dst_val.f32[_i] = dst;
5167          }
5168 
5169       break;
5170    }
5171    case 64: {
5172 
5173 
5174 
5175          for (unsigned _i = 0; _i < num_components; _i++) {
5176                   const float64_t src0 =
5177                      _src[0].f64[_i];
5178                   const float64_t src1 =
5179                      _src[1].f64[_i];
5180 
5181                float64_t dst = bit_size == 64 ? powf(src0, src1) : pow(src0, src1);
5182 
5183                _dst_val.f64[_i] = dst;
5184          }
5185 
5186       break;
5187    }
5188 
5189    default:
5190       unreachable("unknown bit width");
5191    }
5192 
5193    return _dst_val;
5194 }
5195 static nir_const_value
evaluate_fquantize2f16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5196 evaluate_fquantize2f16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5197                  MAYBE_UNUSED nir_const_value *_src)
5198 {
5199    nir_const_value _dst_val = { {0, } };
5200 
5201    switch (bit_size) {
5202    case 32: {
5203 
5204 
5205 
5206          for (unsigned _i = 0; _i < num_components; _i++) {
5207                   const float32_t src0 =
5208                      _src[0].f32[_i];
5209 
5210                float32_t dst = (fabs(src0) < ldexpf(1.0, -14)) ? copysignf(0.0f, src0) : _mesa_half_to_float(_mesa_float_to_half(src0));
5211 
5212                _dst_val.f32[_i] = dst;
5213          }
5214 
5215       break;
5216    }
5217    case 64: {
5218 
5219 
5220 
5221          for (unsigned _i = 0; _i < num_components; _i++) {
5222                   const float64_t src0 =
5223                      _src[0].f64[_i];
5224 
5225                float64_t dst = (fabs(src0) < ldexpf(1.0, -14)) ? copysignf(0.0f, src0) : _mesa_half_to_float(_mesa_float_to_half(src0));
5226 
5227                _dst_val.f64[_i] = dst;
5228          }
5229 
5230       break;
5231    }
5232 
5233    default:
5234       unreachable("unknown bit width");
5235    }
5236 
5237    return _dst_val;
5238 }
5239 static nir_const_value
evaluate_frcp(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5240 evaluate_frcp(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5241                  MAYBE_UNUSED nir_const_value *_src)
5242 {
5243    nir_const_value _dst_val = { {0, } };
5244 
5245    switch (bit_size) {
5246    case 32: {
5247 
5248 
5249 
5250          for (unsigned _i = 0; _i < num_components; _i++) {
5251                   const float32_t src0 =
5252                      _src[0].f32[_i];
5253 
5254                float32_t dst = bit_size == 64 ? 1.0 / src0 : 1.0f / src0;
5255 
5256                _dst_val.f32[_i] = dst;
5257          }
5258 
5259       break;
5260    }
5261    case 64: {
5262 
5263 
5264 
5265          for (unsigned _i = 0; _i < num_components; _i++) {
5266                   const float64_t src0 =
5267                      _src[0].f64[_i];
5268 
5269                float64_t dst = bit_size == 64 ? 1.0 / src0 : 1.0f / src0;
5270 
5271                _dst_val.f64[_i] = dst;
5272          }
5273 
5274       break;
5275    }
5276 
5277    default:
5278       unreachable("unknown bit width");
5279    }
5280 
5281    return _dst_val;
5282 }
5283 static nir_const_value
evaluate_frem(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5284 evaluate_frem(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5285                  MAYBE_UNUSED nir_const_value *_src)
5286 {
5287    nir_const_value _dst_val = { {0, } };
5288 
5289    switch (bit_size) {
5290    case 32: {
5291 
5292 
5293 
5294          for (unsigned _i = 0; _i < num_components; _i++) {
5295                   const float32_t src0 =
5296                      _src[0].f32[_i];
5297                   const float32_t src1 =
5298                      _src[1].f32[_i];
5299 
5300                float32_t dst = src0 - src1 * truncf(src0 / src1);
5301 
5302                _dst_val.f32[_i] = dst;
5303          }
5304 
5305       break;
5306    }
5307    case 64: {
5308 
5309 
5310 
5311          for (unsigned _i = 0; _i < num_components; _i++) {
5312                   const float64_t src0 =
5313                      _src[0].f64[_i];
5314                   const float64_t src1 =
5315                      _src[1].f64[_i];
5316 
5317                float64_t dst = src0 - src1 * truncf(src0 / src1);
5318 
5319                _dst_val.f64[_i] = dst;
5320          }
5321 
5322       break;
5323    }
5324 
5325    default:
5326       unreachable("unknown bit width");
5327    }
5328 
5329    return _dst_val;
5330 }
5331 static nir_const_value
evaluate_fround_even(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5332 evaluate_fround_even(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5333                  MAYBE_UNUSED nir_const_value *_src)
5334 {
5335    nir_const_value _dst_val = { {0, } };
5336 
5337    switch (bit_size) {
5338    case 32: {
5339 
5340 
5341 
5342          for (unsigned _i = 0; _i < num_components; _i++) {
5343                   const float32_t src0 =
5344                      _src[0].f32[_i];
5345 
5346                float32_t dst = bit_size == 64 ? _mesa_roundeven(src0) : _mesa_roundevenf(src0);
5347 
5348                _dst_val.f32[_i] = dst;
5349          }
5350 
5351       break;
5352    }
5353    case 64: {
5354 
5355 
5356 
5357          for (unsigned _i = 0; _i < num_components; _i++) {
5358                   const float64_t src0 =
5359                      _src[0].f64[_i];
5360 
5361                float64_t dst = bit_size == 64 ? _mesa_roundeven(src0) : _mesa_roundevenf(src0);
5362 
5363                _dst_val.f64[_i] = dst;
5364          }
5365 
5366       break;
5367    }
5368 
5369    default:
5370       unreachable("unknown bit width");
5371    }
5372 
5373    return _dst_val;
5374 }
5375 static nir_const_value
evaluate_frsq(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5376 evaluate_frsq(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5377                  MAYBE_UNUSED nir_const_value *_src)
5378 {
5379    nir_const_value _dst_val = { {0, } };
5380 
5381    switch (bit_size) {
5382    case 32: {
5383 
5384 
5385 
5386          for (unsigned _i = 0; _i < num_components; _i++) {
5387                   const float32_t src0 =
5388                      _src[0].f32[_i];
5389 
5390                float32_t dst = bit_size == 64 ? 1.0 / sqrt(src0) : 1.0f / sqrtf(src0);
5391 
5392                _dst_val.f32[_i] = dst;
5393          }
5394 
5395       break;
5396    }
5397    case 64: {
5398 
5399 
5400 
5401          for (unsigned _i = 0; _i < num_components; _i++) {
5402                   const float64_t src0 =
5403                      _src[0].f64[_i];
5404 
5405                float64_t dst = bit_size == 64 ? 1.0 / sqrt(src0) : 1.0f / sqrtf(src0);
5406 
5407                _dst_val.f64[_i] = dst;
5408          }
5409 
5410       break;
5411    }
5412 
5413    default:
5414       unreachable("unknown bit width");
5415    }
5416 
5417    return _dst_val;
5418 }
5419 static nir_const_value
evaluate_fsat(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5420 evaluate_fsat(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5421                  MAYBE_UNUSED nir_const_value *_src)
5422 {
5423    nir_const_value _dst_val = { {0, } };
5424 
5425    switch (bit_size) {
5426    case 32: {
5427 
5428 
5429 
5430          for (unsigned _i = 0; _i < num_components; _i++) {
5431                   const float32_t src0 =
5432                      _src[0].f32[_i];
5433 
5434                float32_t dst = bit_size == 64 ? ((src0 > 1.0) ? 1.0 : ((src0 <= 0.0) ? 0.0 : src0)) : ((src0 > 1.0f) ? 1.0f : ((src0 <= 0.0f) ? 0.0f : src0));
5435 
5436                _dst_val.f32[_i] = dst;
5437          }
5438 
5439       break;
5440    }
5441    case 64: {
5442 
5443 
5444 
5445          for (unsigned _i = 0; _i < num_components; _i++) {
5446                   const float64_t src0 =
5447                      _src[0].f64[_i];
5448 
5449                float64_t dst = bit_size == 64 ? ((src0 > 1.0) ? 1.0 : ((src0 <= 0.0) ? 0.0 : src0)) : ((src0 > 1.0f) ? 1.0f : ((src0 <= 0.0f) ? 0.0f : src0));
5450 
5451                _dst_val.f64[_i] = dst;
5452          }
5453 
5454       break;
5455    }
5456 
5457    default:
5458       unreachable("unknown bit width");
5459    }
5460 
5461    return _dst_val;
5462 }
5463 static nir_const_value
evaluate_fsign(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5464 evaluate_fsign(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5465                  MAYBE_UNUSED nir_const_value *_src)
5466 {
5467    nir_const_value _dst_val = { {0, } };
5468 
5469    switch (bit_size) {
5470    case 32: {
5471 
5472 
5473 
5474          for (unsigned _i = 0; _i < num_components; _i++) {
5475                   const float32_t src0 =
5476                      _src[0].f32[_i];
5477 
5478                float32_t dst = bit_size == 64 ? ((src0 == 0.0) ? 0.0 : ((src0 > 0.0) ? 1.0 : -1.0)) : ((src0 == 0.0f) ? 0.0f : ((src0 > 0.0f) ? 1.0f : -1.0f));
5479 
5480                _dst_val.f32[_i] = dst;
5481          }
5482 
5483       break;
5484    }
5485    case 64: {
5486 
5487 
5488 
5489          for (unsigned _i = 0; _i < num_components; _i++) {
5490                   const float64_t src0 =
5491                      _src[0].f64[_i];
5492 
5493                float64_t dst = bit_size == 64 ? ((src0 == 0.0) ? 0.0 : ((src0 > 0.0) ? 1.0 : -1.0)) : ((src0 == 0.0f) ? 0.0f : ((src0 > 0.0f) ? 1.0f : -1.0f));
5494 
5495                _dst_val.f64[_i] = dst;
5496          }
5497 
5498       break;
5499    }
5500 
5501    default:
5502       unreachable("unknown bit width");
5503    }
5504 
5505    return _dst_val;
5506 }
5507 static nir_const_value
evaluate_fsin(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5508 evaluate_fsin(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5509                  MAYBE_UNUSED nir_const_value *_src)
5510 {
5511    nir_const_value _dst_val = { {0, } };
5512 
5513    switch (bit_size) {
5514    case 32: {
5515 
5516 
5517 
5518          for (unsigned _i = 0; _i < num_components; _i++) {
5519                   const float32_t src0 =
5520                      _src[0].f32[_i];
5521 
5522                float32_t dst = bit_size == 64 ? sin(src0) : sinf(src0);
5523 
5524                _dst_val.f32[_i] = dst;
5525          }
5526 
5527       break;
5528    }
5529    case 64: {
5530 
5531 
5532 
5533          for (unsigned _i = 0; _i < num_components; _i++) {
5534                   const float64_t src0 =
5535                      _src[0].f64[_i];
5536 
5537                float64_t dst = bit_size == 64 ? sin(src0) : sinf(src0);
5538 
5539                _dst_val.f64[_i] = dst;
5540          }
5541 
5542       break;
5543    }
5544 
5545    default:
5546       unreachable("unknown bit width");
5547    }
5548 
5549    return _dst_val;
5550 }
5551 static nir_const_value
evaluate_fsqrt(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5552 evaluate_fsqrt(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5553                  MAYBE_UNUSED nir_const_value *_src)
5554 {
5555    nir_const_value _dst_val = { {0, } };
5556 
5557    switch (bit_size) {
5558    case 32: {
5559 
5560 
5561 
5562          for (unsigned _i = 0; _i < num_components; _i++) {
5563                   const float32_t src0 =
5564                      _src[0].f32[_i];
5565 
5566                float32_t dst = bit_size == 64 ? sqrt(src0) : sqrtf(src0);
5567 
5568                _dst_val.f32[_i] = dst;
5569          }
5570 
5571       break;
5572    }
5573    case 64: {
5574 
5575 
5576 
5577          for (unsigned _i = 0; _i < num_components; _i++) {
5578                   const float64_t src0 =
5579                      _src[0].f64[_i];
5580 
5581                float64_t dst = bit_size == 64 ? sqrt(src0) : sqrtf(src0);
5582 
5583                _dst_val.f64[_i] = dst;
5584          }
5585 
5586       break;
5587    }
5588 
5589    default:
5590       unreachable("unknown bit width");
5591    }
5592 
5593    return _dst_val;
5594 }
5595 static nir_const_value
evaluate_fsub(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5596 evaluate_fsub(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5597                  MAYBE_UNUSED nir_const_value *_src)
5598 {
5599    nir_const_value _dst_val = { {0, } };
5600 
5601    switch (bit_size) {
5602    case 32: {
5603 
5604 
5605 
5606          for (unsigned _i = 0; _i < num_components; _i++) {
5607                   const float32_t src0 =
5608                      _src[0].f32[_i];
5609                   const float32_t src1 =
5610                      _src[1].f32[_i];
5611 
5612                float32_t dst = src0 - src1;
5613 
5614                _dst_val.f32[_i] = dst;
5615          }
5616 
5617       break;
5618    }
5619    case 64: {
5620 
5621 
5622 
5623          for (unsigned _i = 0; _i < num_components; _i++) {
5624                   const float64_t src0 =
5625                      _src[0].f64[_i];
5626                   const float64_t src1 =
5627                      _src[1].f64[_i];
5628 
5629                float64_t dst = src0 - src1;
5630 
5631                _dst_val.f64[_i] = dst;
5632          }
5633 
5634       break;
5635    }
5636 
5637    default:
5638       unreachable("unknown bit width");
5639    }
5640 
5641    return _dst_val;
5642 }
5643 static nir_const_value
evaluate_ftrunc(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5644 evaluate_ftrunc(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5645                  MAYBE_UNUSED nir_const_value *_src)
5646 {
5647    nir_const_value _dst_val = { {0, } };
5648 
5649    switch (bit_size) {
5650    case 32: {
5651 
5652 
5653 
5654          for (unsigned _i = 0; _i < num_components; _i++) {
5655                   const float32_t src0 =
5656                      _src[0].f32[_i];
5657 
5658                float32_t dst = bit_size == 64 ? trunc(src0) : truncf(src0);
5659 
5660                _dst_val.f32[_i] = dst;
5661          }
5662 
5663       break;
5664    }
5665    case 64: {
5666 
5667 
5668 
5669          for (unsigned _i = 0; _i < num_components; _i++) {
5670                   const float64_t src0 =
5671                      _src[0].f64[_i];
5672 
5673                float64_t dst = bit_size == 64 ? trunc(src0) : truncf(src0);
5674 
5675                _dst_val.f64[_i] = dst;
5676          }
5677 
5678       break;
5679    }
5680 
5681    default:
5682       unreachable("unknown bit width");
5683    }
5684 
5685    return _dst_val;
5686 }
5687 static nir_const_value
evaluate_fxor(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5688 evaluate_fxor(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5689                  MAYBE_UNUSED nir_const_value *_src)
5690 {
5691    nir_const_value _dst_val = { {0, } };
5692 
5693    switch (bit_size) {
5694    case 32: {
5695 
5696 
5697 
5698          for (unsigned _i = 0; _i < num_components; _i++) {
5699                   const float32_t src0 =
5700                      _src[0].f32[_i];
5701                   const float32_t src1 =
5702                      _src[1].f32[_i];
5703 
5704                float32_t dst = (src0 != 0.0f && src1 == 0.0f) || (src0 == 0.0f && src1 != 0.0f) ? 1.0f : 0.0f;
5705 
5706                _dst_val.f32[_i] = dst;
5707          }
5708 
5709       break;
5710    }
5711    case 64: {
5712 
5713 
5714 
5715          for (unsigned _i = 0; _i < num_components; _i++) {
5716                   const float32_t src0 =
5717                      _src[0].f32[_i];
5718                   const float32_t src1 =
5719                      _src[1].f32[_i];
5720 
5721                float32_t dst = (src0 != 0.0f && src1 == 0.0f) || (src0 == 0.0f && src1 != 0.0f) ? 1.0f : 0.0f;
5722 
5723                _dst_val.f32[_i] = dst;
5724          }
5725 
5726       break;
5727    }
5728 
5729    default:
5730       unreachable("unknown bit width");
5731    }
5732 
5733    return _dst_val;
5734 }
5735 static nir_const_value
evaluate_i2b(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5736 evaluate_i2b(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5737                  MAYBE_UNUSED nir_const_value *_src)
5738 {
5739    nir_const_value _dst_val = { {0, } };
5740 
5741    switch (bit_size) {
5742    case 32: {
5743 
5744 
5745 
5746          for (unsigned _i = 0; _i < num_components; _i++) {
5747                   const int32_t src0 =
5748                      _src[0].i32[_i];
5749 
5750                bool32_t dst = src0 != 0;
5751 
5752                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
5753          }
5754 
5755       break;
5756    }
5757    case 64: {
5758 
5759 
5760 
5761          for (unsigned _i = 0; _i < num_components; _i++) {
5762                   const int32_t src0 =
5763                      _src[0].i32[_i];
5764 
5765                bool32_t dst = src0 != 0;
5766 
5767                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
5768          }
5769 
5770       break;
5771    }
5772 
5773    default:
5774       unreachable("unknown bit width");
5775    }
5776 
5777    return _dst_val;
5778 }
5779 static nir_const_value
evaluate_i2d(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5780 evaluate_i2d(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5781                  MAYBE_UNUSED nir_const_value *_src)
5782 {
5783    nir_const_value _dst_val = { {0, } };
5784 
5785    switch (bit_size) {
5786    case 32: {
5787 
5788 
5789 
5790          for (unsigned _i = 0; _i < num_components; _i++) {
5791                   const int32_t src0 =
5792                      _src[0].i32[_i];
5793 
5794                float64_t dst = src0;
5795 
5796                _dst_val.f64[_i] = dst;
5797          }
5798 
5799       break;
5800    }
5801    case 64: {
5802 
5803 
5804 
5805          for (unsigned _i = 0; _i < num_components; _i++) {
5806                   const int32_t src0 =
5807                      _src[0].i32[_i];
5808 
5809                float64_t dst = src0;
5810 
5811                _dst_val.f64[_i] = dst;
5812          }
5813 
5814       break;
5815    }
5816 
5817    default:
5818       unreachable("unknown bit width");
5819    }
5820 
5821    return _dst_val;
5822 }
5823 static nir_const_value
evaluate_i2f(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5824 evaluate_i2f(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5825                  MAYBE_UNUSED nir_const_value *_src)
5826 {
5827    nir_const_value _dst_val = { {0, } };
5828 
5829    switch (bit_size) {
5830    case 32: {
5831 
5832 
5833 
5834          for (unsigned _i = 0; _i < num_components; _i++) {
5835                   const int32_t src0 =
5836                      _src[0].i32[_i];
5837 
5838                float32_t dst = src0;
5839 
5840                _dst_val.f32[_i] = dst;
5841          }
5842 
5843       break;
5844    }
5845    case 64: {
5846 
5847 
5848 
5849          for (unsigned _i = 0; _i < num_components; _i++) {
5850                   const int32_t src0 =
5851                      _src[0].i32[_i];
5852 
5853                float32_t dst = src0;
5854 
5855                _dst_val.f32[_i] = dst;
5856          }
5857 
5858       break;
5859    }
5860 
5861    default:
5862       unreachable("unknown bit width");
5863    }
5864 
5865    return _dst_val;
5866 }
5867 static nir_const_value
evaluate_iabs(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5868 evaluate_iabs(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5869                  MAYBE_UNUSED nir_const_value *_src)
5870 {
5871    nir_const_value _dst_val = { {0, } };
5872 
5873    switch (bit_size) {
5874    case 32: {
5875 
5876 
5877 
5878          for (unsigned _i = 0; _i < num_components; _i++) {
5879                   const int32_t src0 =
5880                      _src[0].i32[_i];
5881 
5882                int32_t dst = (src0 < 0) ? -src0 : src0;
5883 
5884                _dst_val.i32[_i] = dst;
5885          }
5886 
5887       break;
5888    }
5889    case 64: {
5890 
5891 
5892 
5893          for (unsigned _i = 0; _i < num_components; _i++) {
5894                   const int64_t src0 =
5895                      _src[0].i64[_i];
5896 
5897                int64_t dst = (src0 < 0) ? -src0 : src0;
5898 
5899                _dst_val.i64[_i] = dst;
5900          }
5901 
5902       break;
5903    }
5904 
5905    default:
5906       unreachable("unknown bit width");
5907    }
5908 
5909    return _dst_val;
5910 }
5911 static nir_const_value
evaluate_iadd(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5912 evaluate_iadd(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5913                  MAYBE_UNUSED nir_const_value *_src)
5914 {
5915    nir_const_value _dst_val = { {0, } };
5916 
5917    switch (bit_size) {
5918    case 32: {
5919 
5920 
5921 
5922          for (unsigned _i = 0; _i < num_components; _i++) {
5923                   const int32_t src0 =
5924                      _src[0].i32[_i];
5925                   const int32_t src1 =
5926                      _src[1].i32[_i];
5927 
5928                int32_t dst = src0 + src1;
5929 
5930                _dst_val.i32[_i] = dst;
5931          }
5932 
5933       break;
5934    }
5935    case 64: {
5936 
5937 
5938 
5939          for (unsigned _i = 0; _i < num_components; _i++) {
5940                   const int64_t src0 =
5941                      _src[0].i64[_i];
5942                   const int64_t src1 =
5943                      _src[1].i64[_i];
5944 
5945                int64_t dst = src0 + src1;
5946 
5947                _dst_val.i64[_i] = dst;
5948          }
5949 
5950       break;
5951    }
5952 
5953    default:
5954       unreachable("unknown bit width");
5955    }
5956 
5957    return _dst_val;
5958 }
5959 static nir_const_value
evaluate_iand(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)5960 evaluate_iand(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
5961                  MAYBE_UNUSED nir_const_value *_src)
5962 {
5963    nir_const_value _dst_val = { {0, } };
5964 
5965    switch (bit_size) {
5966    case 32: {
5967 
5968 
5969 
5970          for (unsigned _i = 0; _i < num_components; _i++) {
5971                   const uint32_t src0 =
5972                      _src[0].u32[_i];
5973                   const uint32_t src1 =
5974                      _src[1].u32[_i];
5975 
5976                uint32_t dst = src0 & src1;
5977 
5978                _dst_val.u32[_i] = dst;
5979          }
5980 
5981       break;
5982    }
5983    case 64: {
5984 
5985 
5986 
5987          for (unsigned _i = 0; _i < num_components; _i++) {
5988                   const uint64_t src0 =
5989                      _src[0].u64[_i];
5990                   const uint64_t src1 =
5991                      _src[1].u64[_i];
5992 
5993                uint64_t dst = src0 & src1;
5994 
5995                _dst_val.u64[_i] = dst;
5996          }
5997 
5998       break;
5999    }
6000 
6001    default:
6002       unreachable("unknown bit width");
6003    }
6004 
6005    return _dst_val;
6006 }
6007 static nir_const_value
evaluate_ibfe(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6008 evaluate_ibfe(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6009                  MAYBE_UNUSED nir_const_value *_src)
6010 {
6011    nir_const_value _dst_val = { {0, } };
6012 
6013    switch (bit_size) {
6014    case 32: {
6015 
6016 
6017 
6018          for (unsigned _i = 0; _i < num_components; _i++) {
6019                   const int32_t src0 =
6020                      _src[0].i32[_i];
6021                   const int32_t src1 =
6022                      _src[1].i32[_i];
6023                   const int32_t src2 =
6024                      _src[2].i32[_i];
6025 
6026                int32_t dst;
6027 
6028 
6029 int base = src0;
6030 int offset = src1, bits = src2;
6031 if (bits == 0) {
6032    dst = 0;
6033 } else if (bits < 0 || offset < 0) {
6034    dst = 0; /* undefined */
6035 } else if (offset + bits < 32) {
6036    dst = (base << (32 - bits - offset)) >> (32 - bits);
6037 } else {
6038    dst = base >> offset;
6039 }
6040 
6041 
6042                _dst_val.i32[_i] = dst;
6043          }
6044 
6045       break;
6046    }
6047    case 64: {
6048 
6049 
6050 
6051          for (unsigned _i = 0; _i < num_components; _i++) {
6052                   const int32_t src0 =
6053                      _src[0].i32[_i];
6054                   const int32_t src1 =
6055                      _src[1].i32[_i];
6056                   const int32_t src2 =
6057                      _src[2].i32[_i];
6058 
6059                int32_t dst;
6060 
6061 
6062 int base = src0;
6063 int offset = src1, bits = src2;
6064 if (bits == 0) {
6065    dst = 0;
6066 } else if (bits < 0 || offset < 0) {
6067    dst = 0; /* undefined */
6068 } else if (offset + bits < 32) {
6069    dst = (base << (32 - bits - offset)) >> (32 - bits);
6070 } else {
6071    dst = base >> offset;
6072 }
6073 
6074 
6075                _dst_val.i32[_i] = dst;
6076          }
6077 
6078       break;
6079    }
6080 
6081    default:
6082       unreachable("unknown bit width");
6083    }
6084 
6085    return _dst_val;
6086 }
6087 static nir_const_value
evaluate_ibitfield_extract(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6088 evaluate_ibitfield_extract(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6089                  MAYBE_UNUSED nir_const_value *_src)
6090 {
6091    nir_const_value _dst_val = { {0, } };
6092 
6093    switch (bit_size) {
6094    case 32: {
6095 
6096 
6097 
6098          for (unsigned _i = 0; _i < num_components; _i++) {
6099                   const int32_t src0 =
6100                      _src[0].i32[_i];
6101                   const int32_t src1 =
6102                      _src[1].i32[_i];
6103                   const int32_t src2 =
6104                      _src[2].i32[_i];
6105 
6106                int32_t dst;
6107 
6108 
6109 int base = src0;
6110 int offset = src1, bits = src2;
6111 if (bits == 0) {
6112    dst = 0;
6113 } else if (offset < 0 || bits < 0 || offset + bits > 32) {
6114    dst = 0;
6115 } else {
6116    dst = (base << (32 - offset - bits)) >> offset; /* use sign-extending shift */
6117 }
6118 
6119 
6120                _dst_val.i32[_i] = dst;
6121          }
6122 
6123       break;
6124    }
6125    case 64: {
6126 
6127 
6128 
6129          for (unsigned _i = 0; _i < num_components; _i++) {
6130                   const int32_t src0 =
6131                      _src[0].i32[_i];
6132                   const int32_t src1 =
6133                      _src[1].i32[_i];
6134                   const int32_t src2 =
6135                      _src[2].i32[_i];
6136 
6137                int32_t dst;
6138 
6139 
6140 int base = src0;
6141 int offset = src1, bits = src2;
6142 if (bits == 0) {
6143    dst = 0;
6144 } else if (offset < 0 || bits < 0 || offset + bits > 32) {
6145    dst = 0;
6146 } else {
6147    dst = (base << (32 - offset - bits)) >> offset; /* use sign-extending shift */
6148 }
6149 
6150 
6151                _dst_val.i32[_i] = dst;
6152          }
6153 
6154       break;
6155    }
6156 
6157    default:
6158       unreachable("unknown bit width");
6159    }
6160 
6161    return _dst_val;
6162 }
6163 static nir_const_value
evaluate_idiv(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6164 evaluate_idiv(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6165                  MAYBE_UNUSED nir_const_value *_src)
6166 {
6167    nir_const_value _dst_val = { {0, } };
6168 
6169    switch (bit_size) {
6170    case 32: {
6171 
6172 
6173 
6174          for (unsigned _i = 0; _i < num_components; _i++) {
6175                   const int32_t src0 =
6176                      _src[0].i32[_i];
6177                   const int32_t src1 =
6178                      _src[1].i32[_i];
6179 
6180                int32_t dst = src0 / src1;
6181 
6182                _dst_val.i32[_i] = dst;
6183          }
6184 
6185       break;
6186    }
6187    case 64: {
6188 
6189 
6190 
6191          for (unsigned _i = 0; _i < num_components; _i++) {
6192                   const int64_t src0 =
6193                      _src[0].i64[_i];
6194                   const int64_t src1 =
6195                      _src[1].i64[_i];
6196 
6197                int64_t dst = src0 / src1;
6198 
6199                _dst_val.i64[_i] = dst;
6200          }
6201 
6202       break;
6203    }
6204 
6205    default:
6206       unreachable("unknown bit width");
6207    }
6208 
6209    return _dst_val;
6210 }
6211 static nir_const_value
evaluate_ieq(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6212 evaluate_ieq(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6213                  MAYBE_UNUSED nir_const_value *_src)
6214 {
6215    nir_const_value _dst_val = { {0, } };
6216 
6217    switch (bit_size) {
6218    case 32: {
6219 
6220 
6221 
6222          for (unsigned _i = 0; _i < num_components; _i++) {
6223                   const int32_t src0 =
6224                      _src[0].i32[_i];
6225                   const int32_t src1 =
6226                      _src[1].i32[_i];
6227 
6228                bool32_t dst = src0 == src1;
6229 
6230                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6231          }
6232 
6233       break;
6234    }
6235    case 64: {
6236 
6237 
6238 
6239          for (unsigned _i = 0; _i < num_components; _i++) {
6240                   const int64_t src0 =
6241                      _src[0].i64[_i];
6242                   const int64_t src1 =
6243                      _src[1].i64[_i];
6244 
6245                bool32_t dst = src0 == src1;
6246 
6247                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6248          }
6249 
6250       break;
6251    }
6252 
6253    default:
6254       unreachable("unknown bit width");
6255    }
6256 
6257    return _dst_val;
6258 }
6259 static nir_const_value
evaluate_ifind_msb(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6260 evaluate_ifind_msb(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6261                  MAYBE_UNUSED nir_const_value *_src)
6262 {
6263    nir_const_value _dst_val = { {0, } };
6264 
6265    switch (bit_size) {
6266    case 32: {
6267 
6268 
6269 
6270          for (unsigned _i = 0; _i < num_components; _i++) {
6271                   const int32_t src0 =
6272                      _src[0].i32[_i];
6273 
6274                int32_t dst;
6275 
6276 
6277 dst = -1;
6278 for (int bit = 31; bit >= 0; bit--) {
6279    /* If src0 < 0, we're looking for the first 0 bit.
6280     * if src0 >= 0, we're looking for the first 1 bit.
6281     */
6282    if ((((src0 >> bit) & 1) && (src0 >= 0)) ||
6283       (!((src0 >> bit) & 1) && (src0 < 0))) {
6284       dst = bit;
6285       break;
6286    }
6287 }
6288 
6289 
6290                _dst_val.i32[_i] = dst;
6291          }
6292 
6293       break;
6294    }
6295    case 64: {
6296 
6297 
6298 
6299          for (unsigned _i = 0; _i < num_components; _i++) {
6300                   const int32_t src0 =
6301                      _src[0].i32[_i];
6302 
6303                int32_t dst;
6304 
6305 
6306 dst = -1;
6307 for (int bit = 31; bit >= 0; bit--) {
6308    /* If src0 < 0, we're looking for the first 0 bit.
6309     * if src0 >= 0, we're looking for the first 1 bit.
6310     */
6311    if ((((src0 >> bit) & 1) && (src0 >= 0)) ||
6312       (!((src0 >> bit) & 1) && (src0 < 0))) {
6313       dst = bit;
6314       break;
6315    }
6316 }
6317 
6318 
6319                _dst_val.i32[_i] = dst;
6320          }
6321 
6322       break;
6323    }
6324 
6325    default:
6326       unreachable("unknown bit width");
6327    }
6328 
6329    return _dst_val;
6330 }
6331 static nir_const_value
evaluate_ige(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6332 evaluate_ige(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6333                  MAYBE_UNUSED nir_const_value *_src)
6334 {
6335    nir_const_value _dst_val = { {0, } };
6336 
6337    switch (bit_size) {
6338    case 32: {
6339 
6340 
6341 
6342          for (unsigned _i = 0; _i < num_components; _i++) {
6343                   const int32_t src0 =
6344                      _src[0].i32[_i];
6345                   const int32_t src1 =
6346                      _src[1].i32[_i];
6347 
6348                bool32_t dst = src0 >= src1;
6349 
6350                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6351          }
6352 
6353       break;
6354    }
6355    case 64: {
6356 
6357 
6358 
6359          for (unsigned _i = 0; _i < num_components; _i++) {
6360                   const int64_t src0 =
6361                      _src[0].i64[_i];
6362                   const int64_t src1 =
6363                      _src[1].i64[_i];
6364 
6365                bool32_t dst = src0 >= src1;
6366 
6367                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6368          }
6369 
6370       break;
6371    }
6372 
6373    default:
6374       unreachable("unknown bit width");
6375    }
6376 
6377    return _dst_val;
6378 }
6379 static nir_const_value
evaluate_ilt(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6380 evaluate_ilt(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6381                  MAYBE_UNUSED nir_const_value *_src)
6382 {
6383    nir_const_value _dst_val = { {0, } };
6384 
6385    switch (bit_size) {
6386    case 32: {
6387 
6388 
6389 
6390          for (unsigned _i = 0; _i < num_components; _i++) {
6391                   const int32_t src0 =
6392                      _src[0].i32[_i];
6393                   const int32_t src1 =
6394                      _src[1].i32[_i];
6395 
6396                bool32_t dst = src0 < src1;
6397 
6398                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6399          }
6400 
6401       break;
6402    }
6403    case 64: {
6404 
6405 
6406 
6407          for (unsigned _i = 0; _i < num_components; _i++) {
6408                   const int64_t src0 =
6409                      _src[0].i64[_i];
6410                   const int64_t src1 =
6411                      _src[1].i64[_i];
6412 
6413                bool32_t dst = src0 < src1;
6414 
6415                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6416          }
6417 
6418       break;
6419    }
6420 
6421    default:
6422       unreachable("unknown bit width");
6423    }
6424 
6425    return _dst_val;
6426 }
6427 static nir_const_value
evaluate_imax(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6428 evaluate_imax(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6429                  MAYBE_UNUSED nir_const_value *_src)
6430 {
6431    nir_const_value _dst_val = { {0, } };
6432 
6433    switch (bit_size) {
6434    case 32: {
6435 
6436 
6437 
6438          for (unsigned _i = 0; _i < num_components; _i++) {
6439                   const int32_t src0 =
6440                      _src[0].i32[_i];
6441                   const int32_t src1 =
6442                      _src[1].i32[_i];
6443 
6444                int32_t dst = src1 > src0 ? src1 : src0;
6445 
6446                _dst_val.i32[_i] = dst;
6447          }
6448 
6449       break;
6450    }
6451    case 64: {
6452 
6453 
6454 
6455          for (unsigned _i = 0; _i < num_components; _i++) {
6456                   const int64_t src0 =
6457                      _src[0].i64[_i];
6458                   const int64_t src1 =
6459                      _src[1].i64[_i];
6460 
6461                int64_t dst = src1 > src0 ? src1 : src0;
6462 
6463                _dst_val.i64[_i] = dst;
6464          }
6465 
6466       break;
6467    }
6468 
6469    default:
6470       unreachable("unknown bit width");
6471    }
6472 
6473    return _dst_val;
6474 }
6475 static nir_const_value
evaluate_imin(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6476 evaluate_imin(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6477                  MAYBE_UNUSED nir_const_value *_src)
6478 {
6479    nir_const_value _dst_val = { {0, } };
6480 
6481    switch (bit_size) {
6482    case 32: {
6483 
6484 
6485 
6486          for (unsigned _i = 0; _i < num_components; _i++) {
6487                   const int32_t src0 =
6488                      _src[0].i32[_i];
6489                   const int32_t src1 =
6490                      _src[1].i32[_i];
6491 
6492                int32_t dst = src1 > src0 ? src0 : src1;
6493 
6494                _dst_val.i32[_i] = dst;
6495          }
6496 
6497       break;
6498    }
6499    case 64: {
6500 
6501 
6502 
6503          for (unsigned _i = 0; _i < num_components; _i++) {
6504                   const int64_t src0 =
6505                      _src[0].i64[_i];
6506                   const int64_t src1 =
6507                      _src[1].i64[_i];
6508 
6509                int64_t dst = src1 > src0 ? src0 : src1;
6510 
6511                _dst_val.i64[_i] = dst;
6512          }
6513 
6514       break;
6515    }
6516 
6517    default:
6518       unreachable("unknown bit width");
6519    }
6520 
6521    return _dst_val;
6522 }
6523 static nir_const_value
evaluate_imod(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6524 evaluate_imod(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6525                  MAYBE_UNUSED nir_const_value *_src)
6526 {
6527    nir_const_value _dst_val = { {0, } };
6528 
6529    switch (bit_size) {
6530    case 32: {
6531 
6532 
6533 
6534          for (unsigned _i = 0; _i < num_components; _i++) {
6535                   const int32_t src0 =
6536                      _src[0].i32[_i];
6537                   const int32_t src1 =
6538                      _src[1].i32[_i];
6539 
6540                int32_t dst = src1 == 0 ? 0 : ((src0 % src1 == 0 || (src0 >= 0) == (src1 >= 0)) ?                 src0 % src1 : src0 % src1 + src1);
6541 
6542                _dst_val.i32[_i] = dst;
6543          }
6544 
6545       break;
6546    }
6547    case 64: {
6548 
6549 
6550 
6551          for (unsigned _i = 0; _i < num_components; _i++) {
6552                   const int64_t src0 =
6553                      _src[0].i64[_i];
6554                   const int64_t src1 =
6555                      _src[1].i64[_i];
6556 
6557                int64_t dst = src1 == 0 ? 0 : ((src0 % src1 == 0 || (src0 >= 0) == (src1 >= 0)) ?                 src0 % src1 : src0 % src1 + src1);
6558 
6559                _dst_val.i64[_i] = dst;
6560          }
6561 
6562       break;
6563    }
6564 
6565    default:
6566       unreachable("unknown bit width");
6567    }
6568 
6569    return _dst_val;
6570 }
6571 static nir_const_value
evaluate_imov(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6572 evaluate_imov(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6573                  MAYBE_UNUSED nir_const_value *_src)
6574 {
6575    nir_const_value _dst_val = { {0, } };
6576 
6577    switch (bit_size) {
6578    case 32: {
6579 
6580 
6581 
6582          for (unsigned _i = 0; _i < num_components; _i++) {
6583                   const int32_t src0 =
6584                      _src[0].i32[_i];
6585 
6586                int32_t dst = src0;
6587 
6588                _dst_val.i32[_i] = dst;
6589          }
6590 
6591       break;
6592    }
6593    case 64: {
6594 
6595 
6596 
6597          for (unsigned _i = 0; _i < num_components; _i++) {
6598                   const int64_t src0 =
6599                      _src[0].i64[_i];
6600 
6601                int64_t dst = src0;
6602 
6603                _dst_val.i64[_i] = dst;
6604          }
6605 
6606       break;
6607    }
6608 
6609    default:
6610       unreachable("unknown bit width");
6611    }
6612 
6613    return _dst_val;
6614 }
6615 static nir_const_value
evaluate_imul(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6616 evaluate_imul(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6617                  MAYBE_UNUSED nir_const_value *_src)
6618 {
6619    nir_const_value _dst_val = { {0, } };
6620 
6621    switch (bit_size) {
6622    case 32: {
6623 
6624 
6625 
6626          for (unsigned _i = 0; _i < num_components; _i++) {
6627                   const int32_t src0 =
6628                      _src[0].i32[_i];
6629                   const int32_t src1 =
6630                      _src[1].i32[_i];
6631 
6632                int32_t dst = src0 * src1;
6633 
6634                _dst_val.i32[_i] = dst;
6635          }
6636 
6637       break;
6638    }
6639    case 64: {
6640 
6641 
6642 
6643          for (unsigned _i = 0; _i < num_components; _i++) {
6644                   const int64_t src0 =
6645                      _src[0].i64[_i];
6646                   const int64_t src1 =
6647                      _src[1].i64[_i];
6648 
6649                int64_t dst = src0 * src1;
6650 
6651                _dst_val.i64[_i] = dst;
6652          }
6653 
6654       break;
6655    }
6656 
6657    default:
6658       unreachable("unknown bit width");
6659    }
6660 
6661    return _dst_val;
6662 }
6663 static nir_const_value
evaluate_imul_high(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6664 evaluate_imul_high(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6665                  MAYBE_UNUSED nir_const_value *_src)
6666 {
6667    nir_const_value _dst_val = { {0, } };
6668 
6669    switch (bit_size) {
6670    case 32: {
6671 
6672 
6673 
6674          for (unsigned _i = 0; _i < num_components; _i++) {
6675                   const int32_t src0 =
6676                      _src[0].i32[_i];
6677                   const int32_t src1 =
6678                      _src[1].i32[_i];
6679 
6680                int32_t dst = (int32_t)(((int64_t) src0 * (int64_t) src1) >> 32);
6681 
6682                _dst_val.i32[_i] = dst;
6683          }
6684 
6685       break;
6686    }
6687    case 64: {
6688 
6689 
6690 
6691          for (unsigned _i = 0; _i < num_components; _i++) {
6692                   const int32_t src0 =
6693                      _src[0].i32[_i];
6694                   const int32_t src1 =
6695                      _src[1].i32[_i];
6696 
6697                int32_t dst = (int32_t)(((int64_t) src0 * (int64_t) src1) >> 32);
6698 
6699                _dst_val.i32[_i] = dst;
6700          }
6701 
6702       break;
6703    }
6704 
6705    default:
6706       unreachable("unknown bit width");
6707    }
6708 
6709    return _dst_val;
6710 }
6711 static nir_const_value
evaluate_ine(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6712 evaluate_ine(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6713                  MAYBE_UNUSED nir_const_value *_src)
6714 {
6715    nir_const_value _dst_val = { {0, } };
6716 
6717    switch (bit_size) {
6718    case 32: {
6719 
6720 
6721 
6722          for (unsigned _i = 0; _i < num_components; _i++) {
6723                   const int32_t src0 =
6724                      _src[0].i32[_i];
6725                   const int32_t src1 =
6726                      _src[1].i32[_i];
6727 
6728                bool32_t dst = src0 != src1;
6729 
6730                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6731          }
6732 
6733       break;
6734    }
6735    case 64: {
6736 
6737 
6738 
6739          for (unsigned _i = 0; _i < num_components; _i++) {
6740                   const int64_t src0 =
6741                      _src[0].i64[_i];
6742                   const int64_t src1 =
6743                      _src[1].i64[_i];
6744 
6745                bool32_t dst = src0 != src1;
6746 
6747                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
6748          }
6749 
6750       break;
6751    }
6752 
6753    default:
6754       unreachable("unknown bit width");
6755    }
6756 
6757    return _dst_val;
6758 }
6759 static nir_const_value
evaluate_ineg(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6760 evaluate_ineg(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6761                  MAYBE_UNUSED nir_const_value *_src)
6762 {
6763    nir_const_value _dst_val = { {0, } };
6764 
6765    switch (bit_size) {
6766    case 32: {
6767 
6768 
6769 
6770          for (unsigned _i = 0; _i < num_components; _i++) {
6771                   const int32_t src0 =
6772                      _src[0].i32[_i];
6773 
6774                int32_t dst = -src0;
6775 
6776                _dst_val.i32[_i] = dst;
6777          }
6778 
6779       break;
6780    }
6781    case 64: {
6782 
6783 
6784 
6785          for (unsigned _i = 0; _i < num_components; _i++) {
6786                   const int64_t src0 =
6787                      _src[0].i64[_i];
6788 
6789                int64_t dst = -src0;
6790 
6791                _dst_val.i64[_i] = dst;
6792          }
6793 
6794       break;
6795    }
6796 
6797    default:
6798       unreachable("unknown bit width");
6799    }
6800 
6801    return _dst_val;
6802 }
6803 static nir_const_value
evaluate_inot(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6804 evaluate_inot(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6805                  MAYBE_UNUSED nir_const_value *_src)
6806 {
6807    nir_const_value _dst_val = { {0, } };
6808 
6809    switch (bit_size) {
6810    case 32: {
6811 
6812 
6813 
6814          for (unsigned _i = 0; _i < num_components; _i++) {
6815                   const int32_t src0 =
6816                      _src[0].i32[_i];
6817 
6818                int32_t dst = ~src0;
6819 
6820                _dst_val.i32[_i] = dst;
6821          }
6822 
6823       break;
6824    }
6825    case 64: {
6826 
6827 
6828 
6829          for (unsigned _i = 0; _i < num_components; _i++) {
6830                   const int64_t src0 =
6831                      _src[0].i64[_i];
6832 
6833                int64_t dst = ~src0;
6834 
6835                _dst_val.i64[_i] = dst;
6836          }
6837 
6838       break;
6839    }
6840 
6841    default:
6842       unreachable("unknown bit width");
6843    }
6844 
6845    return _dst_val;
6846 }
6847 static nir_const_value
evaluate_ior(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6848 evaluate_ior(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6849                  MAYBE_UNUSED nir_const_value *_src)
6850 {
6851    nir_const_value _dst_val = { {0, } };
6852 
6853    switch (bit_size) {
6854    case 32: {
6855 
6856 
6857 
6858          for (unsigned _i = 0; _i < num_components; _i++) {
6859                   const uint32_t src0 =
6860                      _src[0].u32[_i];
6861                   const uint32_t src1 =
6862                      _src[1].u32[_i];
6863 
6864                uint32_t dst = src0 | src1;
6865 
6866                _dst_val.u32[_i] = dst;
6867          }
6868 
6869       break;
6870    }
6871    case 64: {
6872 
6873 
6874 
6875          for (unsigned _i = 0; _i < num_components; _i++) {
6876                   const uint64_t src0 =
6877                      _src[0].u64[_i];
6878                   const uint64_t src1 =
6879                      _src[1].u64[_i];
6880 
6881                uint64_t dst = src0 | src1;
6882 
6883                _dst_val.u64[_i] = dst;
6884          }
6885 
6886       break;
6887    }
6888 
6889    default:
6890       unreachable("unknown bit width");
6891    }
6892 
6893    return _dst_val;
6894 }
6895 static nir_const_value
evaluate_irem(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6896 evaluate_irem(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6897                  MAYBE_UNUSED nir_const_value *_src)
6898 {
6899    nir_const_value _dst_val = { {0, } };
6900 
6901    switch (bit_size) {
6902    case 32: {
6903 
6904 
6905 
6906          for (unsigned _i = 0; _i < num_components; _i++) {
6907                   const int32_t src0 =
6908                      _src[0].i32[_i];
6909                   const int32_t src1 =
6910                      _src[1].i32[_i];
6911 
6912                int32_t dst = src1 == 0 ? 0 : src0 % src1;
6913 
6914                _dst_val.i32[_i] = dst;
6915          }
6916 
6917       break;
6918    }
6919    case 64: {
6920 
6921 
6922 
6923          for (unsigned _i = 0; _i < num_components; _i++) {
6924                   const int64_t src0 =
6925                      _src[0].i64[_i];
6926                   const int64_t src1 =
6927                      _src[1].i64[_i];
6928 
6929                int64_t dst = src1 == 0 ? 0 : src0 % src1;
6930 
6931                _dst_val.i64[_i] = dst;
6932          }
6933 
6934       break;
6935    }
6936 
6937    default:
6938       unreachable("unknown bit width");
6939    }
6940 
6941    return _dst_val;
6942 }
6943 static nir_const_value
evaluate_ishl(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6944 evaluate_ishl(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6945                  MAYBE_UNUSED nir_const_value *_src)
6946 {
6947    nir_const_value _dst_val = { {0, } };
6948 
6949    switch (bit_size) {
6950    case 32: {
6951 
6952 
6953 
6954          for (unsigned _i = 0; _i < num_components; _i++) {
6955                   const int32_t src0 =
6956                      _src[0].i32[_i];
6957                   const int32_t src1 =
6958                      _src[1].i32[_i];
6959 
6960                int32_t dst = src0 << src1;
6961 
6962                _dst_val.i32[_i] = dst;
6963          }
6964 
6965       break;
6966    }
6967    case 64: {
6968 
6969 
6970 
6971          for (unsigned _i = 0; _i < num_components; _i++) {
6972                   const int64_t src0 =
6973                      _src[0].i64[_i];
6974                   const int64_t src1 =
6975                      _src[1].i64[_i];
6976 
6977                int64_t dst = src0 << src1;
6978 
6979                _dst_val.i64[_i] = dst;
6980          }
6981 
6982       break;
6983    }
6984 
6985    default:
6986       unreachable("unknown bit width");
6987    }
6988 
6989    return _dst_val;
6990 }
6991 static nir_const_value
evaluate_ishr(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)6992 evaluate_ishr(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
6993                  MAYBE_UNUSED nir_const_value *_src)
6994 {
6995    nir_const_value _dst_val = { {0, } };
6996 
6997    switch (bit_size) {
6998    case 32: {
6999 
7000 
7001 
7002          for (unsigned _i = 0; _i < num_components; _i++) {
7003                   const int32_t src0 =
7004                      _src[0].i32[_i];
7005                   const int32_t src1 =
7006                      _src[1].i32[_i];
7007 
7008                int32_t dst = src0 >> src1;
7009 
7010                _dst_val.i32[_i] = dst;
7011          }
7012 
7013       break;
7014    }
7015    case 64: {
7016 
7017 
7018 
7019          for (unsigned _i = 0; _i < num_components; _i++) {
7020                   const int64_t src0 =
7021                      _src[0].i64[_i];
7022                   const int64_t src1 =
7023                      _src[1].i64[_i];
7024 
7025                int64_t dst = src0 >> src1;
7026 
7027                _dst_val.i64[_i] = dst;
7028          }
7029 
7030       break;
7031    }
7032 
7033    default:
7034       unreachable("unknown bit width");
7035    }
7036 
7037    return _dst_val;
7038 }
7039 static nir_const_value
evaluate_isign(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7040 evaluate_isign(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7041                  MAYBE_UNUSED nir_const_value *_src)
7042 {
7043    nir_const_value _dst_val = { {0, } };
7044 
7045    switch (bit_size) {
7046    case 32: {
7047 
7048 
7049 
7050          for (unsigned _i = 0; _i < num_components; _i++) {
7051                   const int32_t src0 =
7052                      _src[0].i32[_i];
7053 
7054                int32_t dst = (src0 == 0) ? 0 : ((src0 > 0) ? 1 : -1);
7055 
7056                _dst_val.i32[_i] = dst;
7057          }
7058 
7059       break;
7060    }
7061    case 64: {
7062 
7063 
7064 
7065          for (unsigned _i = 0; _i < num_components; _i++) {
7066                   const int64_t src0 =
7067                      _src[0].i64[_i];
7068 
7069                int64_t dst = (src0 == 0) ? 0 : ((src0 > 0) ? 1 : -1);
7070 
7071                _dst_val.i64[_i] = dst;
7072          }
7073 
7074       break;
7075    }
7076 
7077    default:
7078       unreachable("unknown bit width");
7079    }
7080 
7081    return _dst_val;
7082 }
7083 static nir_const_value
evaluate_isub(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7084 evaluate_isub(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7085                  MAYBE_UNUSED nir_const_value *_src)
7086 {
7087    nir_const_value _dst_val = { {0, } };
7088 
7089    switch (bit_size) {
7090    case 32: {
7091 
7092 
7093 
7094          for (unsigned _i = 0; _i < num_components; _i++) {
7095                   const int32_t src0 =
7096                      _src[0].i32[_i];
7097                   const int32_t src1 =
7098                      _src[1].i32[_i];
7099 
7100                int32_t dst = src0 - src1;
7101 
7102                _dst_val.i32[_i] = dst;
7103          }
7104 
7105       break;
7106    }
7107    case 64: {
7108 
7109 
7110 
7111          for (unsigned _i = 0; _i < num_components; _i++) {
7112                   const int64_t src0 =
7113                      _src[0].i64[_i];
7114                   const int64_t src1 =
7115                      _src[1].i64[_i];
7116 
7117                int64_t dst = src0 - src1;
7118 
7119                _dst_val.i64[_i] = dst;
7120          }
7121 
7122       break;
7123    }
7124 
7125    default:
7126       unreachable("unknown bit width");
7127    }
7128 
7129    return _dst_val;
7130 }
7131 static nir_const_value
evaluate_ixor(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7132 evaluate_ixor(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7133                  MAYBE_UNUSED nir_const_value *_src)
7134 {
7135    nir_const_value _dst_val = { {0, } };
7136 
7137    switch (bit_size) {
7138    case 32: {
7139 
7140 
7141 
7142          for (unsigned _i = 0; _i < num_components; _i++) {
7143                   const uint32_t src0 =
7144                      _src[0].u32[_i];
7145                   const uint32_t src1 =
7146                      _src[1].u32[_i];
7147 
7148                uint32_t dst = src0 ^ src1;
7149 
7150                _dst_val.u32[_i] = dst;
7151          }
7152 
7153       break;
7154    }
7155    case 64: {
7156 
7157 
7158 
7159          for (unsigned _i = 0; _i < num_components; _i++) {
7160                   const uint64_t src0 =
7161                      _src[0].u64[_i];
7162                   const uint64_t src1 =
7163                      _src[1].u64[_i];
7164 
7165                uint64_t dst = src0 ^ src1;
7166 
7167                _dst_val.u64[_i] = dst;
7168          }
7169 
7170       break;
7171    }
7172 
7173    default:
7174       unreachable("unknown bit width");
7175    }
7176 
7177    return _dst_val;
7178 }
7179 static nir_const_value
evaluate_ldexp(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7180 evaluate_ldexp(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7181                  MAYBE_UNUSED nir_const_value *_src)
7182 {
7183    nir_const_value _dst_val = { {0, } };
7184 
7185    switch (bit_size) {
7186    case 32: {
7187 
7188 
7189 
7190          for (unsigned _i = 0; _i < num_components; _i++) {
7191                   const float32_t src0 =
7192                      _src[0].f32[_i];
7193                   const int32_t src1 =
7194                      _src[1].i32[_i];
7195 
7196                float32_t dst;
7197 
7198 
7199 dst = (bit_size == 64) ? ldexp(src0, src1) : ldexpf(src0, src1);
7200 /* flush denormals to zero. */
7201 if (!isnormal(dst))
7202    dst = copysignf(0.0f, src0);
7203 
7204 
7205                _dst_val.f32[_i] = dst;
7206          }
7207 
7208       break;
7209    }
7210    case 64: {
7211 
7212 
7213 
7214          for (unsigned _i = 0; _i < num_components; _i++) {
7215                   const float64_t src0 =
7216                      _src[0].f64[_i];
7217                   const int32_t src1 =
7218                      _src[1].i32[_i];
7219 
7220                float64_t dst;
7221 
7222 
7223 dst = (bit_size == 64) ? ldexp(src0, src1) : ldexpf(src0, src1);
7224 /* flush denormals to zero. */
7225 if (!isnormal(dst))
7226    dst = copysignf(0.0f, src0);
7227 
7228 
7229                _dst_val.f64[_i] = dst;
7230          }
7231 
7232       break;
7233    }
7234 
7235    default:
7236       unreachable("unknown bit width");
7237    }
7238 
7239    return _dst_val;
7240 }
7241 static nir_const_value
evaluate_pack_double_2x32(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7242 evaluate_pack_double_2x32(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7243                  MAYBE_UNUSED nir_const_value *_src)
7244 {
7245    nir_const_value _dst_val = { {0, } };
7246 
7247    switch (bit_size) {
7248    case 32: {
7249 
7250 
7251 
7252          const struct uint32_vec src0 = {
7253                _src[0].u32[0],
7254                _src[0].u32[1],
7255             0,
7256             0,
7257          };
7258 
7259          struct uint64_vec dst;
7260 
7261             dst.x = src0.x | ((uint64_t)src0.y << 32);
7262 
7263                _dst_val.u64[0] = dst.x;
7264 
7265       break;
7266    }
7267    case 64: {
7268 
7269 
7270 
7271          const struct uint32_vec src0 = {
7272                _src[0].u32[0],
7273                _src[0].u32[1],
7274             0,
7275             0,
7276          };
7277 
7278          struct uint64_vec dst;
7279 
7280             dst.x = src0.x | ((uint64_t)src0.y << 32);
7281 
7282                _dst_val.u64[0] = dst.x;
7283 
7284       break;
7285    }
7286 
7287    default:
7288       unreachable("unknown bit width");
7289    }
7290 
7291    return _dst_val;
7292 }
7293 static nir_const_value
evaluate_pack_double_2x32_split(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7294 evaluate_pack_double_2x32_split(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7295                  MAYBE_UNUSED nir_const_value *_src)
7296 {
7297    nir_const_value _dst_val = { {0, } };
7298 
7299    switch (bit_size) {
7300    case 32: {
7301 
7302 
7303 
7304          for (unsigned _i = 0; _i < num_components; _i++) {
7305                   const uint32_t src0 =
7306                      _src[0].u32[_i];
7307                   const uint32_t src1 =
7308                      _src[1].u32[_i];
7309 
7310                uint64_t dst = src0 | ((uint64_t)src1 << 32);
7311 
7312                _dst_val.u64[_i] = dst;
7313          }
7314 
7315       break;
7316    }
7317    case 64: {
7318 
7319 
7320 
7321          for (unsigned _i = 0; _i < num_components; _i++) {
7322                   const uint32_t src0 =
7323                      _src[0].u32[_i];
7324                   const uint32_t src1 =
7325                      _src[1].u32[_i];
7326 
7327                uint64_t dst = src0 | ((uint64_t)src1 << 32);
7328 
7329                _dst_val.u64[_i] = dst;
7330          }
7331 
7332       break;
7333    }
7334 
7335    default:
7336       unreachable("unknown bit width");
7337    }
7338 
7339    return _dst_val;
7340 }
7341 static nir_const_value
evaluate_pack_half_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7342 evaluate_pack_half_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7343                  MAYBE_UNUSED nir_const_value *_src)
7344 {
7345    nir_const_value _dst_val = { {0, } };
7346 
7347    switch (bit_size) {
7348    case 32: {
7349 
7350 
7351 
7352          const struct float32_vec src0 = {
7353                _src[0].f32[0],
7354                _src[0].f32[1],
7355             0,
7356             0,
7357          };
7358 
7359          struct uint32_vec dst;
7360 
7361 
7362 dst.x = (uint32_t) pack_half_1x16(src0.x);
7363 dst.x |= ((uint32_t) pack_half_1x16(src0.y)) << 16;
7364 
7365 
7366                _dst_val.u32[0] = dst.x;
7367 
7368       break;
7369    }
7370    case 64: {
7371 
7372 
7373 
7374          const struct float32_vec src0 = {
7375                _src[0].f32[0],
7376                _src[0].f32[1],
7377             0,
7378             0,
7379          };
7380 
7381          struct uint32_vec dst;
7382 
7383 
7384 dst.x = (uint32_t) pack_half_1x16(src0.x);
7385 dst.x |= ((uint32_t) pack_half_1x16(src0.y)) << 16;
7386 
7387 
7388                _dst_val.u32[0] = dst.x;
7389 
7390       break;
7391    }
7392 
7393    default:
7394       unreachable("unknown bit width");
7395    }
7396 
7397    return _dst_val;
7398 }
7399 static nir_const_value
evaluate_pack_half_2x16_split(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7400 evaluate_pack_half_2x16_split(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7401                  MAYBE_UNUSED nir_const_value *_src)
7402 {
7403    nir_const_value _dst_val = { {0, } };
7404 
7405    switch (bit_size) {
7406    case 32: {
7407 
7408 
7409 
7410          const struct float32_vec src0 = {
7411                _src[0].f32[0],
7412             0,
7413             0,
7414             0,
7415          };
7416 
7417          const struct float32_vec src1 = {
7418                _src[1].f32[0],
7419             0,
7420             0,
7421             0,
7422          };
7423 
7424          struct uint32_vec dst;
7425 
7426             dst.x = dst.y = dst.z = dst.w = pack_half_1x16(src0.x) | (pack_half_1x16(src1.x) << 16);
7427 
7428                _dst_val.u32[0] = dst.x;
7429 
7430       break;
7431    }
7432    case 64: {
7433 
7434 
7435 
7436          const struct float32_vec src0 = {
7437                _src[0].f32[0],
7438             0,
7439             0,
7440             0,
7441          };
7442 
7443          const struct float32_vec src1 = {
7444                _src[1].f32[0],
7445             0,
7446             0,
7447             0,
7448          };
7449 
7450          struct uint32_vec dst;
7451 
7452             dst.x = dst.y = dst.z = dst.w = pack_half_1x16(src0.x) | (pack_half_1x16(src1.x) << 16);
7453 
7454                _dst_val.u32[0] = dst.x;
7455 
7456       break;
7457    }
7458 
7459    default:
7460       unreachable("unknown bit width");
7461    }
7462 
7463    return _dst_val;
7464 }
7465 static nir_const_value
evaluate_pack_snorm_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7466 evaluate_pack_snorm_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7467                  MAYBE_UNUSED nir_const_value *_src)
7468 {
7469    nir_const_value _dst_val = { {0, } };
7470 
7471    switch (bit_size) {
7472    case 32: {
7473 
7474 
7475 
7476          const struct float32_vec src0 = {
7477                _src[0].f32[0],
7478                _src[0].f32[1],
7479             0,
7480             0,
7481          };
7482 
7483          struct uint32_vec dst;
7484 
7485 
7486 dst.x = (uint32_t) pack_snorm_1x16(src0.x);
7487 dst.x |= ((uint32_t) pack_snorm_1x16(src0.y)) << 16;
7488 
7489 
7490                _dst_val.u32[0] = dst.x;
7491 
7492       break;
7493    }
7494    case 64: {
7495 
7496 
7497 
7498          const struct float32_vec src0 = {
7499                _src[0].f32[0],
7500                _src[0].f32[1],
7501             0,
7502             0,
7503          };
7504 
7505          struct uint32_vec dst;
7506 
7507 
7508 dst.x = (uint32_t) pack_snorm_1x16(src0.x);
7509 dst.x |= ((uint32_t) pack_snorm_1x16(src0.y)) << 16;
7510 
7511 
7512                _dst_val.u32[0] = dst.x;
7513 
7514       break;
7515    }
7516 
7517    default:
7518       unreachable("unknown bit width");
7519    }
7520 
7521    return _dst_val;
7522 }
7523 static nir_const_value
evaluate_pack_snorm_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7524 evaluate_pack_snorm_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7525                  MAYBE_UNUSED nir_const_value *_src)
7526 {
7527    nir_const_value _dst_val = { {0, } };
7528 
7529    switch (bit_size) {
7530    case 32: {
7531 
7532 
7533 
7534          const struct float32_vec src0 = {
7535                _src[0].f32[0],
7536                _src[0].f32[1],
7537                _src[0].f32[2],
7538                _src[0].f32[3],
7539          };
7540 
7541          struct uint32_vec dst;
7542 
7543 
7544 dst.x = (uint32_t) pack_snorm_1x8(src0.x);
7545 dst.x |= ((uint32_t) pack_snorm_1x8(src0.y)) << 8;
7546 dst.x |= ((uint32_t) pack_snorm_1x8(src0.z)) << 16;
7547 dst.x |= ((uint32_t) pack_snorm_1x8(src0.w)) << 24;
7548 
7549 
7550                _dst_val.u32[0] = dst.x;
7551 
7552       break;
7553    }
7554    case 64: {
7555 
7556 
7557 
7558          const struct float32_vec src0 = {
7559                _src[0].f32[0],
7560                _src[0].f32[1],
7561                _src[0].f32[2],
7562                _src[0].f32[3],
7563          };
7564 
7565          struct uint32_vec dst;
7566 
7567 
7568 dst.x = (uint32_t) pack_snorm_1x8(src0.x);
7569 dst.x |= ((uint32_t) pack_snorm_1x8(src0.y)) << 8;
7570 dst.x |= ((uint32_t) pack_snorm_1x8(src0.z)) << 16;
7571 dst.x |= ((uint32_t) pack_snorm_1x8(src0.w)) << 24;
7572 
7573 
7574                _dst_val.u32[0] = dst.x;
7575 
7576       break;
7577    }
7578 
7579    default:
7580       unreachable("unknown bit width");
7581    }
7582 
7583    return _dst_val;
7584 }
7585 static nir_const_value
evaluate_pack_unorm_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7586 evaluate_pack_unorm_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7587                  MAYBE_UNUSED nir_const_value *_src)
7588 {
7589    nir_const_value _dst_val = { {0, } };
7590 
7591    switch (bit_size) {
7592    case 32: {
7593 
7594 
7595 
7596          const struct float32_vec src0 = {
7597                _src[0].f32[0],
7598                _src[0].f32[1],
7599             0,
7600             0,
7601          };
7602 
7603          struct uint32_vec dst;
7604 
7605 
7606 dst.x = (uint32_t) pack_unorm_1x16(src0.x);
7607 dst.x |= ((uint32_t) pack_unorm_1x16(src0.y)) << 16;
7608 
7609 
7610                _dst_val.u32[0] = dst.x;
7611 
7612       break;
7613    }
7614    case 64: {
7615 
7616 
7617 
7618          const struct float32_vec src0 = {
7619                _src[0].f32[0],
7620                _src[0].f32[1],
7621             0,
7622             0,
7623          };
7624 
7625          struct uint32_vec dst;
7626 
7627 
7628 dst.x = (uint32_t) pack_unorm_1x16(src0.x);
7629 dst.x |= ((uint32_t) pack_unorm_1x16(src0.y)) << 16;
7630 
7631 
7632                _dst_val.u32[0] = dst.x;
7633 
7634       break;
7635    }
7636 
7637    default:
7638       unreachable("unknown bit width");
7639    }
7640 
7641    return _dst_val;
7642 }
7643 static nir_const_value
evaluate_pack_unorm_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7644 evaluate_pack_unorm_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7645                  MAYBE_UNUSED nir_const_value *_src)
7646 {
7647    nir_const_value _dst_val = { {0, } };
7648 
7649    switch (bit_size) {
7650    case 32: {
7651 
7652 
7653 
7654          const struct float32_vec src0 = {
7655                _src[0].f32[0],
7656                _src[0].f32[1],
7657                _src[0].f32[2],
7658                _src[0].f32[3],
7659          };
7660 
7661          struct uint32_vec dst;
7662 
7663 
7664 dst.x = (uint32_t) pack_unorm_1x8(src0.x);
7665 dst.x |= ((uint32_t) pack_unorm_1x8(src0.y)) << 8;
7666 dst.x |= ((uint32_t) pack_unorm_1x8(src0.z)) << 16;
7667 dst.x |= ((uint32_t) pack_unorm_1x8(src0.w)) << 24;
7668 
7669 
7670                _dst_val.u32[0] = dst.x;
7671 
7672       break;
7673    }
7674    case 64: {
7675 
7676 
7677 
7678          const struct float32_vec src0 = {
7679                _src[0].f32[0],
7680                _src[0].f32[1],
7681                _src[0].f32[2],
7682                _src[0].f32[3],
7683          };
7684 
7685          struct uint32_vec dst;
7686 
7687 
7688 dst.x = (uint32_t) pack_unorm_1x8(src0.x);
7689 dst.x |= ((uint32_t) pack_unorm_1x8(src0.y)) << 8;
7690 dst.x |= ((uint32_t) pack_unorm_1x8(src0.z)) << 16;
7691 dst.x |= ((uint32_t) pack_unorm_1x8(src0.w)) << 24;
7692 
7693 
7694                _dst_val.u32[0] = dst.x;
7695 
7696       break;
7697    }
7698 
7699    default:
7700       unreachable("unknown bit width");
7701    }
7702 
7703    return _dst_val;
7704 }
7705 static nir_const_value
evaluate_pack_uvec2_to_uint(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7706 evaluate_pack_uvec2_to_uint(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7707                  MAYBE_UNUSED nir_const_value *_src)
7708 {
7709    nir_const_value _dst_val = { {0, } };
7710 
7711    switch (bit_size) {
7712    case 32: {
7713 
7714 
7715 
7716          const struct uint32_vec src0 = {
7717                _src[0].u32[0],
7718                _src[0].u32[1],
7719             0,
7720             0,
7721          };
7722 
7723          struct uint32_vec dst;
7724 
7725 
7726 dst.x = (src0.x & 0xffff) | (src0.y << 16);
7727 
7728 
7729                _dst_val.u32[0] = dst.x;
7730 
7731       break;
7732    }
7733    case 64: {
7734 
7735 
7736 
7737          const struct uint32_vec src0 = {
7738                _src[0].u32[0],
7739                _src[0].u32[1],
7740             0,
7741             0,
7742          };
7743 
7744          struct uint32_vec dst;
7745 
7746 
7747 dst.x = (src0.x & 0xffff) | (src0.y << 16);
7748 
7749 
7750                _dst_val.u32[0] = dst.x;
7751 
7752       break;
7753    }
7754 
7755    default:
7756       unreachable("unknown bit width");
7757    }
7758 
7759    return _dst_val;
7760 }
7761 static nir_const_value
evaluate_pack_uvec4_to_uint(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7762 evaluate_pack_uvec4_to_uint(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7763                  MAYBE_UNUSED nir_const_value *_src)
7764 {
7765    nir_const_value _dst_val = { {0, } };
7766 
7767    switch (bit_size) {
7768    case 32: {
7769 
7770 
7771 
7772          const struct uint32_vec src0 = {
7773                _src[0].u32[0],
7774                _src[0].u32[1],
7775                _src[0].u32[2],
7776                _src[0].u32[3],
7777          };
7778 
7779          struct uint32_vec dst;
7780 
7781 
7782 dst.x = (src0.x <<  0) |
7783         (src0.y <<  8) |
7784         (src0.z << 16) |
7785         (src0.w << 24);
7786 
7787 
7788                _dst_val.u32[0] = dst.x;
7789 
7790       break;
7791    }
7792    case 64: {
7793 
7794 
7795 
7796          const struct uint32_vec src0 = {
7797                _src[0].u32[0],
7798                _src[0].u32[1],
7799                _src[0].u32[2],
7800                _src[0].u32[3],
7801          };
7802 
7803          struct uint32_vec dst;
7804 
7805 
7806 dst.x = (src0.x <<  0) |
7807         (src0.y <<  8) |
7808         (src0.z << 16) |
7809         (src0.w << 24);
7810 
7811 
7812                _dst_val.u32[0] = dst.x;
7813 
7814       break;
7815    }
7816 
7817    default:
7818       unreachable("unknown bit width");
7819    }
7820 
7821    return _dst_val;
7822 }
7823 static nir_const_value
evaluate_seq(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7824 evaluate_seq(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7825                  MAYBE_UNUSED nir_const_value *_src)
7826 {
7827    nir_const_value _dst_val = { {0, } };
7828 
7829    switch (bit_size) {
7830    case 32: {
7831 
7832 
7833 
7834          for (unsigned _i = 0; _i < num_components; _i++) {
7835                   const float32_t src0 =
7836                      _src[0].f32[_i];
7837                   const float32_t src1 =
7838                      _src[1].f32[_i];
7839 
7840                float32_t dst = (src0 == src1) ? 1.0f : 0.0f;
7841 
7842                _dst_val.f32[_i] = dst;
7843          }
7844 
7845       break;
7846    }
7847    case 64: {
7848 
7849 
7850 
7851          for (unsigned _i = 0; _i < num_components; _i++) {
7852                   const float32_t src0 =
7853                      _src[0].f32[_i];
7854                   const float32_t src1 =
7855                      _src[1].f32[_i];
7856 
7857                float32_t dst = (src0 == src1) ? 1.0f : 0.0f;
7858 
7859                _dst_val.f32[_i] = dst;
7860          }
7861 
7862       break;
7863    }
7864 
7865    default:
7866       unreachable("unknown bit width");
7867    }
7868 
7869    return _dst_val;
7870 }
7871 static nir_const_value
evaluate_sge(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7872 evaluate_sge(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7873                  MAYBE_UNUSED nir_const_value *_src)
7874 {
7875    nir_const_value _dst_val = { {0, } };
7876 
7877    switch (bit_size) {
7878    case 32: {
7879 
7880 
7881 
7882          for (unsigned _i = 0; _i < num_components; _i++) {
7883                   const float32_t src0 =
7884                      _src[0].f32[_i];
7885                   const float32_t src1 =
7886                      _src[1].f32[_i];
7887 
7888                float32_t dst = (src0 >= src1) ? 1.0f : 0.0f;
7889 
7890                _dst_val.f32[_i] = dst;
7891          }
7892 
7893       break;
7894    }
7895    case 64: {
7896 
7897 
7898 
7899          for (unsigned _i = 0; _i < num_components; _i++) {
7900                   const float32_t src0 =
7901                      _src[0].f32[_i];
7902                   const float32_t src1 =
7903                      _src[1].f32[_i];
7904 
7905                float32_t dst = (src0 >= src1) ? 1.0f : 0.0f;
7906 
7907                _dst_val.f32[_i] = dst;
7908          }
7909 
7910       break;
7911    }
7912 
7913    default:
7914       unreachable("unknown bit width");
7915    }
7916 
7917    return _dst_val;
7918 }
7919 static nir_const_value
evaluate_slt(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7920 evaluate_slt(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7921                  MAYBE_UNUSED nir_const_value *_src)
7922 {
7923    nir_const_value _dst_val = { {0, } };
7924 
7925    switch (bit_size) {
7926    case 32: {
7927 
7928 
7929 
7930          for (unsigned _i = 0; _i < num_components; _i++) {
7931                   const float32_t src0 =
7932                      _src[0].f32[_i];
7933                   const float32_t src1 =
7934                      _src[1].f32[_i];
7935 
7936                float32_t dst = (src0 < src1) ? 1.0f : 0.0f;
7937 
7938                _dst_val.f32[_i] = dst;
7939          }
7940 
7941       break;
7942    }
7943    case 64: {
7944 
7945 
7946 
7947          for (unsigned _i = 0; _i < num_components; _i++) {
7948                   const float32_t src0 =
7949                      _src[0].f32[_i];
7950                   const float32_t src1 =
7951                      _src[1].f32[_i];
7952 
7953                float32_t dst = (src0 < src1) ? 1.0f : 0.0f;
7954 
7955                _dst_val.f32[_i] = dst;
7956          }
7957 
7958       break;
7959    }
7960 
7961    default:
7962       unreachable("unknown bit width");
7963    }
7964 
7965    return _dst_val;
7966 }
7967 static nir_const_value
evaluate_sne(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)7968 evaluate_sne(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
7969                  MAYBE_UNUSED nir_const_value *_src)
7970 {
7971    nir_const_value _dst_val = { {0, } };
7972 
7973    switch (bit_size) {
7974    case 32: {
7975 
7976 
7977 
7978          for (unsigned _i = 0; _i < num_components; _i++) {
7979                   const float32_t src0 =
7980                      _src[0].f32[_i];
7981                   const float32_t src1 =
7982                      _src[1].f32[_i];
7983 
7984                float32_t dst = (src0 != src1) ? 1.0f : 0.0f;
7985 
7986                _dst_val.f32[_i] = dst;
7987          }
7988 
7989       break;
7990    }
7991    case 64: {
7992 
7993 
7994 
7995          for (unsigned _i = 0; _i < num_components; _i++) {
7996                   const float32_t src0 =
7997                      _src[0].f32[_i];
7998                   const float32_t src1 =
7999                      _src[1].f32[_i];
8000 
8001                float32_t dst = (src0 != src1) ? 1.0f : 0.0f;
8002 
8003                _dst_val.f32[_i] = dst;
8004          }
8005 
8006       break;
8007    }
8008 
8009    default:
8010       unreachable("unknown bit width");
8011    }
8012 
8013    return _dst_val;
8014 }
8015 static nir_const_value
evaluate_u2d(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8016 evaluate_u2d(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8017                  MAYBE_UNUSED nir_const_value *_src)
8018 {
8019    nir_const_value _dst_val = { {0, } };
8020 
8021    switch (bit_size) {
8022    case 32: {
8023 
8024 
8025 
8026          for (unsigned _i = 0; _i < num_components; _i++) {
8027                   const uint32_t src0 =
8028                      _src[0].u32[_i];
8029 
8030                float64_t dst = src0;
8031 
8032                _dst_val.f64[_i] = dst;
8033          }
8034 
8035       break;
8036    }
8037    case 64: {
8038 
8039 
8040 
8041          for (unsigned _i = 0; _i < num_components; _i++) {
8042                   const uint32_t src0 =
8043                      _src[0].u32[_i];
8044 
8045                float64_t dst = src0;
8046 
8047                _dst_val.f64[_i] = dst;
8048          }
8049 
8050       break;
8051    }
8052 
8053    default:
8054       unreachable("unknown bit width");
8055    }
8056 
8057    return _dst_val;
8058 }
8059 static nir_const_value
evaluate_u2f(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8060 evaluate_u2f(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8061                  MAYBE_UNUSED nir_const_value *_src)
8062 {
8063    nir_const_value _dst_val = { {0, } };
8064 
8065    switch (bit_size) {
8066    case 32: {
8067 
8068 
8069 
8070          for (unsigned _i = 0; _i < num_components; _i++) {
8071                   const uint32_t src0 =
8072                      _src[0].u32[_i];
8073 
8074                float32_t dst = src0;
8075 
8076                _dst_val.f32[_i] = dst;
8077          }
8078 
8079       break;
8080    }
8081    case 64: {
8082 
8083 
8084 
8085          for (unsigned _i = 0; _i < num_components; _i++) {
8086                   const uint32_t src0 =
8087                      _src[0].u32[_i];
8088 
8089                float32_t dst = src0;
8090 
8091                _dst_val.f32[_i] = dst;
8092          }
8093 
8094       break;
8095    }
8096 
8097    default:
8098       unreachable("unknown bit width");
8099    }
8100 
8101    return _dst_val;
8102 }
8103 static nir_const_value
evaluate_uadd_carry(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8104 evaluate_uadd_carry(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8105                  MAYBE_UNUSED nir_const_value *_src)
8106 {
8107    nir_const_value _dst_val = { {0, } };
8108 
8109    switch (bit_size) {
8110    case 32: {
8111 
8112 
8113 
8114          for (unsigned _i = 0; _i < num_components; _i++) {
8115                   const uint32_t src0 =
8116                      _src[0].u32[_i];
8117                   const uint32_t src1 =
8118                      _src[1].u32[_i];
8119 
8120                uint32_t dst = src0 + src1 < src0;
8121 
8122                _dst_val.u32[_i] = dst;
8123          }
8124 
8125       break;
8126    }
8127    case 64: {
8128 
8129 
8130 
8131          for (unsigned _i = 0; _i < num_components; _i++) {
8132                   const uint64_t src0 =
8133                      _src[0].u64[_i];
8134                   const uint64_t src1 =
8135                      _src[1].u64[_i];
8136 
8137                uint64_t dst = src0 + src1 < src0;
8138 
8139                _dst_val.u64[_i] = dst;
8140          }
8141 
8142       break;
8143    }
8144 
8145    default:
8146       unreachable("unknown bit width");
8147    }
8148 
8149    return _dst_val;
8150 }
8151 static nir_const_value
evaluate_ubfe(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8152 evaluate_ubfe(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8153                  MAYBE_UNUSED nir_const_value *_src)
8154 {
8155    nir_const_value _dst_val = { {0, } };
8156 
8157    switch (bit_size) {
8158    case 32: {
8159 
8160 
8161 
8162          for (unsigned _i = 0; _i < num_components; _i++) {
8163                   const uint32_t src0 =
8164                      _src[0].u32[_i];
8165                   const int32_t src1 =
8166                      _src[1].i32[_i];
8167                   const int32_t src2 =
8168                      _src[2].i32[_i];
8169 
8170                uint32_t dst;
8171 
8172 
8173 unsigned base = src0;
8174 int offset = src1, bits = src2;
8175 if (bits == 0) {
8176    dst = 0;
8177 } else if (bits < 0 || offset < 0) {
8178    dst = 0; /* undefined */
8179 } else if (offset + bits < 32) {
8180    dst = (base << (32 - bits - offset)) >> (32 - bits);
8181 } else {
8182    dst = base >> offset;
8183 }
8184 
8185 
8186                _dst_val.u32[_i] = dst;
8187          }
8188 
8189       break;
8190    }
8191    case 64: {
8192 
8193 
8194 
8195          for (unsigned _i = 0; _i < num_components; _i++) {
8196                   const uint32_t src0 =
8197                      _src[0].u32[_i];
8198                   const int32_t src1 =
8199                      _src[1].i32[_i];
8200                   const int32_t src2 =
8201                      _src[2].i32[_i];
8202 
8203                uint32_t dst;
8204 
8205 
8206 unsigned base = src0;
8207 int offset = src1, bits = src2;
8208 if (bits == 0) {
8209    dst = 0;
8210 } else if (bits < 0 || offset < 0) {
8211    dst = 0; /* undefined */
8212 } else if (offset + bits < 32) {
8213    dst = (base << (32 - bits - offset)) >> (32 - bits);
8214 } else {
8215    dst = base >> offset;
8216 }
8217 
8218 
8219                _dst_val.u32[_i] = dst;
8220          }
8221 
8222       break;
8223    }
8224 
8225    default:
8226       unreachable("unknown bit width");
8227    }
8228 
8229    return _dst_val;
8230 }
8231 static nir_const_value
evaluate_ubitfield_extract(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8232 evaluate_ubitfield_extract(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8233                  MAYBE_UNUSED nir_const_value *_src)
8234 {
8235    nir_const_value _dst_val = { {0, } };
8236 
8237    switch (bit_size) {
8238    case 32: {
8239 
8240 
8241 
8242          for (unsigned _i = 0; _i < num_components; _i++) {
8243                   const uint32_t src0 =
8244                      _src[0].u32[_i];
8245                   const int32_t src1 =
8246                      _src[1].i32[_i];
8247                   const int32_t src2 =
8248                      _src[2].i32[_i];
8249 
8250                uint32_t dst;
8251 
8252 
8253 unsigned base = src0;
8254 int offset = src1, bits = src2;
8255 if (bits == 0) {
8256    dst = 0;
8257 } else if (bits < 0 || offset < 0 || offset + bits > 32) {
8258    dst = 0; /* undefined per the spec */
8259 } else {
8260    dst = (base >> offset) & ((1ull << bits) - 1);
8261 }
8262 
8263 
8264                _dst_val.u32[_i] = dst;
8265          }
8266 
8267       break;
8268    }
8269    case 64: {
8270 
8271 
8272 
8273          for (unsigned _i = 0; _i < num_components; _i++) {
8274                   const uint32_t src0 =
8275                      _src[0].u32[_i];
8276                   const int32_t src1 =
8277                      _src[1].i32[_i];
8278                   const int32_t src2 =
8279                      _src[2].i32[_i];
8280 
8281                uint32_t dst;
8282 
8283 
8284 unsigned base = src0;
8285 int offset = src1, bits = src2;
8286 if (bits == 0) {
8287    dst = 0;
8288 } else if (bits < 0 || offset < 0 || offset + bits > 32) {
8289    dst = 0; /* undefined per the spec */
8290 } else {
8291    dst = (base >> offset) & ((1ull << bits) - 1);
8292 }
8293 
8294 
8295                _dst_val.u32[_i] = dst;
8296          }
8297 
8298       break;
8299    }
8300 
8301    default:
8302       unreachable("unknown bit width");
8303    }
8304 
8305    return _dst_val;
8306 }
8307 static nir_const_value
evaluate_udiv(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8308 evaluate_udiv(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8309                  MAYBE_UNUSED nir_const_value *_src)
8310 {
8311    nir_const_value _dst_val = { {0, } };
8312 
8313    switch (bit_size) {
8314    case 32: {
8315 
8316 
8317 
8318          for (unsigned _i = 0; _i < num_components; _i++) {
8319                   const uint32_t src0 =
8320                      _src[0].u32[_i];
8321                   const uint32_t src1 =
8322                      _src[1].u32[_i];
8323 
8324                uint32_t dst = src0 / src1;
8325 
8326                _dst_val.u32[_i] = dst;
8327          }
8328 
8329       break;
8330    }
8331    case 64: {
8332 
8333 
8334 
8335          for (unsigned _i = 0; _i < num_components; _i++) {
8336                   const uint64_t src0 =
8337                      _src[0].u64[_i];
8338                   const uint64_t src1 =
8339                      _src[1].u64[_i];
8340 
8341                uint64_t dst = src0 / src1;
8342 
8343                _dst_val.u64[_i] = dst;
8344          }
8345 
8346       break;
8347    }
8348 
8349    default:
8350       unreachable("unknown bit width");
8351    }
8352 
8353    return _dst_val;
8354 }
8355 static nir_const_value
evaluate_ufind_msb(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8356 evaluate_ufind_msb(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8357                  MAYBE_UNUSED nir_const_value *_src)
8358 {
8359    nir_const_value _dst_val = { {0, } };
8360 
8361    switch (bit_size) {
8362    case 32: {
8363 
8364 
8365 
8366          for (unsigned _i = 0; _i < num_components; _i++) {
8367                   const uint32_t src0 =
8368                      _src[0].u32[_i];
8369 
8370                int32_t dst;
8371 
8372 
8373 dst = -1;
8374 for (int bit = 31; bit > 0; bit--) {
8375    if ((src0 >> bit) & 1) {
8376       dst = bit;
8377       break;
8378    }
8379 }
8380 
8381 
8382                _dst_val.i32[_i] = dst;
8383          }
8384 
8385       break;
8386    }
8387    case 64: {
8388 
8389 
8390 
8391          for (unsigned _i = 0; _i < num_components; _i++) {
8392                   const uint32_t src0 =
8393                      _src[0].u32[_i];
8394 
8395                int32_t dst;
8396 
8397 
8398 dst = -1;
8399 for (int bit = 31; bit > 0; bit--) {
8400    if ((src0 >> bit) & 1) {
8401       dst = bit;
8402       break;
8403    }
8404 }
8405 
8406 
8407                _dst_val.i32[_i] = dst;
8408          }
8409 
8410       break;
8411    }
8412 
8413    default:
8414       unreachable("unknown bit width");
8415    }
8416 
8417    return _dst_val;
8418 }
8419 static nir_const_value
evaluate_uge(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8420 evaluate_uge(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8421                  MAYBE_UNUSED nir_const_value *_src)
8422 {
8423    nir_const_value _dst_val = { {0, } };
8424 
8425    switch (bit_size) {
8426    case 32: {
8427 
8428 
8429 
8430          for (unsigned _i = 0; _i < num_components; _i++) {
8431                   const uint32_t src0 =
8432                      _src[0].u32[_i];
8433                   const uint32_t src1 =
8434                      _src[1].u32[_i];
8435 
8436                bool32_t dst = src0 >= src1;
8437 
8438                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
8439          }
8440 
8441       break;
8442    }
8443    case 64: {
8444 
8445 
8446 
8447          for (unsigned _i = 0; _i < num_components; _i++) {
8448                   const uint64_t src0 =
8449                      _src[0].u64[_i];
8450                   const uint64_t src1 =
8451                      _src[1].u64[_i];
8452 
8453                bool32_t dst = src0 >= src1;
8454 
8455                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
8456          }
8457 
8458       break;
8459    }
8460 
8461    default:
8462       unreachable("unknown bit width");
8463    }
8464 
8465    return _dst_val;
8466 }
8467 static nir_const_value
evaluate_ult(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8468 evaluate_ult(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8469                  MAYBE_UNUSED nir_const_value *_src)
8470 {
8471    nir_const_value _dst_val = { {0, } };
8472 
8473    switch (bit_size) {
8474    case 32: {
8475 
8476 
8477 
8478          for (unsigned _i = 0; _i < num_components; _i++) {
8479                   const uint32_t src0 =
8480                      _src[0].u32[_i];
8481                   const uint32_t src1 =
8482                      _src[1].u32[_i];
8483 
8484                bool32_t dst = src0 < src1;
8485 
8486                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
8487          }
8488 
8489       break;
8490    }
8491    case 64: {
8492 
8493 
8494 
8495          for (unsigned _i = 0; _i < num_components; _i++) {
8496                   const uint64_t src0 =
8497                      _src[0].u64[_i];
8498                   const uint64_t src1 =
8499                      _src[1].u64[_i];
8500 
8501                bool32_t dst = src0 < src1;
8502 
8503                _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
8504          }
8505 
8506       break;
8507    }
8508 
8509    default:
8510       unreachable("unknown bit width");
8511    }
8512 
8513    return _dst_val;
8514 }
8515 static nir_const_value
evaluate_umax(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8516 evaluate_umax(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8517                  MAYBE_UNUSED nir_const_value *_src)
8518 {
8519    nir_const_value _dst_val = { {0, } };
8520 
8521    switch (bit_size) {
8522    case 32: {
8523 
8524 
8525 
8526          for (unsigned _i = 0; _i < num_components; _i++) {
8527                   const uint32_t src0 =
8528                      _src[0].u32[_i];
8529                   const uint32_t src1 =
8530                      _src[1].u32[_i];
8531 
8532                uint32_t dst = src1 > src0 ? src1 : src0;
8533 
8534                _dst_val.u32[_i] = dst;
8535          }
8536 
8537       break;
8538    }
8539    case 64: {
8540 
8541 
8542 
8543          for (unsigned _i = 0; _i < num_components; _i++) {
8544                   const uint64_t src0 =
8545                      _src[0].u64[_i];
8546                   const uint64_t src1 =
8547                      _src[1].u64[_i];
8548 
8549                uint64_t dst = src1 > src0 ? src1 : src0;
8550 
8551                _dst_val.u64[_i] = dst;
8552          }
8553 
8554       break;
8555    }
8556 
8557    default:
8558       unreachable("unknown bit width");
8559    }
8560 
8561    return _dst_val;
8562 }
8563 static nir_const_value
evaluate_umax_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8564 evaluate_umax_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8565                  MAYBE_UNUSED nir_const_value *_src)
8566 {
8567    nir_const_value _dst_val = { {0, } };
8568 
8569    switch (bit_size) {
8570    case 32: {
8571 
8572 
8573 
8574          for (unsigned _i = 0; _i < num_components; _i++) {
8575                   const int32_t src0 =
8576                      _src[0].i32[_i];
8577                   const int32_t src1 =
8578                      _src[1].i32[_i];
8579 
8580                int32_t dst;
8581 
8582 
8583 dst = 0;
8584 for (int i = 0; i < 32; i += 8) {
8585    dst |= MAX2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
8586 }
8587 
8588 
8589                _dst_val.i32[_i] = dst;
8590          }
8591 
8592       break;
8593    }
8594    case 64: {
8595 
8596 
8597 
8598          for (unsigned _i = 0; _i < num_components; _i++) {
8599                   const int32_t src0 =
8600                      _src[0].i32[_i];
8601                   const int32_t src1 =
8602                      _src[1].i32[_i];
8603 
8604                int32_t dst;
8605 
8606 
8607 dst = 0;
8608 for (int i = 0; i < 32; i += 8) {
8609    dst |= MAX2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
8610 }
8611 
8612 
8613                _dst_val.i32[_i] = dst;
8614          }
8615 
8616       break;
8617    }
8618 
8619    default:
8620       unreachable("unknown bit width");
8621    }
8622 
8623    return _dst_val;
8624 }
8625 static nir_const_value
evaluate_umin(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8626 evaluate_umin(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8627                  MAYBE_UNUSED nir_const_value *_src)
8628 {
8629    nir_const_value _dst_val = { {0, } };
8630 
8631    switch (bit_size) {
8632    case 32: {
8633 
8634 
8635 
8636          for (unsigned _i = 0; _i < num_components; _i++) {
8637                   const uint32_t src0 =
8638                      _src[0].u32[_i];
8639                   const uint32_t src1 =
8640                      _src[1].u32[_i];
8641 
8642                uint32_t dst = src1 > src0 ? src0 : src1;
8643 
8644                _dst_val.u32[_i] = dst;
8645          }
8646 
8647       break;
8648    }
8649    case 64: {
8650 
8651 
8652 
8653          for (unsigned _i = 0; _i < num_components; _i++) {
8654                   const uint64_t src0 =
8655                      _src[0].u64[_i];
8656                   const uint64_t src1 =
8657                      _src[1].u64[_i];
8658 
8659                uint64_t dst = src1 > src0 ? src0 : src1;
8660 
8661                _dst_val.u64[_i] = dst;
8662          }
8663 
8664       break;
8665    }
8666 
8667    default:
8668       unreachable("unknown bit width");
8669    }
8670 
8671    return _dst_val;
8672 }
8673 static nir_const_value
evaluate_umin_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8674 evaluate_umin_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8675                  MAYBE_UNUSED nir_const_value *_src)
8676 {
8677    nir_const_value _dst_val = { {0, } };
8678 
8679    switch (bit_size) {
8680    case 32: {
8681 
8682 
8683 
8684          for (unsigned _i = 0; _i < num_components; _i++) {
8685                   const int32_t src0 =
8686                      _src[0].i32[_i];
8687                   const int32_t src1 =
8688                      _src[1].i32[_i];
8689 
8690                int32_t dst;
8691 
8692 
8693 dst = 0;
8694 for (int i = 0; i < 32; i += 8) {
8695    dst |= MIN2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
8696 }
8697 
8698 
8699                _dst_val.i32[_i] = dst;
8700          }
8701 
8702       break;
8703    }
8704    case 64: {
8705 
8706 
8707 
8708          for (unsigned _i = 0; _i < num_components; _i++) {
8709                   const int32_t src0 =
8710                      _src[0].i32[_i];
8711                   const int32_t src1 =
8712                      _src[1].i32[_i];
8713 
8714                int32_t dst;
8715 
8716 
8717 dst = 0;
8718 for (int i = 0; i < 32; i += 8) {
8719    dst |= MIN2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
8720 }
8721 
8722 
8723                _dst_val.i32[_i] = dst;
8724          }
8725 
8726       break;
8727    }
8728 
8729    default:
8730       unreachable("unknown bit width");
8731    }
8732 
8733    return _dst_val;
8734 }
8735 static nir_const_value
evaluate_umod(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8736 evaluate_umod(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8737                  MAYBE_UNUSED nir_const_value *_src)
8738 {
8739    nir_const_value _dst_val = { {0, } };
8740 
8741    switch (bit_size) {
8742    case 32: {
8743 
8744 
8745 
8746          for (unsigned _i = 0; _i < num_components; _i++) {
8747                   const uint32_t src0 =
8748                      _src[0].u32[_i];
8749                   const uint32_t src1 =
8750                      _src[1].u32[_i];
8751 
8752                uint32_t dst = src1 == 0 ? 0 : src0 % src1;
8753 
8754                _dst_val.u32[_i] = dst;
8755          }
8756 
8757       break;
8758    }
8759    case 64: {
8760 
8761 
8762 
8763          for (unsigned _i = 0; _i < num_components; _i++) {
8764                   const uint64_t src0 =
8765                      _src[0].u64[_i];
8766                   const uint64_t src1 =
8767                      _src[1].u64[_i];
8768 
8769                uint64_t dst = src1 == 0 ? 0 : src0 % src1;
8770 
8771                _dst_val.u64[_i] = dst;
8772          }
8773 
8774       break;
8775    }
8776 
8777    default:
8778       unreachable("unknown bit width");
8779    }
8780 
8781    return _dst_val;
8782 }
8783 static nir_const_value
evaluate_umul_high(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8784 evaluate_umul_high(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8785                  MAYBE_UNUSED nir_const_value *_src)
8786 {
8787    nir_const_value _dst_val = { {0, } };
8788 
8789    switch (bit_size) {
8790    case 32: {
8791 
8792 
8793 
8794          for (unsigned _i = 0; _i < num_components; _i++) {
8795                   const uint32_t src0 =
8796                      _src[0].u32[_i];
8797                   const uint32_t src1 =
8798                      _src[1].u32[_i];
8799 
8800                uint32_t dst = (uint32_t)(((uint64_t) src0 * (uint64_t) src1) >> 32);
8801 
8802                _dst_val.u32[_i] = dst;
8803          }
8804 
8805       break;
8806    }
8807    case 64: {
8808 
8809 
8810 
8811          for (unsigned _i = 0; _i < num_components; _i++) {
8812                   const uint32_t src0 =
8813                      _src[0].u32[_i];
8814                   const uint32_t src1 =
8815                      _src[1].u32[_i];
8816 
8817                uint32_t dst = (uint32_t)(((uint64_t) src0 * (uint64_t) src1) >> 32);
8818 
8819                _dst_val.u32[_i] = dst;
8820          }
8821 
8822       break;
8823    }
8824 
8825    default:
8826       unreachable("unknown bit width");
8827    }
8828 
8829    return _dst_val;
8830 }
8831 static nir_const_value
evaluate_umul_unorm_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8832 evaluate_umul_unorm_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8833                  MAYBE_UNUSED nir_const_value *_src)
8834 {
8835    nir_const_value _dst_val = { {0, } };
8836 
8837    switch (bit_size) {
8838    case 32: {
8839 
8840 
8841 
8842          for (unsigned _i = 0; _i < num_components; _i++) {
8843                   const int32_t src0 =
8844                      _src[0].i32[_i];
8845                   const int32_t src1 =
8846                      _src[1].i32[_i];
8847 
8848                int32_t dst;
8849 
8850 
8851 dst = 0;
8852 for (int i = 0; i < 32; i += 8) {
8853    int src0_chan = (src0 >> i) & 0xff;
8854    int src1_chan = (src1 >> i) & 0xff;
8855    dst |= ((src0_chan * src1_chan) / 255) << i;
8856 }
8857 
8858 
8859                _dst_val.i32[_i] = dst;
8860          }
8861 
8862       break;
8863    }
8864    case 64: {
8865 
8866 
8867 
8868          for (unsigned _i = 0; _i < num_components; _i++) {
8869                   const int32_t src0 =
8870                      _src[0].i32[_i];
8871                   const int32_t src1 =
8872                      _src[1].i32[_i];
8873 
8874                int32_t dst;
8875 
8876 
8877 dst = 0;
8878 for (int i = 0; i < 32; i += 8) {
8879    int src0_chan = (src0 >> i) & 0xff;
8880    int src1_chan = (src1 >> i) & 0xff;
8881    dst |= ((src0_chan * src1_chan) / 255) << i;
8882 }
8883 
8884 
8885                _dst_val.i32[_i] = dst;
8886          }
8887 
8888       break;
8889    }
8890 
8891    default:
8892       unreachable("unknown bit width");
8893    }
8894 
8895    return _dst_val;
8896 }
8897 static nir_const_value
evaluate_unpack_double_2x32(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8898 evaluate_unpack_double_2x32(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8899                  MAYBE_UNUSED nir_const_value *_src)
8900 {
8901    nir_const_value _dst_val = { {0, } };
8902 
8903    switch (bit_size) {
8904    case 32: {
8905 
8906 
8907 
8908          const struct uint64_vec src0 = {
8909                _src[0].u64[0],
8910             0,
8911             0,
8912             0,
8913          };
8914 
8915          struct uint32_vec dst;
8916 
8917             dst.x = src0.x; dst.y = src0.x >> 32;
8918 
8919                _dst_val.u32[0] = dst.x;
8920                _dst_val.u32[1] = dst.y;
8921 
8922       break;
8923    }
8924    case 64: {
8925 
8926 
8927 
8928          const struct uint64_vec src0 = {
8929                _src[0].u64[0],
8930             0,
8931             0,
8932             0,
8933          };
8934 
8935          struct uint32_vec dst;
8936 
8937             dst.x = src0.x; dst.y = src0.x >> 32;
8938 
8939                _dst_val.u32[0] = dst.x;
8940                _dst_val.u32[1] = dst.y;
8941 
8942       break;
8943    }
8944 
8945    default:
8946       unreachable("unknown bit width");
8947    }
8948 
8949    return _dst_val;
8950 }
8951 static nir_const_value
evaluate_unpack_double_2x32_split_x(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8952 evaluate_unpack_double_2x32_split_x(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8953                  MAYBE_UNUSED nir_const_value *_src)
8954 {
8955    nir_const_value _dst_val = { {0, } };
8956 
8957    switch (bit_size) {
8958    case 32: {
8959 
8960 
8961 
8962          for (unsigned _i = 0; _i < num_components; _i++) {
8963                   const uint64_t src0 =
8964                      _src[0].u64[_i];
8965 
8966                uint32_t dst = src0;
8967 
8968                _dst_val.u32[_i] = dst;
8969          }
8970 
8971       break;
8972    }
8973    case 64: {
8974 
8975 
8976 
8977          for (unsigned _i = 0; _i < num_components; _i++) {
8978                   const uint64_t src0 =
8979                      _src[0].u64[_i];
8980 
8981                uint32_t dst = src0;
8982 
8983                _dst_val.u32[_i] = dst;
8984          }
8985 
8986       break;
8987    }
8988 
8989    default:
8990       unreachable("unknown bit width");
8991    }
8992 
8993    return _dst_val;
8994 }
8995 static nir_const_value
evaluate_unpack_double_2x32_split_y(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)8996 evaluate_unpack_double_2x32_split_y(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
8997                  MAYBE_UNUSED nir_const_value *_src)
8998 {
8999    nir_const_value _dst_val = { {0, } };
9000 
9001    switch (bit_size) {
9002    case 32: {
9003 
9004 
9005 
9006          for (unsigned _i = 0; _i < num_components; _i++) {
9007                   const uint64_t src0 =
9008                      _src[0].u64[_i];
9009 
9010                uint32_t dst = src0 >> 32;
9011 
9012                _dst_val.u32[_i] = dst;
9013          }
9014 
9015       break;
9016    }
9017    case 64: {
9018 
9019 
9020 
9021          for (unsigned _i = 0; _i < num_components; _i++) {
9022                   const uint64_t src0 =
9023                      _src[0].u64[_i];
9024 
9025                uint32_t dst = src0 >> 32;
9026 
9027                _dst_val.u32[_i] = dst;
9028          }
9029 
9030       break;
9031    }
9032 
9033    default:
9034       unreachable("unknown bit width");
9035    }
9036 
9037    return _dst_val;
9038 }
9039 static nir_const_value
evaluate_unpack_half_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9040 evaluate_unpack_half_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9041                  MAYBE_UNUSED nir_const_value *_src)
9042 {
9043    nir_const_value _dst_val = { {0, } };
9044 
9045    switch (bit_size) {
9046    case 32: {
9047 
9048 
9049 
9050          const struct uint32_vec src0 = {
9051                _src[0].u32[0],
9052             0,
9053             0,
9054             0,
9055          };
9056 
9057          struct float32_vec dst;
9058 
9059 
9060 dst.x = unpack_half_1x16((uint16_t)(src0.x & 0xffff));
9061 dst.y = unpack_half_1x16((uint16_t)(src0.x << 16));
9062 
9063 
9064                _dst_val.f32[0] = dst.x;
9065                _dst_val.f32[1] = dst.y;
9066 
9067       break;
9068    }
9069    case 64: {
9070 
9071 
9072 
9073          const struct uint32_vec src0 = {
9074                _src[0].u32[0],
9075             0,
9076             0,
9077             0,
9078          };
9079 
9080          struct float32_vec dst;
9081 
9082 
9083 dst.x = unpack_half_1x16((uint16_t)(src0.x & 0xffff));
9084 dst.y = unpack_half_1x16((uint16_t)(src0.x << 16));
9085 
9086 
9087                _dst_val.f32[0] = dst.x;
9088                _dst_val.f32[1] = dst.y;
9089 
9090       break;
9091    }
9092 
9093    default:
9094       unreachable("unknown bit width");
9095    }
9096 
9097    return _dst_val;
9098 }
9099 static nir_const_value
evaluate_unpack_half_2x16_split_x(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9100 evaluate_unpack_half_2x16_split_x(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9101                  MAYBE_UNUSED nir_const_value *_src)
9102 {
9103    nir_const_value _dst_val = { {0, } };
9104 
9105    switch (bit_size) {
9106    case 32: {
9107 
9108 
9109 
9110          const struct uint32_vec src0 = {
9111                _src[0].u32[0],
9112             0,
9113             0,
9114             0,
9115          };
9116 
9117          struct float32_vec dst;
9118 
9119             dst.x = dst.y = dst.z = dst.w = unpack_half_1x16((uint16_t)(src0.x & 0xffff));
9120 
9121                _dst_val.f32[0] = dst.x;
9122 
9123       break;
9124    }
9125    case 64: {
9126 
9127 
9128 
9129          const struct uint32_vec src0 = {
9130                _src[0].u32[0],
9131             0,
9132             0,
9133             0,
9134          };
9135 
9136          struct float32_vec dst;
9137 
9138             dst.x = dst.y = dst.z = dst.w = unpack_half_1x16((uint16_t)(src0.x & 0xffff));
9139 
9140                _dst_val.f32[0] = dst.x;
9141 
9142       break;
9143    }
9144 
9145    default:
9146       unreachable("unknown bit width");
9147    }
9148 
9149    return _dst_val;
9150 }
9151 static nir_const_value
evaluate_unpack_half_2x16_split_y(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9152 evaluate_unpack_half_2x16_split_y(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9153                  MAYBE_UNUSED nir_const_value *_src)
9154 {
9155    nir_const_value _dst_val = { {0, } };
9156 
9157    switch (bit_size) {
9158    case 32: {
9159 
9160 
9161 
9162          const struct uint32_vec src0 = {
9163                _src[0].u32[0],
9164             0,
9165             0,
9166             0,
9167          };
9168 
9169          struct float32_vec dst;
9170 
9171             dst.x = dst.y = dst.z = dst.w = unpack_half_1x16((uint16_t)(src0.x >> 16));
9172 
9173                _dst_val.f32[0] = dst.x;
9174 
9175       break;
9176    }
9177    case 64: {
9178 
9179 
9180 
9181          const struct uint32_vec src0 = {
9182                _src[0].u32[0],
9183             0,
9184             0,
9185             0,
9186          };
9187 
9188          struct float32_vec dst;
9189 
9190             dst.x = dst.y = dst.z = dst.w = unpack_half_1x16((uint16_t)(src0.x >> 16));
9191 
9192                _dst_val.f32[0] = dst.x;
9193 
9194       break;
9195    }
9196 
9197    default:
9198       unreachable("unknown bit width");
9199    }
9200 
9201    return _dst_val;
9202 }
9203 static nir_const_value
evaluate_unpack_snorm_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9204 evaluate_unpack_snorm_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9205                  MAYBE_UNUSED nir_const_value *_src)
9206 {
9207    nir_const_value _dst_val = { {0, } };
9208 
9209    switch (bit_size) {
9210    case 32: {
9211 
9212 
9213 
9214          const struct uint32_vec src0 = {
9215                _src[0].u32[0],
9216             0,
9217             0,
9218             0,
9219          };
9220 
9221          struct float32_vec dst;
9222 
9223 
9224 dst.x = unpack_snorm_1x16((uint16_t)(src0.x & 0xffff));
9225 dst.y = unpack_snorm_1x16((uint16_t)(src0.x << 16));
9226 
9227 
9228                _dst_val.f32[0] = dst.x;
9229                _dst_val.f32[1] = dst.y;
9230 
9231       break;
9232    }
9233    case 64: {
9234 
9235 
9236 
9237          const struct uint32_vec src0 = {
9238                _src[0].u32[0],
9239             0,
9240             0,
9241             0,
9242          };
9243 
9244          struct float32_vec dst;
9245 
9246 
9247 dst.x = unpack_snorm_1x16((uint16_t)(src0.x & 0xffff));
9248 dst.y = unpack_snorm_1x16((uint16_t)(src0.x << 16));
9249 
9250 
9251                _dst_val.f32[0] = dst.x;
9252                _dst_val.f32[1] = dst.y;
9253 
9254       break;
9255    }
9256 
9257    default:
9258       unreachable("unknown bit width");
9259    }
9260 
9261    return _dst_val;
9262 }
9263 static nir_const_value
evaluate_unpack_snorm_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9264 evaluate_unpack_snorm_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9265                  MAYBE_UNUSED nir_const_value *_src)
9266 {
9267    nir_const_value _dst_val = { {0, } };
9268 
9269    switch (bit_size) {
9270    case 32: {
9271 
9272 
9273 
9274          const struct uint32_vec src0 = {
9275                _src[0].u32[0],
9276             0,
9277             0,
9278             0,
9279          };
9280 
9281          struct float32_vec dst;
9282 
9283 
9284 dst.x = unpack_snorm_1x8((uint8_t)(src0.x & 0xff));
9285 dst.y = unpack_snorm_1x8((uint8_t)((src0.x >> 8) & 0xff));
9286 dst.z = unpack_snorm_1x8((uint8_t)((src0.x >> 16) & 0xff));
9287 dst.w = unpack_snorm_1x8((uint8_t)(src0.x >> 24));
9288 
9289 
9290                _dst_val.f32[0] = dst.x;
9291                _dst_val.f32[1] = dst.y;
9292                _dst_val.f32[2] = dst.z;
9293                _dst_val.f32[3] = dst.w;
9294 
9295       break;
9296    }
9297    case 64: {
9298 
9299 
9300 
9301          const struct uint32_vec src0 = {
9302                _src[0].u32[0],
9303             0,
9304             0,
9305             0,
9306          };
9307 
9308          struct float32_vec dst;
9309 
9310 
9311 dst.x = unpack_snorm_1x8((uint8_t)(src0.x & 0xff));
9312 dst.y = unpack_snorm_1x8((uint8_t)((src0.x >> 8) & 0xff));
9313 dst.z = unpack_snorm_1x8((uint8_t)((src0.x >> 16) & 0xff));
9314 dst.w = unpack_snorm_1x8((uint8_t)(src0.x >> 24));
9315 
9316 
9317                _dst_val.f32[0] = dst.x;
9318                _dst_val.f32[1] = dst.y;
9319                _dst_val.f32[2] = dst.z;
9320                _dst_val.f32[3] = dst.w;
9321 
9322       break;
9323    }
9324 
9325    default:
9326       unreachable("unknown bit width");
9327    }
9328 
9329    return _dst_val;
9330 }
9331 static nir_const_value
evaluate_unpack_unorm_2x16(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9332 evaluate_unpack_unorm_2x16(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9333                  MAYBE_UNUSED nir_const_value *_src)
9334 {
9335    nir_const_value _dst_val = { {0, } };
9336 
9337    switch (bit_size) {
9338    case 32: {
9339 
9340 
9341 
9342          const struct uint32_vec src0 = {
9343                _src[0].u32[0],
9344             0,
9345             0,
9346             0,
9347          };
9348 
9349          struct float32_vec dst;
9350 
9351 
9352 dst.x = unpack_unorm_1x16((uint16_t)(src0.x & 0xffff));
9353 dst.y = unpack_unorm_1x16((uint16_t)(src0.x << 16));
9354 
9355 
9356                _dst_val.f32[0] = dst.x;
9357                _dst_val.f32[1] = dst.y;
9358 
9359       break;
9360    }
9361    case 64: {
9362 
9363 
9364 
9365          const struct uint32_vec src0 = {
9366                _src[0].u32[0],
9367             0,
9368             0,
9369             0,
9370          };
9371 
9372          struct float32_vec dst;
9373 
9374 
9375 dst.x = unpack_unorm_1x16((uint16_t)(src0.x & 0xffff));
9376 dst.y = unpack_unorm_1x16((uint16_t)(src0.x << 16));
9377 
9378 
9379                _dst_val.f32[0] = dst.x;
9380                _dst_val.f32[1] = dst.y;
9381 
9382       break;
9383    }
9384 
9385    default:
9386       unreachable("unknown bit width");
9387    }
9388 
9389    return _dst_val;
9390 }
9391 static nir_const_value
evaluate_unpack_unorm_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9392 evaluate_unpack_unorm_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9393                  MAYBE_UNUSED nir_const_value *_src)
9394 {
9395    nir_const_value _dst_val = { {0, } };
9396 
9397    switch (bit_size) {
9398    case 32: {
9399 
9400 
9401 
9402          const struct uint32_vec src0 = {
9403                _src[0].u32[0],
9404             0,
9405             0,
9406             0,
9407          };
9408 
9409          struct float32_vec dst;
9410 
9411 
9412 dst.x = unpack_unorm_1x8((uint8_t)(src0.x & 0xff));
9413 dst.y = unpack_unorm_1x8((uint8_t)((src0.x >> 8) & 0xff));
9414 dst.z = unpack_unorm_1x8((uint8_t)((src0.x >> 16) & 0xff));
9415 dst.w = unpack_unorm_1x8((uint8_t)(src0.x >> 24));
9416 
9417 
9418                _dst_val.f32[0] = dst.x;
9419                _dst_val.f32[1] = dst.y;
9420                _dst_val.f32[2] = dst.z;
9421                _dst_val.f32[3] = dst.w;
9422 
9423       break;
9424    }
9425    case 64: {
9426 
9427 
9428 
9429          const struct uint32_vec src0 = {
9430                _src[0].u32[0],
9431             0,
9432             0,
9433             0,
9434          };
9435 
9436          struct float32_vec dst;
9437 
9438 
9439 dst.x = unpack_unorm_1x8((uint8_t)(src0.x & 0xff));
9440 dst.y = unpack_unorm_1x8((uint8_t)((src0.x >> 8) & 0xff));
9441 dst.z = unpack_unorm_1x8((uint8_t)((src0.x >> 16) & 0xff));
9442 dst.w = unpack_unorm_1x8((uint8_t)(src0.x >> 24));
9443 
9444 
9445                _dst_val.f32[0] = dst.x;
9446                _dst_val.f32[1] = dst.y;
9447                _dst_val.f32[2] = dst.z;
9448                _dst_val.f32[3] = dst.w;
9449 
9450       break;
9451    }
9452 
9453    default:
9454       unreachable("unknown bit width");
9455    }
9456 
9457    return _dst_val;
9458 }
9459 static nir_const_value
evaluate_usadd_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9460 evaluate_usadd_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9461                  MAYBE_UNUSED nir_const_value *_src)
9462 {
9463    nir_const_value _dst_val = { {0, } };
9464 
9465    switch (bit_size) {
9466    case 32: {
9467 
9468 
9469 
9470          for (unsigned _i = 0; _i < num_components; _i++) {
9471                   const int32_t src0 =
9472                      _src[0].i32[_i];
9473                   const int32_t src1 =
9474                      _src[1].i32[_i];
9475 
9476                int32_t dst;
9477 
9478 
9479 dst = 0;
9480 for (int i = 0; i < 32; i += 8) {
9481    dst |= MIN2(((src0 >> i) & 0xff) + ((src1 >> i) & 0xff), 0xff) << i;
9482 }
9483 
9484 
9485                _dst_val.i32[_i] = dst;
9486          }
9487 
9488       break;
9489    }
9490    case 64: {
9491 
9492 
9493 
9494          for (unsigned _i = 0; _i < num_components; _i++) {
9495                   const int32_t src0 =
9496                      _src[0].i32[_i];
9497                   const int32_t src1 =
9498                      _src[1].i32[_i];
9499 
9500                int32_t dst;
9501 
9502 
9503 dst = 0;
9504 for (int i = 0; i < 32; i += 8) {
9505    dst |= MIN2(((src0 >> i) & 0xff) + ((src1 >> i) & 0xff), 0xff) << i;
9506 }
9507 
9508 
9509                _dst_val.i32[_i] = dst;
9510          }
9511 
9512       break;
9513    }
9514 
9515    default:
9516       unreachable("unknown bit width");
9517    }
9518 
9519    return _dst_val;
9520 }
9521 static nir_const_value
evaluate_ushr(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9522 evaluate_ushr(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9523                  MAYBE_UNUSED nir_const_value *_src)
9524 {
9525    nir_const_value _dst_val = { {0, } };
9526 
9527    switch (bit_size) {
9528    case 32: {
9529 
9530 
9531 
9532          for (unsigned _i = 0; _i < num_components; _i++) {
9533                   const uint32_t src0 =
9534                      _src[0].u32[_i];
9535                   const uint32_t src1 =
9536                      _src[1].u32[_i];
9537 
9538                uint32_t dst = src0 >> src1;
9539 
9540                _dst_val.u32[_i] = dst;
9541          }
9542 
9543       break;
9544    }
9545    case 64: {
9546 
9547 
9548 
9549          for (unsigned _i = 0; _i < num_components; _i++) {
9550                   const uint64_t src0 =
9551                      _src[0].u64[_i];
9552                   const uint64_t src1 =
9553                      _src[1].u64[_i];
9554 
9555                uint64_t dst = src0 >> src1;
9556 
9557                _dst_val.u64[_i] = dst;
9558          }
9559 
9560       break;
9561    }
9562 
9563    default:
9564       unreachable("unknown bit width");
9565    }
9566 
9567    return _dst_val;
9568 }
9569 static nir_const_value
evaluate_ussub_4x8(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9570 evaluate_ussub_4x8(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9571                  MAYBE_UNUSED nir_const_value *_src)
9572 {
9573    nir_const_value _dst_val = { {0, } };
9574 
9575    switch (bit_size) {
9576    case 32: {
9577 
9578 
9579 
9580          for (unsigned _i = 0; _i < num_components; _i++) {
9581                   const int32_t src0 =
9582                      _src[0].i32[_i];
9583                   const int32_t src1 =
9584                      _src[1].i32[_i];
9585 
9586                int32_t dst;
9587 
9588 
9589 dst = 0;
9590 for (int i = 0; i < 32; i += 8) {
9591    int src0_chan = (src0 >> i) & 0xff;
9592    int src1_chan = (src1 >> i) & 0xff;
9593    if (src0_chan > src1_chan)
9594       dst |= (src0_chan - src1_chan) << i;
9595 }
9596 
9597 
9598                _dst_val.i32[_i] = dst;
9599          }
9600 
9601       break;
9602    }
9603    case 64: {
9604 
9605 
9606 
9607          for (unsigned _i = 0; _i < num_components; _i++) {
9608                   const int32_t src0 =
9609                      _src[0].i32[_i];
9610                   const int32_t src1 =
9611                      _src[1].i32[_i];
9612 
9613                int32_t dst;
9614 
9615 
9616 dst = 0;
9617 for (int i = 0; i < 32; i += 8) {
9618    int src0_chan = (src0 >> i) & 0xff;
9619    int src1_chan = (src1 >> i) & 0xff;
9620    if (src0_chan > src1_chan)
9621       dst |= (src0_chan - src1_chan) << i;
9622 }
9623 
9624 
9625                _dst_val.i32[_i] = dst;
9626          }
9627 
9628       break;
9629    }
9630 
9631    default:
9632       unreachable("unknown bit width");
9633    }
9634 
9635    return _dst_val;
9636 }
9637 static nir_const_value
evaluate_usub_borrow(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9638 evaluate_usub_borrow(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9639                  MAYBE_UNUSED nir_const_value *_src)
9640 {
9641    nir_const_value _dst_val = { {0, } };
9642 
9643    switch (bit_size) {
9644    case 32: {
9645 
9646 
9647 
9648          for (unsigned _i = 0; _i < num_components; _i++) {
9649                   const uint32_t src0 =
9650                      _src[0].u32[_i];
9651                   const uint32_t src1 =
9652                      _src[1].u32[_i];
9653 
9654                uint32_t dst = src0 < src1;
9655 
9656                _dst_val.u32[_i] = dst;
9657          }
9658 
9659       break;
9660    }
9661    case 64: {
9662 
9663 
9664 
9665          for (unsigned _i = 0; _i < num_components; _i++) {
9666                   const uint64_t src0 =
9667                      _src[0].u64[_i];
9668                   const uint64_t src1 =
9669                      _src[1].u64[_i];
9670 
9671                uint64_t dst = src0 < src1;
9672 
9673                _dst_val.u64[_i] = dst;
9674          }
9675 
9676       break;
9677    }
9678 
9679    default:
9680       unreachable("unknown bit width");
9681    }
9682 
9683    return _dst_val;
9684 }
9685 static nir_const_value
evaluate_vec2(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9686 evaluate_vec2(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9687                  MAYBE_UNUSED nir_const_value *_src)
9688 {
9689    nir_const_value _dst_val = { {0, } };
9690 
9691    switch (bit_size) {
9692    case 32: {
9693 
9694 
9695 
9696          const struct uint32_vec src0 = {
9697                _src[0].u32[0],
9698             0,
9699             0,
9700             0,
9701          };
9702 
9703          const struct uint32_vec src1 = {
9704                _src[1].u32[0],
9705             0,
9706             0,
9707             0,
9708          };
9709 
9710          struct uint32_vec dst;
9711 
9712 
9713 dst.x = src0.x;
9714 dst.y = src1.x;
9715 
9716 
9717                _dst_val.u32[0] = dst.x;
9718                _dst_val.u32[1] = dst.y;
9719 
9720       break;
9721    }
9722    case 64: {
9723 
9724 
9725 
9726          const struct uint64_vec src0 = {
9727                _src[0].u64[0],
9728             0,
9729             0,
9730             0,
9731          };
9732 
9733          const struct uint64_vec src1 = {
9734                _src[1].u64[0],
9735             0,
9736             0,
9737             0,
9738          };
9739 
9740          struct uint64_vec dst;
9741 
9742 
9743 dst.x = src0.x;
9744 dst.y = src1.x;
9745 
9746 
9747                _dst_val.u64[0] = dst.x;
9748                _dst_val.u64[1] = dst.y;
9749 
9750       break;
9751    }
9752 
9753    default:
9754       unreachable("unknown bit width");
9755    }
9756 
9757    return _dst_val;
9758 }
9759 static nir_const_value
evaluate_vec3(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9760 evaluate_vec3(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9761                  MAYBE_UNUSED nir_const_value *_src)
9762 {
9763    nir_const_value _dst_val = { {0, } };
9764 
9765    switch (bit_size) {
9766    case 32: {
9767 
9768 
9769 
9770          const struct uint32_vec src0 = {
9771                _src[0].u32[0],
9772             0,
9773             0,
9774             0,
9775          };
9776 
9777          const struct uint32_vec src1 = {
9778                _src[1].u32[0],
9779             0,
9780             0,
9781             0,
9782          };
9783 
9784          const struct uint32_vec src2 = {
9785                _src[2].u32[0],
9786             0,
9787             0,
9788             0,
9789          };
9790 
9791          struct uint32_vec dst;
9792 
9793 
9794 dst.x = src0.x;
9795 dst.y = src1.x;
9796 dst.z = src2.x;
9797 
9798 
9799                _dst_val.u32[0] = dst.x;
9800                _dst_val.u32[1] = dst.y;
9801                _dst_val.u32[2] = dst.z;
9802 
9803       break;
9804    }
9805    case 64: {
9806 
9807 
9808 
9809          const struct uint64_vec src0 = {
9810                _src[0].u64[0],
9811             0,
9812             0,
9813             0,
9814          };
9815 
9816          const struct uint64_vec src1 = {
9817                _src[1].u64[0],
9818             0,
9819             0,
9820             0,
9821          };
9822 
9823          const struct uint64_vec src2 = {
9824                _src[2].u64[0],
9825             0,
9826             0,
9827             0,
9828          };
9829 
9830          struct uint64_vec dst;
9831 
9832 
9833 dst.x = src0.x;
9834 dst.y = src1.x;
9835 dst.z = src2.x;
9836 
9837 
9838                _dst_val.u64[0] = dst.x;
9839                _dst_val.u64[1] = dst.y;
9840                _dst_val.u64[2] = dst.z;
9841 
9842       break;
9843    }
9844 
9845    default:
9846       unreachable("unknown bit width");
9847    }
9848 
9849    return _dst_val;
9850 }
9851 static nir_const_value
evaluate_vec4(MAYBE_UNUSED unsigned num_components,unsigned bit_size,MAYBE_UNUSED nir_const_value * _src)9852 evaluate_vec4(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
9853                  MAYBE_UNUSED nir_const_value *_src)
9854 {
9855    nir_const_value _dst_val = { {0, } };
9856 
9857    switch (bit_size) {
9858    case 32: {
9859 
9860 
9861 
9862          const struct uint32_vec src0 = {
9863                _src[0].u32[0],
9864             0,
9865             0,
9866             0,
9867          };
9868 
9869          const struct uint32_vec src1 = {
9870                _src[1].u32[0],
9871             0,
9872             0,
9873             0,
9874          };
9875 
9876          const struct uint32_vec src2 = {
9877                _src[2].u32[0],
9878             0,
9879             0,
9880             0,
9881          };
9882 
9883          const struct uint32_vec src3 = {
9884                _src[3].u32[0],
9885             0,
9886             0,
9887             0,
9888          };
9889 
9890          struct uint32_vec dst;
9891 
9892 
9893 dst.x = src0.x;
9894 dst.y = src1.x;
9895 dst.z = src2.x;
9896 dst.w = src3.x;
9897 
9898 
9899                _dst_val.u32[0] = dst.x;
9900                _dst_val.u32[1] = dst.y;
9901                _dst_val.u32[2] = dst.z;
9902                _dst_val.u32[3] = dst.w;
9903 
9904       break;
9905    }
9906    case 64: {
9907 
9908 
9909 
9910          const struct uint64_vec src0 = {
9911                _src[0].u64[0],
9912             0,
9913             0,
9914             0,
9915          };
9916 
9917          const struct uint64_vec src1 = {
9918                _src[1].u64[0],
9919             0,
9920             0,
9921             0,
9922          };
9923 
9924          const struct uint64_vec src2 = {
9925                _src[2].u64[0],
9926             0,
9927             0,
9928             0,
9929          };
9930 
9931          const struct uint64_vec src3 = {
9932                _src[3].u64[0],
9933             0,
9934             0,
9935             0,
9936          };
9937 
9938          struct uint64_vec dst;
9939 
9940 
9941 dst.x = src0.x;
9942 dst.y = src1.x;
9943 dst.z = src2.x;
9944 dst.w = src3.x;
9945 
9946 
9947                _dst_val.u64[0] = dst.x;
9948                _dst_val.u64[1] = dst.y;
9949                _dst_val.u64[2] = dst.z;
9950                _dst_val.u64[3] = dst.w;
9951 
9952       break;
9953    }
9954 
9955    default:
9956       unreachable("unknown bit width");
9957    }
9958 
9959    return _dst_val;
9960 }
9961 
9962 nir_const_value
nir_eval_const_opcode(nir_op op,unsigned num_components,unsigned bit_width,nir_const_value * src)9963 nir_eval_const_opcode(nir_op op, unsigned num_components,
9964                       unsigned bit_width, nir_const_value *src)
9965 {
9966    switch (op) {
9967    case nir_op_b2f:
9968       return evaluate_b2f(num_components, bit_width, src);
9969    case nir_op_b2i:
9970       return evaluate_b2i(num_components, bit_width, src);
9971    case nir_op_ball_fequal2:
9972       return evaluate_ball_fequal2(num_components, bit_width, src);
9973    case nir_op_ball_fequal3:
9974       return evaluate_ball_fequal3(num_components, bit_width, src);
9975    case nir_op_ball_fequal4:
9976       return evaluate_ball_fequal4(num_components, bit_width, src);
9977    case nir_op_ball_iequal2:
9978       return evaluate_ball_iequal2(num_components, bit_width, src);
9979    case nir_op_ball_iequal3:
9980       return evaluate_ball_iequal3(num_components, bit_width, src);
9981    case nir_op_ball_iequal4:
9982       return evaluate_ball_iequal4(num_components, bit_width, src);
9983    case nir_op_bany_fnequal2:
9984       return evaluate_bany_fnequal2(num_components, bit_width, src);
9985    case nir_op_bany_fnequal3:
9986       return evaluate_bany_fnequal3(num_components, bit_width, src);
9987    case nir_op_bany_fnequal4:
9988       return evaluate_bany_fnequal4(num_components, bit_width, src);
9989    case nir_op_bany_inequal2:
9990       return evaluate_bany_inequal2(num_components, bit_width, src);
9991    case nir_op_bany_inequal3:
9992       return evaluate_bany_inequal3(num_components, bit_width, src);
9993    case nir_op_bany_inequal4:
9994       return evaluate_bany_inequal4(num_components, bit_width, src);
9995    case nir_op_bcsel:
9996       return evaluate_bcsel(num_components, bit_width, src);
9997    case nir_op_bfi:
9998       return evaluate_bfi(num_components, bit_width, src);
9999    case nir_op_bfm:
10000       return evaluate_bfm(num_components, bit_width, src);
10001    case nir_op_bit_count:
10002       return evaluate_bit_count(num_components, bit_width, src);
10003    case nir_op_bitfield_insert:
10004       return evaluate_bitfield_insert(num_components, bit_width, src);
10005    case nir_op_bitfield_reverse:
10006       return evaluate_bitfield_reverse(num_components, bit_width, src);
10007    case nir_op_d2b:
10008       return evaluate_d2b(num_components, bit_width, src);
10009    case nir_op_d2f:
10010       return evaluate_d2f(num_components, bit_width, src);
10011    case nir_op_d2i:
10012       return evaluate_d2i(num_components, bit_width, src);
10013    case nir_op_d2u:
10014       return evaluate_d2u(num_components, bit_width, src);
10015    case nir_op_extract_i16:
10016       return evaluate_extract_i16(num_components, bit_width, src);
10017    case nir_op_extract_i8:
10018       return evaluate_extract_i8(num_components, bit_width, src);
10019    case nir_op_extract_u16:
10020       return evaluate_extract_u16(num_components, bit_width, src);
10021    case nir_op_extract_u8:
10022       return evaluate_extract_u8(num_components, bit_width, src);
10023    case nir_op_f2b:
10024       return evaluate_f2b(num_components, bit_width, src);
10025    case nir_op_f2d:
10026       return evaluate_f2d(num_components, bit_width, src);
10027    case nir_op_f2i:
10028       return evaluate_f2i(num_components, bit_width, src);
10029    case nir_op_f2u:
10030       return evaluate_f2u(num_components, bit_width, src);
10031    case nir_op_fabs:
10032       return evaluate_fabs(num_components, bit_width, src);
10033    case nir_op_fadd:
10034       return evaluate_fadd(num_components, bit_width, src);
10035    case nir_op_fall_equal2:
10036       return evaluate_fall_equal2(num_components, bit_width, src);
10037    case nir_op_fall_equal3:
10038       return evaluate_fall_equal3(num_components, bit_width, src);
10039    case nir_op_fall_equal4:
10040       return evaluate_fall_equal4(num_components, bit_width, src);
10041    case nir_op_fand:
10042       return evaluate_fand(num_components, bit_width, src);
10043    case nir_op_fany_nequal2:
10044       return evaluate_fany_nequal2(num_components, bit_width, src);
10045    case nir_op_fany_nequal3:
10046       return evaluate_fany_nequal3(num_components, bit_width, src);
10047    case nir_op_fany_nequal4:
10048       return evaluate_fany_nequal4(num_components, bit_width, src);
10049    case nir_op_fceil:
10050       return evaluate_fceil(num_components, bit_width, src);
10051    case nir_op_fcos:
10052       return evaluate_fcos(num_components, bit_width, src);
10053    case nir_op_fcsel:
10054       return evaluate_fcsel(num_components, bit_width, src);
10055    case nir_op_fddx:
10056       return evaluate_fddx(num_components, bit_width, src);
10057    case nir_op_fddx_coarse:
10058       return evaluate_fddx_coarse(num_components, bit_width, src);
10059    case nir_op_fddx_fine:
10060       return evaluate_fddx_fine(num_components, bit_width, src);
10061    case nir_op_fddy:
10062       return evaluate_fddy(num_components, bit_width, src);
10063    case nir_op_fddy_coarse:
10064       return evaluate_fddy_coarse(num_components, bit_width, src);
10065    case nir_op_fddy_fine:
10066       return evaluate_fddy_fine(num_components, bit_width, src);
10067    case nir_op_fdiv:
10068       return evaluate_fdiv(num_components, bit_width, src);
10069    case nir_op_fdot2:
10070       return evaluate_fdot2(num_components, bit_width, src);
10071    case nir_op_fdot3:
10072       return evaluate_fdot3(num_components, bit_width, src);
10073    case nir_op_fdot4:
10074       return evaluate_fdot4(num_components, bit_width, src);
10075    case nir_op_fdot_replicated2:
10076       return evaluate_fdot_replicated2(num_components, bit_width, src);
10077    case nir_op_fdot_replicated3:
10078       return evaluate_fdot_replicated3(num_components, bit_width, src);
10079    case nir_op_fdot_replicated4:
10080       return evaluate_fdot_replicated4(num_components, bit_width, src);
10081    case nir_op_fdph:
10082       return evaluate_fdph(num_components, bit_width, src);
10083    case nir_op_fdph_replicated:
10084       return evaluate_fdph_replicated(num_components, bit_width, src);
10085    case nir_op_feq:
10086       return evaluate_feq(num_components, bit_width, src);
10087    case nir_op_fexp2:
10088       return evaluate_fexp2(num_components, bit_width, src);
10089    case nir_op_ffloor:
10090       return evaluate_ffloor(num_components, bit_width, src);
10091    case nir_op_ffma:
10092       return evaluate_ffma(num_components, bit_width, src);
10093    case nir_op_ffract:
10094       return evaluate_ffract(num_components, bit_width, src);
10095    case nir_op_fge:
10096       return evaluate_fge(num_components, bit_width, src);
10097    case nir_op_find_lsb:
10098       return evaluate_find_lsb(num_components, bit_width, src);
10099    case nir_op_flog2:
10100       return evaluate_flog2(num_components, bit_width, src);
10101    case nir_op_flrp:
10102       return evaluate_flrp(num_components, bit_width, src);
10103    case nir_op_flt:
10104       return evaluate_flt(num_components, bit_width, src);
10105    case nir_op_fmax:
10106       return evaluate_fmax(num_components, bit_width, src);
10107    case nir_op_fmin:
10108       return evaluate_fmin(num_components, bit_width, src);
10109    case nir_op_fmod:
10110       return evaluate_fmod(num_components, bit_width, src);
10111    case nir_op_fmov:
10112       return evaluate_fmov(num_components, bit_width, src);
10113    case nir_op_fmul:
10114       return evaluate_fmul(num_components, bit_width, src);
10115    case nir_op_fne:
10116       return evaluate_fne(num_components, bit_width, src);
10117    case nir_op_fneg:
10118       return evaluate_fneg(num_components, bit_width, src);
10119    case nir_op_fnoise1_1:
10120       return evaluate_fnoise1_1(num_components, bit_width, src);
10121    case nir_op_fnoise1_2:
10122       return evaluate_fnoise1_2(num_components, bit_width, src);
10123    case nir_op_fnoise1_3:
10124       return evaluate_fnoise1_3(num_components, bit_width, src);
10125    case nir_op_fnoise1_4:
10126       return evaluate_fnoise1_4(num_components, bit_width, src);
10127    case nir_op_fnoise2_1:
10128       return evaluate_fnoise2_1(num_components, bit_width, src);
10129    case nir_op_fnoise2_2:
10130       return evaluate_fnoise2_2(num_components, bit_width, src);
10131    case nir_op_fnoise2_3:
10132       return evaluate_fnoise2_3(num_components, bit_width, src);
10133    case nir_op_fnoise2_4:
10134       return evaluate_fnoise2_4(num_components, bit_width, src);
10135    case nir_op_fnoise3_1:
10136       return evaluate_fnoise3_1(num_components, bit_width, src);
10137    case nir_op_fnoise3_2:
10138       return evaluate_fnoise3_2(num_components, bit_width, src);
10139    case nir_op_fnoise3_3:
10140       return evaluate_fnoise3_3(num_components, bit_width, src);
10141    case nir_op_fnoise3_4:
10142       return evaluate_fnoise3_4(num_components, bit_width, src);
10143    case nir_op_fnoise4_1:
10144       return evaluate_fnoise4_1(num_components, bit_width, src);
10145    case nir_op_fnoise4_2:
10146       return evaluate_fnoise4_2(num_components, bit_width, src);
10147    case nir_op_fnoise4_3:
10148       return evaluate_fnoise4_3(num_components, bit_width, src);
10149    case nir_op_fnoise4_4:
10150       return evaluate_fnoise4_4(num_components, bit_width, src);
10151    case nir_op_fnot:
10152       return evaluate_fnot(num_components, bit_width, src);
10153    case nir_op_for:
10154       return evaluate_for(num_components, bit_width, src);
10155    case nir_op_fpow:
10156       return evaluate_fpow(num_components, bit_width, src);
10157    case nir_op_fquantize2f16:
10158       return evaluate_fquantize2f16(num_components, bit_width, src);
10159    case nir_op_frcp:
10160       return evaluate_frcp(num_components, bit_width, src);
10161    case nir_op_frem:
10162       return evaluate_frem(num_components, bit_width, src);
10163    case nir_op_fround_even:
10164       return evaluate_fround_even(num_components, bit_width, src);
10165    case nir_op_frsq:
10166       return evaluate_frsq(num_components, bit_width, src);
10167    case nir_op_fsat:
10168       return evaluate_fsat(num_components, bit_width, src);
10169    case nir_op_fsign:
10170       return evaluate_fsign(num_components, bit_width, src);
10171    case nir_op_fsin:
10172       return evaluate_fsin(num_components, bit_width, src);
10173    case nir_op_fsqrt:
10174       return evaluate_fsqrt(num_components, bit_width, src);
10175    case nir_op_fsub:
10176       return evaluate_fsub(num_components, bit_width, src);
10177    case nir_op_ftrunc:
10178       return evaluate_ftrunc(num_components, bit_width, src);
10179    case nir_op_fxor:
10180       return evaluate_fxor(num_components, bit_width, src);
10181    case nir_op_i2b:
10182       return evaluate_i2b(num_components, bit_width, src);
10183    case nir_op_i2d:
10184       return evaluate_i2d(num_components, bit_width, src);
10185    case nir_op_i2f:
10186       return evaluate_i2f(num_components, bit_width, src);
10187    case nir_op_iabs:
10188       return evaluate_iabs(num_components, bit_width, src);
10189    case nir_op_iadd:
10190       return evaluate_iadd(num_components, bit_width, src);
10191    case nir_op_iand:
10192       return evaluate_iand(num_components, bit_width, src);
10193    case nir_op_ibfe:
10194       return evaluate_ibfe(num_components, bit_width, src);
10195    case nir_op_ibitfield_extract:
10196       return evaluate_ibitfield_extract(num_components, bit_width, src);
10197    case nir_op_idiv:
10198       return evaluate_idiv(num_components, bit_width, src);
10199    case nir_op_ieq:
10200       return evaluate_ieq(num_components, bit_width, src);
10201    case nir_op_ifind_msb:
10202       return evaluate_ifind_msb(num_components, bit_width, src);
10203    case nir_op_ige:
10204       return evaluate_ige(num_components, bit_width, src);
10205    case nir_op_ilt:
10206       return evaluate_ilt(num_components, bit_width, src);
10207    case nir_op_imax:
10208       return evaluate_imax(num_components, bit_width, src);
10209    case nir_op_imin:
10210       return evaluate_imin(num_components, bit_width, src);
10211    case nir_op_imod:
10212       return evaluate_imod(num_components, bit_width, src);
10213    case nir_op_imov:
10214       return evaluate_imov(num_components, bit_width, src);
10215    case nir_op_imul:
10216       return evaluate_imul(num_components, bit_width, src);
10217    case nir_op_imul_high:
10218       return evaluate_imul_high(num_components, bit_width, src);
10219    case nir_op_ine:
10220       return evaluate_ine(num_components, bit_width, src);
10221    case nir_op_ineg:
10222       return evaluate_ineg(num_components, bit_width, src);
10223    case nir_op_inot:
10224       return evaluate_inot(num_components, bit_width, src);
10225    case nir_op_ior:
10226       return evaluate_ior(num_components, bit_width, src);
10227    case nir_op_irem:
10228       return evaluate_irem(num_components, bit_width, src);
10229    case nir_op_ishl:
10230       return evaluate_ishl(num_components, bit_width, src);
10231    case nir_op_ishr:
10232       return evaluate_ishr(num_components, bit_width, src);
10233    case nir_op_isign:
10234       return evaluate_isign(num_components, bit_width, src);
10235    case nir_op_isub:
10236       return evaluate_isub(num_components, bit_width, src);
10237    case nir_op_ixor:
10238       return evaluate_ixor(num_components, bit_width, src);
10239    case nir_op_ldexp:
10240       return evaluate_ldexp(num_components, bit_width, src);
10241    case nir_op_pack_double_2x32:
10242       return evaluate_pack_double_2x32(num_components, bit_width, src);
10243    case nir_op_pack_double_2x32_split:
10244       return evaluate_pack_double_2x32_split(num_components, bit_width, src);
10245    case nir_op_pack_half_2x16:
10246       return evaluate_pack_half_2x16(num_components, bit_width, src);
10247    case nir_op_pack_half_2x16_split:
10248       return evaluate_pack_half_2x16_split(num_components, bit_width, src);
10249    case nir_op_pack_snorm_2x16:
10250       return evaluate_pack_snorm_2x16(num_components, bit_width, src);
10251    case nir_op_pack_snorm_4x8:
10252       return evaluate_pack_snorm_4x8(num_components, bit_width, src);
10253    case nir_op_pack_unorm_2x16:
10254       return evaluate_pack_unorm_2x16(num_components, bit_width, src);
10255    case nir_op_pack_unorm_4x8:
10256       return evaluate_pack_unorm_4x8(num_components, bit_width, src);
10257    case nir_op_pack_uvec2_to_uint:
10258       return evaluate_pack_uvec2_to_uint(num_components, bit_width, src);
10259    case nir_op_pack_uvec4_to_uint:
10260       return evaluate_pack_uvec4_to_uint(num_components, bit_width, src);
10261    case nir_op_seq:
10262       return evaluate_seq(num_components, bit_width, src);
10263    case nir_op_sge:
10264       return evaluate_sge(num_components, bit_width, src);
10265    case nir_op_slt:
10266       return evaluate_slt(num_components, bit_width, src);
10267    case nir_op_sne:
10268       return evaluate_sne(num_components, bit_width, src);
10269    case nir_op_u2d:
10270       return evaluate_u2d(num_components, bit_width, src);
10271    case nir_op_u2f:
10272       return evaluate_u2f(num_components, bit_width, src);
10273    case nir_op_uadd_carry:
10274       return evaluate_uadd_carry(num_components, bit_width, src);
10275    case nir_op_ubfe:
10276       return evaluate_ubfe(num_components, bit_width, src);
10277    case nir_op_ubitfield_extract:
10278       return evaluate_ubitfield_extract(num_components, bit_width, src);
10279    case nir_op_udiv:
10280       return evaluate_udiv(num_components, bit_width, src);
10281    case nir_op_ufind_msb:
10282       return evaluate_ufind_msb(num_components, bit_width, src);
10283    case nir_op_uge:
10284       return evaluate_uge(num_components, bit_width, src);
10285    case nir_op_ult:
10286       return evaluate_ult(num_components, bit_width, src);
10287    case nir_op_umax:
10288       return evaluate_umax(num_components, bit_width, src);
10289    case nir_op_umax_4x8:
10290       return evaluate_umax_4x8(num_components, bit_width, src);
10291    case nir_op_umin:
10292       return evaluate_umin(num_components, bit_width, src);
10293    case nir_op_umin_4x8:
10294       return evaluate_umin_4x8(num_components, bit_width, src);
10295    case nir_op_umod:
10296       return evaluate_umod(num_components, bit_width, src);
10297    case nir_op_umul_high:
10298       return evaluate_umul_high(num_components, bit_width, src);
10299    case nir_op_umul_unorm_4x8:
10300       return evaluate_umul_unorm_4x8(num_components, bit_width, src);
10301    case nir_op_unpack_double_2x32:
10302       return evaluate_unpack_double_2x32(num_components, bit_width, src);
10303    case nir_op_unpack_double_2x32_split_x:
10304       return evaluate_unpack_double_2x32_split_x(num_components, bit_width, src);
10305    case nir_op_unpack_double_2x32_split_y:
10306       return evaluate_unpack_double_2x32_split_y(num_components, bit_width, src);
10307    case nir_op_unpack_half_2x16:
10308       return evaluate_unpack_half_2x16(num_components, bit_width, src);
10309    case nir_op_unpack_half_2x16_split_x:
10310       return evaluate_unpack_half_2x16_split_x(num_components, bit_width, src);
10311    case nir_op_unpack_half_2x16_split_y:
10312       return evaluate_unpack_half_2x16_split_y(num_components, bit_width, src);
10313    case nir_op_unpack_snorm_2x16:
10314       return evaluate_unpack_snorm_2x16(num_components, bit_width, src);
10315    case nir_op_unpack_snorm_4x8:
10316       return evaluate_unpack_snorm_4x8(num_components, bit_width, src);
10317    case nir_op_unpack_unorm_2x16:
10318       return evaluate_unpack_unorm_2x16(num_components, bit_width, src);
10319    case nir_op_unpack_unorm_4x8:
10320       return evaluate_unpack_unorm_4x8(num_components, bit_width, src);
10321    case nir_op_usadd_4x8:
10322       return evaluate_usadd_4x8(num_components, bit_width, src);
10323    case nir_op_ushr:
10324       return evaluate_ushr(num_components, bit_width, src);
10325    case nir_op_ussub_4x8:
10326       return evaluate_ussub_4x8(num_components, bit_width, src);
10327    case nir_op_usub_borrow:
10328       return evaluate_usub_borrow(num_components, bit_width, src);
10329    case nir_op_vec2:
10330       return evaluate_vec2(num_components, bit_width, src);
10331    case nir_op_vec3:
10332       return evaluate_vec3(num_components, bit_width, src);
10333    case nir_op_vec4:
10334       return evaluate_vec4(num_components, bit_width, src);
10335    default:
10336       unreachable("shouldn't get here");
10337    }
10338 }
10339