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

Side by Side Diff: src/mips/macro-assembler-mips.cc

Issue 1922553002: Get rid of AllocationFlags::TAG_OBJECT (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove TAG_OBJECT from AllocationFlags Created 4 years, 8 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
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #if V8_TARGET_ARCH_MIPS 7 #if V8_TARGET_ARCH_MIPS
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/division-by-constant.h" 10 #include "src/base/division-by-constant.h"
(...skipping 3956 matching lines...) Expand 10 before | Expand all | Expand 10 after
3967 Addu(result, result, Operand(kDoubleSize / 2)); 3967 Addu(result, result, Operand(kDoubleSize / 2));
3968 bind(&aligned); 3968 bind(&aligned);
3969 } 3969 }
3970 3970
3971 // Calculate new top and bail out if new space is exhausted. Use result 3971 // Calculate new top and bail out if new space is exhausted. Use result
3972 // to calculate the new top. 3972 // to calculate the new top.
3973 Addu(result_end, result, Operand(object_size)); 3973 Addu(result_end, result, Operand(object_size));
3974 Branch(gc_required, Ugreater, result_end, Operand(alloc_limit)); 3974 Branch(gc_required, Ugreater, result_end, Operand(alloc_limit));
3975 sw(result_end, MemOperand(top_address)); 3975 sw(result_end, MemOperand(top_address));
3976 3976
3977 // Tag object if requested. 3977 // Tag object.
3978 if ((flags & TAG_OBJECT) != 0) { 3978 Addu(result, result, Operand(kHeapObjectTag));
3979 Addu(result, result, Operand(kHeapObjectTag));
3980 }
3981 } 3979 }
3982 3980
3983 3981
3984 void MacroAssembler::Allocate(Register object_size, Register result, 3982 void MacroAssembler::Allocate(Register object_size, Register result,
3985 Register result_end, Register scratch, 3983 Register result_end, Register scratch,
3986 Label* gc_required, AllocationFlags flags) { 3984 Label* gc_required, AllocationFlags flags) {
3987 if (!FLAG_inline_new) { 3985 if (!FLAG_inline_new) {
3988 if (emit_debug_code()) { 3986 if (emit_debug_code()) {
3989 // Trash the registers to simulate an allocation failure. 3987 // Trash the registers to simulate an allocation failure.
3990 li(result, 0x7091); 3988 li(result, 0x7091);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4058 } 4056 }
4059 Branch(gc_required, Ugreater, result_end, Operand(alloc_limit)); 4057 Branch(gc_required, Ugreater, result_end, Operand(alloc_limit));
4060 4058
4061 // Update allocation top. result temporarily holds the new top. 4059 // Update allocation top. result temporarily holds the new top.
4062 if (emit_debug_code()) { 4060 if (emit_debug_code()) {
4063 And(alloc_limit, result_end, Operand(kObjectAlignmentMask)); 4061 And(alloc_limit, result_end, Operand(kObjectAlignmentMask));
4064 Check(eq, kUnalignedAllocationInNewSpace, alloc_limit, Operand(zero_reg)); 4062 Check(eq, kUnalignedAllocationInNewSpace, alloc_limit, Operand(zero_reg));
4065 } 4063 }
4066 sw(result_end, MemOperand(top_address)); 4064 sw(result_end, MemOperand(top_address));
4067 4065
4068 // Tag object if requested. 4066 // Tag object.
4069 if ((flags & TAG_OBJECT) != 0) { 4067 Addu(result, result, Operand(kHeapObjectTag));
4070 Addu(result, result, Operand(kHeapObjectTag));
4071 }
4072 } 4068 }
4073 4069
4074 4070
4075 void MacroAssembler::AllocateTwoByteString(Register result, 4071 void MacroAssembler::AllocateTwoByteString(Register result,
4076 Register length, 4072 Register length,
4077 Register scratch1, 4073 Register scratch1,
4078 Register scratch2, 4074 Register scratch2,
4079 Register scratch3, 4075 Register scratch3,
4080 Label* gc_required) { 4076 Label* gc_required) {
4081 // Calculate the number of bytes needed for the characters in the string while 4077 // Calculate the number of bytes needed for the characters in the string while
4082 // observing object alignment. 4078 // observing object alignment.
4083 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0); 4079 DCHECK((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0);
4084 sll(scratch1, length, 1); // Length in bytes, not chars. 4080 sll(scratch1, length, 1); // Length in bytes, not chars.
4085 addiu(scratch1, scratch1, 4081 addiu(scratch1, scratch1,
4086 kObjectAlignmentMask + SeqTwoByteString::kHeaderSize); 4082 kObjectAlignmentMask + SeqTwoByteString::kHeaderSize);
4087 And(scratch1, scratch1, Operand(~kObjectAlignmentMask)); 4083 And(scratch1, scratch1, Operand(~kObjectAlignmentMask));
4088 4084
4089 // Allocate two-byte string in new space. 4085 // Allocate two-byte string in new space.
4090 Allocate(scratch1, 4086 Allocate(scratch1, result, scratch2, scratch3, gc_required,
4091 result, 4087 NO_ALLOCATION_FLAGS);
4092 scratch2,
4093 scratch3,
4094 gc_required,
4095 TAG_OBJECT);
4096 4088
4097 // Set the map, length and hash field. 4089 // Set the map, length and hash field.
4098 InitializeNewString(result, 4090 InitializeNewString(result,
4099 length, 4091 length,
4100 Heap::kStringMapRootIndex, 4092 Heap::kStringMapRootIndex,
4101 scratch1, 4093 scratch1,
4102 scratch2); 4094 scratch2);
4103 } 4095 }
4104 4096
4105 4097
4106 void MacroAssembler::AllocateOneByteString(Register result, Register length, 4098 void MacroAssembler::AllocateOneByteString(Register result, Register length,
4107 Register scratch1, Register scratch2, 4099 Register scratch1, Register scratch2,
4108 Register scratch3, 4100 Register scratch3,
4109 Label* gc_required) { 4101 Label* gc_required) {
4110 // Calculate the number of bytes needed for the characters in the string 4102 // Calculate the number of bytes needed for the characters in the string
4111 // while observing object alignment. 4103 // while observing object alignment.
4112 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0); 4104 DCHECK((SeqOneByteString::kHeaderSize & kObjectAlignmentMask) == 0);
4113 DCHECK(kCharSize == 1); 4105 DCHECK(kCharSize == 1);
4114 addiu(scratch1, length, kObjectAlignmentMask + SeqOneByteString::kHeaderSize); 4106 addiu(scratch1, length, kObjectAlignmentMask + SeqOneByteString::kHeaderSize);
4115 And(scratch1, scratch1, Operand(~kObjectAlignmentMask)); 4107 And(scratch1, scratch1, Operand(~kObjectAlignmentMask));
4116 4108
4117 // Allocate one-byte string in new space. 4109 // Allocate one-byte string in new space.
4118 Allocate(scratch1, 4110 Allocate(scratch1, result, scratch2, scratch3, gc_required,
4119 result, 4111 NO_ALLOCATION_FLAGS);
4120 scratch2,
4121 scratch3,
4122 gc_required,
4123 TAG_OBJECT);
4124 4112
4125 // Set the map, length and hash field. 4113 // Set the map, length and hash field.
4126 InitializeNewString(result, length, Heap::kOneByteStringMapRootIndex, 4114 InitializeNewString(result, length, Heap::kOneByteStringMapRootIndex,
4127 scratch1, scratch2); 4115 scratch1, scratch2);
4128 } 4116 }
4129 4117
4130 4118
4131 void MacroAssembler::AllocateTwoByteConsString(Register result, 4119 void MacroAssembler::AllocateTwoByteConsString(Register result,
4132 Register length, 4120 Register length,
4133 Register scratch1, 4121 Register scratch1,
4134 Register scratch2, 4122 Register scratch2,
4135 Label* gc_required) { 4123 Label* gc_required) {
4136 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, 4124 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required,
4137 TAG_OBJECT); 4125 NO_ALLOCATION_FLAGS);
4138 InitializeNewString(result, 4126 InitializeNewString(result,
4139 length, 4127 length,
4140 Heap::kConsStringMapRootIndex, 4128 Heap::kConsStringMapRootIndex,
4141 scratch1, 4129 scratch1,
4142 scratch2); 4130 scratch2);
4143 } 4131 }
4144 4132
4145 4133
4146 void MacroAssembler::AllocateOneByteConsString(Register result, Register length, 4134 void MacroAssembler::AllocateOneByteConsString(Register result, Register length,
4147 Register scratch1, 4135 Register scratch1,
4148 Register scratch2, 4136 Register scratch2,
4149 Label* gc_required) { 4137 Label* gc_required) {
4150 Allocate(ConsString::kSize, 4138 Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required,
4151 result, 4139 NO_ALLOCATION_FLAGS);
4152 scratch1,
4153 scratch2,
4154 gc_required,
4155 TAG_OBJECT);
4156 4140
4157 InitializeNewString(result, length, Heap::kConsOneByteStringMapRootIndex, 4141 InitializeNewString(result, length, Heap::kConsOneByteStringMapRootIndex,
4158 scratch1, scratch2); 4142 scratch1, scratch2);
4159 } 4143 }
4160 4144
4161 4145
4162 void MacroAssembler::AllocateTwoByteSlicedString(Register result, 4146 void MacroAssembler::AllocateTwoByteSlicedString(Register result,
4163 Register length, 4147 Register length,
4164 Register scratch1, 4148 Register scratch1,
4165 Register scratch2, 4149 Register scratch2,
4166 Label* gc_required) { 4150 Label* gc_required) {
4167 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, 4151 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required,
4168 TAG_OBJECT); 4152 NO_ALLOCATION_FLAGS);
4169 4153
4170 InitializeNewString(result, 4154 InitializeNewString(result,
4171 length, 4155 length,
4172 Heap::kSlicedStringMapRootIndex, 4156 Heap::kSlicedStringMapRootIndex,
4173 scratch1, 4157 scratch1,
4174 scratch2); 4158 scratch2);
4175 } 4159 }
4176 4160
4177 4161
4178 void MacroAssembler::AllocateOneByteSlicedString(Register result, 4162 void MacroAssembler::AllocateOneByteSlicedString(Register result,
4179 Register length, 4163 Register length,
4180 Register scratch1, 4164 Register scratch1,
4181 Register scratch2, 4165 Register scratch2,
4182 Label* gc_required) { 4166 Label* gc_required) {
4183 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, 4167 Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required,
4184 TAG_OBJECT); 4168 NO_ALLOCATION_FLAGS);
4185 4169
4186 InitializeNewString(result, length, Heap::kSlicedOneByteStringMapRootIndex, 4170 InitializeNewString(result, length, Heap::kSlicedOneByteStringMapRootIndex,
4187 scratch1, scratch2); 4171 scratch1, scratch2);
4188 } 4172 }
4189 4173
4190 4174
4191 void MacroAssembler::JumpIfNotUniqueNameInstanceType(Register reg, 4175 void MacroAssembler::JumpIfNotUniqueNameInstanceType(Register reg,
4192 Label* not_unique_name) { 4176 Label* not_unique_name) {
4193 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); 4177 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0);
4194 Label succeed; 4178 Label succeed;
4195 And(at, reg, Operand(kIsNotStringMask | kIsNotInternalizedMask)); 4179 And(at, reg, Operand(kIsNotStringMask | kIsNotInternalizedMask));
4196 Branch(&succeed, eq, at, Operand(zero_reg)); 4180 Branch(&succeed, eq, at, Operand(zero_reg));
4197 Branch(not_unique_name, ne, reg, Operand(SYMBOL_TYPE)); 4181 Branch(not_unique_name, ne, reg, Operand(SYMBOL_TYPE));
4198 4182
4199 bind(&succeed); 4183 bind(&succeed);
4200 } 4184 }
4201 4185
4202 4186
4203 // Allocates a heap number or jumps to the label if the young space is full and 4187 // Allocates a heap number or jumps to the label if the young space is full and
4204 // a scavenge is needed. 4188 // a scavenge is needed.
4205 void MacroAssembler::AllocateHeapNumber(Register result, 4189 void MacroAssembler::AllocateHeapNumber(Register result,
4206 Register scratch1, 4190 Register scratch1,
4207 Register scratch2, 4191 Register scratch2,
4208 Register heap_number_map, 4192 Register heap_number_map,
4209 Label* need_gc, 4193 Label* need_gc,
4210 TaggingMode tagging_mode,
4211 MutableMode mode) { 4194 MutableMode mode) {
4212 // Allocate an object in the heap for the heap number and tag it as a heap 4195 // Allocate an object in the heap for the heap number and tag it as a heap
4213 // object. 4196 // object.
4214 Allocate(HeapNumber::kSize, result, scratch1, scratch2, need_gc, 4197 Allocate(HeapNumber::kSize, result, scratch1, scratch2, need_gc,
4215 tagging_mode == TAG_RESULT ? TAG_OBJECT : NO_ALLOCATION_FLAGS); 4198 NO_ALLOCATION_FLAGS);
4216 4199
4217 Heap::RootListIndex map_index = mode == MUTABLE 4200 Heap::RootListIndex map_index = mode == MUTABLE
4218 ? Heap::kMutableHeapNumberMapRootIndex 4201 ? Heap::kMutableHeapNumberMapRootIndex
4219 : Heap::kHeapNumberMapRootIndex; 4202 : Heap::kHeapNumberMapRootIndex;
4220 AssertIsRoot(heap_number_map, map_index); 4203 AssertIsRoot(heap_number_map, map_index);
4221 4204
4222 // Store heap number map in the allocated object. 4205 // Store heap number map in the allocated object.
4223 if (tagging_mode == TAG_RESULT) { 4206 sw(heap_number_map, FieldMemOperand(result, HeapObject::kMapOffset));
4224 sw(heap_number_map, FieldMemOperand(result, HeapObject::kMapOffset));
4225 } else {
4226 sw(heap_number_map, MemOperand(result, HeapObject::kMapOffset));
4227 }
4228 } 4207 }
4229 4208
4230 4209
4231 void MacroAssembler::AllocateHeapNumberWithValue(Register result, 4210 void MacroAssembler::AllocateHeapNumberWithValue(Register result,
4232 FPURegister value, 4211 FPURegister value,
4233 Register scratch1, 4212 Register scratch1,
4234 Register scratch2, 4213 Register scratch2,
4235 Label* gc_required) { 4214 Label* gc_required) {
4236 LoadRoot(t8, Heap::kHeapNumberMapRootIndex); 4215 LoadRoot(t8, Heap::kHeapNumberMapRootIndex);
4237 AllocateHeapNumber(result, scratch1, scratch2, t8, gc_required); 4216 AllocateHeapNumber(result, scratch1, scratch2, t8, gc_required);
4238 sdc1(value, FieldMemOperand(result, HeapNumber::kValueOffset)); 4217 sdc1(value, FieldMemOperand(result, HeapNumber::kValueOffset));
4239 } 4218 }
4240 4219
4241 4220
4242 void MacroAssembler::AllocateJSValue(Register result, Register constructor, 4221 void MacroAssembler::AllocateJSValue(Register result, Register constructor,
4243 Register value, Register scratch1, 4222 Register value, Register scratch1,
4244 Register scratch2, Label* gc_required) { 4223 Register scratch2, Label* gc_required) {
4245 DCHECK(!result.is(constructor)); 4224 DCHECK(!result.is(constructor));
4246 DCHECK(!result.is(scratch1)); 4225 DCHECK(!result.is(scratch1));
4247 DCHECK(!result.is(scratch2)); 4226 DCHECK(!result.is(scratch2));
4248 DCHECK(!result.is(value)); 4227 DCHECK(!result.is(value));
4249 4228
4250 // Allocate JSValue in new space. 4229 // Allocate JSValue in new space.
4251 Allocate(JSValue::kSize, result, scratch1, scratch2, gc_required, TAG_OBJECT); 4230 Allocate(JSValue::kSize, result, scratch1, scratch2, gc_required,
4231 NO_ALLOCATION_FLAGS);
4252 4232
4253 // Initialize the JSValue. 4233 // Initialize the JSValue.
4254 LoadGlobalFunctionInitialMap(constructor, scratch1, scratch2); 4234 LoadGlobalFunctionInitialMap(constructor, scratch1, scratch2);
4255 sw(scratch1, FieldMemOperand(result, HeapObject::kMapOffset)); 4235 sw(scratch1, FieldMemOperand(result, HeapObject::kMapOffset));
4256 LoadRoot(scratch1, Heap::kEmptyFixedArrayRootIndex); 4236 LoadRoot(scratch1, Heap::kEmptyFixedArrayRootIndex);
4257 sw(scratch1, FieldMemOperand(result, JSObject::kPropertiesOffset)); 4237 sw(scratch1, FieldMemOperand(result, JSObject::kPropertiesOffset));
4258 sw(scratch1, FieldMemOperand(result, JSObject::kElementsOffset)); 4238 sw(scratch1, FieldMemOperand(result, JSObject::kElementsOffset));
4259 sw(value, FieldMemOperand(result, JSValue::kValueOffset)); 4239 sw(value, FieldMemOperand(result, JSValue::kValueOffset));
4260 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize); 4240 STATIC_ASSERT(JSValue::kSize == 4 * kPointerSize);
4261 } 4241 }
(...skipping 2267 matching lines...) Expand 10 before | Expand all | Expand 10 after
6529 if (mag.shift > 0) sra(result, result, mag.shift); 6509 if (mag.shift > 0) sra(result, result, mag.shift);
6530 srl(at, dividend, 31); 6510 srl(at, dividend, 31);
6531 Addu(result, result, Operand(at)); 6511 Addu(result, result, Operand(at));
6532 } 6512 }
6533 6513
6534 6514
6535 } // namespace internal 6515 } // namespace internal
6536 } // namespace v8 6516 } // namespace v8
6537 6517
6538 #endif // V8_TARGET_ARCH_MIPS 6518 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/mips/macro-assembler-mips.h ('k') | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698