| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 } | 1300 } |
| 1301 } | 1301 } |
| 1302 jmp(gc_required); | 1302 jmp(gc_required); |
| 1303 return; | 1303 return; |
| 1304 } | 1304 } |
| 1305 ASSERT(!result.is(result_end)); | 1305 ASSERT(!result.is(result_end)); |
| 1306 | 1306 |
| 1307 // Load address of new object into result. | 1307 // Load address of new object into result. |
| 1308 LoadAllocationTopHelper(result, scratch, flags); | 1308 LoadAllocationTopHelper(result, scratch, flags); |
| 1309 | 1309 |
| 1310 ExternalReference allocation_limit = |
| 1311 AllocationUtils::GetAllocationLimitReference(isolate(), flags); |
| 1312 |
| 1310 // Align the next allocation. Storing the filler map without checking top is | 1313 // Align the next allocation. Storing the filler map without checking top is |
| 1311 // always safe because the limit of the heap is always aligned. | 1314 // safe in new-space because the limit of the heap is aligned there. |
| 1312 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 1315 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 1313 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); | 1316 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| 1314 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); | 1317 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
| 1315 Label aligned; | 1318 Label aligned; |
| 1316 test(result, Immediate(kDoubleAlignmentMask)); | 1319 test(result, Immediate(kDoubleAlignmentMask)); |
| 1317 j(zero, &aligned, Label::kNear); | 1320 j(zero, &aligned, Label::kNear); |
| 1321 if ((flags & PRETENURE_OLD_DATA_SPACE) != 0) { |
| 1322 cmp(result, Operand::StaticVariable(allocation_limit)); |
| 1323 j(above_equal, gc_required); |
| 1324 } |
| 1318 mov(Operand(result, 0), | 1325 mov(Operand(result, 0), |
| 1319 Immediate(isolate()->factory()->one_pointer_filler_map())); | 1326 Immediate(isolate()->factory()->one_pointer_filler_map())); |
| 1320 add(result, Immediate(kDoubleSize / 2)); | 1327 add(result, Immediate(kDoubleSize / 2)); |
| 1321 bind(&aligned); | 1328 bind(&aligned); |
| 1322 } | 1329 } |
| 1323 | 1330 |
| 1331 // Calculate new top and bail out if space is exhausted. |
| 1324 Register top_reg = result_end.is_valid() ? result_end : result; | 1332 Register top_reg = result_end.is_valid() ? result_end : result; |
| 1325 | |
| 1326 // Calculate new top and bail out if space is exhausted. | |
| 1327 ExternalReference allocation_limit = | |
| 1328 AllocationUtils::GetAllocationLimitReference(isolate(), flags); | |
| 1329 | |
| 1330 if (!top_reg.is(result)) { | 1333 if (!top_reg.is(result)) { |
| 1331 mov(top_reg, result); | 1334 mov(top_reg, result); |
| 1332 } | 1335 } |
| 1333 add(top_reg, Immediate(object_size)); | 1336 add(top_reg, Immediate(object_size)); |
| 1334 j(carry, gc_required); | 1337 j(carry, gc_required); |
| 1335 cmp(top_reg, Operand::StaticVariable(allocation_limit)); | 1338 cmp(top_reg, Operand::StaticVariable(allocation_limit)); |
| 1336 j(above, gc_required); | 1339 j(above, gc_required); |
| 1337 | 1340 |
| 1338 // Update allocation top. | 1341 // Update allocation top. |
| 1339 UpdateAllocationTopHelper(top_reg, scratch, flags); | 1342 UpdateAllocationTopHelper(top_reg, scratch, flags); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 // Register element_count is not modified by the function. | 1377 // Register element_count is not modified by the function. |
| 1375 } | 1378 } |
| 1376 jmp(gc_required); | 1379 jmp(gc_required); |
| 1377 return; | 1380 return; |
| 1378 } | 1381 } |
| 1379 ASSERT(!result.is(result_end)); | 1382 ASSERT(!result.is(result_end)); |
| 1380 | 1383 |
| 1381 // Load address of new object into result. | 1384 // Load address of new object into result. |
| 1382 LoadAllocationTopHelper(result, scratch, flags); | 1385 LoadAllocationTopHelper(result, scratch, flags); |
| 1383 | 1386 |
| 1387 ExternalReference allocation_limit = |
| 1388 AllocationUtils::GetAllocationLimitReference(isolate(), flags); |
| 1389 |
| 1384 // Align the next allocation. Storing the filler map without checking top is | 1390 // Align the next allocation. Storing the filler map without checking top is |
| 1385 // always safe because the limit of the heap is always aligned. | 1391 // safe in new-space because the limit of the heap is aligned there. |
| 1386 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 1392 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 1387 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); | 1393 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| 1388 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); | 1394 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
| 1389 Label aligned; | 1395 Label aligned; |
| 1390 test(result, Immediate(kDoubleAlignmentMask)); | 1396 test(result, Immediate(kDoubleAlignmentMask)); |
| 1391 j(zero, &aligned, Label::kNear); | 1397 j(zero, &aligned, Label::kNear); |
| 1398 if ((flags & PRETENURE_OLD_DATA_SPACE) != 0) { |
| 1399 cmp(result, Operand::StaticVariable(allocation_limit)); |
| 1400 j(above_equal, gc_required); |
| 1401 } |
| 1392 mov(Operand(result, 0), | 1402 mov(Operand(result, 0), |
| 1393 Immediate(isolate()->factory()->one_pointer_filler_map())); | 1403 Immediate(isolate()->factory()->one_pointer_filler_map())); |
| 1394 add(result, Immediate(kDoubleSize / 2)); | 1404 add(result, Immediate(kDoubleSize / 2)); |
| 1395 bind(&aligned); | 1405 bind(&aligned); |
| 1396 } | 1406 } |
| 1397 | 1407 |
| 1398 // Calculate new top and bail out if space is exhausted. | 1408 // Calculate new top and bail out if space is exhausted. |
| 1399 ExternalReference allocation_limit = | |
| 1400 AllocationUtils::GetAllocationLimitReference(isolate(), flags); | |
| 1401 | |
| 1402 // We assume that element_count*element_size + header_size does not | 1409 // We assume that element_count*element_size + header_size does not |
| 1403 // overflow. | 1410 // overflow. |
| 1404 if (element_count_type == REGISTER_VALUE_IS_SMI) { | 1411 if (element_count_type == REGISTER_VALUE_IS_SMI) { |
| 1405 STATIC_ASSERT(static_cast<ScaleFactor>(times_2 - 1) == times_1); | 1412 STATIC_ASSERT(static_cast<ScaleFactor>(times_2 - 1) == times_1); |
| 1406 STATIC_ASSERT(static_cast<ScaleFactor>(times_4 - 1) == times_2); | 1413 STATIC_ASSERT(static_cast<ScaleFactor>(times_4 - 1) == times_2); |
| 1407 STATIC_ASSERT(static_cast<ScaleFactor>(times_8 - 1) == times_4); | 1414 STATIC_ASSERT(static_cast<ScaleFactor>(times_8 - 1) == times_4); |
| 1408 ASSERT(element_size >= times_2); | 1415 ASSERT(element_size >= times_2); |
| 1409 ASSERT(kSmiTagSize == 1); | 1416 ASSERT(kSmiTagSize == 1); |
| 1410 element_size = static_cast<ScaleFactor>(element_size - 1); | 1417 element_size = static_cast<ScaleFactor>(element_size - 1); |
| 1411 } else { | 1418 } else { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1445 // object_size is left unchanged by this function. | 1452 // object_size is left unchanged by this function. |
| 1446 } | 1453 } |
| 1447 jmp(gc_required); | 1454 jmp(gc_required); |
| 1448 return; | 1455 return; |
| 1449 } | 1456 } |
| 1450 ASSERT(!result.is(result_end)); | 1457 ASSERT(!result.is(result_end)); |
| 1451 | 1458 |
| 1452 // Load address of new object into result. | 1459 // Load address of new object into result. |
| 1453 LoadAllocationTopHelper(result, scratch, flags); | 1460 LoadAllocationTopHelper(result, scratch, flags); |
| 1454 | 1461 |
| 1462 ExternalReference allocation_limit = |
| 1463 AllocationUtils::GetAllocationLimitReference(isolate(), flags); |
| 1464 |
| 1455 // Align the next allocation. Storing the filler map without checking top is | 1465 // Align the next allocation. Storing the filler map without checking top is |
| 1456 // always safe because the limit of the heap is always aligned. | 1466 // safe in new-space because the limit of the heap is aligned there. |
| 1457 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 1467 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 1458 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); | 1468 ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| 1459 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); | 1469 ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
| 1460 Label aligned; | 1470 Label aligned; |
| 1461 test(result, Immediate(kDoubleAlignmentMask)); | 1471 test(result, Immediate(kDoubleAlignmentMask)); |
| 1462 j(zero, &aligned, Label::kNear); | 1472 j(zero, &aligned, Label::kNear); |
| 1473 if ((flags & PRETENURE_OLD_DATA_SPACE) != 0) { |
| 1474 cmp(result, Operand::StaticVariable(allocation_limit)); |
| 1475 j(above_equal, gc_required); |
| 1476 } |
| 1463 mov(Operand(result, 0), | 1477 mov(Operand(result, 0), |
| 1464 Immediate(isolate()->factory()->one_pointer_filler_map())); | 1478 Immediate(isolate()->factory()->one_pointer_filler_map())); |
| 1465 add(result, Immediate(kDoubleSize / 2)); | 1479 add(result, Immediate(kDoubleSize / 2)); |
| 1466 bind(&aligned); | 1480 bind(&aligned); |
| 1467 } | 1481 } |
| 1468 | 1482 |
| 1469 // Calculate new top and bail out if space is exhausted. | 1483 // Calculate new top and bail out if space is exhausted. |
| 1470 ExternalReference allocation_limit = | |
| 1471 AllocationUtils::GetAllocationLimitReference(isolate(), flags); | |
| 1472 | |
| 1473 if (!object_size.is(result_end)) { | 1484 if (!object_size.is(result_end)) { |
| 1474 mov(result_end, object_size); | 1485 mov(result_end, object_size); |
| 1475 } | 1486 } |
| 1476 add(result_end, result); | 1487 add(result_end, result); |
| 1477 j(carry, gc_required); | 1488 j(carry, gc_required); |
| 1478 cmp(result_end, Operand::StaticVariable(allocation_limit)); | 1489 cmp(result_end, Operand::StaticVariable(allocation_limit)); |
| 1479 j(above, gc_required); | 1490 j(above, gc_required); |
| 1480 | 1491 |
| 1481 // Tag result if requested. | 1492 // Tag result if requested. |
| 1482 if ((flags & TAG_OBJECT) != 0) { | 1493 if ((flags & TAG_OBJECT) != 0) { |
| (...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3226 j(greater, &no_memento_available); | 3237 j(greater, &no_memento_available); |
| 3227 cmp(MemOperand(scratch_reg, -AllocationMemento::kSize), | 3238 cmp(MemOperand(scratch_reg, -AllocationMemento::kSize), |
| 3228 Immediate(Handle<Map>(isolate()->heap()->allocation_memento_map()))); | 3239 Immediate(Handle<Map>(isolate()->heap()->allocation_memento_map()))); |
| 3229 bind(&no_memento_available); | 3240 bind(&no_memento_available); |
| 3230 } | 3241 } |
| 3231 | 3242 |
| 3232 | 3243 |
| 3233 } } // namespace v8::internal | 3244 } } // namespace v8::internal |
| 3234 | 3245 |
| 3235 #endif // V8_TARGET_ARCH_IA32 | 3246 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |