gallivm/tgsi: handle untyped moves
authorZack Rusin <zackr@vmware.com>
Tue, 9 Apr 2013 12:11:45 +0000 (05:11 -0700)
committerZack Rusin <zackr@vmware.com>
Wed, 10 Apr 2013 19:37:17 +0000 (12:37 -0700)
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 <zackr@vmware.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
src/gallium/auxiliary/tgsi/tgsi_info.c

index 6cc72ff948d29e95885eaa793af52c79d555bc21..853de09cc6b111ffb2f9a96c8bb1da3a92112591 100644 (file)
@@ -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;
index 8ae5523527ca71409d472757ad750036eddf2c32..1fadfec603a1130e73f4fd88a7ebac0ad39c377d 100644 (file)
@@ -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: