diff options
author | Kenneth Graunke <[email protected]> | 2015-11-22 20:12:17 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2018-03-08 15:26:26 -0800 |
commit | 70de61594dcf99f24eb31ebf98d62f13e1f44c2e (patch) | |
tree | a745f0a99d5626cad6545a0c2598c0d825ff608f /src/intel/compiler/brw_fs_builder.h | |
parent | 54e8d2268de37f320b2d206295d0b519f5be5ab7 (diff) |
i965/fs: Add infrastructure for generating CSEL instructions.
v2 (idr): Don't allow CSEL with a non-float src2.
v3 (idr): Add CSEL to fs_inst::flags_written. Suggested by Matt.
v4 (idr): Only set BRW_ALIGN_16 on Gen < 10 (suggested by Matt). Don't
reset the access mode afterwards (suggested by Samuel and Matt). Add
support for CSEL not modifying the flags to more places (requested by
Matt).
Signed-off-by: Kenneth Graunke <[email protected]>
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Samuel Iglesias Gonsálvez <[email protected]> [v3]
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/intel/compiler/brw_fs_builder.h')
-rw-r--r-- | src/intel/compiler/brw_fs_builder.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/intel/compiler/brw_fs_builder.h b/src/intel/compiler/brw_fs_builder.h index cf603b0c868..4203c8c27c3 100644 --- a/src/intel/compiler/brw_fs_builder.h +++ b/src/intel/compiler/brw_fs_builder.h @@ -567,7 +567,6 @@ namespace brw { ALU1(BFREV) ALU1(CBIT) ALU2(CMPN) - ALU3(CSEL) ALU1(DIM) ALU2(DP2) ALU2(DP3) @@ -643,6 +642,27 @@ namespace brw { } /** + * CSEL: dst = src2 <op> 0.0f ? src0 : src1 + */ + instruction * + CSEL(const dst_reg &dst, const src_reg &src0, const src_reg &src1, + const src_reg &src2, brw_conditional_mod condition) const + { + /* CSEL only operates on floats, so we can't do integer </<=/>=/> + * comparisons. Zero/non-zero (== and !=) comparisons almost work. + * 0x80000000 fails because it is -0.0, and -0.0 == 0.0. + */ + assert(src2.type == BRW_REGISTER_TYPE_F); + + return set_condmod(condition, + emit(BRW_OPCODE_CSEL, + retype(dst, BRW_REGISTER_TYPE_F), + retype(src0, BRW_REGISTER_TYPE_F), + retype(src1, BRW_REGISTER_TYPE_F), + src2)); + } + + /** * Emit a linear interpolation instruction. */ instruction * |