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

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

Issue 1671883003: [arm64] Allow immediate-index write barriers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « no previous file | src/compiler/arm64/instruction-selector-arm64.cc » ('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 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/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/compiler/code-generator-impl.h" 10 #include "src/compiler/code-generator-impl.h"
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 263
264 void Generate() final { __ Mov(result_, 0); } 264 void Generate() final { __ Mov(result_, 0); }
265 265
266 private: 266 private:
267 Register const result_; 267 Register const result_;
268 }; 268 };
269 269
270 270
271 class OutOfLineRecordWrite final : public OutOfLineCode { 271 class OutOfLineRecordWrite final : public OutOfLineCode {
272 public: 272 public:
273 OutOfLineRecordWrite(CodeGenerator* gen, Register object, Register index, 273 OutOfLineRecordWrite(CodeGenerator* gen, Register object, Operand index,
274 Register value, Register scratch0, Register scratch1, 274 Register value, Register scratch0, Register scratch1,
275 RecordWriteMode mode) 275 RecordWriteMode mode)
276 : OutOfLineCode(gen), 276 : OutOfLineCode(gen),
277 object_(object), 277 object_(object),
278 index_(index), 278 index_(index),
279 value_(value), 279 value_(value),
280 scratch0_(scratch0), 280 scratch0_(scratch0),
281 scratch1_(scratch1), 281 scratch1_(scratch1),
282 mode_(mode) {} 282 mode_(mode) {}
283 283
(...skipping 11 matching lines...) Expand all
295 // TODO(turbofan): Once we get frame elision working, we need to save 295 // TODO(turbofan): Once we get frame elision working, we need to save
296 // and restore lr properly here if the frame was elided. 296 // and restore lr properly here if the frame was elided.
297 RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_, 297 RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_,
298 EMIT_REMEMBERED_SET, save_fp_mode); 298 EMIT_REMEMBERED_SET, save_fp_mode);
299 __ Add(scratch1_, object_, index_); 299 __ Add(scratch1_, object_, index_);
300 __ CallStub(&stub); 300 __ CallStub(&stub);
301 } 301 }
302 302
303 private: 303 private:
304 Register const object_; 304 Register const object_;
305 Register const index_; 305 Operand const index_;
306 Register const value_; 306 Register const value_;
307 Register const scratch0_; 307 Register const scratch0_;
308 Register const scratch1_; 308 Register const scratch1_;
309 RecordWriteMode const mode_; 309 RecordWriteMode const mode_;
310 }; 310 };
311 311
312 312
313 Condition FlagsConditionToCondition(FlagsCondition condition) { 313 Condition FlagsConditionToCondition(FlagsCondition condition) {
314 switch (condition) { 314 switch (condition) {
315 case kEqual: 315 case kEqual:
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 break; 625 break;
626 case kArchFramePointer: 626 case kArchFramePointer:
627 __ mov(i.OutputRegister(), fp); 627 __ mov(i.OutputRegister(), fp);
628 break; 628 break;
629 case kArchTruncateDoubleToI: 629 case kArchTruncateDoubleToI:
630 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); 630 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0));
631 break; 631 break;
632 case kArchStoreWithWriteBarrier: { 632 case kArchStoreWithWriteBarrier: {
633 RecordWriteMode mode = 633 RecordWriteMode mode =
634 static_cast<RecordWriteMode>(MiscField::decode(instr->opcode())); 634 static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
635 AddressingMode addressing_mode =
636 AddressingModeField::decode(instr->opcode());
635 Register object = i.InputRegister(0); 637 Register object = i.InputRegister(0);
636 Register index = i.InputRegister(1); 638 Operand index(0);
639 if (addressing_mode == kMode_MRI) {
640 index = Operand(i.InputInt64(1));
641 } else {
642 DCHECK_EQ(addressing_mode, kMode_MRR);
643 index = Operand(i.InputRegister(1));
644 }
637 Register value = i.InputRegister(2); 645 Register value = i.InputRegister(2);
638 Register scratch0 = i.TempRegister(0); 646 Register scratch0 = i.TempRegister(0);
639 Register scratch1 = i.TempRegister(1); 647 Register scratch1 = i.TempRegister(1);
640 auto ool = new (zone()) OutOfLineRecordWrite(this, object, index, value, 648 auto ool = new (zone()) OutOfLineRecordWrite(this, object, index, value,
641 scratch0, scratch1, mode); 649 scratch0, scratch1, mode);
642 __ Str(value, MemOperand(object, index)); 650 __ Str(value, MemOperand(object, index));
643 __ CheckPageFlagSet(object, scratch0, 651 __ CheckPageFlagSet(object, scratch0,
644 MemoryChunk::kPointersFromHereAreInterestingMask, 652 MemoryChunk::kPointersFromHereAreInterestingMask,
645 ool->entry()); 653 ool->entry());
646 __ Bind(ool->exit()); 654 __ Bind(ool->exit());
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 padding_size -= kInstructionSize; 1707 padding_size -= kInstructionSize;
1700 } 1708 }
1701 } 1709 }
1702 } 1710 }
1703 1711
1704 #undef __ 1712 #undef __
1705 1713
1706 } // namespace compiler 1714 } // namespace compiler
1707 } // namespace internal 1715 } // namespace internal
1708 } // namespace v8 1716 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/arm64/instruction-selector-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698