diff options
-rw-r--r-- | compiler/optimizing/intrinsics_arm64.cc | 9 | ||||
-rw-r--r-- | test/712-varhandle-invocations/util-src/generate_java.py | 2 |
2 files changed, 8 insertions, 3 deletions
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc index 56a5186d36..4de6d5d582 100644 --- a/compiler/optimizing/intrinsics_arm64.cc +++ b/compiler/optimizing/intrinsics_arm64.cc @@ -56,6 +56,7 @@ using helpers::CPURegisterFrom; using helpers::DRegisterFrom; using helpers::HeapOperand; using helpers::LocationFrom; +using helpers::InputCPURegisterAt; using helpers::InputCPURegisterOrZeroRegAt; using helpers::OperandFrom; using helpers::RegisterFrom; @@ -5423,10 +5424,13 @@ static void GenerateVarHandleGetAndUpdate(HInvoke* invoke, bool byte_swap = false) { uint32_t arg_index = invoke->GetNumberOfArguments() - 1; DataType::Type value_type = GetDataTypeFromShorty(invoke, arg_index); + bool is_fp = DataType::IsFloatingPointType(value_type); MacroAssembler* masm = codegen->GetVIXLAssembler(); LocationSummary* locations = invoke->GetLocations(); - CPURegister arg = InputCPURegisterOrZeroRegAt(invoke, arg_index); + CPURegister arg = (is_fp && get_and_update_op == GetAndUpdateOp::kAdd) + ? InputCPURegisterAt(invoke, arg_index) + : InputCPURegisterOrZeroRegAt(invoke, arg_index); CPURegister out = helpers::OutputCPURegister(invoke); VarHandleTarget target = GetVarHandleTarget(invoke); @@ -5458,7 +5462,6 @@ static void GenerateVarHandleGetAndUpdate(HInvoke* invoke, __ Add(tmp_ptr, target.object.X(), target.offset.X()); // The load/store type is never floating point. - bool is_fp = DataType::IsFloatingPointType(value_type); DataType::Type load_store_type = is_fp ? ((value_type == DataType::Type::kFloat32) ? DataType::Type::kInt32 : DataType::Type::kInt64) : value_type; @@ -5476,7 +5479,7 @@ static void GenerateVarHandleGetAndUpdate(HInvoke* invoke, // For floating point GetAndSet, do the GenerateGetAndUpdate() with core registers, // rather than moving between core and FP registers in the loop. arg = MoveToTempIfFpRegister(arg, value_type, masm, &temps); - if (DataType::IsFloatingPointType(value_type) && !arg.IsZero()) { + if (is_fp && !arg.IsZero()) { // We need a temporary register but we have already used a scratch register for // the new value unless it is zero bit pattern (+0.0f or +0.0) and need another one // in GenerateGetAndUpdate(). We have allocated a normal temporary to handle that. diff --git a/test/712-varhandle-invocations/util-src/generate_java.py b/test/712-varhandle-invocations/util-src/generate_java.py index e32cee9763..352c4d9fc5 100644 --- a/test/712-varhandle-invocations/util-src/generate_java.py +++ b/test/712-varhandle-invocations/util-src/generate_java.py @@ -916,6 +916,8 @@ def emit_accessor_test(var_handle_kind, accessor, var_type, output_path): if var_type.supports_numeric == True: expansions['binop'] = accessor.get_java_numeric_operator() test_template = Template(""" + ${var_type} unchanged = (${var_type}) vh.${accessor_method}(${coordinates}(${var_type}) 0); + assertEquals(${initial_value}, unchanged); ${var_type} old_value = (${var_type}) vh.${accessor_method}(${coordinates}${updated_value}); assertEquals(${initial_value}, old_value); ${var_type} expected_value = (${var_type}) (${initial_value} ${binop} ${updated_value}); |