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

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 181543002: Eliminate extended mode, and other modes clean-up (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « src/i18n.cc ('k') | src/ia32/full-codegen-ia32.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 // 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 1257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1268 Label no_parameter_map; 1268 Label no_parameter_map;
1269 __ test(ebx, ebx); 1269 __ test(ebx, ebx);
1270 __ j(zero, &no_parameter_map, Label::kNear); 1270 __ j(zero, &no_parameter_map, Label::kNear);
1271 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize)); 1271 __ lea(ebx, Operand(ebx, times_2, kParameterMapHeaderSize));
1272 __ bind(&no_parameter_map); 1272 __ bind(&no_parameter_map);
1273 1273
1274 // 2. Backing store. 1274 // 2. Backing store.
1275 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize)); 1275 __ lea(ebx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize));
1276 1276
1277 // 3. Arguments object. 1277 // 3. Arguments object.
1278 __ add(ebx, Immediate(Heap::kArgumentsObjectSize)); 1278 __ add(ebx, Immediate(Heap::kSloppyArgumentsObjectSize));
1279 1279
1280 // Do the allocation of all three objects in one go. 1280 // Do the allocation of all three objects in one go.
1281 __ Allocate(ebx, eax, edx, edi, &runtime, TAG_OBJECT); 1281 __ Allocate(ebx, eax, edx, edi, &runtime, TAG_OBJECT);
1282 1282
1283 // eax = address of new object(s) (tagged) 1283 // eax = address of new object(s) (tagged)
1284 // ecx = argument count (tagged) 1284 // ecx = argument count (tagged)
1285 // esp[0] = mapped parameter count (tagged) 1285 // esp[0] = mapped parameter count (tagged)
1286 // esp[8] = parameter count (tagged) 1286 // esp[8] = parameter count (tagged)
1287 // esp[12] = address of receiver argument 1287 // esp[12] = address of receiver argument
1288 // Get the arguments boilerplate from the current native context into edi. 1288 // Get the arguments boilerplate from the current native context into edi.
1289 Label has_mapped_parameters, copy; 1289 Label has_mapped_parameters, copy;
1290 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); 1290 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
1291 __ mov(edi, FieldOperand(edi, GlobalObject::kNativeContextOffset)); 1291 __ mov(edi, FieldOperand(edi, GlobalObject::kNativeContextOffset));
1292 __ mov(ebx, Operand(esp, 0 * kPointerSize)); 1292 __ mov(ebx, Operand(esp, 0 * kPointerSize));
1293 __ test(ebx, ebx); 1293 __ test(ebx, ebx);
1294 __ j(not_zero, &has_mapped_parameters, Label::kNear); 1294 __ j(not_zero, &has_mapped_parameters, Label::kNear);
1295 __ mov(edi, Operand(edi, 1295 __ mov(edi, Operand(edi,
1296 Context::SlotOffset(Context::ARGUMENTS_BOILERPLATE_INDEX))); 1296 Context::SlotOffset(Context::SLOPPY_ARGUMENTS_BOILERPLATE_INDEX)));
1297 __ jmp(&copy, Label::kNear); 1297 __ jmp(&copy, Label::kNear);
1298 1298
1299 __ bind(&has_mapped_parameters); 1299 __ bind(&has_mapped_parameters);
1300 __ mov(edi, Operand(edi, 1300 __ mov(edi, Operand(edi,
1301 Context::SlotOffset(Context::ALIASED_ARGUMENTS_BOILERPLATE_INDEX))); 1301 Context::SlotOffset(Context::ALIASED_ARGUMENTS_BOILERPLATE_INDEX)));
1302 __ bind(&copy); 1302 __ bind(&copy);
1303 1303
1304 // eax = address of new object (tagged) 1304 // eax = address of new object (tagged)
1305 // ebx = mapped parameter count (tagged) 1305 // ebx = mapped parameter count (tagged)
1306 // ecx = argument count (tagged) 1306 // ecx = argument count (tagged)
(...skipping 16 matching lines...) Expand all
1323 1323
1324 // Use the length (smi tagged) and set that as an in-object property too. 1324 // Use the length (smi tagged) and set that as an in-object property too.
1325 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); 1325 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0);
1326 __ mov(FieldOperand(eax, JSObject::kHeaderSize + 1326 __ mov(FieldOperand(eax, JSObject::kHeaderSize +
1327 Heap::kArgumentsLengthIndex * kPointerSize), 1327 Heap::kArgumentsLengthIndex * kPointerSize),
1328 ecx); 1328 ecx);
1329 1329
1330 // Set up the elements pointer in the allocated arguments object. 1330 // Set up the elements pointer in the allocated arguments object.
1331 // If we allocated a parameter map, edi will point there, otherwise to the 1331 // If we allocated a parameter map, edi will point there, otherwise to the
1332 // backing store. 1332 // backing store.
1333 __ lea(edi, Operand(eax, Heap::kArgumentsObjectSize)); 1333 __ lea(edi, Operand(eax, Heap::kSloppyArgumentsObjectSize));
1334 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi); 1334 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi);
1335 1335
1336 // eax = address of new object (tagged) 1336 // eax = address of new object (tagged)
1337 // ebx = mapped parameter count (tagged) 1337 // ebx = mapped parameter count (tagged)
1338 // ecx = argument count (tagged) 1338 // ecx = argument count (tagged)
1339 // edi = address of parameter map or backing store (tagged) 1339 // edi = address of parameter map or backing store (tagged)
1340 // esp[0] = mapped parameter count (tagged) 1340 // esp[0] = mapped parameter count (tagged)
1341 // esp[8] = parameter count (tagged) 1341 // esp[8] = parameter count (tagged)
1342 // esp[12] = address of receiver argument 1342 // esp[12] = address of receiver argument
1343 // Free a register. 1343 // Free a register.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 __ mov(Operand(esp, 2 * kPointerSize), edx); 1468 __ mov(Operand(esp, 2 * kPointerSize), edx);
1469 1469
1470 // Try the new space allocation. Start out with computing the size of 1470 // Try the new space allocation. Start out with computing the size of
1471 // the arguments object and the elements array. 1471 // the arguments object and the elements array.
1472 Label add_arguments_object; 1472 Label add_arguments_object;
1473 __ bind(&try_allocate); 1473 __ bind(&try_allocate);
1474 __ test(ecx, ecx); 1474 __ test(ecx, ecx);
1475 __ j(zero, &add_arguments_object, Label::kNear); 1475 __ j(zero, &add_arguments_object, Label::kNear);
1476 __ lea(ecx, Operand(ecx, times_2, FixedArray::kHeaderSize)); 1476 __ lea(ecx, Operand(ecx, times_2, FixedArray::kHeaderSize));
1477 __ bind(&add_arguments_object); 1477 __ bind(&add_arguments_object);
1478 __ add(ecx, Immediate(Heap::kArgumentsObjectSizeStrict)); 1478 __ add(ecx, Immediate(Heap::kStrictArgumentsObjectSize));
1479 1479
1480 // Do the allocation of both objects in one go. 1480 // Do the allocation of both objects in one go.
1481 __ Allocate(ecx, eax, edx, ebx, &runtime, TAG_OBJECT); 1481 __ Allocate(ecx, eax, edx, ebx, &runtime, TAG_OBJECT);
1482 1482
1483 // Get the arguments boilerplate from the current native context. 1483 // Get the arguments boilerplate from the current native context.
1484 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); 1484 __ mov(edi, Operand(esi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
1485 __ mov(edi, FieldOperand(edi, GlobalObject::kNativeContextOffset)); 1485 __ mov(edi, FieldOperand(edi, GlobalObject::kNativeContextOffset));
1486 const int offset = 1486 const int offset =
1487 Context::SlotOffset(Context::STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX); 1487 Context::SlotOffset(Context::STRICT_ARGUMENTS_BOILERPLATE_INDEX);
1488 __ mov(edi, Operand(edi, offset)); 1488 __ mov(edi, Operand(edi, offset));
1489 1489
1490 // Copy the JS object part. 1490 // Copy the JS object part.
1491 for (int i = 0; i < JSObject::kHeaderSize; i += kPointerSize) { 1491 for (int i = 0; i < JSObject::kHeaderSize; i += kPointerSize) {
1492 __ mov(ebx, FieldOperand(edi, i)); 1492 __ mov(ebx, FieldOperand(edi, i));
1493 __ mov(FieldOperand(eax, i), ebx); 1493 __ mov(FieldOperand(eax, i), ebx);
1494 } 1494 }
1495 1495
1496 // Get the length (smi tagged) and set that as an in-object property too. 1496 // Get the length (smi tagged) and set that as an in-object property too.
1497 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); 1497 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0);
1498 __ mov(ecx, Operand(esp, 1 * kPointerSize)); 1498 __ mov(ecx, Operand(esp, 1 * kPointerSize));
1499 __ mov(FieldOperand(eax, JSObject::kHeaderSize + 1499 __ mov(FieldOperand(eax, JSObject::kHeaderSize +
1500 Heap::kArgumentsLengthIndex * kPointerSize), 1500 Heap::kArgumentsLengthIndex * kPointerSize),
1501 ecx); 1501 ecx);
1502 1502
1503 // If there are no actual arguments, we're done. 1503 // If there are no actual arguments, we're done.
1504 Label done; 1504 Label done;
1505 __ test(ecx, ecx); 1505 __ test(ecx, ecx);
1506 __ j(zero, &done, Label::kNear); 1506 __ j(zero, &done, Label::kNear);
1507 1507
1508 // Get the parameters pointer from the stack. 1508 // Get the parameters pointer from the stack.
1509 __ mov(edx, Operand(esp, 2 * kPointerSize)); 1509 __ mov(edx, Operand(esp, 2 * kPointerSize));
1510 1510
1511 // Set up the elements pointer in the allocated arguments object and 1511 // Set up the elements pointer in the allocated arguments object and
1512 // initialize the header in the elements fixed array. 1512 // initialize the header in the elements fixed array.
1513 __ lea(edi, Operand(eax, Heap::kArgumentsObjectSizeStrict)); 1513 __ lea(edi, Operand(eax, Heap::kStrictArgumentsObjectSize));
1514 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi); 1514 __ mov(FieldOperand(eax, JSObject::kElementsOffset), edi);
1515 __ mov(FieldOperand(edi, FixedArray::kMapOffset), 1515 __ mov(FieldOperand(edi, FixedArray::kMapOffset),
1516 Immediate(isolate->factory()->fixed_array_map())); 1516 Immediate(isolate->factory()->fixed_array_map()));
1517 1517
1518 __ mov(FieldOperand(edi, FixedArray::kLengthOffset), ecx); 1518 __ mov(FieldOperand(edi, FixedArray::kLengthOffset), ecx);
1519 // Untag the length for the loop below. 1519 // Untag the length for the loop below.
1520 __ SmiUntag(ecx); 1520 __ SmiUntag(ecx);
1521 1521
1522 // Copy the fixed array slots. 1522 // Copy the fixed array slots.
1523 Label loop; 1523 Label loop;
(...skipping 3934 matching lines...) Expand 10 before | Expand all | Expand 10 after
5458 Operand(ebp, 7 * kPointerSize), 5458 Operand(ebp, 7 * kPointerSize),
5459 NULL); 5459 NULL);
5460 } 5460 }
5461 5461
5462 5462
5463 #undef __ 5463 #undef __
5464 5464
5465 } } // namespace v8::internal 5465 } } // namespace v8::internal
5466 5466
5467 #endif // V8_TARGET_ARCH_IA32 5467 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/i18n.cc ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698