[Mesa-dev] [PATCH 5/5] gallivm: enable stores of integer types.
Jose Fonseca
jfonseca at vmware.com
Mon Feb 6 11:47:49 PST 2012
Dave,
I really see no point of inferring anything when translating MOVs. The src/dst value will need to be converted from/to a floating point anyway so this is unnecessary complexity AFAICS. If you believe this is really necessary please provide a concrete example.
Jose
----- Original Message -----
> 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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list