From fe29f99293cb3bbc834f4d4d65e87ac7c734615d Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Tue, 9 Apr 2013 05:11:45 -0700 Subject: [PATCH] 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 Reviewed-by: Jose Fonseca Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 9 +++++++++ src/gallium/auxiliary/tgsi/tgsi_info.c | 1 + 2 files changed, 10 insertions(+) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index 6cc72ff..853de09 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 8ae5523..1fadfec 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: -- 2.7.4