diff options
author | Jason Ekstrand <[email protected]> | 2019-05-06 11:16:25 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-05-24 08:38:11 -0500 |
commit | 8ffbb5440564f6a6c00a73997f554e6c4005783f (patch) | |
tree | b3689005eaa40f66c749b518f8462078bb9a8cc6 | |
parent | 4fde45956327ccc30ef1caba3855bb53c725dcb1 (diff) |
intel: Implement abs, neg, and sat in the back-end
Reviewed-by: Kristian H. Kristensen <[email protected]>
Acked-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/intel/compiler/brw_fs_nir.cpp | 22 | ||||
-rw-r--r-- | src/intel/compiler/brw_vec4_nir.cpp | 31 |
2 files changed, 44 insertions, 9 deletions
diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index a2c8f3f557f..794a38d3833 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -1112,6 +1112,28 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr) inst->saturate = instr->dest.saturate; break; + case nir_op_fsat: + inst = bld.MOV(result, op[0]); + inst->saturate = true; + break; + + case nir_op_fneg: + case nir_op_ineg: + op[0].negate = true; + inst = bld.MOV(result, op[0]); + if (instr->op == nir_op_fneg) + inst->saturate = instr->dest.saturate; + break; + + case nir_op_fabs: + case nir_op_iabs: + op[0].negate = false; + op[0].abs = true; + inst = bld.MOV(result, op[0]); + if (instr->op == nir_op_fabs) + inst->saturate = instr->dest.saturate; + break; + case nir_op_fsign: emit_fsign(bld, instr, result, op, 0); break; diff --git a/src/intel/compiler/brw_vec4_nir.cpp b/src/intel/compiler/brw_vec4_nir.cpp index 7a8ae8158a3..027d3d9bc75 100644 --- a/src/intel/compiler/brw_vec4_nir.cpp +++ b/src/intel/compiler/brw_vec4_nir.cpp @@ -1123,6 +1123,28 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr) emit_conversion_to_double(dst, op[0], instr->dest.saturate); break; + case nir_op_fsat: + inst = emit(MOV(dst, op[0])); + inst->saturate = true; + break; + + case nir_op_fneg: + case nir_op_ineg: + op[0].negate = true; + inst = emit(MOV(dst, op[0])); + if (instr->op == nir_op_fneg) + inst->saturate = instr->dest.saturate; + break; + + case nir_op_fabs: + case nir_op_iabs: + op[0].negate = false; + op[0].abs = true; + inst = emit(MOV(dst, op[0])); + if (instr->op == nir_op_fabs) + inst->saturate = instr->dest.saturate; + break; + case nir_op_iadd: assert(nir_dest_bit_size(instr->dest.dest) < 64); /* fall through */ @@ -1889,15 +1911,6 @@ vec4_visitor::nir_emit_alu(nir_alu_instr *instr) inst->saturate = instr->dest.saturate; break; - case nir_op_iabs: - case nir_op_ineg: - assert(nir_dest_bit_size(instr->dest.dest) < 64); - /* fall through */ - case nir_op_fabs: - case nir_op_fneg: - case nir_op_fsat: - unreachable("not reached: should be lowered by lower_source mods"); - case nir_op_fdiv: unreachable("not reached: should be lowered by DIV_TO_MUL_RCP in the compiler"); |