summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZack Rusin <[email protected]>2013-04-09 05:11:45 -0700
committerZack Rusin <[email protected]>2013-04-10 12:37:17 -0700
commitfe29f99293cb3bbc834f4d4d65e87ac7c734615d (patch)
tree20801e2c03d5ffa33cdf4533566fba75fe2f25ab
parentd56f2d52675397610717875c4a2a5edb04e2c997 (diff)
gallivm/tgsi: handle untyped moves
both mov and ucmp can be used to move variables of any type. correctly note that about ucmp in the tgsi_info and make sure gallivm can handle that by correctly casting the untyped moves. Signed-off-by: Zack Rusin <[email protected]> Reviewed-by: Jose Fonseca <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c9
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_info.c1
2 files changed, 10 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 6cc72ff948d..853de09cc6b 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -1084,6 +1084,15 @@ emit_store_chan(
break;
}
+ /* If the destination is untyped then the source can be anything,
+ * but LLVM won't like if the types don't match so lets cast
+ * to the correct destination type as expected by LLVM. */
+ if (dtype == TGSI_TYPE_UNTYPED &&
+ !lp_check_vec_type(bld_store->type, LLVMTypeOf(value))) {
+ value = LLVMBuildBitCast(builder, value, bld_store->vec_type,
+ "src_casted");
+ }
+
switch( inst->Instruction.Saturate ) {
case TGSI_SAT_NONE:
break;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c
index 8ae5523527c..1fadfec603a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_info.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
@@ -327,6 +327,7 @@ tgsi_opcode_infer_dst_type( uint opcode )
{
switch (opcode) {
case TGSI_OPCODE_MOV:
+ case TGSI_OPCODE_UCMP:
return TGSI_TYPE_UNTYPED;
case TGSI_OPCODE_F2U:
case TGSI_OPCODE_AND: