| OLD | NEW | 
|     1 // Copyright 2013 the V8 project authors. All rights reserved. |     1 // Copyright 2013 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/v8.h" |     5 #include "src/v8.h" | 
|     6  |     6  | 
|     7 #include "src/arm64/lithium-codegen-arm64.h" |     7 #include "src/arm64/lithium-codegen-arm64.h" | 
|     8 #include "src/arm64/lithium-gap-resolver-arm64.h" |     8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 
|     9 #include "src/code-stubs.h" |     9 #include "src/code-stubs.h" | 
|    10 #include "src/stub-cache.h" |    10 #include "src/stub-cache.h" | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    49   BranchOnCondition(LCodeGen* codegen, Condition cond) |    49   BranchOnCondition(LCodeGen* codegen, Condition cond) | 
|    50     : BranchGenerator(codegen), |    50     : BranchGenerator(codegen), | 
|    51       cond_(cond) { } |    51       cond_(cond) { } | 
|    52  |    52  | 
|    53   virtual void Emit(Label* label) const { |    53   virtual void Emit(Label* label) const { | 
|    54     __ B(cond_, label); |    54     __ B(cond_, label); | 
|    55   } |    55   } | 
|    56  |    56  | 
|    57   virtual void EmitInverted(Label* label) const { |    57   virtual void EmitInverted(Label* label) const { | 
|    58     if (cond_ != al) { |    58     if (cond_ != al) { | 
|    59       __ B(InvertCondition(cond_), label); |    59       __ B(NegateCondition(cond_), label); | 
|    60     } |    60     } | 
|    61   } |    61   } | 
|    62  |    62  | 
|    63  private: |    63  private: | 
|    64   Condition cond_; |    64   Condition cond_; | 
|    65 }; |    65 }; | 
|    66  |    66  | 
|    67  |    67  | 
|    68 // Emit code to compare lhs and rhs and branch if the condition holds. |    68 // Emit code to compare lhs and rhs and branch if the condition holds. | 
|    69 // This uses MacroAssembler's CompareAndBranch function so it will handle |    69 // This uses MacroAssembler's CompareAndBranch function so it will handle | 
|    70 // converting the comparison to Cbz/Cbnz if the right-hand side is 0. |    70 // converting the comparison to Cbz/Cbnz if the right-hand side is 0. | 
|    71 // |    71 // | 
|    72 // EmitInverted still compares the two operands but inverts the condition. |    72 // EmitInverted still compares the two operands but inverts the condition. | 
|    73 class CompareAndBranch : public BranchGenerator { |    73 class CompareAndBranch : public BranchGenerator { | 
|    74  public: |    74  public: | 
|    75   CompareAndBranch(LCodeGen* codegen, |    75   CompareAndBranch(LCodeGen* codegen, | 
|    76                    Condition cond, |    76                    Condition cond, | 
|    77                    const Register& lhs, |    77                    const Register& lhs, | 
|    78                    const Operand& rhs) |    78                    const Operand& rhs) | 
|    79     : BranchGenerator(codegen), |    79     : BranchGenerator(codegen), | 
|    80       cond_(cond), |    80       cond_(cond), | 
|    81       lhs_(lhs), |    81       lhs_(lhs), | 
|    82       rhs_(rhs) { } |    82       rhs_(rhs) { } | 
|    83  |    83  | 
|    84   virtual void Emit(Label* label) const { |    84   virtual void Emit(Label* label) const { | 
|    85     __ CompareAndBranch(lhs_, rhs_, cond_, label); |    85     __ CompareAndBranch(lhs_, rhs_, cond_, label); | 
|    86   } |    86   } | 
|    87  |    87  | 
|    88   virtual void EmitInverted(Label* label) const { |    88   virtual void EmitInverted(Label* label) const { | 
|    89     __ CompareAndBranch(lhs_, rhs_, InvertCondition(cond_), label); |    89     __ CompareAndBranch(lhs_, rhs_, NegateCondition(cond_), label); | 
|    90   } |    90   } | 
|    91  |    91  | 
|    92  private: |    92  private: | 
|    93   Condition cond_; |    93   Condition cond_; | 
|    94   const Register& lhs_; |    94   const Register& lhs_; | 
|    95   const Operand& rhs_; |    95   const Operand& rhs_; | 
|    96 }; |    96 }; | 
|    97  |    97  | 
|    98  |    98  | 
|    99 // Test the input with the given mask and branch if the condition holds. |    99 // Test the input with the given mask and branch if the condition holds. | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
|   129     // The inverse of "all clear" is "any set" and vice versa. |   129     // The inverse of "all clear" is "any set" and vice versa. | 
|   130     switch (cond_) { |   130     switch (cond_) { | 
|   131       case eq: |   131       case eq: | 
|   132         __ TestAndBranchIfAnySet(value_, mask_, label); |   132         __ TestAndBranchIfAnySet(value_, mask_, label); | 
|   133         break; |   133         break; | 
|   134       case ne: |   134       case ne: | 
|   135         __ TestAndBranchIfAllClear(value_, mask_, label); |   135         __ TestAndBranchIfAllClear(value_, mask_, label); | 
|   136         break; |   136         break; | 
|   137       default: |   137       default: | 
|   138         __ Tst(value_, mask_); |   138         __ Tst(value_, mask_); | 
|   139         __ B(InvertCondition(cond_), label); |   139         __ B(NegateCondition(cond_), label); | 
|   140     } |   140     } | 
|   141   } |   141   } | 
|   142  |   142  | 
|   143  private: |   143  private: | 
|   144   Condition cond_; |   144   Condition cond_; | 
|   145   const Register& value_; |   145   const Register& value_; | 
|   146   uint64_t mask_; |   146   uint64_t mask_; | 
|   147 }; |   147 }; | 
|   148  |   148  | 
|   149  |   149  | 
| (...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1841  |  1841  | 
|  1842  |  1842  | 
|  1843 void LCodeGen::DoBoundsCheck(LBoundsCheck *instr) { |  1843 void LCodeGen::DoBoundsCheck(LBoundsCheck *instr) { | 
|  1844   Condition cond = instr->hydrogen()->allow_equality() ? hi : hs; |  1844   Condition cond = instr->hydrogen()->allow_equality() ? hi : hs; | 
|  1845   ASSERT(instr->hydrogen()->index()->representation().IsInteger32()); |  1845   ASSERT(instr->hydrogen()->index()->representation().IsInteger32()); | 
|  1846   ASSERT(instr->hydrogen()->length()->representation().IsInteger32()); |  1846   ASSERT(instr->hydrogen()->length()->representation().IsInteger32()); | 
|  1847   if (instr->index()->IsConstantOperand()) { |  1847   if (instr->index()->IsConstantOperand()) { | 
|  1848     Operand index = ToOperand32I(instr->index()); |  1848     Operand index = ToOperand32I(instr->index()); | 
|  1849     Register length = ToRegister32(instr->length()); |  1849     Register length = ToRegister32(instr->length()); | 
|  1850     __ Cmp(length, index); |  1850     __ Cmp(length, index); | 
|  1851     cond = ReverseConditionForCmp(cond); |  1851     cond = ReverseCondition(cond); | 
|  1852   } else { |  1852   } else { | 
|  1853     Register index = ToRegister32(instr->index()); |  1853     Register index = ToRegister32(instr->index()); | 
|  1854     Operand length = ToOperand32I(instr->length()); |  1854     Operand length = ToOperand32I(instr->length()); | 
|  1855     __ Cmp(index, length); |  1855     __ Cmp(index, length); | 
|  1856   } |  1856   } | 
|  1857   if (FLAG_debug_code && instr->hydrogen()->skip_check()) { |  1857   if (FLAG_debug_code && instr->hydrogen()->skip_check()) { | 
|  1858     __ Assert(InvertCondition(cond), kEliminatedBoundsCheckFailed); |  1858     __ Assert(NegateCondition(cond), kEliminatedBoundsCheckFailed); | 
|  1859   } else { |  1859   } else { | 
|  1860     DeoptimizeIf(cond, instr->environment()); |  1860     DeoptimizeIf(cond, instr->environment()); | 
|  1861   } |  1861   } | 
|  1862 } |  1862 } | 
|  1863  |  1863  | 
|  1864  |  1864  | 
|  1865 void LCodeGen::DoBranch(LBranch* instr) { |  1865 void LCodeGen::DoBranch(LBranch* instr) { | 
|  1866   Representation r = instr->hydrogen()->value()->representation(); |  1866   Representation r = instr->hydrogen()->value()->representation(); | 
|  1867   Label* true_label = instr->TrueLabel(chunk_); |  1867   Label* true_label = instr->TrueLabel(chunk_); | 
|  1868   Label* false_label = instr->FalseLabel(chunk_); |  1868   Label* false_label = instr->FalseLabel(chunk_); | 
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2482     EmitGoto(next_block); |  2482     EmitGoto(next_block); | 
|  2483   } else { |  2483   } else { | 
|  2484     if (instr->is_double()) { |  2484     if (instr->is_double()) { | 
|  2485       if (right->IsConstantOperand()) { |  2485       if (right->IsConstantOperand()) { | 
|  2486         __ Fcmp(ToDoubleRegister(left), |  2486         __ Fcmp(ToDoubleRegister(left), | 
|  2487                 ToDouble(LConstantOperand::cast(right))); |  2487                 ToDouble(LConstantOperand::cast(right))); | 
|  2488       } else if (left->IsConstantOperand()) { |  2488       } else if (left->IsConstantOperand()) { | 
|  2489         // Transpose the operands and reverse the condition. |  2489         // Transpose the operands and reverse the condition. | 
|  2490         __ Fcmp(ToDoubleRegister(right), |  2490         __ Fcmp(ToDoubleRegister(right), | 
|  2491                 ToDouble(LConstantOperand::cast(left))); |  2491                 ToDouble(LConstantOperand::cast(left))); | 
|  2492         cond = ReverseConditionForCmp(cond); |  2492         cond = ReverseCondition(cond); | 
|  2493       } else { |  2493       } else { | 
|  2494         __ Fcmp(ToDoubleRegister(left), ToDoubleRegister(right)); |  2494         __ Fcmp(ToDoubleRegister(left), ToDoubleRegister(right)); | 
|  2495       } |  2495       } | 
|  2496  |  2496  | 
|  2497       // If a NaN is involved, i.e. the result is unordered (V set), |  2497       // If a NaN is involved, i.e. the result is unordered (V set), | 
|  2498       // jump to false block label. |  2498       // jump to false block label. | 
|  2499       __ B(vs, instr->FalseLabel(chunk_)); |  2499       __ B(vs, instr->FalseLabel(chunk_)); | 
|  2500       EmitBranch(instr, cond); |  2500       EmitBranch(instr, cond); | 
|  2501     } else { |  2501     } else { | 
|  2502       if (instr->hydrogen_value()->representation().IsInteger32()) { |  2502       if (instr->hydrogen_value()->representation().IsInteger32()) { | 
|  2503         if (right->IsConstantOperand()) { |  2503         if (right->IsConstantOperand()) { | 
|  2504           EmitCompareAndBranch(instr, |  2504           EmitCompareAndBranch(instr, | 
|  2505                                cond, |  2505                                cond, | 
|  2506                                ToRegister32(left), |  2506                                ToRegister32(left), | 
|  2507                                ToOperand32I(right)); |  2507                                ToOperand32I(right)); | 
|  2508         } else { |  2508         } else { | 
|  2509           // Transpose the operands and reverse the condition. |  2509           // Transpose the operands and reverse the condition. | 
|  2510           EmitCompareAndBranch(instr, |  2510           EmitCompareAndBranch(instr, | 
|  2511                                ReverseConditionForCmp(cond), |  2511                                ReverseCondition(cond), | 
|  2512                                ToRegister32(right), |  2512                                ToRegister32(right), | 
|  2513                                ToOperand32I(left)); |  2513                                ToOperand32I(left)); | 
|  2514         } |  2514         } | 
|  2515       } else { |  2515       } else { | 
|  2516         ASSERT(instr->hydrogen_value()->representation().IsSmi()); |  2516         ASSERT(instr->hydrogen_value()->representation().IsSmi()); | 
|  2517         if (right->IsConstantOperand()) { |  2517         if (right->IsConstantOperand()) { | 
|  2518           int32_t value = ToInteger32(LConstantOperand::cast(right)); |  2518           int32_t value = ToInteger32(LConstantOperand::cast(right)); | 
|  2519           EmitCompareAndBranch(instr, |  2519           EmitCompareAndBranch(instr, | 
|  2520                                cond, |  2520                                cond, | 
|  2521                                ToRegister(left), |  2521                                ToRegister(left), | 
|  2522                                Operand(Smi::FromInt(value))); |  2522                                Operand(Smi::FromInt(value))); | 
|  2523         } else if (left->IsConstantOperand()) { |  2523         } else if (left->IsConstantOperand()) { | 
|  2524           // Transpose the operands and reverse the condition. |  2524           // Transpose the operands and reverse the condition. | 
|  2525           int32_t value = ToInteger32(LConstantOperand::cast(left)); |  2525           int32_t value = ToInteger32(LConstantOperand::cast(left)); | 
|  2526           EmitCompareAndBranch(instr, |  2526           EmitCompareAndBranch(instr, | 
|  2527                                ReverseConditionForCmp(cond), |  2527                                ReverseCondition(cond), | 
|  2528                                ToRegister(right), |  2528                                ToRegister(right), | 
|  2529                                Operand(Smi::FromInt(value))); |  2529                                Operand(Smi::FromInt(value))); | 
|  2530         } else { |  2530         } else { | 
|  2531           EmitCompareAndBranch(instr, |  2531           EmitCompareAndBranch(instr, | 
|  2532                                cond, |  2532                                cond, | 
|  2533                                ToRegister(left), |  2533                                ToRegister(left), | 
|  2534                                ToRegister(right)); |  2534                                ToRegister(right)); | 
|  2535         } |  2535         } | 
|  2536       } |  2536       } | 
|  2537     } |  2537     } | 
| (...skipping 3495 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  6033   __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |  6033   __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 
|  6034   // Index is equal to negated out of object property index plus 1. |  6034   // Index is equal to negated out of object property index plus 1. | 
|  6035   __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |  6035   __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 
|  6036   __ Ldr(result, FieldMemOperand(result, |  6036   __ Ldr(result, FieldMemOperand(result, | 
|  6037                                  FixedArray::kHeaderSize - kPointerSize)); |  6037                                  FixedArray::kHeaderSize - kPointerSize)); | 
|  6038   __ Bind(deferred->exit()); |  6038   __ Bind(deferred->exit()); | 
|  6039   __ Bind(&done); |  6039   __ Bind(&done); | 
|  6040 } |  6040 } | 
|  6041  |  6041  | 
|  6042 } }  // namespace v8::internal |  6042 } }  // namespace v8::internal | 
| OLD | NEW |