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

Side by Side Diff: src/compiler/mips/instruction-selector-mips.cc

Issue 782493002: MIPS; Improve checked load/store operators for constant offset and length. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Comments addressed. Created 6 years 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/mips/code-generator-mips.cc ('k') | src/compiler/mips64/code-generator-mips64.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/base/bits.h" 5 #include "src/base/bits.h"
6 #include "src/compiler/instruction-selector-impl.h" 6 #include "src/compiler/instruction-selector-impl.h"
7 #include "src/compiler/node-matchers.h" 7 #include "src/compiler/node-matchers.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 24 matching lines...) Expand all
35 int32_t value = m.Value(); 35 int32_t value = m.Value();
36 switch (ArchOpcodeField::decode(opcode)) { 36 switch (ArchOpcodeField::decode(opcode)) {
37 case kMipsShl: 37 case kMipsShl:
38 case kMipsSar: 38 case kMipsSar:
39 case kMipsShr: 39 case kMipsShr:
40 return is_uint5(value); 40 return is_uint5(value);
41 case kMipsXor: 41 case kMipsXor:
42 return is_uint16(value); 42 return is_uint16(value);
43 case kMipsLdc1: 43 case kMipsLdc1:
44 case kMipsSdc1: 44 case kMipsSdc1:
45 case kCheckedLoadFloat32:
46 case kCheckedLoadFloat64:
47 case kCheckedStoreFloat32:
48 case kCheckedStoreFloat64:
45 return is_int16(value + kIntSize); 49 return is_int16(value + kIntSize);
46 default: 50 default:
47 return is_int16(value); 51 return is_int16(value);
48 } 52 }
49 } 53 }
50 54
51 private: 55 private:
52 bool ImmediateFitsAddrMode1Instruction(int32_t imm) const { 56 bool ImmediateFitsAddrMode1Instruction(int32_t imm) const {
53 TRACE_UNIMPL(); 57 TRACE_UNIMPL();
54 return false; 58 return false;
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 case kRepFloat32: 510 case kRepFloat32:
507 opcode = kCheckedLoadFloat32; 511 opcode = kCheckedLoadFloat32;
508 break; 512 break;
509 case kRepFloat64: 513 case kRepFloat64:
510 opcode = kCheckedLoadFloat64; 514 opcode = kCheckedLoadFloat64;
511 break; 515 break;
512 default: 516 default:
513 UNREACHABLE(); 517 UNREACHABLE();
514 return; 518 return;
515 } 519 }
516 InstructionOperand* offset_operand = g.UseRegister(offset); 520 InstructionOperand* offset_operand = g.CanBeImmediate(offset, opcode)
521 ? g.UseImmediate(offset)
522 : g.UseRegister(offset);
523
524 InstructionOperand* length_operand =
525 (!g.CanBeImmediate(offset, opcode)) ? g.CanBeImmediate(length, opcode)
526 ? g.UseImmediate(length)
527 : g.UseRegister(length)
528 : g.UseRegister(length);
529
517 Emit(opcode | AddressingModeField::encode(kMode_MRI), 530 Emit(opcode | AddressingModeField::encode(kMode_MRI),
518 g.DefineAsRegister(node), offset_operand, g.UseRegister(length), 531 g.DefineAsRegister(node), offset_operand, length_operand,
519 g.UseRegister(buffer)); 532 g.UseRegister(buffer));
520 } 533 }
521 534
522 535
523 void InstructionSelector::VisitCheckedStore(Node* node) { 536 void InstructionSelector::VisitCheckedStore(Node* node) {
524 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); 537 MachineType rep = RepresentationOf(OpParameter<MachineType>(node));
525 MipsOperandGenerator g(this); 538 MipsOperandGenerator g(this);
526 Node* const buffer = node->InputAt(0); 539 Node* const buffer = node->InputAt(0);
527 Node* const offset = node->InputAt(1); 540 Node* const offset = node->InputAt(1);
528 Node* const length = node->InputAt(2); 541 Node* const length = node->InputAt(2);
(...skipping 12 matching lines...) Expand all
541 case kRepFloat32: 554 case kRepFloat32:
542 opcode = kCheckedStoreFloat32; 555 opcode = kCheckedStoreFloat32;
543 break; 556 break;
544 case kRepFloat64: 557 case kRepFloat64:
545 opcode = kCheckedStoreFloat64; 558 opcode = kCheckedStoreFloat64;
546 break; 559 break;
547 default: 560 default:
548 UNREACHABLE(); 561 UNREACHABLE();
549 return; 562 return;
550 } 563 }
551 InstructionOperand* offset_operand = g.UseRegister(offset); 564 InstructionOperand* offset_operand = g.CanBeImmediate(offset, opcode)
565 ? g.UseImmediate(offset)
566 : g.UseRegister(offset);
567
568 InstructionOperand* length_operand =
569 (!g.CanBeImmediate(offset, opcode)) ? g.CanBeImmediate(length, opcode)
570 ? g.UseImmediate(length)
571 : g.UseRegister(length)
572 : g.UseRegister(length);
573
552 Emit(opcode | AddressingModeField::encode(kMode_MRI), nullptr, offset_operand, 574 Emit(opcode | AddressingModeField::encode(kMode_MRI), nullptr, offset_operand,
553 g.UseRegister(length), g.UseRegister(value), g.UseRegister(buffer)); 575 length_operand, g.UseRegister(value), g.UseRegister(buffer));
554 } 576 }
555 577
556 578
557 namespace { 579 namespace {
558 580
559 // Shared routine for multiple compare operations. 581 // Shared routine for multiple compare operations.
560 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, 582 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
561 InstructionOperand* left, InstructionOperand* right, 583 InstructionOperand* left, InstructionOperand* right,
562 FlagsContinuation* cont) { 584 FlagsContinuation* cont) {
563 MipsOperandGenerator g(selector); 585 MipsOperandGenerator g(selector);
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 805
784 // static 806 // static
785 MachineOperatorBuilder::Flags 807 MachineOperatorBuilder::Flags
786 InstructionSelector::SupportedMachineOperatorFlags() { 808 InstructionSelector::SupportedMachineOperatorFlags() {
787 return MachineOperatorBuilder::kNoFlags; 809 return MachineOperatorBuilder::kNoFlags;
788 } 810 }
789 811
790 } // namespace compiler 812 } // namespace compiler
791 } // namespace internal 813 } // namespace internal
792 } // namespace v8 814 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/mips/code-generator-mips.cc ('k') | src/compiler/mips64/code-generator-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698