Lines Matching refs:ir

123 #include "ir.h"
167 void reverse_to_shifts(ir_expression *ir);
168 void find_lsb_to_float_cast(ir_expression *ir);
169 void find_msb_to_float_cast(ir_expression *ir);
170 void imul_high_to_mul(ir_expression *ir);
171 void sqrt_to_abs_sqrt(ir_expression *ir);
172 void mul64_to_mul_and_mul_high(ir_expression *ir);
194 lower_instructions_visitor::sub_to_add_neg(ir_expression *ir)
196 ir->operation = ir_binop_add;
197 ir->init_num_operands();
198 ir->operands[1] = new(ir) ir_expression(ir_unop_neg, ir->operands[1]->type,
199 ir->operands[1], NULL);
204 lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir)
206 assert(ir->operands[1]->type->is_float() || ir->operands[1]->type->is_double());
210 expr = new(ir) ir_expression(ir_unop_rcp,
211 ir->operands[1]->type,
212 ir->operands[1]);
215 ir->operation = ir_binop_mul;
216 ir->init_num_operands();
217 ir->operands[1] = expr;
223 lower_instructions_visitor::int_div_to_mul_rcp(ir_expression *ir)
225 assert(ir->operands[1]->type->is_integer());
235 ir->operands[1]->type->vector_elements,
236 ir->operands[1]->type->matrix_columns);
238 if (ir->operands[1]->type->base_type == GLSL_TYPE_INT)
239 op1 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[1], NULL);
241 op1 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[1], NULL);
243 op1 = new(ir) ir_expression(ir_unop_rcp, op1->type, op1, NULL);
246 ir->operands[0]->type->vector_elements,
247 ir->operands[0]->type->matrix_columns);
249 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT)
250 op0 = new(ir) ir_expression(ir_unop_i2f, vec_type, ir->operands[0], NULL);
252 op0 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[0], NULL);
255 ir->type->vector_elements,
256 ir->type->matrix_columns);
258 op0 = new(ir) ir_expression(ir_binop_mul, vec_type, op0, op1);
260 if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) {
261 ir->operation = ir_unop_f2i;
262 ir->operands[0] = op0;
264 ir->operation = ir_unop_i2u;
265 ir->operands[0] = new(ir) ir_expression(ir_unop_f2i, op0);
267 ir->init_num_operands();
268 ir->operands[1] = NULL;
274 lower_instructions_visitor::exp_to_exp2(ir_expression *ir)
276 ir_constant *log2_e = new(ir) ir_constant(float(M_LOG2E));
278 ir->operation = ir_unop_exp2;
279 ir->init_num_operands();
280 ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[0]->type,
281 ir->operands[0], log2_e);
286 lower_instructions_visitor::pow_to_exp2(ir_expression *ir)
289 new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type,
290 ir->operands[0]);
292 ir->operation = ir_unop_exp2;
293 ir->init_num_operands();
294 ir->operands[0] = new(ir) ir_expression(ir_binop_mul, ir->operands[1]->type,
295 ir->operands[1], log2_x);
296 ir->operands[1] = NULL;
301 lower_instructions_visitor::log_to_log2(ir_expression *ir)
303 ir->operation = ir_binop_mul;
304 ir->init_num_operands();
305 ir->operands[0] = new(ir) ir_expression(ir_unop_log2, ir->operands[0]->type,
306 ir->operands[0], NULL);
307 ir->operands[1] = new(ir) ir_constant(float(1.0 / M_LOG2E));
312 lower_instructions_visitor::mod_to_floor(ir_expression *ir)
314 ir_variable *x = new(ir) ir_variable(ir->operands[0]->type, "mod_x",
316 ir_variable *y = new(ir) ir_variable(ir->operands[1]->type, "mod_y",
322 new(ir) ir_assignment(new(ir) ir_dereference_variable(x),
323 ir->operands[0]);
325 new(ir) ir_assignment(new(ir) ir_dereference_variable(y),
326 ir->operands[1]);
332 new(ir) ir_expression(ir_binop_div, x->type,
333 new(ir) ir_dereference_variable(x),
334 new(ir) ir_dereference_variable(y));
339 if ((lowering(FDIV_TO_MUL_RCP) && ir->type->is_float()) ||
340 (lowering(DDIV_TO_MUL_RCP) && ir->type->is_double()))
344 new(ir) ir_expression(ir_unop_floor, x->type, div_expr);
346 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
350 new(ir) ir_expression(ir_binop_mul,
351 new(ir) ir_dereference_variable(y),
354 ir->operation = ir_binop_sub;
355 ir->init_num_operands();
356 ir->operands[0] = new(ir) ir_dereference_variable(x);
357 ir->operands[1] = mul_expr;
362 lower_instructions_visitor::ldexp_to_arith(ir_expression *ir)
419 const unsigned vec_elem = ir->type->vector_elements;
427 ir_variable *x = new(ir) ir_variable(ir->type, "x", ir_var_temporary);
428 ir_variable *exp = new(ir) ir_variable(ivec, "exp", ir_var_temporary);
429 ir_variable *result = new(ir) ir_variable(uvec, "result", ir_var_temporary);
432 new(ir) ir_variable(ivec, "extracted_biased_exp", ir_var_temporary);
434 new(ir) ir_variable(ivec, "resulting_biased_exp", ir_var_temporary);
437 new(ir) ir_variable(uvec, "sign_mantissa", ir_var_temporary);
440 new(ir) ir_variable(bvec, "flush_to_zero", ir_var_temporary);
442 new(ir) ir_variable(bvec, "zero_mantissa", ir_var_temporary);
448 i.insert_before(assign(x, ir->operands[0]));
450 i.insert_before(assign(exp, ir->operands[1]));
456 new(ir) ir_constant(23, vec_elem))));
472 new(ir) ir_constant(255, vec_elem))));
477 new(ir) ir_constant(0x807fffffu, vec_elem))));
491 ir_constant::zero(ir, ivec))));
494 ir_constant::zero(ir, ivec),
501 new(ir) ir_constant(255, vec_elem)))));
505 new(ir) ir_constant(0x80000000u, vec_elem)),
516 new(ir) ir_constant(23u, vec_elem),
517 new(ir) ir_constant(8u, vec_elem))));
522 new(ir) ir_constant(23, vec_elem)))));
525 ir->operation = ir_triop_csel;
526 ir->init_num_operands();
527 ir->operands[0] = gequal(extracted_biased_exp,
528 new(ir) ir_constant(255, vec_elem));
529 ir->operands[1] = new(ir) ir_dereference_variable(x);
530 ir->operands[2] = bitcast_u2f(result);
536 lower_instructions_visitor::dldexp_to_arith(ir_expression *ir)
542 const unsigned vec_elem = ir->type->vector_elements;
549 ir_constant *zeroi = ir_constant::zero(ir, ivec);
551 ir_constant *sign_mask = new(ir) ir_constant(0x80000000u);
553 ir_constant *exp_shift = new(ir) ir_constant(20u);
554 ir_constant *exp_width = new(ir) ir_constant(11u);
555 ir_constant *exp_bias = new(ir) ir_constant(1022, vec_elem);
558 ir_variable *x = new(ir) ir_variable(ir->type, "x", ir_var_temporary);
559 ir_variable *exp = new(ir) ir_variable(ivec, "exp", ir_var_temporary);
561 ir_variable *zero_sign_x = new(ir) ir_variable(ir->type, "zero_sign_x",
565 new(ir) ir_variable(ivec, "extracted_biased_exp", ir_var_temporary);
567 new(ir) ir_variable(ivec, "resulting_biased_exp", ir_var_temporary);
570 new(ir) ir_variable(bvec, "is_not_zero_or_underflow", ir_var_temporary);
576 i.insert_before(assign(x, ir->operands[0]));
578 i.insert_before(assign(exp, ir->operands[1]));
601 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
606 i.insert_before(assign(unpacked, bit_and(swizzle_y(unpacked), sign_mask->clone(ir, NULL)),
608 i.insert_before(assign(unpacked, ir_constant::zero(ir, glsl_type::uint_type), WRITEMASK_X));
616 new(ir) ir_constant(0x1, vec_elem))));
634 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
643 exp_shift->clone(ir, NULL),
644 exp_width->clone(ir, NULL));
651 ir->operation = ir_quadop_vector;
652 ir->init_num_operands();
653 ir->operands[0] = results[0];
654 ir->operands[1] = results[1];
655 ir->operands[2] = results[2];
656 ir->operands[3] = results[3];
666 lower_instructions_visitor::dfrexp_sig_to_arith(ir_expression *ir)
668 const unsigned vec_elem = ir->type->vector_elements;
684 new(ir) ir_variable(bvec, "is_not_zero", ir_var_temporary);
687 ir_constant *dzero = new(ir) ir_constant(0.0, vec_elem);
691 nequal(abs(ir->operands[0]->clone(ir, NULL)), dzero)));
697 ir_constant *zero = new(ir) ir_constant(0u, 1);
698 ir_constant *sign_mantissa_mask = new(ir) ir_constant(0x800fffffu, 1);
701 ir_constant *exponent_value = new(ir) ir_constant(0x3fe00000u, 1);
704 new(ir) ir_variable(glsl_type::uint_type, "bits", ir_var_temporary);
706 new(ir) ir_variable(glsl_type::uvec2_type, "unpacked", ir_var_temporary);
708 ir_rvalue *x = swizzle(ir->operands[0]->clone(ir, NULL), elem, 1);
728 ir->operation = ir_quadop_vector;
729 ir->init_num_operands();
730 ir->operands[0] = results[0];
731 ir->operands[1] = results[1];
732 ir->operands[2] = results[2];
733 ir->operands[3] = results[3];
739 lower_instructions_visitor::dfrexp_exp_to_arith(ir_expression *ir)
741 const unsigned vec_elem = ir->type->vector_elements;
757 new(ir) ir_variable(bvec, "is_not_zero", ir_var_temporary);
759 new(ir) ir_variable(uvec, "high_words", ir_var_temporary);
760 ir_constant *dzero = new(ir) ir_constant(0.0, vec_elem);
761 ir_constant *izero = new(ir) ir_constant(0, vec_elem);
763 ir_rvalue *absval = abs(ir->operands[0]);
767 i.insert_before(assign(is_not_zero, nequal(absval->clone(ir, NULL), dzero)));
771 ir_rvalue *x = swizzle(absval->clone(ir, NULL), elem, 1);
778 ir_constant *exponent_shift = new(ir) ir_constant(20, vec_elem);
779 ir_constant *exponent_bias = new(ir) ir_constant(-1022, vec_elem);
782 ir->operation = ir_triop_csel;
783 ir->init_num_operands();
784 ir->operands[0] = new(ir) ir_dereference_variable(is_not_zero);
785 ir->operands[1] = add(exponent_bias, u2i(rshift(high_words, exponent_shift)));
786 ir->operands[2] = izero;
792 lower_instructions_visitor::carry_to_arith(ir_expression *ir)
802 ir_rvalue *x_clone = ir->operands[0]->clone(ir, NULL);
803 ir->operation = ir_unop_i2u;
804 ir->init_num_operands();
805 ir->operands[0] = b2i(less(add(ir->operands[0], ir->operands[1]), x_clone));
806 ir->operands[1] = NULL;
812 lower_instructions_visitor::borrow_to_arith(ir_expression *ir)
821 ir->operation = ir_unop_i2u;
822 ir->init_num_operands();
823 ir->operands[0] = b2i(less(ir->operands[0], ir->operands[1]));
824 ir->operands[1] = NULL;
830 lower_instructions_visitor::sat_to_clamp(ir_expression *ir)
838 ir->operation = ir_binop_min;
839 ir->init_num_operands();
840 ir->operands[0] = new(ir) ir_expression(ir_binop_max, ir->operands[0]->type,
841 ir->operands[0],
842 new(ir) ir_constant(0.0f));
843 ir->operands[1] = new(ir) ir_constant(1.0f);
849 lower_instructions_visitor::double_dot_to_fma(ir_expression *ir)
851 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type->get_base_type(), "dot_res",
855 int nc = ir->operands[0]->type->components();
859 assig = assign(temp, mul(swizzle(ir->operands[0]->clone(ir, NULL), i, 1),
860 swizzle(ir->operands[1]->clone(ir, NULL), i, 1)));
862 assig = assign(temp, fma(swizzle(ir->operands[0]->clone(ir, NULL), i, 1),
863 swizzle(ir->operands[1]->clone(ir, NULL), i, 1),
869 ir->operation = ir_triop_fma;
870 ir->init_num_operands();
871 ir->operands[0] = swizzle(ir->operands[0], 0, 1);
872 ir->operands[1] = swizzle(ir->operands[1], 0, 1);
873 ir->operands[2] = new(ir) ir_dereference_variable(temp);
880 lower_instructions_visitor::double_lrp(ir_expression *ir)
883 ir_rvalue *op0 = ir->operands[0], *op2 = ir->operands[2];
884 ir_constant *one = new(ir) ir_constant(1.0, op2->type->vector_elements);
896 ir->operation = ir_triop_fma;
897 ir->init_num_operands();
898 ir->operands[0] = swizzle(op2, swizval, op0->type->vector_elements);
899 ir->operands[2] = mul(sub(one, op2->clone(ir, NULL)), op0);
905 lower_instructions_visitor::dceil_to_dfrac(ir_expression *ir)
913 ir_constant *zero = new(ir) ir_constant(0.0, ir->operands[0]->type->vector_elements);
914 ir_constant *one = new(ir) ir_constant(1.0, ir->operands[0]->type->vector_elements);
915 ir_variable *frtemp = new(ir) ir_variable(ir->operands[0]->type, "frtemp",
919 i.insert_before(assign(frtemp, fract(ir->operands[0])));
921 ir->operation = ir_binop_add;
922 ir->init_num_operands();
923 ir->operands[0] = sub(ir->operands[0]->clone(ir, NULL), frtemp);
924 ir->operands[1] = csel(nequal(frtemp, zero), one, zero->clone(ir, NULL));
930 lower_instructions_visitor::dfloor_to_dfrac(ir_expression *ir)
936 ir->operation = ir_binop_sub;
937 ir->init_num_operands();
938 ir->operands[1] = fract(ir->operands[0]->clone(ir, NULL));
943 lower_instructions_visitor::dround_even_to_dfrac(ir_expression *ir)
957 ir_variable *frtemp = new(ir) ir_variable(ir->operands[0]->type, "frtemp",
959 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type, "temp",
961 ir_variable *t2 = new(ir) ir_variable(ir->operands[0]->type, "t2",
963 ir_constant *p5 = new(ir) ir_constant(0.5, ir->operands[0]->type->vector_elements);
964 ir_constant *one = new(ir) ir_constant(1.0, ir->operands[0]->type->vector_elements);
965 ir_constant *zero = new(ir) ir_constant(0.0, ir->operands[0]->type->vector_elements);
968 i.insert_before(assign(temp, add(ir->operands[0], p5)));
976 ir->operation = ir_triop_csel;
977 ir->init_num_operands();
978 ir->operands[0] = equal(fract(ir->operands[0]->clone(ir, NULL)),
979 p5->clone(ir, NULL));
980 ir->operands[1] = csel(equal(fract(mul(t2, p5->clone(ir, NULL))),
984 ir->operands[2] = new(ir) ir_dereference_variable(t2);
990 lower_instructions_visitor::dtrunc_to_dfrac(ir_expression *ir)
997 ir_rvalue *arg = ir->operands[0];
1000 ir_constant *zero = new(ir) ir_constant(0.0, arg->type->vector_elements);
1001 ir_constant *one = new(ir) ir_constant(1.0, arg->type->vector_elements);
1002 ir_variable *frtemp = new(ir) ir_variable(arg->type, "frtemp",
1004 ir_variable *temp = new(ir) ir_variable(ir->operands[0]->type, "temp",
1010 i.insert_before(assign(temp, sub(arg->clone(ir, NULL), frtemp)));
1012 ir->operation = ir_triop_csel;
1013 ir->init_num_operands();
1014 ir->operands[0] = gequal(arg->clone(ir, NULL), zero);
1015 ir->operands[1] = new (ir) ir_dereference_variable(temp);
1016 ir->operands[2] = add(temp,
1017 csel(equal(frtemp, zero->clone(ir, NULL)),
1018 zero->clone(ir, NULL),
1025 lower_instructions_visitor::dsign_to_csel(ir_expression *ir)
1031 ir_rvalue *arg = ir->operands[0];
1032 ir_constant *zero = new(ir) ir_constant(0.0, arg->type->vector_elements);
1033 ir_constant *one = new(ir) ir_constant(1.0, arg->type->vector_elements);
1034 ir_constant *neg_one = new(ir) ir_constant(-1.0, arg->type->vector_elements);
1036 ir->operation = ir_triop_csel;
1037 ir->init_num_operands();
1038 ir->operands[0] = less(arg->clone(ir, NULL),
1039 zero->clone(ir, NULL));
1040 ir->operands[1] = neg_one;
1041 ir->operands[2] = csel(greater(arg, zero),
1043 zero->clone(ir, NULL));
1049 lower_instructions_visitor::bit_count_to_math(ir_expression *ir)
1055 const unsigned elements = ir->operands[0]->type->vector_elements;
1056 ir_variable *temp = new(ir) ir_variable(glsl_type::uvec(elements), "temp",
1058 ir_constant *c55555555 = new(ir) ir_constant(0x55555555u);
1059 ir_constant *c33333333 = new(ir) ir_constant(0x33333333u);
1060 ir_constant *c0F0F0F0F = new(ir) ir_constant(0x0F0F0F0Fu);
1061 ir_constant *c01010101 = new(ir) ir_constant(0x01010101u);
1062 ir_constant *c1 = new(ir) ir_constant(1u);
1063 ir_constant *c2 = new(ir) ir_constant(2u);
1064 ir_constant *c4 = new(ir) ir_constant(4u);
1065 ir_constant *c24 = new(ir) ir_constant(24u);
1069 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1070 base_ir->insert_before(assign(temp, ir->operands[0]));
1072 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1073 base_ir->insert_before(assign(temp, i2u(ir->operands[0])));
1083 c33333333->clone(ir, NULL)))));
1086 ir->operation = ir_unop_u2i;
1087 ir->init_num_operands();
1088 ir->operands[0] = rshift(mul(bit_and(add(temp, rshift(temp, c4)), c0F0F0F0F),
1096 lower_instructions_visitor::extract_to_shifts(ir_expression *ir)
1099 new(ir) ir_variable(ir->operands[0]->type, "bits", ir_var_temporary);
1102 base_ir->insert_before(assign(bits, ir->operands[2]));
1104 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1106 new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1108 new(ir) ir_constant(32u, ir->operands[0]->type->vector_elements);
1110 new(ir) ir_constant(0xFFFFFFFFu, ir->operands[0]->type->vector_elements);
1119 sub(lshift(c1, bits), c1->clone(ir, NULL)));
1130 ir->operation = ir_binop_bit_and;
1131 ir->init_num_operands();
1132 ir->operands[0] = rshift(ir->operands[0], ir->operands[1]);
1133 ir->operands[1] = mask;
1134 ir->operands[2] = NULL;
1137 new(ir) ir_constant(int(0), ir->operands[0]->type->vector_elements);
1139 new(ir) ir_constant(int(32), ir->operands[0]->type->vector_elements);
1141 new(ir) ir_variable(ir->operands[0]->type, "temp", ir_var_temporary);
1149 rshift(lshift(ir->operands[0], sub(temp, ir->operands[1])), temp);
1161 ir->operation = ir_triop_csel;
1162 ir->init_num_operands();
1163 ir->operands[0] = equal(c0, bits);
1164 ir->operands[1] = c0->clone(ir, NULL);
1165 ir->operands[2] = expr;
1172 lower_instructions_visitor::insert_to_shifts(ir_expression *ir)
1178 new(ir) ir_variable(ir->operands[0]->type, "offset", ir_var_temporary);
1180 new(ir) ir_variable(ir->operands[0]->type, "bits", ir_var_temporary);
1182 new(ir) ir_variable(ir->operands[0]->type, "mask", ir_var_temporary);
1184 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT) {
1185 c1 = new(ir) ir_constant(int(1), ir->operands[0]->type->vector_elements);
1186 c32 = new(ir) ir_constant(int(32), ir->operands[0]->type->vector_elements);
1187 cFFFFFFFF = new(ir) ir_constant(int(0xFFFFFFFF), ir->operands[0]->type->vector_elements);
1189 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1191 c1 = new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1192 c32 = new(ir) ir_constant(32u, ir->operands[0]->type->vector_elements);
1193 cFFFFFFFF = new(ir) ir_constant(0xFFFFFFFFu, ir->operands[0]->type->vector_elements);
1197 base_ir->insert_before(assign(offset, ir->operands[2]));
1200 base_ir->insert_before(assign(bits, ir->operands[3]));
1224 c1->clone(ir, NULL)),
1228 ir->operation = ir_binop_bit_or;
1229 ir->init_num_operands();
1230 ir->operands[0] = bit_and(ir->operands[0], bit_not(mask));
1231 ir->operands[1] = bit_and(lshift(ir->operands[1], offset), mask);
1232 ir->operands[2] = NULL;
1233 ir->operands[3] = NULL;
1239 lower_instructions_visitor::reverse_to_shifts(ir_expression *ir)
1246 new(ir) ir_constant(1u, ir->operands[0]->type->vector_elements);
1248 new(ir) ir_constant(2u, ir->operands[0]->type->vector_elements);
1250 new(ir) ir_constant(4u, ir->operands[0]->type->vector_elements);
1252 new(ir) ir_constant(8u, ir->operands[0]->type->vector_elements);
1254 new(ir) ir_constant(16u, ir->operands[0]->type->vector_elements);
1256 new(ir) ir_constant(0x33333333u, ir->operands[0]->type->vector_elements);
1258 new(ir) ir_constant(0x55555555u, ir->operands[0]->type->vector_elements);
1260 new(ir) ir_constant(0x0F0F0F0Fu, ir->operands[0]->type->vector_elements);
1262 new(ir) ir_constant(0x00FF00FFu, ir->operands[0]->type->vector_elements);
1264 new(ir) ir_variable(glsl_type::uvec(ir->operands[0]->type->vector_elements),
1270 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1271 i.insert_before(assign(temp, ir->operands[0]));
1273 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1274 i.insert_before(assign(temp, i2u(ir->operands[0])));
1282 lshift(bit_and(temp, c55555555->clone(ir, NULL)),
1283 c1->clone(ir, NULL)))));
1289 lshift(bit_and(temp, c33333333->clone(ir, NULL)),
1290 c2->clone(ir, NULL)))));
1297 lshift(bit_and(temp, c0F0F0F0F->clone(ir, NULL)),
1298 c4->clone(ir, NULL)))));
1308 lshift(bit_and(temp, c00FF00FF->clone(ir, NULL)),
1309 c8->clone(ir, NULL)))));
1311 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1312 ir->operation = ir_binop_bit_or;
1313 ir->init_num_operands();
1314 ir->operands[0] = rshift(temp, c16);
1315 ir->operands[1] = lshift(temp, c16->clone(ir, NULL));
1317 ir->operation = ir_unop_u2i;
1318 ir->init_num_operands();
1319 ir->operands[0] = bit_or(rshift(temp, c16),
1320 lshift(temp, c16->clone(ir, NULL)));
1327 lower_instructions_visitor::find_lsb_to_float_cast(ir_expression *ir)
1333 const unsigned elements = ir->operands[0]->type->vector_elements;
1334 ir_constant *c0 = new(ir) ir_constant(unsigned(0), elements);
1335 ir_constant *cminus1 = new(ir) ir_constant(int(-1), elements);
1336 ir_constant *c23 = new(ir) ir_constant(int(23), elements);
1337 ir_constant *c7F = new(ir) ir_constant(int(0x7F), elements);
1339 new(ir) ir_variable(glsl_type::ivec(elements), "temp", ir_var_temporary);
1341 new(ir) ir_variable(glsl_type::uvec(elements), "lsb_only", ir_var_temporary);
1343 new(ir) ir_variable(glsl_type::vec(elements), "as_float", ir_var_temporary);
1345 new(ir) ir_variable(glsl_type::ivec(elements), "lsb", ir_var_temporary);
1351 if (ir->operands[0]->type->base_type == GLSL_TYPE_INT) {
1352 i.insert_before(assign(temp, ir->operands[0]));
1354 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1355 i.insert_before(assign(temp, u2i(ir->operands[0])));
1398 ir->operation = ir_triop_csel;
1399 ir->init_num_operands();
1400 ir->operands[0] = equal(lsb_only, c0);
1401 ir->operands[1] = cminus1;
1402 ir->operands[2] = new(ir) ir_dereference_variable(lsb);
1408 lower_instructions_visitor::find_msb_to_float_cast(ir_expression *ir)
1414 const unsigned elements = ir->operands[0]->type->vector_elements;
1415 ir_constant *c0 = new(ir) ir_constant(int(0), elements);
1416 ir_constant *cminus1 = new(ir) ir_constant(int(-1), elements);
1417 ir_constant *c23 = new(ir) ir_constant(int(23), elements);
1418 ir_constant *c7F = new(ir) ir_constant(int(0x7F), elements);
1419 ir_constant *c000000FF = new(ir) ir_constant(0x000000FFu, elements);
1420 ir_constant *cFFFFFF00 = new(ir) ir_constant(0xFFFFFF00u, elements);
1422 new(ir) ir_variable(glsl_type::uvec(elements), "temp", ir_var_temporary);
1424 new(ir) ir_variable(glsl_type::vec(elements), "as_float", ir_var_temporary);
1426 new(ir) ir_variable(glsl_type::ivec(elements), "msb", ir_var_temporary);
1432 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1433 i.insert_before(assign(temp, ir->operands[0]));
1435 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1454 new(ir) ir_variable(glsl_type::ivec(elements), "as_int", ir_var_temporary);
1455 ir_constant *c31 = new(ir) ir_constant(int(31), elements);
1458 i.insert_before(assign(as_int, ir->operands[0]));
1499 ir->operation = ir_triop_csel;
1500 ir->init_num_operands();
1501 ir->operands[0] = less(msb, c0);
1502 ir->operands[1] = cminus1;
1503 ir->operands[2] = new(ir) ir_dereference_variable(msb);
1519 lower_instructions_visitor::imul_high_to_mul(ir_expression *ir)
1544 const unsigned elements = ir->operands[0]->type->vector_elements;
1546 new(ir) ir_variable(glsl_type::uvec(elements), "src1", ir_var_temporary);
1548 new(ir) ir_variable(glsl_type::uvec(elements), "src1h", ir_var_temporary);
1550 new(ir) ir_variable(glsl_type::uvec(elements), "src1l", ir_var_temporary);
1552 new(ir) ir_variable(glsl_type::uvec(elements), "src2", ir_var_temporary);
1554 new(ir) ir_variable(glsl_type::uvec(elements), "src2h", ir_var_temporary);
1556 new(ir) ir_variable(glsl_type::uvec(elements), "src2l", ir_var_temporary);
1558 new(ir) ir_variable(glsl_type::uvec(elements), "t1", ir_var_temporary);
1560 new(ir) ir_variable(glsl_type::uvec(elements), "t2", ir_var_temporary);
1562 new(ir) ir_variable(glsl_type::uvec(elements), "lo", ir_var_temporary);
1564 new(ir) ir_variable(glsl_type::uvec(elements), "hi", ir_var_temporary);
1566 ir_constant *c0000FFFF = new(ir) ir_constant(0x0000FFFFu, elements);
1567 ir_constant *c16 = new(ir) ir_constant(16u, elements);
1578 if (ir->operands[0]->type->base_type == GLSL_TYPE_UINT) {
1579 i.insert_before(assign(src1, ir->operands[0]));
1580 i.insert_before(assign(src2, ir->operands[1]));
1582 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1585 new(ir) ir_variable(glsl_type::ivec(elements), "itmp1", ir_var_temporary);
1587 new(ir) ir_variable(glsl_type::ivec(elements), "itmp2", ir_var_temporary);
1588 ir_constant *c0 = new(ir) ir_constant(int(0), elements);
1592 i.insert_before(assign(itmp1, ir->operands[0]));
1593 i.insert_before(assign(itmp2, ir->operands[1]));
1596 new(ir) ir_variable(glsl_type::bvec(elements), "different_signs",
1602 less(itmp2, c0->clone(ir, NULL)))));
1609 i.insert_before(assign(src2l, bit_and(src2, c0000FFFF->clone(ir, NULL))));
1611 i.insert_before(assign(src2h, rshift(src2, c16->clone(ir, NULL))));
1623 i.insert_before(assign(hi, add(hi, _carry(lo, lshift(t1, c16->clone(ir, NULL))))));
1624 i.insert_before(assign(lo, add(lo, lshift(t1, c16->clone(ir, NULL)))));
1626 i.insert_before(assign(hi, add(hi, _carry(lo, lshift(t2, c16->clone(ir, NULL))))));
1627 i.insert_before(assign(lo, add(lo, lshift(t2, c16->clone(ir, NULL)))));
1630 assert(ir->operands[0]->type->base_type == GLSL_TYPE_UINT);
1632 ir->operation = ir_binop_add;
1633 ir->init_num_operands();
1634 ir->operands[0] = add(hi, rshift(t1, c16->clone(ir, NULL)));
1635 ir->operands[1] = rshift(t2, c16->clone(ir, NULL));
1637 assert(ir->operands[0]->type->base_type == GLSL_TYPE_INT);
1639 i.insert_before(assign(hi, add(add(hi, rshift(t1, c16->clone(ir, NULL))),
1640 rshift(t2, c16->clone(ir, NULL)))));
1648 new(ir) ir_variable(glsl_type::ivec(elements), "neg_hi", ir_var_temporary);
1649 ir_constant *c1 = new(ir) ir_constant(1u, elements);
1655 ir->operation = ir_triop_csel;
1656 ir->init_num_operands();
1657 ir->operands[0] = new(ir) ir_dereference_variable(different_signs);
1658 ir->operands[1] = new(ir) ir_dereference_variable(neg_hi);
1659 ir->operands[2] = u2i(hi);
1664 lower_instructions_visitor::sqrt_to_abs_sqrt(ir_expression *ir)
1666 ir->operands[0] = new(ir) ir_expression(ir_unop_abs, ir->operands[0]);
1671 lower_instructions_visitor::mul64_to_mul_and_mul_high(ir_expression *ir)
1677 const unsigned elements = ir->operands[0]->type->vector_elements;
1680 ir->type->base_type == GLSL_TYPE_UINT64 ? ir_unop_pack_uint_2x32
1683 const glsl_type *var_type = ir->type->base_type == GLSL_TYPE_UINT64
1687 const glsl_type *ret_type = ir->type->base_type == GLSL_TYPE_UINT64
1694 new(ir) ir_variable(var_type, "msb", ir_var_temporary);
1696 new(ir) ir_variable(var_type, "lsb", ir_var_temporary);
1698 new(ir) ir_variable(var_type, "x", ir_var_temporary);
1700 new(ir) ir_variable(var_type, "y", ir_var_temporary);
1703 i.insert_before(assign(x, ir->operands[0]));
1705 i.insert_before(assign(y, ir->operands[1]));
1714 ir_rvalue *val = new(ir) ir_expression(ir_quadop_vector, ret_type,
1720 ir->operation = ir_quadop_vector;
1721 ir->init_num_operands();
1722 ir->operands[0] = result[0];
1723 ir->operands[1] = result[1];
1724 ir->operands[2] = result[2];
1725 ir->operands[3] = result[3];
1731 lower_instructions_visitor::visit_leave(ir_expression *ir)
1733 switch (ir->operation) {
1735 if (ir->operands[0]->type->is_double())
1736 double_dot_to_fma(ir);
1739 if (ir->operands[0]->type->is_double())
1740 double_lrp(ir);
1744 sub_to_add_neg(ir);
1748 if (ir->operands[1]->type->is_integer() && lowering(INT_DIV_TO_MUL_RCP))
1749 int_div_to_mul_rcp(ir);
1750 else if ((ir->operands[1]->type->is_float() && lowering(FDIV_TO_MUL_RCP)) ||
1751 (ir->operands[1]->type->is_double() && lowering(DDIV_TO_MUL_RCP)))
1752 div_to_mul_rcp(ir);
1757 exp_to_exp2(ir);
1762 log_to_log2(ir);
1766 if (lowering(MOD_TO_FLOOR) && (ir->type->is_float() || ir->type->is_double()))
1767 mod_to_floor(ir);
1772 pow_to_exp2(ir);
1776 if (lowering(LDEXP_TO_ARITH) && ir->type->is_float())
1777 ldexp_to_arith(ir);
1778 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->type->is_double())
1779 dldexp_to_arith(ir);
1783 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->operands[0]->type->is_double())
1784 dfrexp_exp_to_arith(ir);
1788 if (lowering(DFREXP_DLDEXP_TO_ARITH) && ir->operands[0]->type->is_double())
1789 dfrexp_sig_to_arith(ir);
1794 carry_to_arith(ir);
1799 borrow_to_arith(ir);
1804 sat_to_clamp(ir);
1808 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1809 dtrunc_to_dfrac(ir);
1813 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1814 dceil_to_dfrac(ir);
1818 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1819 dfloor_to_dfrac(ir);
1823 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1824 dround_even_to_dfrac(ir);
1828 if (lowering(DOPS_TO_DFRAC) && ir->type->is_double())
1829 dsign_to_csel(ir);
1834 bit_count_to_math(ir);
1839 extract_to_shifts(ir);
1844 insert_to_shifts(ir);
1849 reverse_to_shifts(ir);
1854 find_lsb_to_float_cast(ir);
1859 find_msb_to_float_cast(ir);
1864 imul_high_to_mul(ir);
1869 (ir->type->base_type == GLSL_TYPE_INT64 ||
1870 ir->type->base_type == GLSL_TYPE_UINT64) &&
1871 (ir->operands[0]->type->base_type == GLSL_TYPE_INT ||
1872 ir->operands[1]->type->base_type == GLSL_TYPE_UINT))
1873 mul64_to_mul_and_mul_high(ir);
1879 sqrt_to_abs_sqrt(ir);