Lines Matching refs:ir
124 #include "ir.h"
169 void reverse_to_shifts(ir_expression *ir);
170 void find_lsb_to_float_cast(ir_expression *ir);
171 void find_msb_to_float_cast(ir_expression *ir);
172 void imul_high_to_mul(ir_expression *ir);
173 void sqrt_to_abs_sqrt(ir_expression *ir);
174 void mul64_to_mul_and_mul_high(ir_expression *ir);
201 lower_instructions_visitor::sub_to_add_neg(ir_expression *ir)
203 ir->operation = ir_binop_add;
204 ir->init_num_operands();
205 ir->operands[1] = new(ir) ir_expression(ir_unop_neg, ir->operands[1]->type,
206 ir->operands[1], NULL);
211 lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir)
213 assert(ir->operands[1]->type->is_float_16_32_64());
217 expr = new(ir) ir_expression(ir_unop_rcp,
218 ir->operands[1]->type,
219 ir->operands[1]);
222 ir->operation = ir_binop_mul;
223 ir->init_num_operands();
224 ir->operands[1] = expr;
230 lower_instructions_visitor::int_div_to_mul_rcp(ir_expression *ir)
232 assert(ir->operands[1]->type->is_integer_32());
242 ir->operands[1]->type->vector_elements,
243 ir->operands[1]->type->matrix_columns);
245 if (ir->operands[1]->type->base_type == GLSL_TYPE_INT)
246 op1 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[1], NULL);
248 op1 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[1], NULL);
250 op1 = new(ir) ir_expression(ir_unop_rcp, op1->type, op1, NULL);
253 ir->operands[0]->type->vector_elements,
254 ir->operands[0]->type->matrix_columns);
256 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT)
257 op0 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[0], NULL);
259 op0 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[0], NULL);
262 ir->type->vector_elements,
263 ir->type->matrix_columns);
265 op0 = new(ir) ir_expression(ir_binop_mul, vec_type, op0, op1);
267 if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) {
268 ir->operation = ir_unop_f2i;
269 ir->operands[0] = op0;
271 ir->operation = ir_unop_i2u;
272 ir->operands[0] = new(ir) ir_expression(ir_unop_f2i, op0);
274 ir->init_num_operands();
275 ir->operands[1] = NULL;
281 lower_instructions_visitor::exp_to_exp2(ir_expression *ir)
283 ir_constant *log2_e = _imm_fp(ir, ir->type, M_LOG2E);
285 ir->operation = ir_unop_exp2;
286 ir->init_num_operands();
287 ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[0]->type,
288 ir->operands[0], log2_e);
293 lower_instructions_visitor::pow_to_exp2(ir_expression *ir)
296 new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type,
297 ir->operands[0]);
299 ir->operation = ir_unop_exp2;
300 ir->init_num_operands();
301 ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[1]->type,
302 ir->operands[1], log2_x);
303 ir->operands[1] = NULL;
308 lower_instructions_visitor::log_to_log2(ir_expression *ir)
310 ir->operation = ir_binop_mul;
311 ir->init_num_operands();
312 ir->operands[0] = new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type,
313 ir->operands[0], NULL);
314 ir->operands[1] = _imm_fp(ir, ir->operands[0]->type, 1.0 / M_LOG2E);
319 lower_instructions_visitor::mod_to_floor(ir_expression *ir)
321 ir_variable *x = new(ir) ir_variable(ir->operands[0]->type, "mod_x",
323 ir_variable *y = new(ir) ir_variable(ir->operands[1]->type, "mod_y",
329 new(ir) ir_assignment(new(ir) ir_dereference_variable(x),
330 ir->operands[0]);
332 new(ir) ir_assignment(new(ir) ir_dereference_variable(y),
333 ir->operands[1]);
339 new(ir) ir_expression(ir_binop_div, x->type,
340 new(ir) ir_dereference_variable(x),
341 new(ir) ir_dereference_variable(y));
346 if ((lowering(FDIV_TO_MUL_RCP) && ir->type->is_float_16_32()) ||
347 (lowering(DDIV_TO_MUL_RCP) && ir->type->is_double()))
351 new(ir) ir_expression(ir_unop_floor, x->type, div_expr);
353 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
357 new(ir) ir_expression(ir_binop_mul,
358 new(ir) ir_dereference_variable(y),
361 ir->operation = ir_binop_sub;
362 ir->init_num_operands();
363 ir->operands[0] = new(ir) ir_dereference_variable(x);
364 ir->operands[1] = mul_expr;
369 lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
426 const unsigned vec_elem = ir->type->vector_elements;
434 ir_variable *x = new(ir) ir_variable(ir->type, "x", ir_var_temporary);
435 ir_variable *exp = new(ir) ir_variable(ivec, "exp", ir_var_temporary);
436 ir_variable *result = new(ir) ir_variable(uvec, "result", ir_var_temporary);
439 new(ir) ir_variable(ivec, "extracted_biased_exp", ir_var_temporary);
441 new(ir) ir_variable(ivec, "resulting_biased_exp", ir_var_temporary);
444 new(ir) ir_variable(uvec, "sign_mantissa", ir_var_temporary);
447 new(ir) ir_variable(bvec, "flush_to_zero", ir_var_temporary);
449 new(ir) ir_variable(bvec, "zero_mantissa", ir_var_temporary);
455 i.insert_before(assign(x, ir->operands[0]));
457 i.insert_before(assign(exp, ir->operands[1]));
463 new(ir) ir_constant(23, vec_elem))));
479 new(ir) ir_constant(255, vec_elem))));
484 new(ir) ir_constant(0x807fffffu, vec_elem))));
498 ir_constant::zero(ir, ivec))));
501 ir_constant::zero(ir, ivec),
508 new(ir) ir_constant(255, vec_elem)))));
512 new(ir) ir_constant(0x80000000u, vec_elem)),
523 new(ir) ir_constant(23u, vec_elem),
524 new(ir) ir_constant(8u, vec_elem))));
529 new(ir) ir_constant(23, vec_elem)))));
532 ir->operation = ir_triop_csel;
533 ir->init_num_operands();
534 ir->operands[0] = gequal(extracted_biased_exp,
535 new(ir) ir_constant(255, vec_elem));
536 ir->operands[1] = new(ir) ir_dereference_variable(x);
537 ir->operands[2] = bitcast_u2f(result);
543 lower_instructions_visitor::dldexp_to_arith(ir_expression *ir)
549 const unsigned vec_elem = ir->type->vector_elements;
556 ir_constant *zeroi = ir_constant::zero(ir, ivec);
558 ir_constant *sign_mask = new(ir) ir_constant(0x80000000u);
560 ir_constant *exp_shift = new(ir) ir_constant(20u);
561 ir_constant *exp_width = new(ir) ir_constant(11u);
562 ir_constant *exp_bias = new(ir) ir_constant(1022, vec_elem);
565 ir_variable *x = new(ir) ir_variable(ir->type, "x", ir_var_temporary);
566 ir_variable *exp = new(ir) ir_variable(ivec, "exp", ir_var_temporary);
568 ir_variable *zero_sign_x = new(ir) ir_variable(ir->type, "zero_sign_x",
572 new(ir) ir_variable(ivec, "extracted_biased_exp", ir_var_temporary);
574 new(ir) ir_variable(ivec, "resulting_biased_exp", ir_var_temporary);
577 new(ir) ir_variable(bvec, "is_not_zero_or_underflow", ir_var_temporary);
583 i.insert_before(assign(x, ir->operands[0]));
585 i.insert_before(assign(exp, ir->operands[1]));
608 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
613 i.insert_before(assign(unpacked, bit_and(swizzle_y(unpacked), sign_mask->clone(ir, NULL)),
615 i.insert_before(assign(unpacked, ir_constant::zero(ir, glsl_type::uint_type), WRITEMASK_X));
623 new(ir) ir_constant(0x1, vec_elem))));
641 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
650 exp_shift->clone(ir, NULL),
651 exp_width->clone(ir, NULL));
658 ir->operation = ir_quadop_vector;
659 ir->init_num_operands();
660 ir->operands[0] = results[0];
661 ir->operands[1] = results[1];
662 ir->operands[2] = results[2];
663 ir->operands[3] = results[3];
673 lower_instructions_visitor::dfrexp_sig_to_arith(ir_expression *ir)
675 const unsigned vec_elem = ir->type->vector_elements;
691 new(ir) ir_variable(bvec, "is_not_zero", ir_var_temporary);
694 ir_constant *dzero = new(ir) ir_constant(0.0, vec_elem);
698 nequal(abs(ir->operands[0]->clone(ir, NULL)), dzero)));
704 ir_constant *zero = new(ir) ir_constant(0u, 1);
705 ir_constant *sign_mantissa_mask = new(ir) ir_constant(0x800fffffu, 1);
708 ir_constant *exponent_value = new(ir) ir_constant(0x3fe00000u, 1);
711 new(ir) ir_variable(glsl_type::uint_type, "bits", ir_var_temporary);
713 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
715 ir_rvalue *x = swizzle(ir->operands[0]->clone(ir, NULL), elem, 1);
735 ir->operation = ir_quadop_vector;
736 ir->init_num_operands();
737 ir->operands[0] = results[0];
738 ir->operands[1] = results[1];
739 ir->operands[2] = results[2];
740 ir->operands[3] = results[3];
746 lower_instructions_visitor::dfrexp_exp_to_arith(ir_expression *ir)
748 const unsigned vec_elem = ir->type->vector_elements;
764 new(ir) ir_variable(bvec, "is_not_zero", ir_var_temporary);
766 new(ir) ir_variable(uvec, "high_words", ir_var_temporary);
767 ir_constant *dzero = new(ir) ir_constant(0.0, vec_elem);
768 ir_constant *izero = new(ir) ir_constant(0, vec_elem);
770 ir_rvalue *absval = abs(ir->operands[0]);
774 i.insert_before(assign(is_not_zero, nequal(absval->clone(ir, NULL), dzero)));
778 ir_rvalue *x = swizzle(absval->clone(ir, NULL), elem, 1);
785 ir_constant *exponent_shift = new(ir) ir_constant(20, vec_elem);
786 ir_constant *exponent_bias = new(ir) ir_constant(-1022, vec_elem);
789 ir->operation = ir_triop_csel;
790 ir->init_num_operands();
791 ir->operands[0] = new(ir) ir_dereference_variable(is_not_zero);
792 ir->operands[1] = add(exponent_bias, u2i(rshift(high_words, exponent_shift)));
793 ir->operands[2] = izero;
799 lower_instructions_visitor::carry_to_arith(ir_expression *ir)
809 ir_rvalue *x_clone = ir->operands[0]->clone(ir, NULL);
810 ir->operation = ir_unop_i2u;
811 ir->init_num_operands();
812 ir->operands[0] = b2i(less(add(ir->operands[0], ir->operands[1]), x_clone));
813 ir->operands[1] = NULL;
819 lower_instructions_visitor::borrow_to_arith(ir_expression *ir)
828 ir->operation = ir_unop_i2u;
829 ir->init_num_operands();
830 ir->operands[0] = b2i(less(ir->operands[0], ir->operands[1]));
831 ir->operands[1] = NULL;
837 lower_instructions_visitor::sat_to_clamp(ir_expression *ir)
845 ir->operation = ir_binop_min;
846 ir->init_num_operands();
848 ir_constant *zero = _imm_fp(ir, ir->operands[0]->type, 0.0);
849 ir->operands[0] = new(ir) ir_expression(ir_binop_max, ir->operands[0]->type,
850 ir->operands[0], zero);
851 ir->operands[1] = _imm_fp(ir, ir->operands[0]->type, 1.0);
857 lower_instructions_visitor::double_dot_to_fma(ir_expression *ir)
859 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type->get_base_type(), "dot_res",
863 int nc = ir->operands[0]->type->components();
867 assig = assign(temp, mul(swizzle(ir->operands[0]->clone(ir, NULL), i, 1),
868 swizzle(ir->operands[1]->clone(ir, NULL), i, 1)));
870 assig = assign(temp, fma(swizzle(ir->operands[0]->clone(ir, NULL), i, 1),
871 swizzle(ir->operands[1]->clone(ir, NULL), i, 1),
877 ir->operation = ir_triop_fma;
878 ir->init_num_operands();
879 ir->operands[0] = swizzle(ir->operands[0], 0, 1);
880 ir->operands[1] = swizzle(ir->operands[1], 0, 1);
881 ir->operands[2] = new(ir) ir_dereference_variable(temp);
888 lower_instructions_visitor::double_lrp(ir_expression *ir)
891 ir_rvalue *op0 = ir->operands[0], *op2 = ir->operands[2];
892 ir_constant *one = new(ir) ir_constant(1.0, op2->type->vector_elements);
904 ir->operation = ir_triop_fma;
905 ir->init_num_operands();
906 ir->operands[0] = swizzle(op2, swizval, op0->type->vector_elements);
907 ir->operands[2] = mul(sub(one, op2->clone(ir, NULL)), op0);
913 lower_instructions_visitor::dceil_to_dfrac(ir_expression *ir)
921 ir_constant *zero = new(ir) ir_constant(0.0, ir->operands[0]->type->vector_elements);
922 ir_constant *one = new(ir) ir_constant(1.0, ir->operands[0]->type->vector_elements);
923 ir_variable *frtemp = new(ir) ir_variable(ir->operands[0]->type, "frtemp",
927 i.insert_before(assign(frtemp, fract(ir->operands[0])));
929 ir->operation = ir_binop_add;
930 ir->init_num_operands();
931 ir->operands[0] = sub(ir->operands[0]->clone(ir, NULL), frtemp);
932 ir->operands[1] = csel(nequal(frtemp, zero), one, zero->clone(ir, NULL));
938 lower_instructions_visitor::dfloor_to_dfrac(ir_expression *ir)
944 ir->operation = ir_binop_sub;
945 ir->init_num_operands();
946 ir->operands[1] = fract(ir->operands[0]->clone(ir, NULL));
951 lower_instructions_visitor::dround_even_to_dfrac(ir_expression *ir)
965 ir_variable *frtemp = new(ir) ir_variable(ir->operands[0]->type, "frtemp",
967 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type, "temp",
969 ir_variable *t2 = new(ir) ir_variable(ir->operands[0]->type, "t2",
971 ir_constant *p5 = new(ir) ir_constant(0.5, ir->operands[0]->type->vector_elements);
972 ir_constant *one = new(ir) ir_constant(1.0, ir->operands[0]->type->vector_elements);
973 ir_constant *zero = new(ir) ir_constant(0.0, ir->operands[0]->type->vector_elements);
976 i.insert_before(assign(temp, add(ir->operands[0], p5)));
984 ir->operation = ir_triop_csel;
985 ir->init_num_operands();
986 ir->operands[0] = equal(fract(ir->operands[0]->clone(ir, NULL)),
987 p5->clone(ir, NULL));
988 ir->operands[1] = csel(equal(fract(mul(t2, p5->clone(ir, NULL))),
992 ir->operands[2] = new(ir) ir_dereference_variable(t2);
998 lower_instructions_visitor::dtrunc_to_dfrac(ir_expression *ir)
1005 ir_rvalue *arg = ir->operands[0];
1008 ir_constant *zero = new(ir) ir_constant(0.0, arg->type->vector_elements);
1009 ir_constant *one = new(ir) ir_constant(1.0, arg->type->vector_elements);
1010 ir_variable *frtemp = new(ir) ir_variable(arg->type, "frtemp",
1012 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type, "temp",
1018 i.insert_before(assign(temp, sub(arg->clone(ir, NULL), frtemp)));
1020 ir->operation = ir_triop_csel;
1021 ir->init_num_operands();
1022 ir->operands[0] = gequal(arg->clone(ir, NULL), zero);
1023 ir->operands[1] = new (ir) ir_dereference_variable(temp);
1024 ir->operands[2] = add(temp,
1025 csel(equal(frtemp, zero->clone(ir, NULL)),
1026 zero->clone(ir, NULL),
1033 lower_instructions_visitor::dsign_to_csel(ir_expression *ir)
1039 ir_rvalue *arg = ir->operands[0];
1040 ir_constant *zero = new(ir) ir_constant(0.0, arg->type->vector_elements);
1041 ir_constant *one = new(ir) ir_constant(1.0, arg->type->vector_elements);
1042 ir_constant *neg_one = new(ir) ir_constant(-1.0, arg->type->vector_elements);
1044 ir->operation = ir_triop_csel;
1045 ir->init_num_operands();
1046 ir->operands[0] = less(arg->clone(ir, NULL),
1047 zero->clone(ir, NULL));
1048 ir->operands[1] = neg_one;
1049 ir->operands[2] = csel(greater(arg, zero),
1051 zero->clone(ir, NULL));
1057 lower_instructions_visitor::bit_count_to_math(ir_expression *ir)
1063 const unsigned elements = ir->operands[0]->type->vector_elements;
1064 ir_variable *temp = new(ir) ir_variable(glsl_type::uvec(elements), "temp",
1066 ir_constant *c55555555 = new(ir) ir_constant(0x55555555u);
1067 ir_constant *c33333333 = new(ir) ir_constant(0x33333333u);
1068 ir_constant *c0F0F0F0F = new(ir) ir_constant(0x0F0F0F0Fu);
1069 ir_constant *c01010101 = new(ir) ir_constant(0x01010101u);
1070 ir_constant *c1 = new(ir) ir_constant(1u);
1071 ir_constant *c2 = new(ir) ir_constant(2u);
1072 ir_constant *c4 = new(ir) ir_constant(4u);
1073 ir_constant *c24 = new(ir) ir_constant(24u);
1077 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1078 base_ir->insert_before(assign(temp, ir->operands[0]));
1080 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1081 base_ir->insert_before(assign(temp, i2u(ir->operands[0])));
1091 c33333333->clone(ir, NULL)))));
1094 ir->operation = ir_unop_u2i;
1095 ir->init_num_operands();
1096 ir->operands[0] = rshift(mul(bit_and(add(temp, rshift(temp, c4)), c0F0F0F0F),
1104 lower_instructions_visitor::extract_to_shifts(ir_expression *ir)
1107 new(ir) ir_variable(ir->operands[0]->type, "bits", ir_var_temporary);
1110 base_ir->insert_before(assign(bits, ir->operands[2]));
1112 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1114 new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1116 new(ir) ir_constant(32u, ir->operands[0]->type->vector_elements);
1118 new(ir) ir_constant(0xFFFFFFFFu, ir->operands[0]->type->vector_elements);
1127 sub(lshift(c1, bits), c1->clone(ir, NULL)));
1138 ir->operation = ir_binop_bit_and;
1139 ir->init_num_operands();
1140 ir->operands[0] = rshift(ir->operands[0], ir->operands[1]);
1141 ir->operands[1] = mask;
1142 ir->operands[2] = NULL;
1145 new(ir) ir_constant(int(0), ir->operands[0]->type->vector_elements);
1147 new(ir) ir_constant(int(32), ir->operands[0]->type->vector_elements);
1149 new(ir) ir_variable(ir->operands[0]->type, "temp", ir_var_temporary);
1157 rshift(lshift(ir->operands[0], sub(temp, ir->operands[1])), temp);
1169 ir->operation = ir_triop_csel;
1170 ir->init_num_operands();
1171 ir->operands[0] = equal(c0, bits);
1172 ir->operands[1] = c0->clone(ir, NULL);
1173 ir->operands[2] = expr;
1180 lower_instructions_visitor::insert_to_shifts(ir_expression *ir)
1186 new(ir) ir_variable(ir->operands[0]->type, "offset", ir_var_temporary);
1188 new(ir) ir_variable(ir->operands[0]->type, "bits", ir_var_temporary);
1190 new(ir) ir_variable(ir->operands[0]->type, "mask", ir_var_temporary);
1192 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT) {
1193 c1 = new(ir) ir_constant(int(1), ir->operands[0]->type->vector_elements);
1194 c32 = new(ir) ir_constant(int(32), ir->operands[0]->type->vector_elements);
1195 cFFFFFFFF = new(ir) ir_constant(int(0xFFFFFFFF), ir->operands[0]->type->vector_elements);
1197 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1199 c1 = new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1200 c32 = new(ir) ir_constant(32u, ir->operands[0]->type->vector_elements);
1201 cFFFFFFFF = new(ir) ir_constant(0xFFFFFFFFu, ir->operands[0]->type->vector_elements);
1205 base_ir->insert_before(assign(offset, ir->operands[2]));
1208 base_ir->insert_before(assign(bits, ir->operands[3]));
1232 c1->clone(ir, NULL)),
1236 ir->operation = ir_binop_bit_or;
1237 ir->init_num_operands();
1238 ir->operands[0] = bit_and(ir->operands[0], bit_not(mask));
1239 ir->operands[1] = bit_and(lshift(ir->operands[1], offset), mask);
1240 ir->operands[2] = NULL;
1241 ir->operands[3] = NULL;
1247 lower_instructions_visitor::reverse_to_shifts(ir_expression *ir)
1254 new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1256 new(ir) ir_constant(2u, ir->operands[0]->type->vector_elements);
1258 new(ir) ir_constant(4u, ir->operands[0]->type->vector_elements);
1260 new(ir) ir_constant(8u, ir->operands[0]->type->vector_elements);
1262 new(ir) ir_constant(16u, ir->operands[0]->type->vector_elements);
1264 new(ir) ir_constant(0x33333333u, ir->operands[0]->type->vector_elements);
1266 new(ir) ir_constant(0x55555555u, ir->operands[0]->type->vector_elements);
1268 new(ir) ir_constant(0x0F0F0F0Fu, ir->operands[0]->type->vector_elements);
1270 new(ir) ir_constant(0x00FF00FFu, ir->operands[0]->type->vector_elements);
1272 new(ir) ir_variable(glsl_type::uvec(ir->operands[0]->type->vector_elements),
1278 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1279 i.insert_before(assign(temp, ir->operands[0]));
1281 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1282 i.insert_before(assign(temp, i2u(ir->operands[0])));
1290 lshift(bit_and(temp, c55555555->clone(ir, NULL)),
1291 c1->clone(ir, NULL)))));
1297 lshift(bit_and(temp, c33333333->clone(ir, NULL)),
1298 c2->clone(ir, NULL)))));
1305 lshift(bit_and(temp, c0F0F0F0F->clone(ir, NULL)),
1306 c4->clone(ir, NULL)))));
1316 lshift(bit_and(temp, c00FF00FF->clone(ir, NULL)),
1317 c8->clone(ir, NULL)))));
1319 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1320 ir->operation = ir_binop_bit_or;
1321 ir->init_num_operands();
1322 ir->operands[0] = rshift(temp, c16);
1323 ir->operands[1] = lshift(temp, c16->clone(ir, NULL));
1325 ir->operation = ir_unop_u2i;
1326 ir->init_num_operands();
1327 ir->operands[0] = bit_or(rshift(temp, c16),
1328 lshift(temp, c16->clone(ir, NULL)));
1335 lower_instructions_visitor::find_lsb_to_float_cast(ir_expression *ir)
1341 const unsigned elements = ir->operands[0]->type->vector_elements;
1342 ir_constant *c0 = new(ir) ir_constant(unsigned(0), elements);
1343 ir_constant *cminus1 = new(ir) ir_constant(int(-1), elements);
1344 ir_constant *c23 = new(ir) ir_constant(int(23), elements);
1345 ir_constant *c7F = new(ir) ir_constant(int(0x7F), elements);
1347 new(ir) ir_variable(glsl_type::ivec(elements), "temp", ir_var_temporary);
1349 new(ir) ir_variable(glsl_type::uvec(elements), "lsb_only", ir_var_temporary);
1351 new(ir) ir_variable(glsl_type::vec(elements), "as_float", ir_var_temporary);
1353 new(ir) ir_variable(glsl_type::ivec(elements), "lsb", ir_var_temporary);
1359 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT) {
1360 i.insert_before(assign(temp, ir->operands[0]));
1362 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1363 i.insert_before(assign(temp, u2i(ir->operands[0])));
1406 ir->operation = ir_triop_csel;
1407 ir->init_num_operands();
1408 ir->operands[0] = equal(lsb_only, c0);
1409 ir->operands[1] = cminus1;
1410 ir->operands[2] = new(ir) ir_dereference_variable(lsb);
1416 lower_instructions_visitor::find_msb_to_float_cast(ir_expression *ir)
1422 const unsigned elements = ir->operands[0]->type->vector_elements;
1423 ir_constant *c0 = new(ir) ir_constant(int(0), elements);
1424 ir_constant *cminus1 = new(ir) ir_constant(int(-1), elements);
1425 ir_constant *c23 = new(ir) ir_constant(int(23), elements);
1426 ir_constant *c7F = new(ir) ir_constant(int(0x7F), elements);
1427 ir_constant *c000000FF = new(ir) ir_constant(0x000000FFu, elements);
1428 ir_constant *cFFFFFF00 = new(ir) ir_constant(0xFFFFFF00u, elements);
1430 new(ir) ir_variable(glsl_type::uvec(elements), "temp", ir_var_temporary);
1432 new(ir) ir_variable(glsl_type::vec(elements), "as_float", ir_var_temporary);
1434 new(ir) ir_variable(glsl_type::ivec(elements), "msb", ir_var_temporary);
1440 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1441 i.insert_before(assign(temp, ir->operands[0]));
1443 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1462 new(ir) ir_variable(glsl_type::ivec(elements), "as_int", ir_var_temporary);
1463 ir_constant *c31 = new(ir) ir_constant(int(31), elements);
1466 i.insert_before(assign(as_int, ir->operands[0]));
1507 ir->operation = ir_triop_csel;
1508 ir->init_num_operands();
1509 ir->operands[0] = less(msb, c0);
1510 ir->operands[1] = cminus1;
1511 ir->operands[2] = new(ir) ir_dereference_variable(msb);
1546 lower_instructions_visitor::imul_high_to_mul(ir_expression *ir)
1571 const unsigned elements = ir->operands[0]->type->vector_elements;
1573 new(ir) ir_variable(glsl_type::uvec(elements), "src1", ir_var_temporary);
1575 new(ir) ir_variable(glsl_type::uvec(elements), "src1h", ir_var_temporary);
1577 new(ir) ir_variable(glsl_type::uvec(elements), "src1l", ir_var_temporary);
1579 new(ir) ir_variable(glsl_type::uvec(elements), "src2", ir_var_temporary);
1581 new(ir) ir_variable(glsl_type::uvec(elements), "src2h", ir_var_temporary);
1583 new(ir) ir_variable(glsl_type::uvec(elements), "src2l", ir_var_temporary);
1585 new(ir) ir_variable(glsl_type::uvec(elements), "t1", ir_var_temporary);
1587 new(ir) ir_variable(glsl_type::uvec(elements), "t2", ir_var_temporary);
1589 new(ir) ir_variable(glsl_type::uvec(elements), "lo", ir_var_temporary);
1591 new(ir) ir_variable(glsl_type::uvec(elements), "hi", ir_var_temporary);
1593 ir_constant *c0000FFFF = new(ir) ir_constant(0x0000FFFFu, elements);
1594 ir_constant *c16 = new(ir) ir_constant(16u, elements);
1605 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1606 i.insert_before(assign(src1, ir->operands[0]));
1607 i.insert_before(assign(src2, ir->operands[1]));
1609 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1612 new(ir) ir_variable(glsl_type::ivec(elements), "itmp1", ir_var_temporary);
1614 new(ir) ir_variable(glsl_type::ivec(elements), "itmp2", ir_var_temporary);
1615 ir_constant *c0 = new(ir) ir_constant(int(0), elements);
1619 i.insert_before(assign(itmp1, ir->operands[0]));
1620 i.insert_before(assign(itmp2, ir->operands[1]));
1623 new(ir) ir_variable(glsl_type::bvec(elements), "different_signs",
1629 less(itmp2, c0->clone(ir, NULL)))));
1636 i.insert_before(assign(src2l, bit_and(src2, c0000FFFF->clone(ir, NULL))));
1638 i.insert_before(assign(src2h, rshift(src2, c16->clone(ir, NULL))));
1650 i.insert_before(assign(hi, add(hi, _carry(lo, lshift(t1, c16->clone(ir, NULL))))));
1651 i.insert_before(assign(lo, add(lo, lshift(t1, c16->clone(ir, NULL)))));
1653 i.insert_before(assign(hi, add(hi, _carry(lo, lshift(t2, c16->clone(ir, NULL))))));
1654 i.insert_before(assign(lo, add(lo, lshift(t2, c16->clone(ir, NULL)))));
1657 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1659 ir->operation = ir_binop_add;
1660 ir->init_num_operands();
1661 ir->operands[0] = add(hi, rshift(t1, c16->clone(ir, NULL)));
1662 ir->operands[1] = rshift(t2, c16->clone(ir, NULL));
1664 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1666 i.insert_before(assign(hi, add(add(hi, rshift(t1, c16->clone(ir, NULL))),
1667 rshift(t2, c16->clone(ir, NULL)))));
1675 new(ir) ir_variable(glsl_type::ivec(elements), "neg_hi", ir_var_temporary);
1676 ir_constant *c1 = new(ir) ir_constant(1u, elements);
1682 ir->operation = ir_triop_csel;
1683 ir->init_num_operands();
1684 ir->operands[0] = new(ir) ir_dereference_variable(different_signs);
1685 ir->operands[1] = new(ir) ir_dereference_variable(neg_hi);
1686 ir->operands[2] = u2i(hi);
1691 lower_instructions_visitor::sqrt_to_abs_sqrt(ir_expression *ir)
1693 ir->operands[0] = new(ir) ir_expression(ir_unop_abs, ir->operands[0]);
1698 lower_instructions_visitor::mul64_to_mul_and_mul_high(ir_expression *ir)
1704 const unsigned elements = ir->operands[0]->type->vector_elements;
1707 ir->type->base_type == GLSL_TYPE_UINT64 ? ir_unop_pack_uint_2x32
1710 const glsl_type *var_type = ir->type->base_type == GLSL_TYPE_UINT64
1714 const glsl_type *ret_type = ir->type->base_type == GLSL_TYPE_UINT64
1721 new(ir) ir_variable(var_type, "msb", ir_var_temporary);
1723 new(ir) ir_variable(var_type, "lsb", ir_var_temporary);
1725 new(ir) ir_variable(var_type, "x", ir_var_temporary);
1727 new(ir) ir_variable(var_type, "y", ir_var_temporary);
1730 i.insert_before(assign(x, ir->operands[0]));
1732 i.insert_before(assign(y, ir->operands[1]));
1741 ir_rvalue *val = new(ir) ir_expression(ir_quadop_vector, ret_type,
1747 ir->operation = ir_quadop_vector;
1748 ir->init_num_operands();
1749 ir->operands[0] = result[0];
1750 ir->operands[1] = result[1];
1751 ir->operands[2] = result[2];
1752 ir->operands[3] = result[3];
1758 lower_instructions_visitor::visit_leave(ir_expression *ir)
1760 switch (ir->operation) {
1762 if (ir->operands[0]->type->is_double())
1763 double_dot_to_fma(ir);
1766 if (ir->operands[0]->type->is_double())
1767 double_lrp(ir);
1771 sub_to_add_neg(ir);
1775 if (ir->operands[1]->type->is_integer_32() && lowering(INT_DIV_TO_MUL_RCP))
1776 int_div_to_mul_rcp(ir);
1777 else if ((ir->operands[1]->type->is_float_16_32() && lowering(FDIV_TO_MUL_RCP)) ||
1778 (ir->operands[1]->type->is_double() && lowering(DDIV_TO_MUL_RCP)))
1779 div_to_mul_rcp(ir);
1784 exp_to_exp2(ir);
1789 log_to_log2(ir);
1793 if (lowering(MOD_TO_FLOOR) && ir->type->is_float_16_32_64())
1794 mod_to_floor(ir);
1799 pow_to_exp2(ir);
1803 if (lowering(LDEXP_TO_ARITH) && ir->type->is_float())
1804 ldexp_to_arith(ir);
1805 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->type->is_double())
1806 dldexp_to_arith(ir);
1810 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->operands[0]->type->is_double())
1811 dfrexp_exp_to_arith(ir);
1815 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->operands[0]->type->is_double())
1816 dfrexp_sig_to_arith(ir);
1821 carry_to_arith(ir);
1826 borrow_to_arith(ir);
1831 sat_to_clamp(ir);
1835 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1836 dtrunc_to_dfrac(ir);
1840 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1841 dceil_to_dfrac(ir);
1845 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1846 dfloor_to_dfrac(ir);
1850 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1851 dround_even_to_dfrac(ir);
1855 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1856 dsign_to_csel(ir);
1861 bit_count_to_math(ir);
1866 extract_to_shifts(ir);
1871 insert_to_shifts(ir);
1876 reverse_to_shifts(ir);
1881 find_lsb_to_float_cast(ir);
1886 find_msb_to_float_cast(ir);
1891 imul_high_to_mul(ir);
1896 (ir->type->base_type == GLSL_TYPE_INT64 ||
1897 ir->type->base_type == GLSL_TYPE_UINT64) &&
1898 (ir->operands[0]->type->base_type == GLSL_TYPE_INT ||
1899 ir->operands[1]->type->base_type == GLSL_TYPE_UINT))
1900 mul64_to_mul_and_mul_high(ir);
1906 sqrt_to_abs_sqrt(ir);