Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 1617503003: [Atomics] code stubs for atomic operations (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: call code stub from TF Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #if V8_TARGET_ARCH_IA32 5 #if V8_TARGET_ARCH_IA32
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/bootstrapper.h" 8 #include "src/bootstrapper.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 5728 matching lines...) Expand 10 before | Expand all | Expand 10 after
5739 ExternalReference::invoke_accessor_getter_callback(isolate()); 5739 ExternalReference::invoke_accessor_getter_callback(isolate());
5740 5740
5741 // +3 is to skip prolog, return address and name handle. 5741 // +3 is to skip prolog, return address and name handle.
5742 Operand return_value_operand( 5742 Operand return_value_operand(
5743 ebp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); 5743 ebp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize);
5744 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5744 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5745 thunk_last_arg, kStackUnwindSpace, nullptr, 5745 thunk_last_arg, kStackUnwindSpace, nullptr,
5746 return_value_operand, NULL); 5746 return_value_operand, NULL);
5747 } 5747 }
5748 5748
5749 static void GetTypedArrayBackingStore(MacroAssembler* masm,
5750 Register backing_store, Register object,
5751 Register scratch) {
5752 Label offset_is_not_smi, done;
5753 __ mov(scratch, FieldOperand(object, JSTypedArray::kBufferOffset));
5754 __ mov(backing_store,
5755 FieldOperand(scratch, JSArrayBuffer::kBackingStoreOffset));
5756
5757 __ mov(scratch, FieldOperand(object, JSArrayBufferView::kByteOffsetOffset));
5758 __ JumpIfNotSmi(scratch, &offset_is_not_smi, Label::kNear);
5759 // offset is smi
5760 __ SmiUntag(scratch);
5761 __ add(backing_store, scratch);
5762 __ jmp(&done, Label::kNear);
5763
5764 // offset is a heap number
5765 __ bind(&offset_is_not_smi);
5766 __ movsd(xmm0, FieldOperand(scratch, HeapNumber::kValueOffset));
5767 __ cvttsd2si(scratch, xmm0);
5768 __ add(backing_store, scratch);
5769 __ bind(&done);
5770 }
5771
5772
5773 static void TaggedToInteger32(MacroAssembler* masm, Register value) {
5774 Label not_smi, done;
5775 __ JumpIfNotSmi(value, &not_smi, Label::kNear);
5776 __ SmiUntag(value);
5777 __ jmp(&done, Label::kNear);
5778
5779 __ bind(&not_smi);
5780 __ movsd(xmm0, FieldOperand(value, HeapNumber::kValueOffset));
5781 __ cvttsd2si(value, xmm0);
5782 __ bind(&done);
5783 }
5784
5785
5786 static void TypedArrayJumpTablePrologue(MacroAssembler* masm, Register object,
5787 Register scratch, Register scratch2,
5788 Label* table) {
5789 __ mov(scratch, FieldOperand(object, JSObject::kElementsOffset));
5790 __ mov(scratch, FieldOperand(scratch, HeapObject::kMapOffset));
5791 __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset));
5792 __ sub(scratch, Immediate(static_cast<uint8_t>(FIXED_INT8_ARRAY_TYPE)));
5793 __ Assert(above_equal, kOffsetOutOfRange);
5794 __ jmp(Operand::JumpTable(scratch, times_4, table));
5795 }
5796
5797
5798 static void TypedArrayJumpTableEpilogue(MacroAssembler* masm, Label* table,
5799 Label* i8, Label* u8, Label* i16,
5800 Label* u16, Label* i32, Label* u32,
5801 Label* u8c) {
5802 STATIC_ASSERT(FIXED_UINT8_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 1);
5803 STATIC_ASSERT(FIXED_INT16_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 2);
5804 STATIC_ASSERT(FIXED_UINT16_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 3);
5805 STATIC_ASSERT(FIXED_INT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 4);
5806 STATIC_ASSERT(FIXED_UINT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 5);
5807 STATIC_ASSERT(FIXED_FLOAT32_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 6);
5808 STATIC_ASSERT(FIXED_FLOAT64_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 7);
5809 STATIC_ASSERT(FIXED_UINT8_CLAMPED_ARRAY_TYPE == FIXED_INT8_ARRAY_TYPE + 8);
5810
5811 Label abort;
5812 __ bind(table);
5813 __ dd(i8); // Int8Array
5814 __ dd(u8); // Uint8Array
5815 __ dd(i16); // Int16Array
5816 __ dd(u16); // Uint16Array
5817 __ dd(i32); // Int32Array
5818 __ dd(u32); // Uint32Array
5819 __ dd(&abort); // Float32Array
5820 __ dd(&abort); // Float64Array
5821 __ dd(u8); // Uint8ClampedArray
Jarin 2016/01/28 08:11:12 u8c?
binji 2016/01/28 16:20:01 Done.
5822
5823 __ bind(&abort);
5824 __ Abort(kNoReason);
5825 }
5826
5827
5828 static void ReturnInteger32(MacroAssembler* masm, XMMRegister dst,
5829 Register value, Register scratch,
5830 Label* use_heap_number) {
5831 Label not_smi;
5832 if (!value.is(eax)) {
5833 __ mov(eax, value);
5834 }
5835 __ JumpIfNotValidSmiValue(eax, scratch, &not_smi, Label::kNear);
5836 __ SmiTag(eax);
5837 __ Ret();
5838
5839 __ bind(&not_smi);
5840 __ Cvtsi2sd(dst, eax);
5841 __ jmp(use_heap_number);
5842 }
5843
5844
5845 static void ReturnUnsignedInteger32(MacroAssembler* masm,
5846 XMMRegister dst,
5847 Register value,
5848 XMMRegister scratch,
5849 Label* use_heap_number) {
5850 Label not_smi;
5851 if (!value.is(eax)) {
5852 __ mov(eax, value);
5853 }
5854 __ JumpIfUIntNotValidSmiValue(eax, &not_smi, Label::kNear);
5855 __ SmiTag(eax);
5856 __ Ret();
5857
5858 __ bind(&not_smi);
5859 // Convert [0, 2**32-1] -> [-2**31, 2**31-1]
5860 __ add(eax, Immediate(-0x7fffffff - 1)); // -0x80000000 parses incorrectly
5861 __ Cvtsi2sd(dst, eax);
5862 __ mov(eax, Immediate(0x4f000000)); // 2**31 as IEEE float
5863 __ movd(scratch, eax);
5864 __ cvtss2sd(scratch, scratch);
5865 __ addsd(dst, scratch);
5866 __ jmp(use_heap_number);
5867 }
5868
5869
5870 static void ReturnAllocatedHeapNumber(MacroAssembler* masm, XMMRegister value,
5871 Register scratch, Register scratch2) {
5872 Label call_runtime;
5873 __ AllocateHeapNumber(eax, scratch, scratch2, &call_runtime);
5874 __ movsd(FieldOperand(eax, HeapNumber::kValueOffset), value);
5875 __ Ret();
5876
5877 __ bind(&call_runtime);
5878 {
5879 FrameScope scope(masm, StackFrame::INTERNAL);
5880 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
5881 __ movsd(FieldOperand(eax, HeapNumber::kValueOffset), value);
5882 }
5883 __ Ret();
5884 }
5885
5886
5887 void AtomicsLoadStub::Generate(MacroAssembler* masm) {
5888 Register object = edx;
5889 Register backing_store = ebx;
5890 Register index = eax;
5891 Label table;
5892
5893 GetTypedArrayBackingStore(masm, backing_store, object, ecx);
5894 TaggedToInteger32(masm, index);
5895 TypedArrayJumpTablePrologue(masm, object, ecx, esi, &table);
5896
5897 Label i8, u8, i16, u16, i32, u32;
5898
5899 __ bind(&i8);
5900 __ mov_b(eax, Operand(backing_store, index, times_1, 0));
5901 __ movsx_b(eax, eax);
5902 __ SmiTag(eax);
5903 __ Ret();
5904
5905 __ bind(&u8);
5906 __ mov_b(eax, Operand(backing_store, index, times_1, 0));
5907 __ movzx_b(eax, eax);
5908 __ SmiTag(eax);
5909 __ Ret();
5910
5911 __ bind(&i16);
5912 __ mov_w(eax, Operand(backing_store, index, times_2, 0));
5913 __ movsx_w(eax, eax);
5914 __ SmiTag(eax);
5915 __ Ret();
5916
5917 __ bind(&u16);
5918 __ mov_w(eax, Operand(backing_store, index, times_2, 0));
5919 __ movzx_w(eax, eax);
5920 __ SmiTag(eax);
5921 __ Ret();
5922
5923 Label use_heap_number;
5924
5925 __ bind(&i32);
5926 __ mov(eax, Operand(backing_store, index, times_4, 0));
5927 ReturnInteger32(masm, xmm0, eax, ecx, &use_heap_number);
5928
5929 __ bind(&u32);
5930 __ mov(eax, Operand(backing_store, index, times_4, 0));
5931 ReturnUnsignedInteger32(masm, xmm0, eax, xmm1, &use_heap_number);
5932
5933 __ bind(&use_heap_number);
5934 ReturnAllocatedHeapNumber(masm, xmm0, ecx, edx);
5935
5936 TypedArrayJumpTableEpilogue(masm, &table, &i8, &u8, &i16, &u16, &i32, &u32,
5937 &u8);
5938 }
5939
5749 5940
5750 #undef __ 5941 #undef __
5751 5942
5752 } // namespace internal 5943 } // namespace internal
5753 } // namespace v8 5944 } // namespace v8
5754 5945
5755 #endif // V8_TARGET_ARCH_IA32 5946 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698