diff options
Diffstat (limited to 'deps/v8/src/compiler/mips64/instruction-selector-mips64.cc')
-rw-r--r-- | deps/v8/src/compiler/mips64/instruction-selector-mips64.cc | 93 |
1 files changed, 83 insertions, 10 deletions
diff --git a/deps/v8/src/compiler/mips64/instruction-selector-mips64.cc b/deps/v8/src/compiler/mips64/instruction-selector-mips64.cc index 33d6f58c28..d20c1c72f6 100644 --- a/deps/v8/src/compiler/mips64/instruction-selector-mips64.cc +++ b/deps/v8/src/compiler/mips64/instruction-selector-mips64.cc @@ -286,6 +286,17 @@ void InstructionSelector::VisitWord32Sar(Node* node) { void InstructionSelector::VisitWord64Shl(Node* node) { + Mips64OperandGenerator g(this); + Int64BinopMatcher m(node); + if ((m.left().IsChangeInt32ToInt64() || m.left().IsChangeUint32ToUint64()) && + m.right().IsInRange(32, 63)) { + // There's no need to sign/zero-extend to 64-bit if we shift out the upper + // 32 bits anyway. + Emit(kMips64Dshl, g.DefineSameAsFirst(node), + g.UseRegister(m.left().node()->InputAt(0)), + g.UseImmediate(m.right().node())); + return; + } VisitRRO(this, kMips64Dshl, node); } @@ -529,6 +540,23 @@ void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { void InstructionSelector::VisitTruncateInt64ToInt32(Node* node) { Mips64OperandGenerator g(this); + Node* value = node->InputAt(0); + if (CanCover(node, value)) { + switch (value->opcode()) { + case IrOpcode::kWord64Sar: { + Int64BinopMatcher m(value); + if (m.right().IsInRange(32, 63)) { + // After smi untagging no need for truncate. Combine sequence. + Emit(kMips64Dsar, g.DefineSameAsFirst(node), + g.UseRegister(m.left().node()), g.TempImmediate(kSmiShift)); + return; + } + break; + } + default: + break; + } + } Emit(kMips64Ext, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), g.TempImmediate(0), g.TempImmediate(32)); } @@ -550,6 +578,29 @@ void InstructionSelector::VisitTruncateFloat64ToInt32(Node* node) { } +void InstructionSelector::VisitBitcastFloat32ToInt32(Node* node) { + VisitRR(this, kMips64Float64ExtractLowWord32, node); +} + + +void InstructionSelector::VisitBitcastFloat64ToInt64(Node* node) { + VisitRR(this, kMips64BitcastDL, node); +} + + +void InstructionSelector::VisitBitcastInt32ToFloat32(Node* node) { + Mips64OperandGenerator g(this); + Emit(kMips64Float64InsertLowWord32, g.DefineAsRegister(node), + ImmediateOperand(ImmediateOperand::INLINE, 0), + g.UseRegister(node->InputAt(0))); +} + + +void InstructionSelector::VisitBitcastInt64ToFloat64(Node* node) { + VisitRR(this, kMips64BitcastLD, node); +} + + void InstructionSelector::VisitFloat32Add(Node* node) { VisitRRR(this, kMips64AddS, node); } @@ -841,6 +892,9 @@ void InstructionSelector::VisitCheckedLoad(Node* node) { case kRepWord32: opcode = kCheckedLoadWord32; break; + case kRepWord64: + opcode = kCheckedLoadWord64; + break; case kRepFloat32: opcode = kCheckedLoadFloat32; break; @@ -885,6 +939,9 @@ void InstructionSelector::VisitCheckedStore(Node* node) { case kRepWord32: opcode = kCheckedStoreWord32; break; + case kRepWord64: + opcode = kCheckedStoreWord64; + break; case kRepFloat32: opcode = kCheckedStoreFloat32; break; @@ -961,12 +1018,32 @@ void VisitWordCompare(InstructionSelector* selector, Node* node, // Match immediates on left or right side of comparison. if (g.CanBeImmediate(right, opcode)) { - VisitCompare(selector, opcode, g.UseRegister(left), g.UseImmediate(right), - cont); + switch (cont->condition()) { + case kSignedLessThan: + case kSignedGreaterThanOrEqual: + case kUnsignedLessThan: + case kUnsignedGreaterThanOrEqual: + VisitCompare(selector, opcode, g.UseRegister(left), + g.UseImmediate(right), cont); + break; + default: + VisitCompare(selector, opcode, g.UseRegister(left), + g.UseRegister(right), cont); + } } else if (g.CanBeImmediate(left, opcode)) { if (!commutative) cont->Commute(); - VisitCompare(selector, opcode, g.UseRegister(right), g.UseImmediate(left), - cont); + switch (cont->condition()) { + case kSignedLessThan: + case kSignedGreaterThanOrEqual: + case kUnsignedLessThan: + case kUnsignedGreaterThanOrEqual: + VisitCompare(selector, opcode, g.UseRegister(right), + g.UseImmediate(left), cont); + break; + default: + VisitCompare(selector, opcode, g.UseRegister(right), + g.UseRegister(left), cont); + } } else { VisitCompare(selector, opcode, g.UseRegister(left), g.UseRegister(right), cont); @@ -1277,16 +1354,12 @@ void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) { - Mips64OperandGenerator g(this); - Emit(kMips64Float64ExtractLowWord32, g.DefineAsRegister(node), - g.UseRegister(node->InputAt(0))); + VisitRR(this, kMips64Float64ExtractLowWord32, node); } void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) { - Mips64OperandGenerator g(this); - Emit(kMips64Float64ExtractHighWord32, g.DefineAsRegister(node), - g.UseRegister(node->InputAt(0))); + VisitRR(this, kMips64Float64ExtractHighWord32, node); } |