OLD | NEW |
---|---|
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
180 } | 180 } |
181 | 181 |
182 | 182 |
183 static void InitializeArrayConstructorDescriptor( | 183 static void InitializeArrayConstructorDescriptor( |
184 Isolate* isolate, | 184 Isolate* isolate, |
185 CodeStubInterfaceDescriptor* descriptor, | 185 CodeStubInterfaceDescriptor* descriptor, |
186 int constant_stack_parameter_count) { | 186 int constant_stack_parameter_count) { |
187 // register state | 187 // register state |
188 // rax -- number of arguments | 188 // rax -- number of arguments |
189 // rdi -- function | 189 // rdi -- function |
190 // rbx -- type info cell with elements kind | 190 // rbx -- allocation site with elements kind |
191 static Register registers_variable_args[] = { rdi, rbx, rax }; | 191 static Register registers_variable_args[] = { rdi, rbx, rax }; |
192 static Register registers_no_args[] = { rdi, rbx }; | 192 static Register registers_no_args[] = { rdi, rbx }; |
193 | 193 |
194 if (constant_stack_parameter_count == 0) { | 194 if (constant_stack_parameter_count == 0) { |
195 descriptor->register_param_count_ = 2; | 195 descriptor->register_param_count_ = 2; |
196 descriptor->register_params_ = registers_no_args; | 196 descriptor->register_params_ = registers_no_args; |
197 } else { | 197 } else { |
198 // stack param count needs (constructor pointer, and single argument) | 198 // stack param count needs (constructor pointer, and single argument) |
199 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; | 199 descriptor->handler_arguments_mode_ = PASS_ARGUMENTS; |
200 descriptor->stack_parameter_count_ = rax; | 200 descriptor->stack_parameter_count_ = rax; |
(...skipping 5024 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5225 // If we reached this point there is a problem. | 5225 // If we reached this point there is a problem. |
5226 __ Abort(kUnexpectedElementsKindInArrayConstructor); | 5226 __ Abort(kUnexpectedElementsKindInArrayConstructor); |
5227 } else { | 5227 } else { |
5228 UNREACHABLE(); | 5228 UNREACHABLE(); |
5229 } | 5229 } |
5230 } | 5230 } |
5231 | 5231 |
5232 | 5232 |
5233 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, | 5233 static void CreateArrayDispatchOneArgument(MacroAssembler* masm, |
5234 AllocationSiteOverrideMode mode) { | 5234 AllocationSiteOverrideMode mode) { |
5235 // rbx - type info cell (if mode != DISABLE_ALLOCATION_SITES) | 5235 // rbx - allocation site (if mode != DISABLE_ALLOCATION_SITES) |
5236 // rdx - kind (if mode != DISABLE_ALLOCATION_SITES) | 5236 // rdx - kind (if mode != DISABLE_ALLOCATION_SITES) |
5237 // rax - number of arguments | 5237 // rax - number of arguments |
5238 // rdi - constructor? | 5238 // rdi - constructor? |
5239 // rsp[0] - return address | 5239 // rsp[0] - return address |
5240 // rsp[8] - last argument | 5240 // rsp[8] - last argument |
5241 Handle<Object> undefined_sentinel( | 5241 Handle<Object> undefined_sentinel( |
5242 masm->isolate()->heap()->undefined_value(), | 5242 masm->isolate()->heap()->undefined_value(), |
5243 masm->isolate()); | 5243 masm->isolate()); |
5244 | 5244 |
5245 Label normal_sequence; | 5245 Label normal_sequence; |
(...skipping 25 matching lines...) Expand all Loading... | |
5271 __ TailCallStub(&stub_holey); | 5271 __ TailCallStub(&stub_holey); |
5272 | 5272 |
5273 __ bind(&normal_sequence); | 5273 __ bind(&normal_sequence); |
5274 ArraySingleArgumentConstructorStub stub(initial, | 5274 ArraySingleArgumentConstructorStub stub(initial, |
5275 DISABLE_ALLOCATION_SITES); | 5275 DISABLE_ALLOCATION_SITES); |
5276 __ TailCallStub(&stub); | 5276 __ TailCallStub(&stub); |
5277 } else if (mode == DONT_OVERRIDE) { | 5277 } else if (mode == DONT_OVERRIDE) { |
5278 // We are going to create a holey array, but our kind is non-holey. | 5278 // We are going to create a holey array, but our kind is non-holey. |
5279 // Fix kind and retry (only if we have an allocation site in the cell). | 5279 // Fix kind and retry (only if we have an allocation site in the cell). |
5280 __ incl(rdx); | 5280 __ incl(rdx); |
5281 __ movp(rcx, FieldOperand(rbx, Cell::kValueOffset)); | |
5282 if (FLAG_debug_code) { | |
5283 Handle<Map> allocation_site_map = | |
5284 masm->isolate()->factory()->allocation_site_map(); | |
5285 __ Cmp(FieldOperand(rcx, 0), allocation_site_map); | |
Benedikt Meurer
2014/01/20 12:24:22
Same.
| |
5286 __ Assert(equal, kExpectedAllocationSiteInCell); | |
5287 } | |
5288 | 5281 |
5289 // Save the resulting elements kind in type info. We can't just store r3 | 5282 // Save the resulting elements kind in type info. We can't just store r3 |
5290 // in the AllocationSite::transition_info field because elements kind is | 5283 // in the AllocationSite::transition_info field because elements kind is |
5291 // restricted to a portion of the field...upper bits need to be left alone. | 5284 // restricted to a portion of the field...upper bits need to be left alone. |
5292 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 5285 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
5293 __ SmiAddConstant(FieldOperand(rcx, AllocationSite::kTransitionInfoOffset), | 5286 __ SmiAddConstant(FieldOperand(rbx, AllocationSite::kTransitionInfoOffset), |
5294 Smi::FromInt(kFastElementsKindPackedToHoley)); | 5287 Smi::FromInt(kFastElementsKindPackedToHoley)); |
5295 | 5288 |
5296 __ bind(&normal_sequence); | 5289 __ bind(&normal_sequence); |
5297 int last_index = GetSequenceIndexFromFastElementsKind( | 5290 int last_index = GetSequenceIndexFromFastElementsKind( |
5298 TERMINAL_FAST_ELEMENTS_KIND); | 5291 TERMINAL_FAST_ELEMENTS_KIND); |
5299 for (int i = 0; i <= last_index; ++i) { | 5292 for (int i = 0; i <= last_index; ++i) { |
5300 Label next; | 5293 Label next; |
5301 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 5294 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
5302 __ cmpl(rdx, Immediate(kind)); | 5295 __ cmpl(rdx, Immediate(kind)); |
5303 __ j(not_equal, &next); | 5296 __ j(not_equal, &next); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5416 __ Cmp(FieldOperand(rbx, 0), cell_map); | 5409 __ Cmp(FieldOperand(rbx, 0), cell_map); |
5417 __ Assert(equal, kExpectedPropertyCellInRegisterRbx); | 5410 __ Assert(equal, kExpectedPropertyCellInRegisterRbx); |
5418 __ bind(&okay_here); | 5411 __ bind(&okay_here); |
5419 } | 5412 } |
5420 | 5413 |
5421 Label no_info; | 5414 Label no_info; |
5422 // If the type cell is undefined, or contains anything other than an | 5415 // If the type cell is undefined, or contains anything other than an |
5423 // AllocationSite, call an array constructor that doesn't use AllocationSites. | 5416 // AllocationSite, call an array constructor that doesn't use AllocationSites. |
5424 __ Cmp(rbx, undefined_sentinel); | 5417 __ Cmp(rbx, undefined_sentinel); |
5425 __ j(equal, &no_info); | 5418 __ j(equal, &no_info); |
5426 __ movp(rdx, FieldOperand(rbx, Cell::kValueOffset)); | 5419 __ movp(rbx, FieldOperand(rbx, Cell::kValueOffset)); |
5427 __ Cmp(FieldOperand(rdx, 0), | 5420 __ Cmp(FieldOperand(rbx, 0), |
5428 masm->isolate()->factory()->allocation_site_map()); | 5421 masm->isolate()->factory()->allocation_site_map()); |
5429 __ j(not_equal, &no_info); | 5422 __ j(not_equal, &no_info); |
5430 | 5423 |
5431 // Only look at the lower 16 bits of the transition info. | 5424 // Only look at the lower 16 bits of the transition info. |
5432 __ movp(rdx, FieldOperand(rdx, AllocationSite::kTransitionInfoOffset)); | 5425 __ movp(rdx, FieldOperand(rbx, AllocationSite::kTransitionInfoOffset)); |
5433 __ SmiToInteger32(rdx, rdx); | 5426 __ SmiToInteger32(rdx, rdx); |
5434 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 5427 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
5435 __ and_(rdx, Immediate(AllocationSite::ElementsKindBits::kMask)); | 5428 __ and_(rdx, Immediate(AllocationSite::ElementsKindBits::kMask)); |
5436 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); | 5429 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); |
5437 | 5430 |
5438 __ bind(&no_info); | 5431 __ bind(&no_info); |
5439 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); | 5432 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
5440 } | 5433 } |
5441 | 5434 |
5442 | 5435 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5528 __ bind(&fast_elements_case); | 5521 __ bind(&fast_elements_case); |
5529 GenerateCase(masm, FAST_ELEMENTS); | 5522 GenerateCase(masm, FAST_ELEMENTS); |
5530 } | 5523 } |
5531 | 5524 |
5532 | 5525 |
5533 #undef __ | 5526 #undef __ |
5534 | 5527 |
5535 } } // namespace v8::internal | 5528 } } // namespace v8::internal |
5536 | 5529 |
5537 #endif // V8_TARGET_ARCH_X64 | 5530 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |