diff options
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_visitor.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 62d2042a598..f35e1127646 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -447,6 +447,26 @@ fs_visitor::visit(ir_expression *ir) assert(ir->type->is_integer()); emit_math(SHADER_OPCODE_INT_QUOTIENT, this->result, op[0], op[1]); break; + case ir_binop_carry: { + if (brw->gen >= 7 && dispatch_width == 16) + fail("16-wide explicit accumulator operands unsupported\n"); + + struct brw_reg acc = retype(brw_acc_reg(), BRW_REGISTER_TYPE_UD); + + emit(ADDC(reg_null_ud, op[0], op[1])); + emit(MOV(this->result, fs_reg(acc))); + break; + } + case ir_binop_borrow: { + if (brw->gen >= 7 && dispatch_width == 16) + fail("16-wide explicit accumulator operands unsupported\n"); + + struct brw_reg acc = retype(brw_acc_reg(), BRW_REGISTER_TYPE_UD); + + emit(SUBB(reg_null_ud, op[0], op[1])); + emit(MOV(this->result, fs_reg(acc))); + break; + } case ir_binop_mod: /* Floating point should be lowered by MOD_TO_FRACT in the compiler. */ assert(ir->type->is_integer()); |