[Mesa-dev] [PATCH] radeonsi: Bitcast result of packf16 intrinsic to float for export intrinsic.

Tom Stellard tom at stellard.net
Thu Nov 29 08:45:00 PST 2012


On Tue, Nov 27, 2012 at 07:55:05PM +0100, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
> 
> Fixes 4 piglit tests and prevents many more from crashing.
> 
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>  src/gallium/drivers/radeonsi/radeonsi_shader.c |    6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
> index d6e37ac..d5d56c4 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
> +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
> @@ -496,7 +496,11 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
>  						LLVMInt32TypeInContext(base->gallivm->context),
>  						args, 2,
>  						LLVMReadNoneAttribute);
> -			args[chan + 7] = args[chan + 5];
> +			args[chan + 7] = args[chan + 5] =
> +				LLVMBuildBitCast(base->gallivm->builder,
> +						 args[chan + 5],
> +						 LLVMFloatTypeInContext(base->gallivm->context),
> +						 "");
>  		}

I think a better fix would be to change the return type of llvm.SI.packf16
intrinsic from i32 to v2f16.  This is more correct and would allow us to
use the intrinsic elsewhere if needed.  Actually, we could also
replace the llvm.SI.packf16 intrinsic with LLVM IR:

llvm.SI.packf16(A, B) => build_vector(fptrunc (f32 A to f16), fptrunc (f32 B to f16))

This will also require a new export intrinsic to handle the packed floats,
and you'll need to add the v2f16 type to the register class definitions.

-Tom

>  
>  		/* Set COMPR flag */
> -- 
> 1.7.10.4
> 
> _______________________________________________
> 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