| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_X64_MACRO_ASSEMBLER_X64_H_ | 5 #ifndef V8_X64_MACRO_ASSEMBLER_X64_H_ | 
| 6 #define V8_X64_MACRO_ASSEMBLER_X64_H_ | 6 #define V8_X64_MACRO_ASSEMBLER_X64_H_ | 
| 7 | 7 | 
| 8 #include "src/assembler.h" | 8 #include "src/assembler.h" | 
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" | 
| 10 #include "src/base/flags.h" | 10 #include "src/base/flags.h" | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 49   kPointersToHereMaybeInteresting, | 49   kPointersToHereMaybeInteresting, | 
| 50   kPointersToHereAreAlwaysInteresting | 50   kPointersToHereAreAlwaysInteresting | 
| 51 }; | 51 }; | 
| 52 | 52 | 
| 53 enum class SmiOperationConstraint { | 53 enum class SmiOperationConstraint { | 
| 54   kPreserveSourceRegister = 1 << 0, | 54   kPreserveSourceRegister = 1 << 0, | 
| 55   kBailoutOnNoOverflow = 1 << 1, | 55   kBailoutOnNoOverflow = 1 << 1, | 
| 56   kBailoutOnOverflow = 1 << 2 | 56   kBailoutOnOverflow = 1 << 2 | 
| 57 }; | 57 }; | 
| 58 | 58 | 
|  | 59 enum class ReturnAddressState { kOnStack, kNotOnStack }; | 
|  | 60 | 
| 59 typedef base::Flags<SmiOperationConstraint> SmiOperationConstraints; | 61 typedef base::Flags<SmiOperationConstraint> SmiOperationConstraints; | 
| 60 | 62 | 
| 61 DEFINE_OPERATORS_FOR_FLAGS(SmiOperationConstraints) | 63 DEFINE_OPERATORS_FOR_FLAGS(SmiOperationConstraints) | 
| 62 | 64 | 
| 63 #ifdef DEBUG | 65 #ifdef DEBUG | 
| 64 bool AreAliased(Register reg1, | 66 bool AreAliased(Register reg1, | 
| 65                 Register reg2, | 67                 Register reg2, | 
| 66                 Register reg3 = no_reg, | 68                 Register reg3 = no_reg, | 
| 67                 Register reg4 = no_reg, | 69                 Register reg4 = no_reg, | 
| 68                 Register reg5 = no_reg, | 70                 Register reg5 = no_reg, | 
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 363   void InitializeRootRegister() { | 365   void InitializeRootRegister() { | 
| 364     ExternalReference roots_array_start = | 366     ExternalReference roots_array_start = | 
| 365         ExternalReference::roots_array_start(isolate()); | 367         ExternalReference::roots_array_start(isolate()); | 
| 366     Move(kRootRegister, roots_array_start); | 368     Move(kRootRegister, roots_array_start); | 
| 367     addp(kRootRegister, Immediate(kRootRegisterBias)); | 369     addp(kRootRegister, Immediate(kRootRegisterBias)); | 
| 368   } | 370   } | 
| 369 | 371 | 
| 370   // --------------------------------------------------------------------------- | 372   // --------------------------------------------------------------------------- | 
| 371   // JavaScript invokes | 373   // JavaScript invokes | 
| 372 | 374 | 
|  | 375   // Removes current frame and its arguments from the stack preserving | 
|  | 376   // the arguments and a return address pushed to the stack for the next call. | 
|  | 377   // |ra_state| defines whether return address is already pushed to stack or | 
|  | 378   // not. Both |callee_args_count| and |caller_args_count_reg| do not include | 
|  | 379   // receiver. |callee_args_count| is not modified, |caller_args_count_reg| | 
|  | 380   // is trashed. | 
|  | 381   void PrepareForTailCall(const ParameterCount& callee_args_count, | 
|  | 382                           Register caller_args_count_reg, Register scratch0, | 
|  | 383                           Register scratch1, ReturnAddressState ra_state); | 
|  | 384 | 
| 373   // Invoke the JavaScript function code by either calling or jumping. | 385   // Invoke the JavaScript function code by either calling or jumping. | 
| 374   void InvokeFunctionCode(Register function, Register new_target, | 386   void InvokeFunctionCode(Register function, Register new_target, | 
| 375                           const ParameterCount& expected, | 387                           const ParameterCount& expected, | 
| 376                           const ParameterCount& actual, InvokeFlag flag, | 388                           const ParameterCount& actual, InvokeFlag flag, | 
| 377                           const CallWrapper& call_wrapper); | 389                           const CallWrapper& call_wrapper); | 
| 378 | 390 | 
| 379   void FloodFunctionIfStepping(Register fun, Register new_target, | 391   void FloodFunctionIfStepping(Register fun, Register new_target, | 
| 380                                const ParameterCount& expected, | 392                                const ParameterCount& expected, | 
| 381                                const ParameterCount& actual); | 393                                const ParameterCount& actual); | 
| 382 | 394 | 
| (...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1007   } | 1019   } | 
| 1008   int CallSize(Register target) { | 1020   int CallSize(Register target) { | 
| 1009     // Opcode: REX_opt FF /2 m64 | 1021     // Opcode: REX_opt FF /2 m64 | 
| 1010     return (target.high_bit() != 0) ? 3 : 2; | 1022     return (target.high_bit() != 0) ? 3 : 2; | 
| 1011   } | 1023   } | 
| 1012   int CallSize(const Operand& target) { | 1024   int CallSize(const Operand& target) { | 
| 1013     // Opcode: REX_opt FF /2 m64 | 1025     // Opcode: REX_opt FF /2 m64 | 
| 1014     return (target.requires_rex() ? 2 : 1) + target.operand_size(); | 1026     return (target.requires_rex() ? 2 : 1) + target.operand_size(); | 
| 1015   } | 1027   } | 
| 1016 | 1028 | 
| 1017   // Emit call to the code we are currently generating. |  | 
| 1018   void CallSelf() { |  | 
| 1019     Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location())); |  | 
| 1020     Call(self, RelocInfo::CODE_TARGET); |  | 
| 1021   } |  | 
| 1022 |  | 
| 1023   // Non-SSE2 instructions. | 1029   // Non-SSE2 instructions. | 
| 1024   void Pextrd(Register dst, XMMRegister src, int8_t imm8); | 1030   void Pextrd(Register dst, XMMRegister src, int8_t imm8); | 
| 1025   void Pinsrd(XMMRegister dst, Register src, int8_t imm8); | 1031   void Pinsrd(XMMRegister dst, Register src, int8_t imm8); | 
| 1026   void Pinsrd(XMMRegister dst, const Operand& src, int8_t imm8); | 1032   void Pinsrd(XMMRegister dst, const Operand& src, int8_t imm8); | 
| 1027 | 1033 | 
| 1028   void Lzcntq(Register dst, Register src); | 1034   void Lzcntq(Register dst, Register src); | 
| 1029   void Lzcntq(Register dst, const Operand& src); | 1035   void Lzcntq(Register dst, const Operand& src); | 
| 1030 | 1036 | 
| 1031   void Lzcntl(Register dst, Register src); | 1037   void Lzcntl(Register dst, Register src); | 
| 1032   void Lzcntl(Register dst, const Operand& src); | 1038   void Lzcntl(Register dst, const Operand& src); | 
| (...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1753   }                                                                          \ | 1759   }                                                                          \ | 
| 1754   masm-> | 1760   masm-> | 
| 1755 #else | 1761 #else | 
| 1756 #define ACCESS_MASM(masm) masm-> | 1762 #define ACCESS_MASM(masm) masm-> | 
| 1757 #endif | 1763 #endif | 
| 1758 | 1764 | 
| 1759 }  // namespace internal | 1765 }  // namespace internal | 
| 1760 }  // namespace v8 | 1766 }  // namespace v8 | 
| 1761 | 1767 | 
| 1762 #endif  // V8_X64_MACRO_ASSEMBLER_X64_H_ | 1768 #endif  // V8_X64_MACRO_ASSEMBLER_X64_H_ | 
| OLD | NEW | 
|---|