summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2021-10-29 14:27:16 +0100
committer Vladimir Marko <vmarko@google.com> 2021-11-01 08:52:18 +0000
commitd1729267e686f568a6c9c853ad80dceb7e7e6f0d (patch)
tree19f252a0baad8a8d7f7a640979c6505ed6ec67db /compiler/optimizing
parent2d4feeb67912d64b9e980e6687794826a5c22f9d (diff)
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
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/intrinsics_arm_vixl.cc10
1 files changed, 6 insertions, 4 deletions
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);
}