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

Side by Side Diff: src/compiler/arm64/instruction-selector-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 | « src/compiler/arm64/code-generator-arm64.cc ('k') | no next file » | 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/instruction-selector-impl.h" 5 #include "src/compiler/instruction-selector-impl.h"
6 #include "src/compiler/node-matchers.h" 6 #include "src/compiler/node-matchers.h"
7 #include "src/compiler/node-properties.h" 7 #include "src/compiler/node-properties.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 Node* index = node->InputAt(1); 391 Node* index = node->InputAt(1);
392 Node* value = node->InputAt(2); 392 Node* value = node->InputAt(2);
393 393
394 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); 394 StoreRepresentation store_rep = StoreRepresentationOf(node->op());
395 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); 395 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
396 MachineRepresentation rep = store_rep.representation(); 396 MachineRepresentation rep = store_rep.representation();
397 397
398 // TODO(arm64): I guess this could be done in a better way. 398 // TODO(arm64): I guess this could be done in a better way.
399 if (write_barrier_kind != kNoWriteBarrier) { 399 if (write_barrier_kind != kNoWriteBarrier) {
400 DCHECK_EQ(MachineRepresentation::kTagged, rep); 400 DCHECK_EQ(MachineRepresentation::kTagged, rep);
401 AddressingMode addressing_mode;
401 InstructionOperand inputs[3]; 402 InstructionOperand inputs[3];
402 size_t input_count = 0; 403 size_t input_count = 0;
403 inputs[input_count++] = g.UseUniqueRegister(base); 404 inputs[input_count++] = g.UseUniqueRegister(base);
404 inputs[input_count++] = g.UseUniqueRegister(index); 405 // OutOfLineRecordWrite uses the index in an arithmetic instruction, so we
406 // must check kArithmeticImm as well as kLoadStoreImm64.
407 if (g.CanBeImmediate(index, kArithmeticImm) &&
408 g.CanBeImmediate(index, kLoadStoreImm64)) {
409 inputs[input_count++] = g.UseImmediate(index);
410 addressing_mode = kMode_MRI;
411 } else {
412 inputs[input_count++] = g.UseUniqueRegister(index);
413 addressing_mode = kMode_MRR;
414 }
405 inputs[input_count++] = (write_barrier_kind == kMapWriteBarrier) 415 inputs[input_count++] = (write_barrier_kind == kMapWriteBarrier)
406 ? g.UseRegister(value) 416 ? g.UseRegister(value)
407 : g.UseUniqueRegister(value); 417 : g.UseUniqueRegister(value);
408 RecordWriteMode record_write_mode = RecordWriteMode::kValueIsAny; 418 RecordWriteMode record_write_mode = RecordWriteMode::kValueIsAny;
409 switch (write_barrier_kind) { 419 switch (write_barrier_kind) {
410 case kNoWriteBarrier: 420 case kNoWriteBarrier:
411 UNREACHABLE(); 421 UNREACHABLE();
412 break; 422 break;
413 case kMapWriteBarrier: 423 case kMapWriteBarrier:
414 record_write_mode = RecordWriteMode::kValueIsMap; 424 record_write_mode = RecordWriteMode::kValueIsMap;
415 break; 425 break;
416 case kPointerWriteBarrier: 426 case kPointerWriteBarrier:
417 record_write_mode = RecordWriteMode::kValueIsPointer; 427 record_write_mode = RecordWriteMode::kValueIsPointer;
418 break; 428 break;
419 case kFullWriteBarrier: 429 case kFullWriteBarrier:
420 record_write_mode = RecordWriteMode::kValueIsAny; 430 record_write_mode = RecordWriteMode::kValueIsAny;
421 break; 431 break;
422 } 432 }
423 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; 433 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
424 size_t const temp_count = arraysize(temps); 434 size_t const temp_count = arraysize(temps);
425 InstructionCode code = kArchStoreWithWriteBarrier; 435 InstructionCode code = kArchStoreWithWriteBarrier;
436 code |= AddressingModeField::encode(addressing_mode);
426 code |= MiscField::encode(static_cast<int>(record_write_mode)); 437 code |= MiscField::encode(static_cast<int>(record_write_mode));
427 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps); 438 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps);
428 } else { 439 } else {
429 ArchOpcode opcode = kArchNop; 440 ArchOpcode opcode = kArchNop;
430 ImmediateMode immediate_mode = kNoImmediate; 441 ImmediateMode immediate_mode = kNoImmediate;
431 switch (rep) { 442 switch (rep) {
432 case MachineRepresentation::kFloat32: 443 case MachineRepresentation::kFloat32:
433 opcode = kArm64StrS; 444 opcode = kArm64StrS;
434 immediate_mode = kLoadStoreImm32; 445 immediate_mode = kLoadStoreImm32;
435 break; 446 break;
(...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after
2197 MachineOperatorBuilder::kFloat32RoundTiesEven | 2208 MachineOperatorBuilder::kFloat32RoundTiesEven |
2198 MachineOperatorBuilder::kFloat64RoundTiesEven | 2209 MachineOperatorBuilder::kFloat64RoundTiesEven |
2199 MachineOperatorBuilder::kWord32ShiftIsSafe | 2210 MachineOperatorBuilder::kWord32ShiftIsSafe |
2200 MachineOperatorBuilder::kInt32DivIsSafe | 2211 MachineOperatorBuilder::kInt32DivIsSafe |
2201 MachineOperatorBuilder::kUint32DivIsSafe; 2212 MachineOperatorBuilder::kUint32DivIsSafe;
2202 } 2213 }
2203 2214
2204 } // namespace compiler 2215 } // namespace compiler
2205 } // namespace internal 2216 } // namespace internal
2206 } // namespace v8 2217 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/arm64/code-generator-arm64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698