mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 11:48:06 +02:00
gallivm/nir: fix big-endian 64-bit splitting/merging.
The shuffles need to be swapped to do this properly on big-endian Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5679>
This commit is contained in:
parent
9286605276
commit
3aeb61da49
2 changed files with 20 additions and 0 deletions
|
|
@ -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), "");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue