From: Dave Airlie Date: Mon, 29 Jun 2020 04:59:20 +0000 (+1000) Subject: gallivm/nir: fix big-endian 64-bit splitting/merging. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3aeb61da49cf0e141759c23d4790ad5dd96bcf52;p=mesa.git gallivm/nir: fix big-endian 64-bit splitting/merging. The shuffles need to be swapped to do this properly on big-endian Cc: Reviewed-by: Roland Scheidegger Part-of: --- diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index f14475e839d..2c4135ccc05 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -353,8 +353,13 @@ static LLVMValueRef split_64bit(struct lp_build_nir_context *bld_base, LLVMValueRef shuffles2[LP_MAX_VECTOR_WIDTH/32]; int len = bld_base->base.type.length * 2; for (unsigned i = 0; i < bld_base->base.type.length; i++) { +#if UTIL_ARCH_LITTLE_ENDIAN shuffles[i] = lp_build_const_int32(gallivm, i * 2); shuffles2[i] = lp_build_const_int32(gallivm, (i * 2) + 1); +#else + shuffles[i] = lp_build_const_int32(gallivm, (i * 2) + 1); + shuffles2[i] = lp_build_const_int32(gallivm, (i * 2)); +#endif } src = LLVMBuildBitCast(gallivm->builder, src, LLVMVectorType(LLVMInt32TypeInContext(gallivm->context), len), ""); @@ -378,8 +383,13 @@ merge_64bit(struct lp_build_nir_context *bld_base, assert(len <= (2 * (LP_MAX_VECTOR_WIDTH/32))); for (i = 0; i < bld_base->base.type.length * 2; i+=2) { +#if UTIL_ARCH_LITTLE_ENDIAN shuffles[i] = lp_build_const_int32(gallivm, i / 2); shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length); +#else + shuffles[i] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length); + shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2); +#endif } return LLVMBuildShuffleVector(builder, input, input2, LLVMConstVector(shuffles, len), ""); } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c index 542fd02565c..3cefcdb6614 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c @@ -69,8 +69,13 @@ emit_fetch_64bit( assert(len <= (2 * (LP_MAX_VECTOR_WIDTH/32))); for (i = 0; i < bld_base->base.type.length * 2; i+=2) { +#if UTIL_ARCH_LITTLE_ENDIAN shuffles[i] = lp_build_const_int32(gallivm, i / 2); shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length); +#else + shuffles[i] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length); + shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2); +#endif } res = LLVMBuildShuffleVector(builder, input, input2, LLVMConstVector(shuffles, len), ""); @@ -91,8 +96,13 @@ emit_store_64bit_split(struct lp_build_nir_context *bld_base, value = LLVMBuildBitCast(gallivm->builder, value, LLVMVectorType(LLVMFloatTypeInContext(gallivm->context), len), ""); for (i = 0; i < bld_base->base.type.length; i++) { +#if UTIL_ARCH_LITTLE_ENDIAN shuffles[i] = lp_build_const_int32(gallivm, i * 2); shuffles2[i] = lp_build_const_int32(gallivm, (i * 2) + 1); +#else + shuffles[i] = lp_build_const_int32(gallivm, i * 2 + 1); + shuffles2[i] = lp_build_const_int32(gallivm, i * 2); +#endif } split_values[0] = LLVMBuildShuffleVector(builder, value,