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_PPC | 8 #if V8_TARGET_ARCH_PPC |
9 | 9 |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1942 // Calculate new top using result. | 1942 // Calculate new top using result. |
1943 Add(result_end, result, object_size, r0); | 1943 Add(result_end, result, object_size, r0); |
1944 | 1944 |
1945 // The top pointer is not updated for allocation folding dominators. | 1945 // The top pointer is not updated for allocation folding dominators. |
1946 StoreP(result_end, MemOperand(top_address)); | 1946 StoreP(result_end, MemOperand(top_address)); |
1947 | 1947 |
1948 // Tag object. | 1948 // Tag object. |
1949 addi(result, result, Operand(kHeapObjectTag)); | 1949 addi(result, result, Operand(kHeapObjectTag)); |
1950 } | 1950 } |
1951 | 1951 |
1952 | |
1953 void MacroAssembler::AllocateTwoByteString(Register result, Register length, | |
1954 Register scratch1, Register scratch2, | |
1955 Register scratch3, | |
1956 Label* gc_required) { | |
1957 // Calculate the number of bytes needed for the characters in the string while | |
1958 // observing object alignment. | |
1959 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); | |
1960 slwi(scratch1, length, Operand(1)); // Length in bytes, not chars. | |
1961 addi(scratch1, scratch1, | |
1962 Operand(kObjectAlignmentMask + SeqTwoByteString::kHeaderSize)); | |
1963 mov(r0, Operand(~kObjectAlignmentMask)); | |
1964 and_(scratch1, scratch1, r0); | |
1965 | |
1966 // Allocate two-byte string in new space. | |
1967 Allocate(scratch1, result, scratch2, scratch3, gc_required, | |
1968 NO_ALLOCATION_FLAGS); | |
1969 | |
1970 // Set the map, length and hash field. | |
1971 InitializeNewString(result, length, Heap::kStringMapRootIndex, scratch1, | |
1972 scratch2); | |
1973 } | |
1974 | |
1975 | |
1976 void MacroAssembler::AllocateOneByteString(Register result, Register length, | |
1977 Register scratch1, Register scratch2, | |
1978 Register scratch3, | |
1979 Label* gc_required) { | |
1980 // Calculate the number of bytes needed for the characters in the string while | |
1981 // observing object alignment. | |
1982 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); | |
1983 DCHECK(kCharSize == 1); | |
1984 addi(scratch1, length, | |
1985 Operand(kObjectAlignmentMask + SeqOneByteString::kHeaderSize)); | |
1986 li(r0, Operand(~kObjectAlignmentMask)); | |
1987 and_(scratch1, scratch1, r0); | |
1988 | |
1989 // Allocate one-byte string in new space. | |
1990 Allocate(scratch1, result, scratch2, scratch3, gc_required, | |
1991 NO_ALLOCATION_FLAGS); | |
1992 | |
1993 // Set the map, length and hash field. | |
1994 InitializeNewString(result, length, Heap::kOneByteStringMapRootIndex, | |
1995 scratch1, scratch2); | |
1996 } | |
1997 | |
1998 | |
1999 void MacroAssembler::AllocateTwoByteConsString(Register result, Register length, | |
2000 Register scratch1, | |
2001 Register scratch2, | |
2002 Label* gc_required) { | |
2003 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | |
2004 NO_ALLOCATION_FLAGS); | |
2005 | |
2006 InitializeNewString(result, length, Heap::kConsStringMapRootIndex, scratch1, | |
2007 scratch2); | |
2008 } | |
2009 | |
2010 | |
2011 void MacroAssembler::AllocateOneByteConsString(Register result, Register length, | |
2012 Register scratch1, | |
2013 Register scratch2, | |
2014 Label* gc_required) { | |
2015 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, | |
2016 NO_ALLOCATION_FLAGS); | |
2017 | |
2018 InitializeNewString(result, length, Heap::kConsOneByteStringMapRootIndex, | |
2019 scratch1, scratch2); | |
2020 } | |
2021 | |
2022 | |
2023 void MacroAssembler::AllocateTwoByteSlicedString(Register result, | |
2024 Register length, | |
2025 Register scratch1, | |
2026 Register scratch2, | |
2027 Label* gc_required) { | |
2028 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | |
2029 NO_ALLOCATION_FLAGS); | |
2030 | |
2031 InitializeNewString(result, length, Heap::kSlicedStringMapRootIndex, scratch1, | |
2032 scratch2); | |
2033 } | |
2034 | |
2035 | |
2036 void MacroAssembler::AllocateOneByteSlicedString(Register result, | |
2037 Register length, | |
2038 Register scratch1, | |
2039 Register scratch2, | |
2040 Label* gc_required) { | |
2041 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, | |
2042 NO_ALLOCATION_FLAGS); | |
2043 | |
2044 InitializeNewString(result, length, Heap::kSlicedOneByteStringMapRootIndex, | |
2045 scratch1, scratch2); | |
2046 } | |
2047 | |
2048 | |
2049 void MacroAssembler::CompareObjectType(Register object, Register map, | 1952 void MacroAssembler::CompareObjectType(Register object, Register map, |
2050 Register type_reg, InstanceType type) { | 1953 Register type_reg, InstanceType type) { |
2051 const Register temp = type_reg.is(no_reg) ? r0 : type_reg; | 1954 const Register temp = type_reg.is(no_reg) ? r0 : type_reg; |
2052 | 1955 |
2053 LoadP(map, FieldMemOperand(object, HeapObject::kMapOffset)); | 1956 LoadP(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
2054 CompareInstanceType(map, temp, type); | 1957 CompareInstanceType(map, temp, type); |
2055 } | 1958 } |
2056 | 1959 |
2057 | 1960 |
2058 void MacroAssembler::CompareInstanceType(Register map, Register type_reg, | 1961 void MacroAssembler::CompareInstanceType(Register map, Register type_reg, |
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3040 const int kFlatOneByteStringTag = | 2943 const int kFlatOneByteStringTag = |
3041 kStringTag | kOneByteStringTag | kSeqStringTag; | 2944 kStringTag | kOneByteStringTag | kSeqStringTag; |
3042 andi(scratch1, first, Operand(kFlatOneByteStringMask)); | 2945 andi(scratch1, first, Operand(kFlatOneByteStringMask)); |
3043 andi(scratch2, second, Operand(kFlatOneByteStringMask)); | 2946 andi(scratch2, second, Operand(kFlatOneByteStringMask)); |
3044 cmpi(scratch1, Operand(kFlatOneByteStringTag)); | 2947 cmpi(scratch1, Operand(kFlatOneByteStringTag)); |
3045 bne(failure); | 2948 bne(failure); |
3046 cmpi(scratch2, Operand(kFlatOneByteStringTag)); | 2949 cmpi(scratch2, Operand(kFlatOneByteStringTag)); |
3047 bne(failure); | 2950 bne(failure); |
3048 } | 2951 } |
3049 | 2952 |
3050 | |
3051 void MacroAssembler::JumpIfInstanceTypeIsNotSequentialOneByte(Register type, | |
3052 Register scratch, | |
3053 Label* failure) { | |
3054 const int kFlatOneByteStringMask = | |
3055 kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask; | |
3056 const int kFlatOneByteStringTag = | |
3057 kStringTag | kOneByteStringTag | kSeqStringTag; | |
3058 andi(scratch, type, Operand(kFlatOneByteStringMask)); | |
3059 cmpi(scratch, Operand(kFlatOneByteStringTag)); | |
3060 bne(failure); | |
3061 } | |
3062 | |
3063 static const int kRegisterPassedArguments = 8; | 2953 static const int kRegisterPassedArguments = 8; |
3064 | 2954 |
3065 | 2955 |
3066 int MacroAssembler::CalculateStackPassedWords(int num_reg_arguments, | 2956 int MacroAssembler::CalculateStackPassedWords(int num_reg_arguments, |
3067 int num_double_arguments) { | 2957 int num_double_arguments) { |
3068 int stack_passed_words = 0; | 2958 int stack_passed_words = 0; |
3069 if (num_double_arguments > DoubleRegister::kNumRegisters) { | 2959 if (num_double_arguments > DoubleRegister::kNumRegisters) { |
3070 stack_passed_words += | 2960 stack_passed_words += |
3071 2 * (num_double_arguments - DoubleRegister::kNumRegisters); | 2961 2 * (num_double_arguments - DoubleRegister::kNumRegisters); |
3072 } | 2962 } |
(...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4498 } | 4388 } |
4499 if (mag.shift > 0) srawi(result, result, mag.shift); | 4389 if (mag.shift > 0) srawi(result, result, mag.shift); |
4500 ExtractBit(r0, dividend, 31); | 4390 ExtractBit(r0, dividend, 31); |
4501 add(result, result, r0); | 4391 add(result, result, r0); |
4502 } | 4392 } |
4503 | 4393 |
4504 } // namespace internal | 4394 } // namespace internal |
4505 } // namespace v8 | 4395 } // namespace v8 |
4506 | 4396 |
4507 #endif // V8_TARGET_ARCH_PPC | 4397 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |