| 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 #include <assert.h> // For assert | 5 #include <assert.h> // For assert |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_S390 | 8 #if V8_TARGET_ARCH_S390 |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 1797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1808 blt(gc_required); | 1808 blt(gc_required); |
| 1809 AddP(result_end, result, Operand(object_size)); | 1809 AddP(result_end, result, Operand(object_size)); |
| 1810 } else { | 1810 } else { |
| 1811 mov(result_end, Operand(object_size)); | 1811 mov(result_end, Operand(object_size)); |
| 1812 CmpP(r0, result_end); | 1812 CmpP(r0, result_end); |
| 1813 blt(gc_required); | 1813 blt(gc_required); |
| 1814 AddP(result_end, result, result_end); | 1814 AddP(result_end, result, result_end); |
| 1815 } | 1815 } |
| 1816 StoreP(result_end, MemOperand(top_address)); | 1816 StoreP(result_end, MemOperand(top_address)); |
| 1817 | 1817 |
| 1818 // Tag object if requested. | 1818 // Tag object. |
| 1819 if ((flags & TAG_OBJECT) != 0) { | 1819 AddP(result, result, Operand(kHeapObjectTag)); |
| 1820 AddP(result, result, Operand(kHeapObjectTag)); | |
| 1821 } | |
| 1822 } | 1820 } |
| 1823 | 1821 |
| 1824 void MacroAssembler::Allocate(Register object_size, Register result, | 1822 void MacroAssembler::Allocate(Register object_size, Register result, |
| 1825 Register result_end, Register scratch, | 1823 Register result_end, Register scratch, |
| 1826 Label* gc_required, AllocationFlags flags) { | 1824 Label* gc_required, AllocationFlags flags) { |
| 1827 if (!FLAG_inline_new) { | 1825 if (!FLAG_inline_new) { |
| 1828 if (emit_debug_code()) { | 1826 if (emit_debug_code()) { |
| 1829 // Trash the registers to simulate an allocation failure. | 1827 // Trash the registers to simulate an allocation failure. |
| 1830 LoadImmP(result, Operand(0x7091)); | 1828 LoadImmP(result, Operand(0x7091)); |
| 1831 LoadImmP(scratch, Operand(0x7191)); | 1829 LoadImmP(scratch, Operand(0x7191)); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 AddP(result_end, result, object_size); | 1906 AddP(result_end, result, object_size); |
| 1909 } | 1907 } |
| 1910 | 1908 |
| 1911 // Update allocation top. result temporarily holds the new top. | 1909 // Update allocation top. result temporarily holds the new top. |
| 1912 if (emit_debug_code()) { | 1910 if (emit_debug_code()) { |
| 1913 AndP(r0, result_end, Operand(kObjectAlignmentMask)); | 1911 AndP(r0, result_end, Operand(kObjectAlignmentMask)); |
| 1914 Check(eq, kUnalignedAllocationInNewSpace, cr0); | 1912 Check(eq, kUnalignedAllocationInNewSpace, cr0); |
| 1915 } | 1913 } |
| 1916 StoreP(result_end, MemOperand(top_address)); | 1914 StoreP(result_end, MemOperand(top_address)); |
| 1917 | 1915 |
| 1918 // Tag object if requested. | 1916 // Tag object. |
| 1919 if ((flags & TAG_OBJECT) != 0) { | 1917 AddP(result, result, Operand(kHeapObjectTag)); |
| 1920 AddP(result, result, Operand(kHeapObjectTag)); | |
| 1921 } | |
| 1922 } | 1918 } |
| 1923 | 1919 |
| 1924 void MacroAssembler::AllocateTwoByteString(Register result, Register length, | 1920 void MacroAssembler::AllocateTwoByteString(Register result, Register length, |
| 1925 Register scratch1, Register scratch2, | 1921 Register scratch1, Register scratch2, |
| 1926 Register scratch3, | 1922 Register scratch3, |
| 1927 Label* gc_required) { | 1923 Label* gc_required) { |
| 1928 // Calculate the number of bytes needed for the characters in the string while | 1924 // Calculate the number of bytes needed for the characters in the string while |
| 1929 // observing object alignment. | 1925 // observing object alignment. |
| 1930 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); | 1926 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); |
| 1931 | 1927 |
| 1932 ShiftLeft(scratch1, length, Operand(1)); // Length in bytes, not chars. | 1928 ShiftLeft(scratch1, length, Operand(1)); // Length in bytes, not chars. |
| 1933 AddP(scratch1, Operand(kObjectAlignmentMask + SeqTwoByteString::kHeaderSize)); | 1929 AddP(scratch1, Operand(kObjectAlignmentMask + SeqTwoByteString::kHeaderSize)); |
| 1934 | 1930 |
| 1935 AndP(scratch1, Operand(~kObjectAlignmentMask)); | 1931 AndP(scratch1, Operand(~kObjectAlignmentMask)); |
| 1936 | 1932 |
| 1937 // Allocate two-byte string in new space. | 1933 // Allocate two-byte string in new space. |
| 1938 Allocate(scratch1, result, scratch2, scratch3, gc_required, TAG_OBJECT); | 1934 Allocate(scratch1, result, scratch2, scratch3, gc_required, |
| 1935 NO_ALLOCATION_FLAGS); |
| 1939 | 1936 |
| 1940 // Set the map, length and hash field. | 1937 // Set the map, length and hash field. |
| 1941 InitializeNewString(result, length, Heap::kStringMapRootIndex, scratch1, | 1938 InitializeNewString(result, length, Heap::kStringMapRootIndex, scratch1, |
| 1942 scratch2); | 1939 scratch2); |
| 1943 } | 1940 } |
| 1944 | 1941 |
| 1945 void MacroAssembler::AllocateOneByteString(Register result, Register length, | 1942 void MacroAssembler::AllocateOneByteString(Register result, Register length, |
| 1946 Register scratch1, Register scratch2, | 1943 Register scratch1, Register scratch2, |
| 1947 Register scratch3, | 1944 Register scratch3, |
| 1948 Label* gc_required) { | 1945 Label* gc_required) { |
| 1949 // Calculate the number of bytes needed for the characters in the string while | 1946 // Calculate the number of bytes needed for the characters in the string while |
| 1950 // observing object alignment. | 1947 // observing object alignment. |
| 1951 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); | 1948 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); |
| 1952 DCHECK(kCharSize == 1); | 1949 DCHECK(kCharSize == 1); |
| 1953 AddP(scratch1, length, | 1950 AddP(scratch1, length, |
| 1954 Operand(kObjectAlignmentMask + SeqOneByteString::kHeaderSize)); | 1951 Operand(kObjectAlignmentMask + SeqOneByteString::kHeaderSize)); |
| 1955 AndP(scratch1, Operand(~kObjectAlignmentMask)); | 1952 AndP(scratch1, Operand(~kObjectAlignmentMask)); |
| 1956 | 1953 |
| 1957 // Allocate one-byte string in new space. | 1954 // Allocate one-byte string in new space. |
| 1958 Allocate(scratch1, result, scratch2, scratch3, gc_required, TAG_OBJECT); | 1955 Allocate(scratch1, result, scratch2, scratch3, gc_required, |
| 1956 NO_ALLOCATION_FLAGS); |
| 1959 | 1957 |
| 1960 // Set the map, length and hash field. | 1958 // Set the map, length and hash field. |
| 1961 InitializeNewString(result, length, Heap::kOneByteStringMapRootIndex, | 1959 InitializeNewString(result, length, Heap::kOneByteStringMapRootIndex, |
| 1962 scratch1, scratch2); | 1960 scratch1, scratch2); |
| 1963 } | 1961 } |
| 1964 | 1962 |
| 1965 void MacroAssembler::AllocateTwoByteConsString(Register result, Register length, | 1963 void MacroAssembler::AllocateTwoByteConsString(Register result, Register length, |
| 1966 Register scratch1, | 1964 Register scratch1, |
| 1967 Register scratch2, | 1965 Register scratch2, |
| 1968 Label* gc_required) { | 1966 Label* gc_required) { |
| 1969 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | 1967 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, |
| 1970 TAG_OBJECT); | 1968 NO_ALLOCATION_FLAGS); |
| 1971 | 1969 |
| 1972 InitializeNewString(result, length, Heap::kConsStringMapRootIndex, scratch1, | 1970 InitializeNewString(result, length, Heap::kConsStringMapRootIndex, scratch1, |
| 1973 scratch2); | 1971 scratch2); |
| 1974 } | 1972 } |
| 1975 | 1973 |
| 1976 void MacroAssembler::AllocateOneByteConsString(Register result, Register length, | 1974 void MacroAssembler::AllocateOneByteConsString(Register result, Register length, |
| 1977 Register scratch1, | 1975 Register scratch1, |
| 1978 Register scratch2, | 1976 Register scratch2, |
| 1979 Label* gc_required) { | 1977 Label* gc_required) { |
| 1980 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | 1978 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, |
| 1981 TAG_OBJECT); | 1979 NO_ALLOCATION_FLAGS); |
| 1982 | 1980 |
| 1983 InitializeNewString(result, length, Heap::kConsOneByteStringMapRootIndex, | 1981 InitializeNewString(result, length, Heap::kConsOneByteStringMapRootIndex, |
| 1984 scratch1, scratch2); | 1982 scratch1, scratch2); |
| 1985 } | 1983 } |
| 1986 | 1984 |
| 1987 void MacroAssembler::AllocateTwoByteSlicedString(Register result, | 1985 void MacroAssembler::AllocateTwoByteSlicedString(Register result, |
| 1988 Register length, | 1986 Register length, |
| 1989 Register scratch1, | 1987 Register scratch1, |
| 1990 Register scratch2, | 1988 Register scratch2, |
| 1991 Label* gc_required) { | 1989 Label* gc_required) { |
| 1992 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | 1990 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, |
| 1993 TAG_OBJECT); | 1991 NO_ALLOCATION_FLAGS); |
| 1994 | 1992 |
| 1995 InitializeNewString(result, length, Heap::kSlicedStringMapRootIndex, scratch1, | 1993 InitializeNewString(result, length, Heap::kSlicedStringMapRootIndex, scratch1, |
| 1996 scratch2); | 1994 scratch2); |
| 1997 } | 1995 } |
| 1998 | 1996 |
| 1999 void MacroAssembler::AllocateOneByteSlicedString(Register result, | 1997 void MacroAssembler::AllocateOneByteSlicedString(Register result, |
| 2000 Register length, | 1998 Register length, |
| 2001 Register scratch1, | 1999 Register scratch1, |
| 2002 Register scratch2, | 2000 Register scratch2, |
| 2003 Label* gc_required) { | 2001 Label* gc_required) { |
| 2004 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | 2002 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, |
| 2005 TAG_OBJECT); | 2003 NO_ALLOCATION_FLAGS); |
| 2006 | 2004 |
| 2007 InitializeNewString(result, length, Heap::kSlicedOneByteStringMapRootIndex, | 2005 InitializeNewString(result, length, Heap::kSlicedOneByteStringMapRootIndex, |
| 2008 scratch1, scratch2); | 2006 scratch1, scratch2); |
| 2009 } | 2007 } |
| 2010 | 2008 |
| 2011 void MacroAssembler::CompareObjectType(Register object, Register map, | 2009 void MacroAssembler::CompareObjectType(Register object, Register map, |
| 2012 Register type_reg, InstanceType type) { | 2010 Register type_reg, InstanceType type) { |
| 2013 const Register temp = type_reg.is(no_reg) ? r0 : type_reg; | 2011 const Register temp = type_reg.is(no_reg) ? r0 : type_reg; |
| 2014 | 2012 |
| 2015 LoadP(map, FieldMemOperand(object, HeapObject::kMapOffset)); | 2013 LoadP(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2962 | 2960 |
| 2963 bind(&succeed); | 2961 bind(&succeed); |
| 2964 } | 2962 } |
| 2965 | 2963 |
| 2966 // Allocates a heap number or jumps to the need_gc label if the young space | 2964 // Allocates a heap number or jumps to the need_gc label if the young space |
| 2967 // is full and a scavenge is needed. | 2965 // is full and a scavenge is needed. |
| 2968 void MacroAssembler::AllocateHeapNumber(Register result, Register scratch1, | 2966 void MacroAssembler::AllocateHeapNumber(Register result, Register scratch1, |
| 2969 Register scratch2, | 2967 Register scratch2, |
| 2970 Register heap_number_map, | 2968 Register heap_number_map, |
| 2971 Label* gc_required, | 2969 Label* gc_required, |
| 2972 TaggingMode tagging_mode, | |
| 2973 MutableMode mode) { | 2970 MutableMode mode) { |
| 2974 // Allocate an object in the heap for the heap number and tag it as a heap | 2971 // Allocate an object in the heap for the heap number and tag it as a heap |
| 2975 // object. | 2972 // object. |
| 2976 Allocate(HeapNumber::kSize, result, scratch1, scratch2, gc_required, | 2973 Allocate(HeapNumber::kSize, result, scratch1, scratch2, gc_required, |
| 2977 tagging_mode == TAG_RESULT ? TAG_OBJECT : NO_ALLOCATION_FLAGS); | 2974 NO_ALLOCATION_FLAGS); |
| 2978 | 2975 |
| 2979 Heap::RootListIndex map_index = mode == MUTABLE | 2976 Heap::RootListIndex map_index = mode == MUTABLE |
| 2980 ? Heap::kMutableHeapNumberMapRootIndex | 2977 ? Heap::kMutableHeapNumberMapRootIndex |
| 2981 : Heap::kHeapNumberMapRootIndex; | 2978 : Heap::kHeapNumberMapRootIndex; |
| 2982 AssertIsRoot(heap_number_map, map_index); | 2979 AssertIsRoot(heap_number_map, map_index); |
| 2983 | 2980 |
| 2984 // Store heap number map in the allocated object. | 2981 // Store heap number map in the allocated object. |
| 2985 if (tagging_mode == TAG_RESULT) { | |
| 2986 StoreP(heap_number_map, FieldMemOperand(result, HeapObject::kMapOffset)); | 2982 StoreP(heap_number_map, FieldMemOperand(result, HeapObject::kMapOffset)); |
| 2987 } else { | |
| 2988 StoreP(heap_number_map, MemOperand(result, HeapObject::kMapOffset)); | |
| 2989 } | |
| 2990 } | 2983 } |
| 2991 | 2984 |
| 2992 void MacroAssembler::AllocateHeapNumberWithValue( | 2985 void MacroAssembler::AllocateHeapNumberWithValue( |
| 2993 Register result, DoubleRegister value, Register scratch1, Register scratch2, | 2986 Register result, DoubleRegister value, Register scratch1, Register scratch2, |
| 2994 Register heap_number_map, Label* gc_required) { | 2987 Register heap_number_map, Label* gc_required) { |
| 2995 AllocateHeapNumber(result, scratch1, scratch2, heap_number_map, gc_required); | 2988 AllocateHeapNumber(result, scratch1, scratch2, heap_number_map, gc_required); |
| 2996 StoreDouble(value, FieldMemOperand(result, HeapNumber::kValueOffset)); | 2989 StoreDouble(value, FieldMemOperand(result, HeapNumber::kValueOffset)); |
| 2997 } | 2990 } |
| 2998 | 2991 |
| 2999 void MacroAssembler::AllocateJSValue(Register result, Register constructor, | 2992 void MacroAssembler::AllocateJSValue(Register result, Register constructor, |
| 3000 Register value, Register scratch1, | 2993 Register value, Register scratch1, |
| 3001 Register scratch2, Label* gc_required) { | 2994 Register scratch2, Label* gc_required) { |
| 3002 DCHECK(!result.is(constructor)); | 2995 DCHECK(!result.is(constructor)); |
| 3003 DCHECK(!result.is(scratch1)); | 2996 DCHECK(!result.is(scratch1)); |
| 3004 DCHECK(!result.is(scratch2)); | 2997 DCHECK(!result.is(scratch2)); |
| 3005 DCHECK(!result.is(value)); | 2998 DCHECK(!result.is(value)); |
| 3006 | 2999 |
| 3007 // Allocate JSValue in new space. | 3000 // Allocate JSValue in new space. |
| 3008 Allocate(JSValue::kSize, result, scratch1, scratch2, gc_required, TAG_OBJECT); | 3001 Allocate(JSValue::kSize, result, scratch1, scratch2, gc_required, |
| 3002 NO_ALLOCATION_FLAGS); |
| 3009 | 3003 |
| 3010 // Initialize the JSValue. | 3004 // Initialize the JSValue. |
| 3011 LoadGlobalFunctionInitialMap(constructor, scratch1, scratch2); | 3005 LoadGlobalFunctionInitialMap(constructor, scratch1, scratch2); |
| 3012 StoreP(scratch1, FieldMemOperand(result, HeapObject::kMapOffset), r0); | 3006 StoreP(scratch1, FieldMemOperand(result, HeapObject::kMapOffset), r0); |
| 3013 LoadRoot(scratch1, Heap::kEmptyFixedArrayRootIndex); | 3007 LoadRoot(scratch1, Heap::kEmptyFixedArrayRootIndex); |
| 3014 StoreP(scratch1, FieldMemOperand(result, JSObject::kPropertiesOffset), r0); | 3008 StoreP(scratch1, FieldMemOperand(result, JSObject::kPropertiesOffset), r0); |
| 3015 StoreP(scratch1, FieldMemOperand(result, JSObject::kElementsOffset), r0); | 3009 StoreP(scratch1, FieldMemOperand(result, JSObject::kElementsOffset), r0); |
| 3016 StoreP(value, FieldMemOperand(result, JSValue::kValueOffset), r0); | 3010 StoreP(value, FieldMemOperand(result, JSValue::kValueOffset), r0); |
| 3017 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); | 3011 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); |
| 3018 } | 3012 } |
| (...skipping 2405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5424 } | 5418 } |
| 5425 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift)); | 5419 if (mag.shift > 0) ShiftRightArith(result, result, Operand(mag.shift)); |
| 5426 ExtractBit(r0, dividend, 31); | 5420 ExtractBit(r0, dividend, 31); |
| 5427 AddP(result, r0); | 5421 AddP(result, r0); |
| 5428 } | 5422 } |
| 5429 | 5423 |
| 5430 } // namespace internal | 5424 } // namespace internal |
| 5431 } // namespace v8 | 5425 } // namespace v8 |
| 5432 | 5426 |
| 5433 #endif // V8_TARGET_ARCH_S390 | 5427 #endif // V8_TARGET_ARCH_S390 |
| OLD | NEW |