diff options
author | Roland Scheidegger <[email protected]> | 2013-02-16 02:26:14 +0100 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2013-02-16 02:40:51 +0100 |
commit | cb2e6782945d5ea6cc26f3f47d6ee04f48caf529 (patch) | |
tree | 232a8598df99d646ba9239ab14c88f7a2e1285a8 /src/gallium/auxiliary/gallivm | |
parent | c25ae5d27b114e23d5734f846002df1a05759658 (diff) |
gallivm/tgsi: fix src modifier fetching with non-float types.
Need to take the type into account. Also, if we want to allow
mov's with modifiers we need to pick a type (assume float).
v2: don't allow all modifiers on all type, in particular don't allow
absolute on non-float types and don't allow negate on unsigned.
Also treat UADD as signed (despite the name) since it is used
for handling both signed and unsigned integer arguments and otherwise
modifiers don't work.
Also add tgsi docs clarifying this.
Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_tgsi.c | 36 |
1 files changed, 34 insertions, 2 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; + } } /* |