| 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 #if V8_TARGET_ARCH_S390 | 5 #if V8_TARGET_ARCH_S390 |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 5680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5691 ExternalReference thunk_ref = | 5691 ExternalReference thunk_ref = |
| 5692 ExternalReference::invoke_accessor_getter_callback(isolate()); | 5692 ExternalReference::invoke_accessor_getter_callback(isolate()); |
| 5693 | 5693 |
| 5694 // +3 is to skip prolog, return address and name handle. | 5694 // +3 is to skip prolog, return address and name handle. |
| 5695 MemOperand return_value_operand( | 5695 MemOperand return_value_operand( |
| 5696 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); | 5696 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); |
| 5697 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 5697 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 5698 kStackUnwindSpace, NULL, return_value_operand, NULL); | 5698 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 5699 } | 5699 } |
| 5700 | 5700 |
| 5701 namespace { | |
| 5702 | |
| 5703 void GetTypedArrayBackingStore(MacroAssembler* masm, Register backing_store, | |
| 5704 Register object, Register scratch, | |
| 5705 DoubleRegister double_scratch) { | |
| 5706 Label offset_is_not_smi, done_offset; | |
| 5707 __ LoadP(scratch, FieldMemOperand(object, JSTypedArray::kBufferOffset)); | |
| 5708 __ LoadP(backing_store, | |
| 5709 FieldMemOperand(scratch, JSArrayBuffer::kBackingStoreOffset)); | |
| 5710 __ LoadP(scratch, | |
| 5711 FieldMemOperand(object, JSArrayBufferView::kByteOffsetOffset)); | |
| 5712 __ JumpIfNotSmi(scratch, &offset_is_not_smi); | |
| 5713 // offset is smi | |
| 5714 __ SmiUntag(scratch); | |
| 5715 __ b(&done_offset, Label::kNear); | |
| 5716 | |
| 5717 // offset is a heap number | |
| 5718 __ bind(&offset_is_not_smi); | |
| 5719 __ LoadDouble(double_scratch, | |
| 5720 FieldMemOperand(scratch, HeapNumber::kValueOffset)); | |
| 5721 __ ConvertDoubleToInt64(double_scratch, | |
| 5722 #if !V8_TARGET_ARCH_S390X | |
| 5723 r0, | |
| 5724 #endif | |
| 5725 scratch, double_scratch); | |
| 5726 __ bind(&done_offset); | |
| 5727 __ AddP(backing_store, backing_store, scratch); | |
| 5728 } | |
| 5729 | |
| 5730 void TypedArrayJumpTablePrologue(MacroAssembler* masm, Register object, | |
| 5731 Register scratch, Register scratch2, | |
| 5732 Label* table) { | |
| 5733 __ LoadP(scratch, FieldMemOperand(object, JSObject::kElementsOffset)); | |
| 5734 __ LoadP(scratch, FieldMemOperand(scratch, HeapObject::kMapOffset)); | |
| 5735 __ LoadlB(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); | |
| 5736 __ SubP(scratch, scratch, | |
| 5737 Operand(static_cast<uint8_t>(FIXED_INT8_ARRAY_TYPE))); | |
| 5738 if (__ emit_debug_code()) { | |
| 5739 __ CmpP(scratch, Operand::Zero()); | |
| 5740 __ Check(ge, kOffsetOutOfRange); | |
| 5741 } | |
| 5742 __ ShiftLeftP(scratch, scratch, Operand(kPointerSizeLog2)); | |
| 5743 __ larl(scratch2, table); | |
| 5744 __ LoadP(scratch, MemOperand(scratch2, scratch)); | |
| 5745 __ Jump(scratch); | |
| 5746 } | |
| 5747 | |
| 5748 void TypedArrayJumpTableEpilogue(MacroAssembler* masm, Label* table, Label* i8, | |
| 5749 Label* u8, Label* i16, Label* u16, Label* i32, | |
| 5750 Label* u32, Label* u8c) { | |
| 5751 STATIC_ASSERT(FIXED_UINT8_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 1); | |
| 5752 STATIC_ASSERT(FIXED_INT16_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 2); | |
| 5753 STATIC_ASSERT(FIXED_UINT16_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 3); | |
| 5754 STATIC_ASSERT(FIXED_INT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 4); | |
| 5755 STATIC_ASSERT(FIXED_UINT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 5); | |
| 5756 STATIC_ASSERT(FIXED_FLOAT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 6); | |
| 5757 STATIC_ASSERT(FIXED_FLOAT64_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 7); | |
| 5758 STATIC_ASSERT(FIXED_UINT8_CLAMPED_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 8); | |
| 5759 | |
| 5760 Label abort; | |
| 5761 __ bind(table); | |
| 5762 __ emit_label_addr(i8); // Int8Array | |
| 5763 __ emit_label_addr(u8); // Uint8Array | |
| 5764 __ emit_label_addr(i16); // Int16Array | |
| 5765 __ emit_label_addr(u16); // Uint16Array | |
| 5766 __ emit_label_addr(i32); // Int32Array | |
| 5767 __ emit_label_addr(u32); // Uint32Array | |
| 5768 __ emit_label_addr(&abort); // Float32Array | |
| 5769 __ emit_label_addr(&abort); // Float64Array | |
| 5770 __ emit_label_addr(u8c); // Uint8ClampedArray | |
| 5771 | |
| 5772 __ bind(&abort); | |
| 5773 __ Abort(kNoReason); | |
| 5774 } | |
| 5775 | |
| 5776 #if !V8_TARGET_ARCH_S390X | |
| 5777 void ReturnInteger32(MacroAssembler* masm, DoubleRegister dst, Register value, | |
| 5778 Label* use_heap_number) { | |
| 5779 Label not_smi; | |
| 5780 __ JumpIfNotSmiCandidate(value, r0, ¬_smi); | |
| 5781 __ SmiTag(r2, value); | |
| 5782 __ Ret(); | |
| 5783 | |
| 5784 __ bind(¬_smi); | |
| 5785 __ ConvertIntToDouble(value, dst); | |
| 5786 __ b(use_heap_number); | |
| 5787 } | |
| 5788 #endif | |
| 5789 | |
| 5790 void ReturnUnsignedInteger32(MacroAssembler* masm, DoubleRegister dst, | |
| 5791 Register value, Label* use_heap_number) { | |
| 5792 Label not_smi; | |
| 5793 __ JumpIfNotUnsignedSmiCandidate(value, r0, ¬_smi); | |
| 5794 __ SmiTag(r2, value); | |
| 5795 __ Ret(); | |
| 5796 | |
| 5797 __ bind(¬_smi); | |
| 5798 __ ConvertUnsignedIntToDouble(value, dst); | |
| 5799 __ b(use_heap_number); | |
| 5800 } | |
| 5801 | |
| 5802 void ReturnAllocatedHeapNumber(MacroAssembler* masm, DoubleRegister value, | |
| 5803 Register scratch, Register scratch2, | |
| 5804 Register scratch3) { | |
| 5805 Label call_runtime; | |
| 5806 __ LoadRoot(scratch3, Heap::kHeapNumberMapRootIndex); | |
| 5807 __ AllocateHeapNumber(r2, scratch, scratch2, scratch3, &call_runtime); | |
| 5808 __ StoreDouble(value, FieldMemOperand(r2, HeapNumber::kValueOffset)); | |
| 5809 __ Ret(); | |
| 5810 | |
| 5811 __ bind(&call_runtime); | |
| 5812 { | |
| 5813 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | |
| 5814 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); | |
| 5815 __ StoreDouble(value, FieldMemOperand(r2, HeapNumber::kValueOffset)); | |
| 5816 } | |
| 5817 __ Ret(); | |
| 5818 } | |
| 5819 | |
| 5820 } // anonymous namespace | |
| 5821 | |
| 5822 void AtomicsLoadStub::Generate(MacroAssembler* masm) { | |
| 5823 Register object = r3; | |
| 5824 Register index = r2; // Index is an untagged word32. | |
| 5825 Register backing_store = r4; | |
| 5826 Label table, i8, u8, i16, u16, i32, u32; | |
| 5827 | |
| 5828 GetTypedArrayBackingStore(masm, backing_store, object, r5, d0); | |
| 5829 TypedArrayJumpTablePrologue(masm, object, r5, r6, &table); | |
| 5830 | |
| 5831 __ bind(&i8); | |
| 5832 __ LoadB(r2, MemOperand(index, backing_store)); | |
| 5833 __ SmiTag(r2); | |
| 5834 __ Ret(); | |
| 5835 | |
| 5836 __ bind(&u8); | |
| 5837 __ LoadlB(r2, MemOperand(index, backing_store)); | |
| 5838 __ SmiTag(r2); | |
| 5839 __ Ret(); | |
| 5840 | |
| 5841 __ bind(&i16); | |
| 5842 __ ShiftLeftP(index, index, Operand(1)); | |
| 5843 __ LoadHalfWordP(r2, MemOperand(index, backing_store)); | |
| 5844 __ SmiTag(r2); | |
| 5845 __ Ret(); | |
| 5846 | |
| 5847 __ bind(&u16); | |
| 5848 __ ShiftLeftP(index, index, Operand(1)); | |
| 5849 __ LoadHalfWordP(r2, MemOperand(index, backing_store)); | |
| 5850 __ SmiTag(r2); | |
| 5851 __ Ret(); | |
| 5852 | |
| 5853 Label use_heap_number; | |
| 5854 | |
| 5855 __ bind(&i32); | |
| 5856 __ ShiftLeftP(index, index, Operand(2)); | |
| 5857 __ LoadW(r2, MemOperand(index, backing_store)); | |
| 5858 #if V8_TARGET_ARCH_S390X | |
| 5859 __ SmiTag(r2); | |
| 5860 __ Ret(); | |
| 5861 #else | |
| 5862 ReturnInteger32(masm, d0, r2, &use_heap_number); | |
| 5863 #endif | |
| 5864 | |
| 5865 __ bind(&u32); | |
| 5866 __ ShiftLeftP(index, index, Operand(2)); | |
| 5867 __ LoadW(r2, MemOperand(index, backing_store)); | |
| 5868 ReturnUnsignedInteger32(masm, d0, r2, &use_heap_number); | |
| 5869 | |
| 5870 __ bind(&use_heap_number); | |
| 5871 ReturnAllocatedHeapNumber(masm, d0, r3, r4, r5); | |
| 5872 | |
| 5873 TypedArrayJumpTableEpilogue(masm, &table, &i8, &u8, &i16, &u16, &i32, &u32, | |
| 5874 &u8); | |
| 5875 } | |
| 5876 | |
| 5877 #undef __ | 5701 #undef __ |
| 5878 | 5702 |
| 5879 } // namespace internal | 5703 } // namespace internal |
| 5880 } // namespace v8 | 5704 } // namespace v8 |
| 5881 | 5705 |
| 5882 #endif // V8_TARGET_ARCH_S390 | 5706 #endif // V8_TARGET_ARCH_S390 |
| OLD | NEW |