| 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_X87 | 7 #if V8_TARGET_ARCH_X87 |
| 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 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 // comments in Runtime_NewObject in runtime.cc). In which case the | 153 // comments in Runtime_NewObject in runtime.cc). In which case the |
| 154 // initial map's instance type would be JS_FUNCTION_TYPE. | 154 // initial map's instance type would be JS_FUNCTION_TYPE. |
| 155 // edi: constructor | 155 // edi: constructor |
| 156 // eax: initial map | 156 // eax: initial map |
| 157 __ CmpInstanceType(eax, JS_FUNCTION_TYPE); | 157 __ CmpInstanceType(eax, JS_FUNCTION_TYPE); |
| 158 __ j(equal, &rt_call); | 158 __ j(equal, &rt_call); |
| 159 | 159 |
| 160 if (!is_api_function) { | 160 if (!is_api_function) { |
| 161 Label allocate; | 161 Label allocate; |
| 162 // The code below relies on these assumptions. | 162 // The code below relies on these assumptions. |
| 163 STATIC_ASSERT(JSFunction::kNoSlackTracking == 0); | 163 STATIC_ASSERT(Map::Counter::kShift + Map::Counter::kSize == 32); |
| 164 STATIC_ASSERT(Map::ConstructionCount::kShift + | |
| 165 Map::ConstructionCount::kSize == 32); | |
| 166 // Check if slack tracking is enabled. | 164 // Check if slack tracking is enabled. |
| 167 __ mov(esi, FieldOperand(eax, Map::kBitField3Offset)); | 165 __ mov(esi, FieldOperand(eax, Map::kBitField3Offset)); |
| 168 __ shr(esi, Map::ConstructionCount::kShift); | 166 __ shr(esi, Map::Counter::kShift); |
| 169 __ j(zero, &allocate); // JSFunction::kNoSlackTracking | 167 __ cmp(esi, Map::kSlackTrackingCounterEnd); |
| 168 __ j(less, &allocate); |
| 170 // Decrease generous allocation count. | 169 // Decrease generous allocation count. |
| 171 __ sub(FieldOperand(eax, Map::kBitField3Offset), | 170 __ sub(FieldOperand(eax, Map::kBitField3Offset), |
| 172 Immediate(1 << Map::ConstructionCount::kShift)); | 171 Immediate(1 << Map::Counter::kShift)); |
| 173 | 172 |
| 174 __ cmp(esi, JSFunction::kFinishSlackTracking); | 173 __ cmp(esi, Map::kSlackTrackingCounterEnd); |
| 175 __ j(not_equal, &allocate); | 174 __ j(not_equal, &allocate); |
| 176 | 175 |
| 177 __ push(eax); | 176 __ push(eax); |
| 178 __ push(edi); | 177 __ push(edi); |
| 179 | 178 |
| 180 __ push(edi); // constructor | 179 __ push(edi); // constructor |
| 181 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); | 180 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); |
| 182 | 181 |
| 183 __ pop(edi); | 182 __ pop(edi); |
| 184 __ pop(eax); | 183 __ pop(eax); |
| 185 __ xor_(esi, esi); // JSFunction::kNoSlackTracking | 184 __ mov(esi, Map::kSlackTrackingCounterEnd - 1); |
| 186 | 185 |
| 187 __ bind(&allocate); | 186 __ bind(&allocate); |
| 188 } | 187 } |
| 189 | 188 |
| 190 // Now allocate the JSObject on the heap. | 189 // Now allocate the JSObject on the heap. |
| 191 // edi: constructor | 190 // edi: constructor |
| 192 // eax: initial map | 191 // eax: initial map |
| 193 __ movzx_b(edi, FieldOperand(eax, Map::kInstanceSizeOffset)); | 192 __ movzx_b(edi, FieldOperand(eax, Map::kInstanceSizeOffset)); |
| 194 __ shl(edi, kPointerSizeLog2); | 193 __ shl(edi, kPointerSizeLog2); |
| 195 if (create_memento) { | 194 if (create_memento) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 212 // eax: initial map | 211 // eax: initial map |
| 213 // ebx: JSObject | 212 // ebx: JSObject |
| 214 // edi: start of next object (including memento if create_memento) | 213 // edi: start of next object (including memento if create_memento) |
| 215 // esi: slack tracking counter (non-API function case) | 214 // esi: slack tracking counter (non-API function case) |
| 216 __ mov(edx, factory->undefined_value()); | 215 __ mov(edx, factory->undefined_value()); |
| 217 __ lea(ecx, Operand(ebx, JSObject::kHeaderSize)); | 216 __ lea(ecx, Operand(ebx, JSObject::kHeaderSize)); |
| 218 if (!is_api_function) { | 217 if (!is_api_function) { |
| 219 Label no_inobject_slack_tracking; | 218 Label no_inobject_slack_tracking; |
| 220 | 219 |
| 221 // Check if slack tracking is enabled. | 220 // Check if slack tracking is enabled. |
| 222 __ cmp(esi, JSFunction::kNoSlackTracking); | 221 __ cmp(esi, Map::kSlackTrackingCounterEnd); |
| 223 __ j(equal, &no_inobject_slack_tracking); | 222 __ j(less, &no_inobject_slack_tracking); |
| 224 | 223 |
| 225 // Allocate object with a slack. | 224 // Allocate object with a slack. |
| 226 __ movzx_b(esi, | 225 __ movzx_b(esi, |
| 227 FieldOperand(eax, Map::kPreAllocatedPropertyFieldsOffset)); | 226 FieldOperand(eax, Map::kPreAllocatedPropertyFieldsOffset)); |
| 228 __ lea(esi, | 227 __ lea(esi, |
| 229 Operand(ebx, esi, times_pointer_size, JSObject::kHeaderSize)); | 228 Operand(ebx, esi, times_pointer_size, JSObject::kHeaderSize)); |
| 230 // esi: offset of first field after pre-allocated fields | 229 // esi: offset of first field after pre-allocated fields |
| 231 if (FLAG_debug_code) { | 230 if (FLAG_debug_code) { |
| 232 __ cmp(esi, edi); | 231 __ cmp(esi, edi); |
| 233 __ Assert(less_equal, | 232 __ Assert(less_equal, |
| (...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 | 1452 |
| 1454 __ bind(&ok); | 1453 __ bind(&ok); |
| 1455 __ ret(0); | 1454 __ ret(0); |
| 1456 } | 1455 } |
| 1457 | 1456 |
| 1458 #undef __ | 1457 #undef __ |
| 1459 } | 1458 } |
| 1460 } // namespace v8::internal | 1459 } // namespace v8::internal |
| 1461 | 1460 |
| 1462 #endif // V8_TARGET_ARCH_X87 | 1461 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |