| OLD | NEW | 
|     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/adapters.h" |     5 #include "src/base/adapters.h" | 
|     6 #include "src/base/bits.h" |     6 #include "src/base/bits.h" | 
|     7 #include "src/compiler/instruction-selector-impl.h" |     7 #include "src/compiler/instruction-selector-impl.h" | 
|     8 #include "src/compiler/node-matchers.h" |     8 #include "src/compiler/node-matchers.h" | 
|     9 #include "src/compiler/node-properties.h" |     9 #include "src/compiler/node-properties.h" | 
|    10  |    10  | 
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   300   } |   300   } | 
|   301  |   301  | 
|   302   DCHECK_NE(0u, input_count); |   302   DCHECK_NE(0u, input_count); | 
|   303   DCHECK_NE(0u, output_count); |   303   DCHECK_NE(0u, output_count); | 
|   304   DCHECK_GE(arraysize(inputs), input_count); |   304   DCHECK_GE(arraysize(inputs), input_count); | 
|   305   DCHECK_GE(arraysize(outputs), output_count); |   305   DCHECK_GE(arraysize(outputs), output_count); | 
|   306  |   306  | 
|   307   opcode = cont->Encode(opcode); |   307   opcode = cont->Encode(opcode); | 
|   308   if (cont->IsDeoptimize()) { |   308   if (cont->IsDeoptimize()) { | 
|   309     selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, |   309     selector->EmitDeoptimize(opcode, output_count, outputs, input_count, inputs, | 
|   310                              cont->kind(), cont->reason(), cont->frame_state()); |   310                              cont->reason(), cont->frame_state()); | 
|   311   } else { |   311   } else { | 
|   312     selector->Emit(opcode, output_count, outputs, input_count, inputs); |   312     selector->Emit(opcode, output_count, outputs, input_count, inputs); | 
|   313   } |   313   } | 
|   314 } |   314 } | 
|   315  |   315  | 
|   316 static void VisitBinop(InstructionSelector* selector, Node* node, |   316 static void VisitBinop(InstructionSelector* selector, Node* node, | 
|   317                        InstructionCode opcode, bool has_reverse_opcode, |   317                        InstructionCode opcode, bool has_reverse_opcode, | 
|   318                        InstructionCode reverse_opcode) { |   318                        InstructionCode reverse_opcode) { | 
|   319   FlagsContinuation cont; |   319   FlagsContinuation cont; | 
|   320   VisitBinop(selector, node, opcode, has_reverse_opcode, reverse_opcode, &cont); |   320   VisitBinop(selector, node, opcode, has_reverse_opcode, reverse_opcode, &cont); | 
| (...skipping 1613 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1934 // Shared routine for multiple compare operations. |  1934 // Shared routine for multiple compare operations. | 
|  1935 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |  1935 static void VisitCompare(InstructionSelector* selector, InstructionCode opcode, | 
|  1936                          InstructionOperand left, InstructionOperand right, |  1936                          InstructionOperand left, InstructionOperand right, | 
|  1937                          FlagsContinuation* cont) { |  1937                          FlagsContinuation* cont) { | 
|  1938   Mips64OperandGenerator g(selector); |  1938   Mips64OperandGenerator g(selector); | 
|  1939   opcode = cont->Encode(opcode); |  1939   opcode = cont->Encode(opcode); | 
|  1940   if (cont->IsBranch()) { |  1940   if (cont->IsBranch()) { | 
|  1941     selector->Emit(opcode, g.NoOutput(), left, right, |  1941     selector->Emit(opcode, g.NoOutput(), left, right, | 
|  1942                    g.Label(cont->true_block()), g.Label(cont->false_block())); |  1942                    g.Label(cont->true_block()), g.Label(cont->false_block())); | 
|  1943   } else if (cont->IsDeoptimize()) { |  1943   } else if (cont->IsDeoptimize()) { | 
|  1944     selector->EmitDeoptimize(opcode, g.NoOutput(), left, right, cont->kind(), |  1944     selector->EmitDeoptimize(opcode, g.NoOutput(), left, right, cont->reason(), | 
|  1945                              cont->reason(), cont->frame_state()); |  1945                              cont->frame_state()); | 
|  1946   } else if (cont->IsSet()) { |  1946   } else if (cont->IsSet()) { | 
|  1947     selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right); |  1947     selector->Emit(opcode, g.DefineAsRegister(cont->result()), left, right); | 
|  1948   } else { |  1948   } else { | 
|  1949     DCHECK(cont->IsTrap()); |  1949     DCHECK(cont->IsTrap()); | 
|  1950     selector->Emit(opcode, g.NoOutput(), left, right, |  1950     selector->Emit(opcode, g.NoOutput(), left, right, | 
|  1951                    g.TempImmediate(cont->trap_id())); |  1951                    g.TempImmediate(cont->trap_id())); | 
|  1952   } |  1952   } | 
|  1953 } |  1953 } | 
|  1954  |  1954  | 
|  1955  |  1955  | 
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2151 void EmitWordCompareZero(InstructionSelector* selector, Node* value, |  2151 void EmitWordCompareZero(InstructionSelector* selector, Node* value, | 
|  2152                          FlagsContinuation* cont) { |  2152                          FlagsContinuation* cont) { | 
|  2153   Mips64OperandGenerator g(selector); |  2153   Mips64OperandGenerator g(selector); | 
|  2154   InstructionCode opcode = cont->Encode(kMips64Cmp); |  2154   InstructionCode opcode = cont->Encode(kMips64Cmp); | 
|  2155   InstructionOperand const value_operand = g.UseRegister(value); |  2155   InstructionOperand const value_operand = g.UseRegister(value); | 
|  2156   if (cont->IsBranch()) { |  2156   if (cont->IsBranch()) { | 
|  2157     selector->Emit(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), |  2157     selector->Emit(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), | 
|  2158                    g.Label(cont->true_block()), g.Label(cont->false_block())); |  2158                    g.Label(cont->true_block()), g.Label(cont->false_block())); | 
|  2159   } else if (cont->IsDeoptimize()) { |  2159   } else if (cont->IsDeoptimize()) { | 
|  2160     selector->EmitDeoptimize(opcode, g.NoOutput(), value_operand, |  2160     selector->EmitDeoptimize(opcode, g.NoOutput(), value_operand, | 
|  2161                              g.TempImmediate(0), cont->kind(), cont->reason(), |  2161                              g.TempImmediate(0), cont->reason(), | 
|  2162                              cont->frame_state()); |  2162                              cont->frame_state()); | 
|  2163   } else if (cont->IsTrap()) { |  2163   } else if (cont->IsTrap()) { | 
|  2164     selector->Emit(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), |  2164     selector->Emit(opcode, g.NoOutput(), value_operand, g.TempImmediate(0), | 
|  2165                    g.TempImmediate(cont->trap_id())); |  2165                    g.TempImmediate(cont->trap_id())); | 
|  2166   } else { |  2166   } else { | 
|  2167     selector->Emit(opcode, g.DefineAsRegister(cont->result()), value_operand, |  2167     selector->Emit(opcode, g.DefineAsRegister(cont->result()), value_operand, | 
|  2168                    g.TempImmediate(0)); |  2168                    g.TempImmediate(0)); | 
|  2169   } |  2169   } | 
|  2170 } |  2170 } | 
|  2171  |  2171  | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2290  |  2290  | 
|  2291 }  // namespace |  2291 }  // namespace | 
|  2292  |  2292  | 
|  2293 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, |  2293 void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, | 
|  2294                                       BasicBlock* fbranch) { |  2294                                       BasicBlock* fbranch) { | 
|  2295   FlagsContinuation cont(kNotEqual, tbranch, fbranch); |  2295   FlagsContinuation cont(kNotEqual, tbranch, fbranch); | 
|  2296   VisitWordCompareZero(this, branch, branch->InputAt(0), &cont); |  2296   VisitWordCompareZero(this, branch, branch->InputAt(0), &cont); | 
|  2297 } |  2297 } | 
|  2298  |  2298  | 
|  2299 void InstructionSelector::VisitDeoptimizeIf(Node* node) { |  2299 void InstructionSelector::VisitDeoptimizeIf(Node* node) { | 
|  2300   DeoptimizeParameters p = DeoptimizeParametersOf(node->op()); |  | 
|  2301   FlagsContinuation cont = FlagsContinuation::ForDeoptimize( |  2300   FlagsContinuation cont = FlagsContinuation::ForDeoptimize( | 
|  2302       kNotEqual, p.kind(), p.reason(), node->InputAt(1)); |  2301       kNotEqual, DeoptimizeReasonOf(node->op()), node->InputAt(1)); | 
|  2303   VisitWordCompareZero(this, node, node->InputAt(0), &cont); |  2302   VisitWordCompareZero(this, node, node->InputAt(0), &cont); | 
|  2304 } |  2303 } | 
|  2305  |  2304  | 
|  2306 void InstructionSelector::VisitDeoptimizeUnless(Node* node) { |  2305 void InstructionSelector::VisitDeoptimizeUnless(Node* node) { | 
|  2307   DeoptimizeParameters p = DeoptimizeParametersOf(node->op()); |  | 
|  2308   FlagsContinuation cont = FlagsContinuation::ForDeoptimize( |  2306   FlagsContinuation cont = FlagsContinuation::ForDeoptimize( | 
|  2309       kEqual, p.kind(), p.reason(), node->InputAt(1)); |  2307       kEqual, DeoptimizeReasonOf(node->op()), node->InputAt(1)); | 
|  2310   VisitWordCompareZero(this, node, node->InputAt(0), &cont); |  2308   VisitWordCompareZero(this, node, node->InputAt(0), &cont); | 
|  2311 } |  2309 } | 
|  2312  |  2310  | 
|  2313 void InstructionSelector::VisitTrapIf(Node* node, Runtime::FunctionId func_id) { |  2311 void InstructionSelector::VisitTrapIf(Node* node, Runtime::FunctionId func_id) { | 
|  2314   FlagsContinuation cont = |  2312   FlagsContinuation cont = | 
|  2315       FlagsContinuation::ForTrap(kNotEqual, func_id, node->InputAt(1)); |  2313       FlagsContinuation::ForTrap(kNotEqual, func_id, node->InputAt(1)); | 
|  2316   VisitWordCompareZero(this, node, node->InputAt(0), &cont); |  2314   VisitWordCompareZero(this, node, node->InputAt(0), &cont); | 
|  2317 } |  2315 } | 
|  2318  |  2316  | 
|  2319 void InstructionSelector::VisitTrapUnless(Node* node, |  2317 void InstructionSelector::VisitTrapUnless(Node* node, | 
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2642   } else { |  2640   } else { | 
|  2643     DCHECK(kArchVariant == kMips64r2); |  2641     DCHECK(kArchVariant == kMips64r2); | 
|  2644     return MachineOperatorBuilder::AlignmentRequirements:: |  2642     return MachineOperatorBuilder::AlignmentRequirements:: | 
|  2645         NoUnalignedAccessSupport(); |  2643         NoUnalignedAccessSupport(); | 
|  2646   } |  2644   } | 
|  2647 } |  2645 } | 
|  2648  |  2646  | 
|  2649 }  // namespace compiler |  2647 }  // namespace compiler | 
|  2650 }  // namespace internal |  2648 }  // namespace internal | 
|  2651 }  // namespace v8 |  2649 }  // namespace v8 | 
| OLD | NEW |