[Mesa-dev] [PATCH 5/5] gallivm: enable stores of integer types.

Dave Airlie airlied at gmail.com
Mon Feb 6 07:46:44 PST 2012


From: Dave Airlie <airlied at redhat.com>

This infers the type of pointer to store to from the opcode,
for MOV instructions it infers it from the type of data its being
asked to store.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c |   68 ++++++++++++++++++++++-
 1 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 17c5d83..01b683a 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -843,6 +843,24 @@ emit_fetch_predicate(
 }
 
 
+static struct lp_build_context *get_mov_type(struct lp_build_tgsi_context *bld_base,
+                                             LLVMValueRef value)
+{
+   LLVMTypeRef val_type = LLVMTypeOf(value);
+   LLVMTypeKind kind_type;
+   struct lp_build_context *bld_d;
+   kind_type = LLVMGetTypeKind(val_type);
+   if (kind_type == LLVMVectorTypeKind) {
+      val_type =  LLVMGetElementType(val_type);
+      kind_type = LLVMGetTypeKind(val_type);
+      if (kind_type == LLVMFloatTypeKind)
+         bld_d = &bld_base->base;
+      else if (kind_type == LLVMIntegerTypeKind)
+         bld_d = &bld_base->uintbld;
+   }
+   return bld_d;
+}
+
 /**
  * Register store.
  */
@@ -862,8 +880,23 @@ emit_store_chan(
    struct lp_build_context *uint_bld = &bld->uint_bld;
    LLVMValueRef indirect_index = NULL;
    struct lp_build_context *bld_store;
+   enum util_format_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode);
 
-   bld_store = &bld->bld_base.base;
+   switch (dtype) {
+   default:
+   case UTIL_FORMAT_TYPE_FLOAT:
+      bld_store = &bld_base->base;
+      break;
+   case UTIL_FORMAT_TYPE_UNSIGNED:
+      bld_store = &bld_base->uintbld;
+      break;
+   case UTIL_FORMAT_TYPE_SIGNED:
+      bld_store = &bld_base->intbld;
+      break;
+   case UTIL_FORMAT_TYPE_VOID:
+      bld_store = get_mov_type(bld_base, value);
+      break;
+   }
 
    switch( inst->Instruction.Saturate ) {
    case TGSI_SAT_NONE:
@@ -973,8 +1006,37 @@ emit_store_chan(
                            &bld->exec_mask, pred);
       }
       else {
-         LLVMValueRef temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index,
-                                              chan_index);
+         LLVMValueRef temp_ptr;
+
+         switch (dtype) {
+         case UTIL_FORMAT_TYPE_VOID: {
+            LLVMTypeRef val_type = LLVMTypeOf(value);
+            LLVMTypeRef ivtype = LLVMPointerType(val_type, 0);
+            LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index,
+                                                       chan_index);
+            temp_ptr = LLVMBuildBitCast(builder, tint_ptr, ivtype, "");
+            break;
+         }
+         case UTIL_FORMAT_TYPE_UNSIGNED:
+         case UTIL_FORMAT_TYPE_SIGNED: {
+            LLVMTypeRef itype = LLVMVectorType(LLVMInt32TypeInContext(gallivm->context), 4);
+            LLVMTypeRef ivtype = LLVMPointerType(itype, 0);
+            LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index,
+                                                        chan_index);
+            LLVMValueRef temp_value_ptr;
+
+            temp_ptr = LLVMBuildBitCast(builder, tint_ptr, ivtype, "");
+            temp_value_ptr = LLVMBuildBitCast(builder, value, itype, "");
+            value = temp_value_ptr;
+            break;
+         }
+         default:
+         case UTIL_FORMAT_TYPE_FLOAT:
+            temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index,
+                                           chan_index);
+            break;
+         }
+
          lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, temp_ptr);
       }
       break;
-- 
1.7.7.6



More information about the mesa-dev mailing list