[Mesa-dev] [PATCH 6/9] gallivm: enable stores of integer types. (v2)
Dave Airlie
airlied at gmail.com
Wed Feb 8 04:17:54 PST 2012
From: Dave Airlie <airlied at redhat.com>
Infer from the operand the type of value to store.
MOV is untyped but we use the float store path.
v2: make MOV use float store path.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 47 +++++++++++++++++++++--
1 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
index 920fed2..e3f9463 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
@@ -855,7 +855,6 @@ emit_fetch_predicate(
}
}
-
/**
* Register store.
*/
@@ -875,8 +874,26 @@ emit_store_chan(
struct lp_build_context *uint_bld = &bld_base->uint_bld;
LLVMValueRef indirect_index = NULL;
struct lp_build_context *bld_store;
+ enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode);
- bld_store = &bld->bld_base.base;
+ switch (dtype) {
+ default:
+ case TGSI_TYPE_FLOAT:
+ case TGSI_TYPE_UNTYPED:
+ bld_store = &bld_base->base;
+ break;
+ case TGSI_TYPE_UNSIGNED:
+ bld_store = &bld_base->uint_bld;
+ break;
+ case TGSI_TYPE_SIGNED:
+ bld_store = &bld_base->int_bld;
+ break;
+ case TGSI_TYPE_DOUBLE:
+ case TGSI_TYPE_VOID:
+ assert(0);
+ bld_store = NULL;
+ break;
+ }
switch( inst->Instruction.Saturate ) {
case TGSI_SAT_NONE:
@@ -986,8 +1003,30 @@ 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 TGSI_TYPE_UNSIGNED:
+ case TGSI_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 TGSI_TYPE_FLOAT:
+ case TGSI_TYPE_UNTYPED:
+ 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