i965/nir/vec4: Implement various rounding functions

Adds NIR ALU operations:
   * nir_op_ftrunc
   * nir_op_fceil
   * nir_op_ffloor
   * nir_op_ffrac
   * nir_op_fround_even

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
Antia Puentes 2015-06-17 00:25:02 +02:00 committed by Jason Ekstrand
parent 0ce159ec7f
commit 7553a51a68

View file

@ -812,6 +812,41 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr)
break;
}
case nir_op_ftrunc:
inst = emit(RNDZ(dst, op[0]));
inst->saturate = instr->dest.saturate;
break;
case nir_op_fceil: {
src_reg tmp = src_reg(this, glsl_type::float_type);
tmp.swizzle =
brw_swizzle_for_size(instr->src[0].src.is_ssa ?
instr->src[0].src.ssa->num_components :
instr->src[0].src.reg.reg->num_components);
op[0].negate = !op[0].negate;
emit(RNDD(dst_reg(tmp), op[0]));
tmp.negate = true;
inst = emit(MOV(dst, tmp));
inst->saturate = instr->dest.saturate;
break;
}
case nir_op_ffloor:
inst = emit(RNDD(dst, op[0]));
inst->saturate = instr->dest.saturate;
break;
case nir_op_ffract:
inst = emit(FRC(dst, op[0]));
inst->saturate = instr->dest.saturate;
break;
case nir_op_fround_even:
inst = emit(RNDE(dst, op[0]));
inst->saturate = instr->dest.saturate;
break;
default:
unreachable("Unimplemented ALU operation");
}