| 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 |