Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(667)

Side by Side Diff: src/arm64/codegen-arm64.cc

Issue 430503007: Rename ASSERT* to DCHECK*. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and fixes Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm64/code-stubs-arm64.cc ('k') | src/arm64/constants-arm64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_ARM64 7 #if V8_TARGET_ARCH_ARM64
8 8
9 #include "src/arm64/simulator-arm64.h" 9 #include "src/arm64/simulator-arm64.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 55
56 MathExpGenerator::EmitMathExp(&masm, input, result, 56 MathExpGenerator::EmitMathExp(&masm, input, result,
57 double_temp1, double_temp2, 57 double_temp1, double_temp2,
58 temp1, temp2, temp3); 58 temp1, temp2, temp3);
59 // Move the result to the return register. 59 // Move the result to the return register.
60 masm.Fmov(d0, result); 60 masm.Fmov(d0, result);
61 masm.Ret(); 61 masm.Ret();
62 62
63 CodeDesc desc; 63 CodeDesc desc;
64 masm.GetCode(&desc); 64 masm.GetCode(&desc);
65 ASSERT(!RelocInfo::RequiresRelocation(desc)); 65 DCHECK(!RelocInfo::RequiresRelocation(desc));
66 66
67 CpuFeatures::FlushICache(buffer, actual_size); 67 CpuFeatures::FlushICache(buffer, actual_size);
68 base::OS::ProtectCode(buffer, actual_size); 68 base::OS::ProtectCode(buffer, actual_size);
69 69
70 #if !defined(USE_SIMULATOR) 70 #if !defined(USE_SIMULATOR)
71 return FUNCTION_CAST<UnaryMathFunction>(buffer); 71 return FUNCTION_CAST<UnaryMathFunction>(buffer);
72 #else 72 #else
73 fast_exp_arm64_machine_code = buffer; 73 fast_exp_arm64_machine_code = buffer;
74 return &fast_exp_simulator; 74 return &fast_exp_simulator;
75 #endif 75 #endif
76 } 76 }
77 77
78 78
79 UnaryMathFunction CreateSqrtFunction() { 79 UnaryMathFunction CreateSqrtFunction() {
80 return &std::sqrt; 80 return &std::sqrt;
81 } 81 }
82 82
83 83
84 // ------------------------------------------------------------------------- 84 // -------------------------------------------------------------------------
85 // Platform-specific RuntimeCallHelper functions. 85 // Platform-specific RuntimeCallHelper functions.
86 86
87 void StubRuntimeCallHelper::BeforeCall(MacroAssembler* masm) const { 87 void StubRuntimeCallHelper::BeforeCall(MacroAssembler* masm) const {
88 masm->EnterFrame(StackFrame::INTERNAL); 88 masm->EnterFrame(StackFrame::INTERNAL);
89 ASSERT(!masm->has_frame()); 89 DCHECK(!masm->has_frame());
90 masm->set_has_frame(true); 90 masm->set_has_frame(true);
91 } 91 }
92 92
93 93
94 void StubRuntimeCallHelper::AfterCall(MacroAssembler* masm) const { 94 void StubRuntimeCallHelper::AfterCall(MacroAssembler* masm) const {
95 masm->LeaveFrame(StackFrame::INTERNAL); 95 masm->LeaveFrame(StackFrame::INTERNAL);
96 ASSERT(masm->has_frame()); 96 DCHECK(masm->has_frame());
97 masm->set_has_frame(false); 97 masm->set_has_frame(false);
98 } 98 }
99 99
100 100
101 // ------------------------------------------------------------------------- 101 // -------------------------------------------------------------------------
102 // Code generators 102 // Code generators
103 103
104 void ElementsTransitionGenerator::GenerateMapChangeElementsTransition( 104 void ElementsTransitionGenerator::GenerateMapChangeElementsTransition(
105 MacroAssembler* masm, 105 MacroAssembler* masm,
106 Register receiver, 106 Register receiver,
107 Register key, 107 Register key,
108 Register value, 108 Register value,
109 Register target_map, 109 Register target_map,
110 AllocationSiteMode mode, 110 AllocationSiteMode mode,
111 Label* allocation_memento_found) { 111 Label* allocation_memento_found) {
112 ASM_LOCATION( 112 ASM_LOCATION(
113 "ElementsTransitionGenerator::GenerateMapChangeElementsTransition"); 113 "ElementsTransitionGenerator::GenerateMapChangeElementsTransition");
114 ASSERT(!AreAliased(receiver, key, value, target_map)); 114 DCHECK(!AreAliased(receiver, key, value, target_map));
115 115
116 if (mode == TRACK_ALLOCATION_SITE) { 116 if (mode == TRACK_ALLOCATION_SITE) {
117 ASSERT(allocation_memento_found != NULL); 117 DCHECK(allocation_memento_found != NULL);
118 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11, 118 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11,
119 allocation_memento_found); 119 allocation_memento_found);
120 } 120 }
121 121
122 // Set transitioned map. 122 // Set transitioned map.
123 __ Str(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 123 __ Str(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
124 __ RecordWriteField(receiver, 124 __ RecordWriteField(receiver,
125 HeapObject::kMapOffset, 125 HeapObject::kMapOffset,
126 target_map, 126 target_map,
127 x10, 127 x10,
(...skipping 15 matching lines...) Expand all
143 ASM_LOCATION("ElementsTransitionGenerator::GenerateSmiToDouble"); 143 ASM_LOCATION("ElementsTransitionGenerator::GenerateSmiToDouble");
144 Label gc_required, only_change_map; 144 Label gc_required, only_change_map;
145 Register elements = x4; 145 Register elements = x4;
146 Register length = x5; 146 Register length = x5;
147 Register array_size = x6; 147 Register array_size = x6;
148 Register array = x7; 148 Register array = x7;
149 149
150 Register scratch = x6; 150 Register scratch = x6;
151 151
152 // Verify input registers don't conflict with locals. 152 // Verify input registers don't conflict with locals.
153 ASSERT(!AreAliased(receiver, key, value, target_map, 153 DCHECK(!AreAliased(receiver, key, value, target_map,
154 elements, length, array_size, array)); 154 elements, length, array_size, array));
155 155
156 if (mode == TRACK_ALLOCATION_SITE) { 156 if (mode == TRACK_ALLOCATION_SITE) {
157 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11, fail); 157 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11, fail);
158 } 158 }
159 159
160 // Check for empty arrays, which only require a map transition and no changes 160 // Check for empty arrays, which only require a map transition and no changes
161 // to the backing store. 161 // to the backing store.
162 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset)); 162 __ Ldr(elements, FieldMemOperand(receiver, JSObject::kElementsOffset));
163 __ JumpIfRoot(elements, Heap::kEmptyFixedArrayRootIndex, &only_change_map); 163 __ JumpIfRoot(elements, Heap::kEmptyFixedArrayRootIndex, &only_change_map);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 Register target_map, 246 Register target_map,
247 AllocationSiteMode mode, 247 AllocationSiteMode mode,
248 Label* fail) { 248 Label* fail) {
249 ASM_LOCATION("ElementsTransitionGenerator::GenerateDoubleToObject"); 249 ASM_LOCATION("ElementsTransitionGenerator::GenerateDoubleToObject");
250 Register elements = x4; 250 Register elements = x4;
251 Register array_size = x6; 251 Register array_size = x6;
252 Register array = x7; 252 Register array = x7;
253 Register length = x5; 253 Register length = x5;
254 254
255 // Verify input registers don't conflict with locals. 255 // Verify input registers don't conflict with locals.
256 ASSERT(!AreAliased(receiver, key, value, target_map, 256 DCHECK(!AreAliased(receiver, key, value, target_map,
257 elements, array_size, array, length)); 257 elements, array_size, array, length));
258 258
259 if (mode == TRACK_ALLOCATION_SITE) { 259 if (mode == TRACK_ALLOCATION_SITE) {
260 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11, fail); 260 __ JumpIfJSArrayHasAllocationMemento(receiver, x10, x11, fail);
261 } 261 }
262 262
263 // Check for empty arrays, which only require a map transition and no changes 263 // Check for empty arrays, which only require a map transition and no changes
264 // to the backing store. 264 // to the backing store.
265 Label only_change_map; 265 Label only_change_map;
266 266
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 349
350 __ Bind(&only_change_map); 350 __ Bind(&only_change_map);
351 __ Str(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 351 __ Str(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset));
352 __ RecordWriteField(receiver, HeapObject::kMapOffset, target_map, x13, 352 __ RecordWriteField(receiver, HeapObject::kMapOffset, target_map, x13,
353 kLRHasNotBeenSaved, kDontSaveFPRegs, OMIT_REMEMBERED_SET, 353 kLRHasNotBeenSaved, kDontSaveFPRegs, OMIT_REMEMBERED_SET,
354 OMIT_SMI_CHECK); 354 OMIT_SMI_CHECK);
355 } 355 }
356 356
357 357
358 CodeAgingHelper::CodeAgingHelper() { 358 CodeAgingHelper::CodeAgingHelper() {
359 ASSERT(young_sequence_.length() == kNoCodeAgeSequenceLength); 359 DCHECK(young_sequence_.length() == kNoCodeAgeSequenceLength);
360 // The sequence of instructions that is patched out for aging code is the 360 // The sequence of instructions that is patched out for aging code is the
361 // following boilerplate stack-building prologue that is found both in 361 // following boilerplate stack-building prologue that is found both in
362 // FUNCTION and OPTIMIZED_FUNCTION code: 362 // FUNCTION and OPTIMIZED_FUNCTION code:
363 PatchingAssembler patcher(young_sequence_.start(), 363 PatchingAssembler patcher(young_sequence_.start(),
364 young_sequence_.length() / kInstructionSize); 364 young_sequence_.length() / kInstructionSize);
365 // The young sequence is the frame setup code for FUNCTION code types. It is 365 // The young sequence is the frame setup code for FUNCTION code types. It is
366 // generated by FullCodeGenerator::Generate. 366 // generated by FullCodeGenerator::Generate.
367 MacroAssembler::EmitFrameSetupForCodeAgePatching(&patcher); 367 MacroAssembler::EmitFrameSetupForCodeAgePatching(&patcher);
368 368
369 #ifdef DEBUG 369 #ifdef DEBUG
370 const int length = kCodeAgeStubEntryOffset / kInstructionSize; 370 const int length = kCodeAgeStubEntryOffset / kInstructionSize;
371 ASSERT(old_sequence_.length() >= kCodeAgeStubEntryOffset); 371 DCHECK(old_sequence_.length() >= kCodeAgeStubEntryOffset);
372 PatchingAssembler patcher_old(old_sequence_.start(), length); 372 PatchingAssembler patcher_old(old_sequence_.start(), length);
373 MacroAssembler::EmitCodeAgeSequence(&patcher_old, NULL); 373 MacroAssembler::EmitCodeAgeSequence(&patcher_old, NULL);
374 #endif 374 #endif
375 } 375 }
376 376
377 377
378 #ifdef DEBUG 378 #ifdef DEBUG
379 bool CodeAgingHelper::IsOld(byte* candidate) const { 379 bool CodeAgingHelper::IsOld(byte* candidate) const {
380 return memcmp(candidate, old_sequence_.start(), kCodeAgeStubEntryOffset) == 0; 380 return memcmp(candidate, old_sequence_.start(), kCodeAgeStubEntryOffset) == 0;
381 } 381 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 MacroAssembler::EmitCodeAgeSequence(&patcher, stub); 413 MacroAssembler::EmitCodeAgeSequence(&patcher, stub);
414 } 414 }
415 } 415 }
416 416
417 417
418 void StringCharLoadGenerator::Generate(MacroAssembler* masm, 418 void StringCharLoadGenerator::Generate(MacroAssembler* masm,
419 Register string, 419 Register string,
420 Register index, 420 Register index,
421 Register result, 421 Register result,
422 Label* call_runtime) { 422 Label* call_runtime) {
423 ASSERT(string.Is64Bits() && index.Is32Bits() && result.Is64Bits()); 423 DCHECK(string.Is64Bits() && index.Is32Bits() && result.Is64Bits());
424 // Fetch the instance type of the receiver into result register. 424 // Fetch the instance type of the receiver into result register.
425 __ Ldr(result, FieldMemOperand(string, HeapObject::kMapOffset)); 425 __ Ldr(result, FieldMemOperand(string, HeapObject::kMapOffset));
426 __ Ldrb(result, FieldMemOperand(result, Map::kInstanceTypeOffset)); 426 __ Ldrb(result, FieldMemOperand(result, Map::kInstanceTypeOffset));
427 427
428 // We need special handling for indirect strings. 428 // We need special handling for indirect strings.
429 Label check_sequential; 429 Label check_sequential;
430 __ TestAndBranchIfAllClear(result, kIsIndirectStringMask, &check_sequential); 430 __ TestAndBranchIfAllClear(result, kIsIndirectStringMask, &check_sequential);
431 431
432 // Dispatch on the indirect string shape: slice or cons. 432 // Dispatch on the indirect string shape: slice or cons.
433 Label cons_string; 433 Label cons_string;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 DoubleRegister result, 509 DoubleRegister result,
510 DoubleRegister double_temp1, 510 DoubleRegister double_temp1,
511 DoubleRegister double_temp2, 511 DoubleRegister double_temp2,
512 Register temp1, 512 Register temp1,
513 Register temp2, 513 Register temp2,
514 Register temp3) { 514 Register temp3) {
515 // TODO(jbramley): There are several instances where fnmsub could be used 515 // TODO(jbramley): There are several instances where fnmsub could be used
516 // instead of fmul and fsub. Doing this changes the result, but since this is 516 // instead of fmul and fsub. Doing this changes the result, but since this is
517 // an estimation anyway, does it matter? 517 // an estimation anyway, does it matter?
518 518
519 ASSERT(!AreAliased(input, result, 519 DCHECK(!AreAliased(input, result,
520 double_temp1, double_temp2, 520 double_temp1, double_temp2,
521 temp1, temp2, temp3)); 521 temp1, temp2, temp3));
522 ASSERT(ExternalReference::math_exp_constants(0).address() != NULL); 522 DCHECK(ExternalReference::math_exp_constants(0).address() != NULL);
523 523
524 Label done; 524 Label done;
525 DoubleRegister double_temp3 = result; 525 DoubleRegister double_temp3 = result;
526 Register constants = temp3; 526 Register constants = temp3;
527 527
528 // The algorithm used relies on some magic constants which are initialized in 528 // The algorithm used relies on some magic constants which are initialized in
529 // ExternalReference::InitializeMathExpData(). 529 // ExternalReference::InitializeMathExpData().
530 530
531 // Load the address of the start of the array. 531 // Load the address of the start of the array.
532 __ Mov(constants, ExternalReference::math_exp_constants(0)); 532 __ Mov(constants, ExternalReference::math_exp_constants(0));
533 533
534 // We have to do a four-way split here: 534 // We have to do a four-way split here:
535 // - If input <= about -708.4, the output always rounds to zero. 535 // - If input <= about -708.4, the output always rounds to zero.
536 // - If input >= about 709.8, the output always rounds to +infinity. 536 // - If input >= about 709.8, the output always rounds to +infinity.
537 // - If the input is NaN, the output is NaN. 537 // - If the input is NaN, the output is NaN.
538 // - Otherwise, the result needs to be calculated. 538 // - Otherwise, the result needs to be calculated.
539 Label result_is_finite_non_zero; 539 Label result_is_finite_non_zero;
540 // Assert that we can load offset 0 (the small input threshold) and offset 1 540 // Assert that we can load offset 0 (the small input threshold) and offset 1
541 // (the large input threshold) with a single ldp. 541 // (the large input threshold) with a single ldp.
542 ASSERT(kDRegSize == (ExpConstant(constants, 1).offset() - 542 DCHECK(kDRegSize == (ExpConstant(constants, 1).offset() -
543 ExpConstant(constants, 0).offset())); 543 ExpConstant(constants, 0).offset()));
544 __ Ldp(double_temp1, double_temp2, ExpConstant(constants, 0)); 544 __ Ldp(double_temp1, double_temp2, ExpConstant(constants, 0));
545 545
546 __ Fcmp(input, double_temp1); 546 __ Fcmp(input, double_temp1);
547 __ Fccmp(input, double_temp2, NoFlag, hi); 547 __ Fccmp(input, double_temp2, NoFlag, hi);
548 // At this point, the condition flags can be in one of five states: 548 // At this point, the condition flags can be in one of five states:
549 // NZCV 549 // NZCV
550 // 1000 -708.4 < input < 709.8 result = exp(input) 550 // 1000 -708.4 < input < 709.8 result = exp(input)
551 // 0110 input == 709.8 result = +infinity 551 // 0110 input == 709.8 result = +infinity
552 // 0010 input > 709.8 result = +infinity 552 // 0010 input > 709.8 result = +infinity
553 // 0011 input is NaN result = input 553 // 0011 input is NaN result = input
554 // 0000 input <= -708.4 result = +0.0 554 // 0000 input <= -708.4 result = +0.0
555 555
556 // Continue the common case first. 'mi' tests N == 1. 556 // Continue the common case first. 'mi' tests N == 1.
557 __ B(&result_is_finite_non_zero, mi); 557 __ B(&result_is_finite_non_zero, mi);
558 558
559 // TODO(jbramley): Consider adding a +infinity register for ARM64. 559 // TODO(jbramley): Consider adding a +infinity register for ARM64.
560 __ Ldr(double_temp2, ExpConstant(constants, 2)); // Synthesize +infinity. 560 __ Ldr(double_temp2, ExpConstant(constants, 2)); // Synthesize +infinity.
561 561
562 // Select between +0.0 and +infinity. 'lo' tests C == 0. 562 // Select between +0.0 and +infinity. 'lo' tests C == 0.
563 __ Fcsel(result, fp_zero, double_temp2, lo); 563 __ Fcsel(result, fp_zero, double_temp2, lo);
564 // Select between {+0.0 or +infinity} and input. 'vc' tests V == 0. 564 // Select between {+0.0 or +infinity} and input. 'vc' tests V == 0.
565 __ Fcsel(result, result, input, vc); 565 __ Fcsel(result, result, input, vc);
566 __ B(&done); 566 __ B(&done);
567 567
568 // The rest is magic, as described in InitializeMathExpData(). 568 // The rest is magic, as described in InitializeMathExpData().
569 __ Bind(&result_is_finite_non_zero); 569 __ Bind(&result_is_finite_non_zero);
570 570
571 // Assert that we can load offset 3 and offset 4 with a single ldp. 571 // Assert that we can load offset 3 and offset 4 with a single ldp.
572 ASSERT(kDRegSize == (ExpConstant(constants, 4).offset() - 572 DCHECK(kDRegSize == (ExpConstant(constants, 4).offset() -
573 ExpConstant(constants, 3).offset())); 573 ExpConstant(constants, 3).offset()));
574 __ Ldp(double_temp1, double_temp3, ExpConstant(constants, 3)); 574 __ Ldp(double_temp1, double_temp3, ExpConstant(constants, 3));
575 __ Fmadd(double_temp1, double_temp1, input, double_temp3); 575 __ Fmadd(double_temp1, double_temp1, input, double_temp3);
576 __ Fmov(temp2.W(), double_temp1.S()); 576 __ Fmov(temp2.W(), double_temp1.S());
577 __ Fsub(double_temp1, double_temp1, double_temp3); 577 __ Fsub(double_temp1, double_temp1, double_temp3);
578 578
579 // Assert that we can load offset 5 and offset 6 with a single ldp. 579 // Assert that we can load offset 5 and offset 6 with a single ldp.
580 ASSERT(kDRegSize == (ExpConstant(constants, 6).offset() - 580 DCHECK(kDRegSize == (ExpConstant(constants, 6).offset() -
581 ExpConstant(constants, 5).offset())); 581 ExpConstant(constants, 5).offset()));
582 __ Ldp(double_temp2, double_temp3, ExpConstant(constants, 5)); 582 __ Ldp(double_temp2, double_temp3, ExpConstant(constants, 5));
583 // TODO(jbramley): Consider using Fnmsub here. 583 // TODO(jbramley): Consider using Fnmsub here.
584 __ Fmul(double_temp1, double_temp1, double_temp2); 584 __ Fmul(double_temp1, double_temp1, double_temp2);
585 __ Fsub(double_temp1, double_temp1, input); 585 __ Fsub(double_temp1, double_temp1, input);
586 586
587 __ Fmul(double_temp2, double_temp1, double_temp1); 587 __ Fmul(double_temp2, double_temp1, double_temp1);
588 __ Fsub(double_temp3, double_temp3, double_temp1); 588 __ Fsub(double_temp3, double_temp3, double_temp1);
589 __ Fmul(double_temp3, double_temp3, double_temp2); 589 __ Fmul(double_temp3, double_temp3, double_temp2);
590 590
(...skipping 25 matching lines...) Expand all
616 __ Fmul(result, double_temp3, double_temp1); 616 __ Fmul(result, double_temp3, double_temp1);
617 617
618 __ Bind(&done); 618 __ Bind(&done);
619 } 619 }
620 620
621 #undef __ 621 #undef __
622 622
623 } } // namespace v8::internal 623 } } // namespace v8::internal
624 624
625 #endif // V8_TARGET_ARCH_ARM64 625 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm64/code-stubs-arm64.cc ('k') | src/arm64/constants-arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698