diff options
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi.c | 36 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_exec.c | 2 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_info.c | 6 | ||||
-rw-r--r-- | src/gallium/docs/source/tgsi.rst | 15 |
4 files changed, 54 insertions, 5 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c index 53c81bd1fc2..7255d979439 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.c @@ -310,11 +310,43 @@ lp_build_emit_fetch( } if (reg->Register.Absolute) { - res = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, res); + switch (stype) { + case TGSI_TYPE_FLOAT: + case TGSI_TYPE_DOUBLE: + case TGSI_TYPE_UNTYPED: + /* modifiers on movs assume data is float */ + res = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, res); + break; + case TGSI_TYPE_UNSIGNED: + case TGSI_TYPE_SIGNED: + case TGSI_TYPE_VOID: + default: + /* abs modifier is only legal on floating point types */ + assert(0); + break; + } } if (reg->Register.Negate) { - res = lp_build_negate( &bld_base->base, res ); + switch (stype) { + case TGSI_TYPE_FLOAT: + case TGSI_TYPE_UNTYPED: + /* modifiers on movs assume data is float */ + res = lp_build_negate( &bld_base->base, res ); + break; + case TGSI_TYPE_DOUBLE: + /* no double build context */ + assert(0); + break; + case TGSI_TYPE_SIGNED: + res = lp_build_negate( &bld_base->int_bld, res ); + break; + case TGSI_TYPE_UNSIGNED: + case TGSI_TYPE_VOID: + default: + assert(0); + break; + } } /* diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c index 03f19420986..1099d062dd8 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c @@ -4150,7 +4150,7 @@ exec_instruction( break; case TGSI_OPCODE_UADD: - exec_vector_binary(mach, inst, micro_uadd, TGSI_EXEC_DATA_UINT, TGSI_EXEC_DATA_UINT); + exec_vector_binary(mach, inst, micro_uadd, TGSI_EXEC_DATA_INT, TGSI_EXEC_DATA_INT); break; case TGSI_OPCODE_UDIV: diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c index f289ebcda5a..9c6fdfcd278 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info.c +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c @@ -277,9 +277,9 @@ tgsi_opcode_infer_src_type( uint opcode ) case TGSI_OPCODE_AND: case TGSI_OPCODE_OR: case TGSI_OPCODE_XOR: + /* XXX some src args may be signed for SAD ? */ case TGSI_OPCODE_SAD: case TGSI_OPCODE_U2F: - case TGSI_OPCODE_UADD: case TGSI_OPCODE_UDIV: case TGSI_OPCODE_UMOD: case TGSI_OPCODE_UMAD: @@ -310,6 +310,8 @@ tgsi_opcode_infer_src_type( uint opcode ) case TGSI_OPCODE_IABS: case TGSI_OPCODE_ISSG: case TGSI_OPCODE_UARL: + /* UADD is both signed and unsigned require signed for working modifiers */ + case TGSI_OPCODE_UADD: return TGSI_TYPE_SIGNED; default: return TGSI_TYPE_FLOAT; @@ -331,7 +333,6 @@ tgsi_opcode_infer_dst_type( uint opcode ) case TGSI_OPCODE_OR: case TGSI_OPCODE_XOR: case TGSI_OPCODE_SAD: - case TGSI_OPCODE_UADD: case TGSI_OPCODE_UDIV: case TGSI_OPCODE_UMOD: case TGSI_OPCODE_UMAD: @@ -362,6 +363,7 @@ tgsi_opcode_infer_dst_type( uint opcode ) case TGSI_OPCODE_ARR: case TGSI_OPCODE_IABS: case TGSI_OPCODE_ISSG: + case TGSI_OPCODE_UADD: return TGSI_TYPE_SIGNED; default: return TGSI_TYPE_FLOAT; diff --git a/src/gallium/docs/source/tgsi.rst b/src/gallium/docs/source/tgsi.rst index dd4c7739f3f..d9a7fe9774a 100644 --- a/src/gallium/docs/source/tgsi.rst +++ b/src/gallium/docs/source/tgsi.rst @@ -23,6 +23,21 @@ When an instruction has a scalar result, the result is usually copied into each of the components of *dst*. When this happens, the result is said to be *replicated* to *dst*. :opcode:`RCP` is one such instruction. +Modifiers +^^^^^^^^^^^^^^^ + +TGSI supports modifiers on inputs (as well as saturate modifier on instructions). + +For inputs which have a floating point type, both absolute value and negation +modifiers are supported (with absolute value being applied first). +TGSI_OPCODE_MOV is considered to have float input type for applying modifiers. + +For inputs which have signed type only the negate modifier is supported. This +includes instructions which are otherwise ignorant if the type is signed or +unsigned, such as TGSI_OPCODE_UADD. + +For inputs with unsigned type no modifiers are allowed. + Instruction Set --------------- |