| Index: runtime/vm/stub_code_arm64.cc
|
| diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
|
| index 443ab1cece5b3f4168f3586a8e050116366147aa..71dae4b3b848ddb0cbed4e2f50daf03698713d8d 100644
|
| --- a/runtime/vm/stub_code_arm64.cc
|
| +++ b/runtime/vm/stub_code_arm64.cc
|
| @@ -22,8 +22,10 @@
|
| namespace dart {
|
|
|
| DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
|
| -DEFINE_FLAG(bool, use_slow_path, false,
|
| - "Set to true for debugging & verifying the slow paths.");
|
| +DEFINE_FLAG(bool,
|
| + use_slow_path,
|
| + false,
|
| + "Set to true for debugging & verifying the slow paths.");
|
| DECLARE_FLAG(bool, trace_optimized_ic_calls);
|
|
|
| // Input parameters:
|
| @@ -48,7 +50,8 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
| __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
|
|
|
| #if defined(DEBUG)
|
| - { Label ok;
|
| + {
|
| + Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ LoadFromOffset(R8, THR, Thread::vm_tag_offset());
|
| __ CompareImmediate(R8, VMTag::kDartTagId);
|
| @@ -86,7 +89,7 @@ void StubCode::GenerateCallToRuntimeStub(Assembler* assembler) {
|
| // Set argv in NativeArguments.
|
| __ AddImmediate(R2, R2, kParamEndSlotFromFp * kWordSize);
|
|
|
| - ASSERT(retval_offset == 3 * kWordSize);
|
| + ASSERT(retval_offset == 3 * kWordSize);
|
| __ AddImmediate(R3, R2, kWordSize);
|
|
|
| __ StoreToOffset(R0, SP, thread_offset);
|
| @@ -152,7 +155,8 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) {
|
| __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
|
|
|
| #if defined(DEBUG)
|
| - { Label ok;
|
| + {
|
| + Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
|
| __ CompareImmediate(R6, VMTag::kDartTagId);
|
| @@ -245,7 +249,8 @@ void StubCode::GenerateCallBootstrapCFunctionStub(Assembler* assembler) {
|
| __ StoreToOffset(FP, THR, Thread::top_exit_frame_info_offset());
|
|
|
| #if defined(DEBUG)
|
| - { Label ok;
|
| + {
|
| + Label ok;
|
| // Check that we are always entering from Dart code.
|
| __ LoadFromOffset(R6, THR, Thread::vm_tag_offset());
|
| __ CompareImmediate(R6, VMTag::kDartTagId);
|
| @@ -479,8 +484,8 @@ static void GenerateDeoptimizationSequence(Assembler* assembler,
|
| }
|
|
|
| __ mov(R0, SP); // Pass address of saved registers block.
|
| - bool is_lazy = (kind == kLazyDeoptFromReturn) ||
|
| - (kind == kLazyDeoptFromThrow);
|
| + bool is_lazy =
|
| + (kind == kLazyDeoptFromReturn) || (kind == kLazyDeoptFromThrow);
|
| __ LoadImmediate(R1, is_lazy ? 1 : 0);
|
| __ ReserveAlignedFrameSpace(0);
|
| __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
|
| @@ -738,8 +743,7 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) {
|
| // R7: new object end address.
|
|
|
| // Store the type argument field.
|
| - __ StoreIntoObjectOffsetNoBarrier(
|
| - R0, Array::type_arguments_offset(), R1);
|
| + __ StoreIntoObjectOffsetNoBarrier(R0, Array::type_arguments_offset(), R1);
|
|
|
| // Set the length field.
|
| __ StoreIntoObjectOffsetNoBarrier(R0, Array::length_offset(), R2);
|
| @@ -1020,8 +1024,7 @@ void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
|
| // R1: number of context variables.
|
| // R2: raw null.
|
| Label loop, done;
|
| - __ AddImmediate(
|
| - R3, R0, Context::variable_offset(0) - kHeapObjectTag);
|
| + __ AddImmediate(R3, R0, Context::variable_offset(0) - kHeapObjectTag);
|
| __ Bind(&loop);
|
| __ subs(R1, R1, Operand(1));
|
| __ b(&done, MI);
|
| @@ -1184,8 +1187,7 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
|
| // Check if the object contains any non-header fields.
|
| // Small objects are initialized using a consecutive set of writes.
|
| for (intptr_t current_offset = Instance::NextFieldOffset();
|
| - current_offset < instance_size;
|
| - current_offset += kWordSize) {
|
| + current_offset < instance_size; current_offset += kWordSize) {
|
| __ StoreToOffset(R0, R2, current_offset);
|
| }
|
| } else {
|
| @@ -1224,8 +1226,8 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
|
| // Create a stub frame as we are pushing some objects on the stack before
|
| // calling into the runtime.
|
| __ EnterStubFrame(); // Uses pool pointer to pass cls to runtime.
|
| - __ Push(ZR); // Result slot.
|
| - __ PushObject(cls); // Push class of object to be allocated.
|
| + __ Push(ZR); // Result slot.
|
| + __ PushObject(cls); // Push class of object to be allocated.
|
| if (is_cls_parameterized) {
|
| // Push type arguments.
|
| __ Push(R1);
|
| @@ -1234,7 +1236,7 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
|
| __ PushObject(Object::null_object());
|
| }
|
| __ CallRuntime(kAllocateObjectRuntimeEntry, 2); // Allocate object.
|
| - __ Drop(2); // Pop arguments.
|
| + __ Drop(2); // Pop arguments.
|
| __ Pop(R0); // Pop result (newly allocated object).
|
| // R0: new object
|
| // Restore the frame pointer.
|
| @@ -1284,9 +1286,9 @@ void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| Register func_reg = R6;
|
| if (FLAG_trace_optimized_ic_calls) {
|
| __ EnterStubFrame();
|
| - __ Push(R6); // Preserve.
|
| - __ Push(R5); // Preserve.
|
| - __ Push(ic_reg); // Argument.
|
| + __ Push(R6); // Preserve.
|
| + __ Push(R5); // Preserve.
|
| + __ Push(ic_reg); // Argument.
|
| __ Push(func_reg); // Argument.
|
| __ CallRuntime(kTraceICCallRuntimeEntry, 2);
|
| __ Drop(2); // Discard argument;
|
| @@ -1294,11 +1296,9 @@ void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
|
| __ Pop(R6); // Restore.
|
| __ LeaveStubFrame();
|
| }
|
| - __ LoadFieldFromOffset(
|
| - R7, func_reg, Function::usage_counter_offset(), kWord);
|
| + __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kWord);
|
| __ add(R7, R7, Operand(1));
|
| - __ StoreFieldToOffset(
|
| - R7, func_reg, Function::usage_counter_offset(), kWord);
|
| + __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kWord);
|
| }
|
|
|
|
|
| @@ -1311,11 +1311,11 @@ void StubCode::GenerateUsageCounterIncrement(Assembler* assembler,
|
| ASSERT(temp_reg == R6);
|
| __ Comment("Increment function counter");
|
| __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset());
|
| - __ LoadFieldFromOffset(
|
| - R7, func_reg, Function::usage_counter_offset(), kWord);
|
| + __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(),
|
| + kWord);
|
| __ AddImmediate(R7, R7, 1);
|
| - __ StoreFieldToOffset(
|
| - R7, func_reg, Function::usage_counter_offset(), kWord);
|
| + __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(),
|
| + kWord);
|
| }
|
| }
|
|
|
| @@ -1329,19 +1329,19 @@ static void EmitFastSmiOp(Assembler* assembler,
|
| intptr_t num_args,
|
| Label* not_smi_or_overflow) {
|
| __ Comment("Fast Smi op");
|
| - __ ldr(R0, Address(SP, + 0 * kWordSize)); // Right.
|
| - __ ldr(R1, Address(SP, + 1 * kWordSize)); // Left.
|
| + __ ldr(R0, Address(SP, +0 * kWordSize)); // Right.
|
| + __ ldr(R1, Address(SP, +1 * kWordSize)); // Left.
|
| __ orr(TMP, R0, Operand(R1));
|
| __ tsti(TMP, Immediate(kSmiTagMask));
|
| __ b(not_smi_or_overflow, NE);
|
| switch (kind) {
|
| case Token::kADD: {
|
| - __ adds(R0, R1, Operand(R0)); // Adds.
|
| + __ adds(R0, R1, Operand(R0)); // Adds.
|
| __ b(not_smi_or_overflow, VS); // Branch if overflow.
|
| break;
|
| }
|
| case Token::kSUB: {
|
| - __ subs(R0, R1, Operand(R0)); // Subtract.
|
| + __ subs(R0, R1, Operand(R0)); // Subtract.
|
| __ b(not_smi_or_overflow, VS); // Branch if overflow.
|
| break;
|
| }
|
| @@ -1352,14 +1352,15 @@ static void EmitFastSmiOp(Assembler* assembler,
|
| __ csel(R0, R1, R0, NE);
|
| break;
|
| }
|
| - default: UNIMPLEMENTED();
|
| + default:
|
| + UNIMPLEMENTED();
|
| }
|
|
|
| // R5: IC data object (preserved).
|
| __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset());
|
| // R6: ic_data_array with check entries: classes and target functions.
|
| __ AddImmediate(R6, R6, Array::data_offset() - kHeapObjectTag);
|
| - // R6: points directly to the first ic data array element.
|
| +// R6: points directly to the first ic data array element.
|
| #if defined(DEBUG)
|
| // Check that first entry is for Smi/Smi.
|
| Label error, ok;
|
| @@ -1406,7 +1407,8 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
| bool optimized) {
|
| ASSERT(num_args > 0);
|
| #if defined(DEBUG)
|
| - { Label ok;
|
| + {
|
| + Label ok;
|
| // Check that the IC data array has NumArgsTested() == num_args.
|
| // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
|
| __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
|
| @@ -1424,8 +1426,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
| if (FLAG_support_debugger && !optimized) {
|
| __ Comment("Check single stepping");
|
| __ LoadIsolate(R6);
|
| - __ LoadFromOffset(
|
| - R6, R6, Isolate::single_step_offset(), kUnsignedByte);
|
| + __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
|
| __ CompareRegisters(R6, ZR);
|
| __ b(&stepping, NE);
|
| __ Bind(&done_stepping);
|
| @@ -1433,10 +1434,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
|
|
| Label not_smi_or_overflow;
|
| if (kind != Token::kILLEGAL) {
|
| - EmitFastSmiOp(assembler,
|
| - kind,
|
| - num_args,
|
| - ¬_smi_or_overflow);
|
| + EmitFastSmiOp(assembler, kind, num_args, ¬_smi_or_overflow);
|
| }
|
| __ Bind(¬_smi_or_overflow);
|
|
|
| @@ -1496,7 +1494,7 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
|
|
| const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
|
| __ AddImmediate(R6, R6, entry_size); // Next entry.
|
| - __ ldr(R1, Address(R6)); // Next class ID.
|
| + __ ldr(R1, Address(R6)); // Next class ID.
|
|
|
| __ Bind(&test);
|
| __ CompareImmediate(R1, Smi::RawValue(kIllegalCid)); // Done?
|
| @@ -1589,36 +1587,37 @@ void StubCode::GenerateNArgsCheckInlineCacheStub(
|
| // - 1 target function.
|
| void StubCode::GenerateOneArgCheckInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| - GenerateNArgsCheckInlineCacheStub(assembler, 1,
|
| - kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| + GenerateNArgsCheckInlineCacheStub(
|
| + assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
|
|
| void StubCode::GenerateTwoArgsCheckInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| + kInlineCacheMissHandlerTwoArgsRuntimeEntry,
|
| + Token::kILLEGAL);
|
| }
|
|
|
|
|
| void StubCode::GenerateSmiAddInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| - GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
|
| + GenerateNArgsCheckInlineCacheStub(
|
| + assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kADD);
|
| }
|
|
|
|
|
| void StubCode::GenerateSmiSubInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| - GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
|
| + GenerateNArgsCheckInlineCacheStub(
|
| + assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kSUB);
|
| }
|
|
|
|
|
| void StubCode::GenerateSmiEqualInlineCacheStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| - GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
|
| + GenerateNArgsCheckInlineCacheStub(
|
| + assembler, 2, kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kEQ);
|
| }
|
|
|
|
|
| @@ -1626,8 +1625,8 @@ void StubCode::GenerateOneArgOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 1,
|
| - kInlineCacheMissHandlerOneArgRuntimeEntry, Token::kILLEGAL,
|
| - true /* optimized */);
|
| + kInlineCacheMissHandlerOneArgRuntimeEntry,
|
| + Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
|
|
| @@ -1635,15 +1634,16 @@ void StubCode::GenerateTwoArgsOptimizedCheckInlineCacheStub(
|
| Assembler* assembler) {
|
| GenerateOptimizedUsageCounterIncrement(assembler);
|
| GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kInlineCacheMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL,
|
| - true /* optimized */);
|
| + kInlineCacheMissHandlerTwoArgsRuntimeEntry,
|
| + Token::kILLEGAL, true /* optimized */);
|
| }
|
|
|
|
|
| void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| #if defined(DEBUG)
|
| - { Label ok;
|
| + {
|
| + Label ok;
|
| // Check that the IC data array has NumArgsTested() == 0.
|
| // 'NumArgsTested' is stored in the least significant bits of 'state_bits'.
|
| __ LoadFromOffset(R6, R5, ICData::state_bits_offset() - kHeapObjectTag,
|
| @@ -1659,10 +1659,9 @@ void StubCode::GenerateZeroArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
|
|
| // Check single stepping.
|
| Label stepping, done_stepping;
|
| - if (FLAG_support_debugger) {
|
| + if (FLAG_support_debugger) {
|
| __ LoadIsolate(R6);
|
| - __ LoadFromOffset(
|
| - R6, R6, Isolate::single_step_offset(), kUnsignedByte);
|
| + __ LoadFromOffset(R6, R6, Isolate::single_step_offset(), kUnsignedByte);
|
| __ CompareImmediate(R6, 0);
|
| __ b(&stepping, NE);
|
| __ Bind(&done_stepping);
|
| @@ -1716,8 +1715,8 @@ void StubCode::GenerateOneArgUnoptimizedStaticCallStub(Assembler* assembler) {
|
|
|
| void StubCode::GenerateTwoArgsUnoptimizedStaticCallStub(Assembler* assembler) {
|
| GenerateUsageCounterIncrement(assembler, R6);
|
| - GenerateNArgsCheckInlineCacheStub(assembler, 2,
|
| - kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| + GenerateNArgsCheckInlineCacheStub(
|
| + assembler, 2, kStaticCallMissHandlerTwoArgsRuntimeEntry, Token::kILLEGAL);
|
| }
|
|
|
|
|
| @@ -1768,13 +1767,11 @@ void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) {
|
| }
|
|
|
| // Called only from unoptimized code. All relevant registers have been saved.
|
| -void StubCode::GenerateDebugStepCheckStub(
|
| - Assembler* assembler) {
|
| +void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
|
| // Check single stepping.
|
| Label stepping, done_stepping;
|
| __ LoadIsolate(R1);
|
| - __ LoadFromOffset(
|
| - R1, R1, Isolate::single_step_offset(), kUnsignedByte);
|
| + __ LoadFromOffset(R1, R1, Isolate::single_step_offset(), kUnsignedByte);
|
| __ CompareImmediate(R1, 0);
|
| __ b(&stepping, NE);
|
| __ Bind(&done_stepping);
|
| @@ -1803,8 +1800,8 @@ static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
|
| // Compute instance type arguments into R4.
|
| Label has_no_type_arguments;
|
| __ LoadObject(R4, Object::null_object());
|
| - __ LoadFieldFromOffset(R5, R3,
|
| - Class::type_arguments_field_offset_in_words_offset(), kWord);
|
| + __ LoadFieldFromOffset(
|
| + R5, R3, Class::type_arguments_field_offset_in_words_offset(), kWord);
|
| __ CompareImmediate(R5, Class::kNoTypeArguments);
|
| __ b(&has_no_type_arguments, EQ);
|
| __ add(R5, R0, Operand(R5, LSL, 3));
|
| @@ -1830,8 +1827,8 @@ static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
|
| __ LoadFieldFromOffset(R3, R0, Closure::function_offset());
|
| // R3: instance class id as Smi or function.
|
| __ Bind(&loop);
|
| - __ LoadFromOffset(
|
| - R5, R2, kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction);
|
| + __ LoadFromOffset(R5, R2,
|
| + kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction);
|
| __ CompareObject(R5, Object::null_object());
|
| __ b(¬_found, EQ);
|
| __ CompareRegisters(R5, R3);
|
| @@ -1839,22 +1836,21 @@ static void GenerateSubtypeNTestCacheStub(Assembler* assembler, int n) {
|
| __ b(&found, EQ);
|
| } else {
|
| __ b(&next_iteration, NE);
|
| - __ LoadFromOffset(
|
| - R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments);
|
| + __ LoadFromOffset(R5, R2,
|
| + kWordSize * SubtypeTestCache::kInstanceTypeArguments);
|
| __ CompareRegisters(R5, R4);
|
| if (n == 2) {
|
| __ b(&found, EQ);
|
| } else {
|
| __ b(&next_iteration, NE);
|
| - __ LoadFromOffset(R5, R2,
|
| - kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
|
| + __ LoadFromOffset(
|
| + R5, R2, kWordSize * SubtypeTestCache::kInstantiatorTypeArguments);
|
| __ CompareRegisters(R5, R1);
|
| __ b(&found, EQ);
|
| }
|
| }
|
| __ Bind(&next_iteration);
|
| - __ AddImmediate(
|
| - R2, R2, kWordSize * SubtypeTestCache::kTestEntryLength);
|
| + __ AddImmediate(R2, R2, kWordSize * SubtypeTestCache::kTestEntryLength);
|
| __ b(&loop);
|
| // Fall through to not found.
|
| __ Bind(¬_found);
|
|
|