| OLD | NEW |
| 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 __ CmpObjectType(rax, MAP_TYPE, rbx); | 151 __ CmpObjectType(rax, MAP_TYPE, rbx); |
| 152 __ j(not_equal, &rt_call); | 152 __ j(not_equal, &rt_call); |
| 153 | 153 |
| 154 // Check that the constructor is not constructing a JSFunction (see | 154 // Check that the constructor is not constructing a JSFunction (see |
| 155 // comments in Runtime_NewObject in runtime.cc). In which case the | 155 // comments in Runtime_NewObject in runtime.cc). In which case the |
| 156 // initial map's instance type would be JS_FUNCTION_TYPE. | 156 // initial map's instance type would be JS_FUNCTION_TYPE. |
| 157 // rdi: constructor | 157 // rdi: constructor |
| 158 // rax: initial map | 158 // rax: initial map |
| 159 __ CmpInstanceType(rax, JS_FUNCTION_TYPE); | 159 __ CmpInstanceType(rax, JS_FUNCTION_TYPE); |
| 160 __ j(equal, &rt_call); | 160 __ j(equal, &rt_call); |
| 161 | |
| 162 if (!is_api_function) { | 161 if (!is_api_function) { |
| 163 Label allocate; | 162 Label allocate; |
| 164 // The code below relies on these assumptions. | 163 // The code below relies on these assumptions. |
| 165 STATIC_ASSERT(JSFunction::kNoSlackTracking == 0); | 164 STATIC_ASSERT(Map::Counter::kShift + Map::Counter::kSize == 32); |
| 166 STATIC_ASSERT(Map::ConstructionCount::kShift + | |
| 167 Map::ConstructionCount::kSize == 32); | |
| 168 // Check if slack tracking is enabled. | 165 // Check if slack tracking is enabled. |
| 169 __ movl(rsi, FieldOperand(rax, Map::kBitField3Offset)); | 166 __ movl(rsi, FieldOperand(rax, Map::kBitField3Offset)); |
| 170 __ shrl(rsi, Immediate(Map::ConstructionCount::kShift)); | 167 __ shrl(rsi, Immediate(Map::Counter::kShift)); |
| 171 __ j(zero, &allocate); // JSFunction::kNoSlackTracking | 168 __ cmpl(rsi, Immediate(Map::kSlackTrackingCounterEnd)); |
| 169 __ j(less, &allocate); |
| 172 // Decrease generous allocation count. | 170 // Decrease generous allocation count. |
| 173 __ subl(FieldOperand(rax, Map::kBitField3Offset), | 171 __ subl(FieldOperand(rax, Map::kBitField3Offset), |
| 174 Immediate(1 << Map::ConstructionCount::kShift)); | 172 Immediate(1 << Map::Counter::kShift)); |
| 175 | 173 |
| 176 __ cmpl(rsi, Immediate(JSFunction::kFinishSlackTracking)); | 174 __ cmpl(rsi, Immediate(Map::kSlackTrackingCounterEnd)); |
| 177 __ j(not_equal, &allocate); | 175 __ j(not_equal, &allocate); |
| 178 | 176 |
| 179 __ Push(rax); | 177 __ Push(rax); |
| 180 __ Push(rdi); | 178 __ Push(rdi); |
| 181 | 179 |
| 182 __ Push(rdi); // constructor | 180 __ Push(rdi); // constructor |
| 183 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); | 181 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); |
| 184 | 182 |
| 185 __ Pop(rdi); | 183 __ Pop(rdi); |
| 186 __ Pop(rax); | 184 __ Pop(rax); |
| 187 __ xorl(rsi, rsi); // JSFunction::kNoSlackTracking | 185 __ movl(rsi, Immediate(Map::kSlackTrackingCounterEnd - 1)); |
| 188 | 186 |
| 189 __ bind(&allocate); | 187 __ bind(&allocate); |
| 190 } | 188 } |
| 191 | 189 |
| 192 // Now allocate the JSObject on the heap. | 190 // Now allocate the JSObject on the heap. |
| 193 __ movzxbp(rdi, FieldOperand(rax, Map::kInstanceSizeOffset)); | 191 __ movzxbp(rdi, FieldOperand(rax, Map::kInstanceSizeOffset)); |
| 194 __ shlp(rdi, Immediate(kPointerSizeLog2)); | 192 __ shlp(rdi, Immediate(kPointerSizeLog2)); |
| 195 if (create_memento) { | 193 if (create_memento) { |
| 196 __ addp(rdi, Immediate(AllocationMemento::kSize)); | 194 __ addp(rdi, Immediate(AllocationMemento::kSize)); |
| 197 } | 195 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 215 // rax: initial map | 213 // rax: initial map |
| 216 // rbx: JSObject | 214 // rbx: JSObject |
| 217 // rdi: start of next object (including memento if create_memento) | 215 // rdi: start of next object (including memento if create_memento) |
| 218 // rsi: slack tracking counter (non-API function case) | 216 // rsi: slack tracking counter (non-API function case) |
| 219 __ leap(rcx, Operand(rbx, JSObject::kHeaderSize)); | 217 __ leap(rcx, Operand(rbx, JSObject::kHeaderSize)); |
| 220 __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex); | 218 __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex); |
| 221 if (!is_api_function) { | 219 if (!is_api_function) { |
| 222 Label no_inobject_slack_tracking; | 220 Label no_inobject_slack_tracking; |
| 223 | 221 |
| 224 // Check if slack tracking is enabled. | 222 // Check if slack tracking is enabled. |
| 225 __ cmpl(rsi, Immediate(JSFunction::kNoSlackTracking)); | 223 __ cmpl(rsi, Immediate(Map::kSlackTrackingCounterEnd)); |
| 226 __ j(equal, &no_inobject_slack_tracking); | 224 __ j(less, &no_inobject_slack_tracking); |
| 227 | 225 |
| 228 // Allocate object with a slack. | 226 // Allocate object with a slack. |
| 229 __ movzxbp(rsi, | 227 __ movzxbp(rsi, |
| 230 FieldOperand(rax, Map::kPreAllocatedPropertyFieldsOffset)); | 228 FieldOperand(rax, Map::kPreAllocatedPropertyFieldsOffset)); |
| 231 __ leap(rsi, | 229 __ leap(rsi, |
| 232 Operand(rbx, rsi, times_pointer_size, JSObject::kHeaderSize)); | 230 Operand(rbx, rsi, times_pointer_size, JSObject::kHeaderSize)); |
| 233 // rsi: offset of first field after pre-allocated fields | 231 // rsi: offset of first field after pre-allocated fields |
| 234 if (FLAG_debug_code) { | 232 if (FLAG_debug_code) { |
| 235 __ cmpp(rsi, rdi); | 233 __ cmpp(rsi, rdi); |
| 236 __ Assert(less_equal, | 234 __ Assert(less_equal, |
| (...skipping 1285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1522 __ bind(&ok); | 1520 __ bind(&ok); |
| 1523 __ ret(0); | 1521 __ ret(0); |
| 1524 } | 1522 } |
| 1525 | 1523 |
| 1526 | 1524 |
| 1527 #undef __ | 1525 #undef __ |
| 1528 | 1526 |
| 1529 } } // namespace v8::internal | 1527 } } // namespace v8::internal |
| 1530 | 1528 |
| 1531 #endif // V8_TARGET_ARCH_X64 | 1529 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |