[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