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

Side by Side Diff: src/compiler/arm64/code-generator-arm64.cc

Issue 1414183006: [turbofan] Avoid unnecessary write barriers and improve code generation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix typo. Created 5 years, 1 month 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/arm64/frames-arm64.h" 7 #include "src/arm64/frames-arm64.h"
8 #include "src/arm64/macro-assembler-arm64.h" 8 #include "src/arm64/macro-assembler-arm64.h"
9 #include "src/compiler/code-generator-impl.h" 9 #include "src/compiler/code-generator-impl.h"
10 #include "src/compiler/gap-resolver.h" 10 #include "src/compiler/gap-resolver.h"
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 OutOfLineLoadZero(CodeGenerator* gen, Register result) 248 OutOfLineLoadZero(CodeGenerator* gen, Register result)
249 : OutOfLineCode(gen), result_(result) {} 249 : OutOfLineCode(gen), result_(result) {}
250 250
251 void Generate() final { __ Mov(result_, 0); } 251 void Generate() final { __ Mov(result_, 0); }
252 252
253 private: 253 private:
254 Register const result_; 254 Register const result_;
255 }; 255 };
256 256
257 257
258 class OutOfLineRecordWrite final : public OutOfLineCode {
259 public:
260 OutOfLineRecordWrite(CodeGenerator* gen, Register object, Register index,
261 Register value, Register scratch0, Register scratch1,
262 RecordWriteMode mode)
263 : OutOfLineCode(gen),
264 object_(object),
265 index_(index),
266 value_(value),
267 scratch0_(scratch0),
268 scratch1_(scratch1),
269 mode_(mode) {}
270
271 void Generate() final {
272 if (mode_ > RecordWriteMode::kValueIsPointer) {
273 __ JumpIfSmi(value_, exit());
274 }
275 if (mode_ > RecordWriteMode::kValueIsMap) {
276 __ CheckPageFlagClear(value_, scratch0_,
277 MemoryChunk::kPointersToHereAreInterestingMask,
278 exit());
279 }
280 SaveFPRegsMode const save_fp_mode =
281 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
282 // TODO(turbofan): Once we get frame elision working, we need to save
283 // and restore lr properly here if the frame was elided.
284 RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_,
285 EMIT_REMEMBERED_SET, save_fp_mode);
286 __ Add(scratch1_, object_, index_);
287 __ CallStub(&stub);
288 }
289
290 private:
291 Register const object_;
292 Register const index_;
293 Register const value_;
294 Register const scratch0_;
295 Register const scratch1_;
296 RecordWriteMode const mode_;
297 };
298
299
258 Condition FlagsConditionToCondition(FlagsCondition condition) { 300 Condition FlagsConditionToCondition(FlagsCondition condition) {
259 switch (condition) { 301 switch (condition) {
260 case kEqual: 302 case kEqual:
261 return eq; 303 return eq;
262 case kNotEqual: 304 case kNotEqual:
263 return ne; 305 return ne;
264 case kSignedLessThan: 306 case kSignedLessThan:
265 return lt; 307 return lt;
266 case kSignedGreaterThanOrEqual: 308 case kSignedGreaterThanOrEqual:
267 return ge; 309 return ge;
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 break; 564 break;
523 case kArchStackPointer: 565 case kArchStackPointer:
524 __ mov(i.OutputRegister(), masm()->StackPointer()); 566 __ mov(i.OutputRegister(), masm()->StackPointer());
525 break; 567 break;
526 case kArchFramePointer: 568 case kArchFramePointer:
527 __ mov(i.OutputRegister(), fp); 569 __ mov(i.OutputRegister(), fp);
528 break; 570 break;
529 case kArchTruncateDoubleToI: 571 case kArchTruncateDoubleToI:
530 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); 572 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0));
531 break; 573 break;
574 case kArchStoreWithWriteBarrier: {
575 RecordWriteMode mode =
576 static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
577 Register object = i.InputRegister(0);
578 Register index = i.InputRegister(1);
579 Register value = i.InputRegister(2);
580 Register scratch0 = i.TempRegister(0);
581 Register scratch1 = i.TempRegister(1);
582 auto ool = new (zone()) OutOfLineRecordWrite(this, object, index, value,
583 scratch0, scratch1, mode);
584 __ Str(value, MemOperand(object, index));
585 __ CheckPageFlagSet(object, scratch0,
586 MemoryChunk::kPointersFromHereAreInterestingMask,
587 ool->entry());
588 __ Bind(ool->exit());
589 break;
590 }
532 case kArm64Float64RoundDown: 591 case kArm64Float64RoundDown:
533 __ Frintm(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 592 __ Frintm(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
534 break; 593 break;
535 case kArm64Float64RoundTiesAway: 594 case kArm64Float64RoundTiesAway:
536 __ Frinta(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 595 __ Frinta(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
537 break; 596 break;
538 case kArm64Float64RoundTruncate: 597 case kArm64Float64RoundTruncate:
539 __ Frintz(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); 598 __ Frintz(i.OutputDoubleRegister(), i.InputDoubleRegister(0));
540 break; 599 break;
541 case kArm64Float64RoundUp: 600 case kArm64Float64RoundUp:
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 break; 1047 break;
989 case kArm64StrS: 1048 case kArm64StrS:
990 __ Str(i.InputDoubleRegister(2).S(), i.MemoryOperand()); 1049 __ Str(i.InputDoubleRegister(2).S(), i.MemoryOperand());
991 break; 1050 break;
992 case kArm64LdrD: 1051 case kArm64LdrD:
993 __ Ldr(i.OutputDoubleRegister(), i.MemoryOperand()); 1052 __ Ldr(i.OutputDoubleRegister(), i.MemoryOperand());
994 break; 1053 break;
995 case kArm64StrD: 1054 case kArm64StrD:
996 __ Str(i.InputDoubleRegister(2), i.MemoryOperand()); 1055 __ Str(i.InputDoubleRegister(2), i.MemoryOperand());
997 break; 1056 break;
998 case kArm64StoreWriteBarrier: {
999 Register object = i.InputRegister(0);
1000 Register index = i.InputRegister(1);
1001 Register value = i.InputRegister(2);
1002 __ Add(index, object, index);
1003 __ Str(value, MemOperand(index));
1004 SaveFPRegsMode mode =
1005 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
1006 // TODO(dcarney): we shouldn't test write barriers from c calls.
1007 LinkRegisterStatus lr_status = kLRHasNotBeenSaved;
1008 UseScratchRegisterScope scope(masm());
1009 Register temp = no_reg;
1010 if (csp.is(masm()->StackPointer())) {
1011 temp = scope.AcquireX();
1012 lr_status = kLRHasBeenSaved;
1013 __ Push(lr, temp); // Need to push a pair
1014 }
1015 __ RecordWrite(object, index, value, lr_status, mode);
1016 if (csp.is(masm()->StackPointer())) {
1017 __ Pop(temp, lr);
1018 }
1019 break;
1020 }
1021 case kCheckedLoadInt8: 1057 case kCheckedLoadInt8:
1022 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsb); 1058 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsb);
1023 break; 1059 break;
1024 case kCheckedLoadUint8: 1060 case kCheckedLoadUint8:
1025 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrb); 1061 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrb);
1026 break; 1062 break;
1027 case kCheckedLoadInt16: 1063 case kCheckedLoadInt16:
1028 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh); 1064 ASSEMBLE_CHECKED_LOAD_INTEGER(Ldrsh);
1029 break; 1065 break;
1030 case kCheckedLoadUint16: 1066 case kCheckedLoadUint16:
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 padding_size -= kInstructionSize; 1499 padding_size -= kInstructionSize;
1464 } 1500 }
1465 } 1501 }
1466 } 1502 }
1467 1503
1468 #undef __ 1504 #undef __
1469 1505
1470 } // namespace compiler 1506 } // namespace compiler
1471 } // namespace internal 1507 } // namespace internal
1472 } // namespace v8 1508 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698