From d1729267e686f568a6c9c853ad80dceb7e7e6f0d Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Fri, 29 Oct 2021 14:27:16 +0100 Subject: arm: Fix VarHandle.compareAndSet/long intrinsic... ... for big-endian array views. Undo the byte swap for all situations where we swapped bytes in arguments. Test: testrunner.py --target --32 --optimizing -t 712 Bug: 71781600 Change-Id: Ide4736032f8a4875e14be66727c00dd79beb230c --- compiler/optimizing/intrinsics_arm_vixl.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'compiler/optimizing') diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc index a3ad409fc7..2b3d48b1a6 100644 --- a/compiler/optimizing/intrinsics_arm_vixl.cc +++ b/compiler/optimizing/intrinsics_arm_vixl.cc @@ -4913,14 +4913,16 @@ static void GenerateVarHandleCompareAndSetOrExchange(HInvoke* invoke, seq_cst_barrier ? MemBarrierKind::kAnyAny : MemBarrierKind::kLoadAny); } + if (byte_swap && value_type == DataType::Type::kInt64) { + // Undo byte swapping in `expected` and `new_value`. We do not have the + // information whether the value in these registers shall be needed later. + GenerateReverseBytesInPlaceForEachWord(assembler, expected); + GenerateReverseBytesInPlaceForEachWord(assembler, new_value); + } if (!return_success) { if (byte_swap) { if (value_type == DataType::Type::kInt64) { GenerateReverseBytesInPlaceForEachWord(assembler, old_value); - // Undo byte swapping in `expected` and `new_value`. We do not have the - // information whether the value in these registers shall be needed later. - GenerateReverseBytesInPlaceForEachWord(assembler, expected); - GenerateReverseBytesInPlaceForEachWord(assembler, new_value); } else { GenerateReverseBytes(assembler, value_type, old_value, out); } -- cgit v1.2.3-59-g8ed1b