| 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 #ifndef V8_S390_MACRO_ASSEMBLER_S390_H_ | 5 #ifndef V8_S390_MACRO_ASSEMBLER_S390_H_ |
| 6 #define V8_S390_MACRO_ASSEMBLER_S390_H_ | 6 #define V8_S390_MACRO_ASSEMBLER_S390_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/frames.h" | 10 #include "src/frames.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 void Drop(int count); | 201 void Drop(int count); |
| 202 void Drop(Register count, Register scratch = r0); | 202 void Drop(Register count, Register scratch = r0); |
| 203 | 203 |
| 204 void Ret(int drop) { | 204 void Ret(int drop) { |
| 205 Drop(drop); | 205 Drop(drop); |
| 206 Ret(); | 206 Ret(); |
| 207 } | 207 } |
| 208 | 208 |
| 209 void Call(Label* target); | 209 void Call(Label* target); |
| 210 | 210 |
| 211 // Emit call to the code we are currently generating. | |
| 212 void CallSelf() { | |
| 213 Handle<Code> self(reinterpret_cast<Code**>(CodeObject().location())); | |
| 214 Call(self, RelocInfo::CODE_TARGET); | |
| 215 } | |
| 216 | |
| 217 // Register move. May do nothing if the registers are identical. | 211 // Register move. May do nothing if the registers are identical. |
| 218 void Move(Register dst, Smi* smi) { LoadSmiLiteral(dst, smi); } | 212 void Move(Register dst, Smi* smi) { LoadSmiLiteral(dst, smi); } |
| 219 void Move(Register dst, Handle<Object> value); | 213 void Move(Register dst, Handle<Object> value); |
| 220 void Move(Register dst, Register src, Condition cond = al); | 214 void Move(Register dst, Register src, Condition cond = al); |
| 221 void Move(DoubleRegister dst, DoubleRegister src); | 215 void Move(DoubleRegister dst, DoubleRegister src); |
| 222 | 216 |
| 223 void InsertDoubleLow(DoubleRegister dst, Register src); | 217 void InsertDoubleLow(DoubleRegister dst, Register src); |
| 224 void InsertDoubleHigh(DoubleRegister dst, Register src); | 218 void InsertDoubleHigh(DoubleRegister dst, Register src); |
| 225 | 219 |
| 226 void MultiPush(RegList regs, Register location = sp); | 220 void MultiPush(RegList regs, Register location = sp); |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 void Pop(Register src1, Register src2, Register src3, Register src4, | 585 void Pop(Register src1, Register src2, Register src3, Register src4, |
| 592 Register src5) { | 586 Register src5) { |
| 593 LoadP(src5, MemOperand(sp, 0)); | 587 LoadP(src5, MemOperand(sp, 0)); |
| 594 LoadP(src4, MemOperand(sp, kPointerSize)); | 588 LoadP(src4, MemOperand(sp, kPointerSize)); |
| 595 LoadP(src3, MemOperand(sp, 2 * kPointerSize)); | 589 LoadP(src3, MemOperand(sp, 2 * kPointerSize)); |
| 596 LoadP(src2, MemOperand(sp, 3 * kPointerSize)); | 590 LoadP(src2, MemOperand(sp, 3 * kPointerSize)); |
| 597 LoadP(src1, MemOperand(sp, 4 * kPointerSize)); | 591 LoadP(src1, MemOperand(sp, 4 * kPointerSize)); |
| 598 la(sp, MemOperand(sp, 5 * kPointerSize)); | 592 la(sp, MemOperand(sp, 5 * kPointerSize)); |
| 599 } | 593 } |
| 600 | 594 |
| 601 // Push a fixed frame, consisting of lr, fp, context and | 595 // Push a fixed frame, consisting of lr, fp, constant pool. |
| 602 // JS function / marker id if marker_reg is a valid register. | 596 void PushCommonFrame(Register marker_reg = no_reg); |
| 603 void PushFixedFrame(Register marker_reg = no_reg); | 597 |
| 604 void PopFixedFrame(Register marker_reg = no_reg); | 598 // Push a standard frame, consisting of lr, fp, constant pool, |
| 599 // context and JS function |
| 600 void PushStandardFrame(Register function_reg); |
| 601 |
| 602 void PopCommonFrame(Register marker_reg = no_reg); |
| 605 | 603 |
| 606 // Restore caller's frame pointer and return address prior to being | 604 // Restore caller's frame pointer and return address prior to being |
| 607 // overwritten by tail call stack preparation. | 605 // overwritten by tail call stack preparation. |
| 608 void RestoreFrameStateForTailCall(); | 606 void RestoreFrameStateForTailCall(); |
| 609 | 607 |
| 610 // Push and pop the registers that can hold pointers, as defined by the | 608 // Push and pop the registers that can hold pointers, as defined by the |
| 611 // RegList constant kSafepointSavedRegisters. | 609 // RegList constant kSafepointSavedRegisters. |
| 612 void PushSafepointRegisters(); | 610 void PushSafepointRegisters(); |
| 613 void PopSafepointRegisters(); | 611 void PopSafepointRegisters(); |
| 614 // Store value in register src in the safepoint stack slot for | 612 // Store value in register src in the safepoint stack slot for |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 void ConvertDoubleToUnsignedInt64( | 687 void ConvertDoubleToUnsignedInt64( |
| 690 const DoubleRegister double_input, const Register dst, | 688 const DoubleRegister double_input, const Register dst, |
| 691 const DoubleRegister double_dst, | 689 const DoubleRegister double_dst, |
| 692 FPRoundingMode rounding_mode = kRoundToZero); | 690 FPRoundingMode rounding_mode = kRoundToZero); |
| 693 void ConvertFloat32ToUnsignedInt64( | 691 void ConvertFloat32ToUnsignedInt64( |
| 694 const DoubleRegister double_input, const Register dst, | 692 const DoubleRegister double_input, const Register dst, |
| 695 const DoubleRegister double_dst, | 693 const DoubleRegister double_dst, |
| 696 FPRoundingMode rounding_mode = kRoundToZero); | 694 FPRoundingMode rounding_mode = kRoundToZero); |
| 697 #endif | 695 #endif |
| 698 | 696 |
| 697 #if !V8_TARGET_ARCH_S390X |
| 698 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, |
| 699 Register src_high, Register scratch, Register shift); |
| 700 void ShiftLeftPair(Register dst_low, Register dst_high, Register src_low, |
| 701 Register src_high, uint32_t shift); |
| 702 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, |
| 703 Register src_high, Register scratch, Register shift); |
| 704 void ShiftRightPair(Register dst_low, Register dst_high, Register src_low, |
| 705 Register src_high, uint32_t shift); |
| 706 void ShiftRightArithPair(Register dst_low, Register dst_high, |
| 707 Register src_low, Register src_high, |
| 708 Register scratch, Register shift); |
| 709 void ShiftRightArithPair(Register dst_low, Register dst_high, |
| 710 Register src_low, Register src_high, uint32_t shift); |
| 711 #endif |
| 712 |
| 699 // Generates function and stub prologue code. | 713 // Generates function and stub prologue code. |
| 700 void StubPrologue(Register base = no_reg, int prologue_offset = 0); | 714 void StubPrologue(StackFrame::Type type, Register base = no_reg, |
| 715 int prologue_offset = 0); |
| 701 void Prologue(bool code_pre_aging, Register base, int prologue_offset = 0); | 716 void Prologue(bool code_pre_aging, Register base, int prologue_offset = 0); |
| 702 | 717 |
| 703 // Enter exit frame. | 718 // Enter exit frame. |
| 704 // stack_space - extra stack space, used for parameters before call to C. | 719 // stack_space - extra stack space, used for parameters before call to C. |
| 705 // At least one slot (for the return address) should be provided. | 720 // At least one slot (for the return address) should be provided. |
| 706 void EnterExitFrame(bool save_doubles, int stack_space = 1); | 721 void EnterExitFrame(bool save_doubles, int stack_space = 1); |
| 707 | 722 |
| 708 // Leave the current exit frame. Expects the return value in r0. | 723 // Leave the current exit frame. Expects the return value in r0. |
| 709 // Expect the number of values, pushed prior to the exit frame, to | 724 // Expect the number of values, pushed prior to the exit frame, to |
| 710 // remove in a register (or no_reg, if there is nothing to remove). | 725 // remove in a register (or no_reg, if there is nothing to remove). |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 } | 827 } |
| 813 | 828 |
| 814 // --------------------------------------------------------------------------- | 829 // --------------------------------------------------------------------------- |
| 815 // JavaScript invokes | 830 // JavaScript invokes |
| 816 | 831 |
| 817 // Set up call kind marking in ecx. The method takes ecx as an | 832 // Set up call kind marking in ecx. The method takes ecx as an |
| 818 // explicit first parameter to make the code more readable at the | 833 // explicit first parameter to make the code more readable at the |
| 819 // call sites. | 834 // call sites. |
| 820 // void SetCallKind(Register dst, CallKind kind); | 835 // void SetCallKind(Register dst, CallKind kind); |
| 821 | 836 |
| 837 // Removes current frame and its arguments from the stack preserving |
| 838 // the arguments and a return address pushed to the stack for the next call. |
| 839 // Both |callee_args_count| and |caller_args_count_reg| do not include |
| 840 // receiver. |callee_args_count| is not modified, |caller_args_count_reg| |
| 841 // is trashed. |
| 842 void PrepareForTailCall(const ParameterCount& callee_args_count, |
| 843 Register caller_args_count_reg, Register scratch0, |
| 844 Register scratch1); |
| 845 |
| 822 // Invoke the JavaScript function code by either calling or jumping. | 846 // Invoke the JavaScript function code by either calling or jumping. |
| 823 void InvokeFunctionCode(Register function, Register new_target, | 847 void InvokeFunctionCode(Register function, Register new_target, |
| 824 const ParameterCount& expected, | 848 const ParameterCount& expected, |
| 825 const ParameterCount& actual, InvokeFlag flag, | 849 const ParameterCount& actual, InvokeFlag flag, |
| 826 const CallWrapper& call_wrapper); | 850 const CallWrapper& call_wrapper); |
| 827 | 851 |
| 828 void FloodFunctionIfStepping(Register fun, Register new_target, | 852 void FloodFunctionIfStepping(Register fun, Register new_target, |
| 829 const ParameterCount& expected, | 853 const ParameterCount& expected, |
| 830 const ParameterCount& actual); | 854 const ParameterCount& actual); |
| 831 | 855 |
| (...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1850 #define ACCESS_MASM(masm) \ | 1874 #define ACCESS_MASM(masm) \ |
| 1851 masm->stop(__FILE_LINE__); \ | 1875 masm->stop(__FILE_LINE__); \ |
| 1852 masm-> | 1876 masm-> |
| 1853 #else | 1877 #else |
| 1854 #define ACCESS_MASM(masm) masm-> | 1878 #define ACCESS_MASM(masm) masm-> |
| 1855 #endif | 1879 #endif |
| 1856 } // namespace internal | 1880 } // namespace internal |
| 1857 } // namespace v8 | 1881 } // namespace v8 |
| 1858 | 1882 |
| 1859 #endif // V8_S390_MACRO_ASSEMBLER_S390_H_ | 1883 #endif // V8_S390_MACRO_ASSEMBLER_S390_H_ |
| OLD | NEW |