diff options
Diffstat (limited to 'deps/v8/src/compiler/mips/instruction-selector-mips.cc')
-rw-r--r-- | deps/v8/src/compiler/mips/instruction-selector-mips.cc | 123 |
1 files changed, 53 insertions, 70 deletions
diff --git a/deps/v8/src/compiler/mips/instruction-selector-mips.cc b/deps/v8/src/compiler/mips/instruction-selector-mips.cc index 1e4b996531..3dcf708349 100644 --- a/deps/v8/src/compiler/mips/instruction-selector-mips.cc +++ b/deps/v8/src/compiler/mips/instruction-selector-mips.cc @@ -188,6 +188,8 @@ static void VisitBinop(InstructionSelector* selector, Node* node, if (cont->IsBranch()) { inputs[input_count++] = g.Label(cont->true_block()); inputs[input_count++] = g.Label(cont->false_block()); + } else if (cont->IsTrap()) { + inputs[input_count++] = g.TempImmediate(cont->trap_id()); } if (cont->IsDeoptimize()) { @@ -368,6 +370,10 @@ void InstructionSelector::VisitStore(Node* node) { } } +void InstructionSelector::VisitProtectedStore(Node* node) { + // TODO(eholk) + UNIMPLEMENTED(); +} void InstructionSelector::VisitWord32And(Node* node) { MipsOperandGenerator g(this); @@ -652,7 +658,7 @@ void InstructionSelector::VisitInt32Add(Node* node) { if (m.right().opcode() == IrOpcode::kWord32Shl && CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { Int32BinopMatcher mright(m.right().node()); - if (mright.right().HasValue()) { + if (mright.right().HasValue() && !m.left().HasValue()) { int32_t shift_value = static_cast<int32_t>(mright.right().Value()); Emit(kMipsLsa, g.DefineAsRegister(node), g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), g.TempImmediate(shift_value)); @@ -664,7 +670,7 @@ void InstructionSelector::VisitInt32Add(Node* node) { if (m.left().opcode() == IrOpcode::kWord32Shl && CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { Int32BinopMatcher mleft(m.left().node()); - if (mleft.right().HasValue()) { + if (mleft.right().HasValue() && !m.right().HasValue()) { int32_t shift_value = static_cast<int32_t>(mleft.right().Value()); Emit(kMipsLsa, g.DefineAsRegister(node), g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), g.TempImmediate(shift_value)); @@ -900,35 +906,23 @@ void InstructionSelector::VisitBitcastInt32ToFloat32(Node* node) { void InstructionSelector::VisitFloat32Add(Node* node) { MipsOperandGenerator g(this); - Float32BinopMatcher m(node); - if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { - // For Add.S(Mul.S(x, y), z): - Float32BinopMatcher mleft(m.left().node()); - if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(z, x, y). + if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(z, x, y). + Float32BinopMatcher m(node); + if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { + // For Add.S(Mul.S(x, y), z): + Float32BinopMatcher mleft(m.left().node()); Emit(kMipsMaddS, g.DefineAsRegister(node), g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), g.UseRegister(mleft.right().node())); return; - } else if (IsMipsArchVariant(kMips32r6)) { // Select Maddf.S(z, x, y). - Emit(kMipsMaddfS, g.DefineSameAsFirst(node), - g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), - g.UseRegister(mleft.right().node())); - return; } - } - if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { - // For Add.S(x, Mul.S(y, z)): - Float32BinopMatcher mright(m.right().node()); - if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(x, y, z). + if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { + // For Add.S(x, Mul.S(y, z)): + Float32BinopMatcher mright(m.right().node()); Emit(kMipsMaddS, g.DefineAsRegister(node), g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), g.UseRegister(mright.right().node())); return; - } else if (IsMipsArchVariant(kMips32r6)) { // Select Maddf.S(x, y, z). - Emit(kMipsMaddfS, g.DefineSameAsFirst(node), - g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), - g.UseRegister(mright.right().node())); - return; } } VisitRRR(this, kMipsAddS, node); @@ -937,35 +931,23 @@ void InstructionSelector::VisitFloat32Add(Node* node) { void InstructionSelector::VisitFloat64Add(Node* node) { MipsOperandGenerator g(this); - Float64BinopMatcher m(node); - if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { - // For Add.D(Mul.D(x, y), z): - Float64BinopMatcher mleft(m.left().node()); - if (IsMipsArchVariant(kMips32r2)) { // Select Madd.D(z, x, y). + if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(z, x, y). + Float64BinopMatcher m(node); + if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { + // For Add.D(Mul.D(x, y), z): + Float64BinopMatcher mleft(m.left().node()); Emit(kMipsMaddD, g.DefineAsRegister(node), g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), g.UseRegister(mleft.right().node())); return; - } else if (IsMipsArchVariant(kMips32r6)) { // Select Maddf.D(z, x, y). - Emit(kMipsMaddfD, g.DefineSameAsFirst(node), - g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), - g.UseRegister(mleft.right().node())); - return; } - } - if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { - // For Add.D(x, Mul.D(y, z)): - Float64BinopMatcher mright(m.right().node()); - if (IsMipsArchVariant(kMips32r2)) { // Select Madd.D(x, y, z). + if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { + // For Add.D(x, Mul.D(y, z)): + Float64BinopMatcher mright(m.right().node()); Emit(kMipsMaddD, g.DefineAsRegister(node), g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), g.UseRegister(mright.right().node())); return; - } else if (IsMipsArchVariant(kMips32r6)) { // Select Maddf.D(x, y, z). - Emit(kMipsMaddfD, g.DefineSameAsFirst(node), - g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), - g.UseRegister(mright.right().node())); - return; } } VisitRRR(this, kMipsAddD, node); @@ -974,9 +956,9 @@ void InstructionSelector::VisitFloat64Add(Node* node) { void InstructionSelector::VisitFloat32Sub(Node* node) { MipsOperandGenerator g(this); - Float32BinopMatcher m(node); - if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { - if (IsMipsArchVariant(kMips32r2)) { + if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(z, x, y). + Float32BinopMatcher m(node); + if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { // For Sub.S(Mul.S(x,y), z) select Msub.S(z, x, y). Float32BinopMatcher mleft(m.left().node()); Emit(kMipsMsubS, g.DefineAsRegister(node), @@ -984,24 +966,15 @@ void InstructionSelector::VisitFloat32Sub(Node* node) { g.UseRegister(mleft.right().node())); return; } - } else if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { - if (IsMipsArchVariant(kMips32r6)) { - // For Sub.S(x,Mul.S(y,z)) select Msubf.S(x, y, z). - Float32BinopMatcher mright(m.right().node()); - Emit(kMipsMsubfS, g.DefineSameAsFirst(node), - g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), - g.UseRegister(mright.right().node())); - return; - } } VisitRRR(this, kMipsSubS, node); } void InstructionSelector::VisitFloat64Sub(Node* node) { MipsOperandGenerator g(this); - Float64BinopMatcher m(node); - if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { - if (IsMipsArchVariant(kMips32r2)) { + if (IsMipsArchVariant(kMips32r2)) { // Select Madd.S(z, x, y). + Float64BinopMatcher m(node); + if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { // For Sub.D(Mul.S(x,y), z) select Msub.D(z, x, y). Float64BinopMatcher mleft(m.left().node()); Emit(kMipsMsubD, g.DefineAsRegister(node), @@ -1009,15 +982,6 @@ void InstructionSelector::VisitFloat64Sub(Node* node) { g.UseRegister(mleft.right().node())); return; } - } else if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { - if (IsMipsArchVariant(kMips32r6)) { - // For Sub.D(x,Mul.S(y,z)) select Msubf.D(x, y, z). - Float64BinopMatcher mright(m.right().node()); - Emit(kMipsMsubfD, g.DefineSameAsFirst(node), - g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), - g.UseRegister(mright.right().node())); - return; - } } VisitRRR(this, kMipsSubD, node); } @@ -1406,9 +1370,12 @@ static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, } else if (cont->IsDeoptimize()) { selector->EmitDeoptimize(opcode, g.NoOutput(), left, right, cont->reason(), cont->frame_state()); - } else { - DCHECK(cont->IsSet()); + } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right); + } else { + DCHECK(cont->IsTrap()); + selector->Emit(opcode, g.NoOutput(), left, right, + g.TempImmediate(cont->trap_id())); } } @@ -1616,10 +1583,13 @@ void VisitWordCompareZero(InstructionSelector* selector, Node* user, selector->EmitDeoptimize(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), cont->reason(), cont->frame_state()); - } else { - DCHECK(cont->IsSet()); + } else if (cont->IsSet()) { selector->Emit(opcode, g.DefineAsRegister(cont->result()), value_operand, g.TempImmediate(0)); + } else { + DCHECK(cont->IsTrap()); + selector->Emit(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), + g.TempImmediate(cont->trap_id())); } } @@ -1643,6 +1613,19 @@ void InstructionSelector::VisitDeoptimizeUnless(Node* node) { VisitWordCompareZero(this, node, node->InputAt(0), &cont); } +void InstructionSelector::VisitTrapIf(Node* node, Runtime::FunctionId func_id) { + FlagsContinuation cont = + FlagsContinuation::ForTrap(kNotEqual, func_id, node->InputAt(1)); + VisitWordCompareZero(this, node, node->InputAt(0), &cont); +} + +void InstructionSelector::VisitTrapUnless(Node* node, + Runtime::FunctionId func_id) { + FlagsContinuation cont = + FlagsContinuation::ForTrap(kEqual, func_id, node->InputAt(1)); + VisitWordCompareZero(this, node, node->InputAt(0), &cont); +} + void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { MipsOperandGenerator g(this); InstructionOperand value_operand = g.UseRegister(node->InputAt(0)); |