X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_fs_channel_expressions.cpp;h=5024bed5cb20855e57d3901c2188ffb019c5de00;hb=1080fc610ef20e376c3a54b3cee2be911df9f012;hp=fc98bcd649ec0c88de09e8d8720ec7baf458281c;hpb=2e5a1a254ed81b1d3efa6064f48183eefac784d0;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp index fc98bcd649e..5024bed5cb2 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_channel_expressions.cpp @@ -135,7 +135,7 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) ir_expression *expr = ir->rhs->as_expression(); bool found_vector = false; unsigned int i, vector_elements = 1; - ir_variable *op_var[2]; + ir_variable *op_var[3]; if (!expr) return visit_continue; @@ -191,9 +191,14 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_unop_log: case ir_unop_exp2: case ir_unop_log2: + case ir_unop_bitcast_i2f: + case ir_unop_bitcast_f2i: + case ir_unop_bitcast_f2u: + case ir_unop_bitcast_u2f: case ir_unop_i2u: case ir_unop_u2i: case ir_unop_f2i: + case ir_unop_f2u: case ir_unop_i2f: case ir_unop_f2b: case ir_unop_b2f: @@ -211,6 +216,10 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_unop_cos_reduced: case ir_unop_dFdx: case ir_unop_dFdy: + case ir_unop_bitfield_reverse: + case ir_unop_bit_count: + case ir_unop_find_msb: + case ir_unop_find_lsb: for (i = 0; i < vector_elements; i++) { ir_rvalue *op0 = get_element(op_var[0], i); @@ -224,7 +233,10 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_binop_add: case ir_binop_sub: case ir_binop_mul: + case ir_binop_imul_high: case ir_binop_div: + case ir_binop_carry: + case ir_binop_borrow: case ir_binop_mod: case ir_binop_min: case ir_binop_max: @@ -332,9 +344,82 @@ ir_channel_expressions_visitor::visit_leave(ir_assignment *ir) case ir_unop_noise: assert(!"noise should have been broken down to function call"); break; + + case ir_binop_bfm: { + /* Does not need to be scalarized, since its result will be identical + * for all channels. + */ + ir_rvalue *op0 = get_element(op_var[0], 0); + ir_rvalue *op1 = get_element(op_var[1], 0); + + assign(ir, 0, new(mem_ctx) ir_expression(expr->operation, + element_type, + op0, + op1)); + break; + } + + case ir_binop_ubo_load: + assert(!"not yet supported"); + break; + + case ir_triop_fma: + case ir_triop_lrp: + case ir_triop_csel: + case ir_triop_bitfield_extract: + for (i = 0; i < vector_elements; i++) { + ir_rvalue *op0 = get_element(op_var[0], i); + ir_rvalue *op1 = get_element(op_var[1], i); + ir_rvalue *op2 = get_element(op_var[2], i); + + assign(ir, i, new(mem_ctx) ir_expression(expr->operation, + element_type, + op0, + op1, + op2)); + } + break; + + case ir_triop_bfi: { + /* Only a single BFM is needed for multiple BFIs. */ + ir_rvalue *op0 = get_element(op_var[0], 0); + + for (i = 0; i < vector_elements; i++) { + ir_rvalue *op1 = get_element(op_var[1], i); + ir_rvalue *op2 = get_element(op_var[2], i); + + assign(ir, i, new(mem_ctx) ir_expression(expr->operation, + element_type, + op0->clone(mem_ctx, NULL), + op1, + op2)); + } + break; + } + + case ir_unop_pack_snorm_2x16: + case ir_unop_pack_snorm_4x8: + case ir_unop_pack_unorm_2x16: + case ir_unop_pack_unorm_4x8: + case ir_unop_pack_half_2x16: + case ir_unop_unpack_snorm_2x16: + case ir_unop_unpack_snorm_4x8: + case ir_unop_unpack_unorm_2x16: + case ir_unop_unpack_unorm_4x8: + case ir_unop_unpack_half_2x16: + case ir_binop_ldexp: + case ir_binop_vector_extract: + case ir_triop_vector_insert: + case ir_quadop_bitfield_insert: case ir_quadop_vector: assert(!"should have been lowered"); break; + + case ir_unop_unpack_half_2x16_split_x: + case ir_unop_unpack_half_2x16_split_y: + case ir_binop_pack_half_2x16_split: + assert("!not reached: expression operates on scalars only"); + break; } ir->remove();