| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 | 412 |
| 413 // Checks the receiver for special cases (value type, slow case bits). | 413 // Checks the receiver for special cases (value type, slow case bits). |
| 414 // Falls through for regular JS object. | 414 // Falls through for regular JS object. |
| 415 static void GenerateKeyedLoadReceiverCheck(MacroAssembler* masm, | 415 static void GenerateKeyedLoadReceiverCheck(MacroAssembler* masm, |
| 416 Register receiver, | 416 Register receiver, |
| 417 Register map, | 417 Register map, |
| 418 Register scratch, | 418 Register scratch, |
| 419 int interceptor_bit, | 419 int interceptor_bit, |
| 420 Label* slow) { | 420 Label* slow) { |
| 421 // Check that the object isn't a smi. | 421 // Check that the object isn't a smi. |
| 422 __ BranchOnSmi(receiver, slow); | 422 __ JumpIfSmi(receiver, slow); |
| 423 // Get the map of the receiver. | 423 // Get the map of the receiver. |
| 424 __ ldr(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 424 __ ldr(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| 425 // Check bit field. | 425 // Check bit field. |
| 426 __ ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset)); | 426 __ ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset)); |
| 427 __ tst(scratch, | 427 __ tst(scratch, |
| 428 Operand((1 << Map::kIsAccessCheckNeeded) | (1 << interceptor_bit))); | 428 Operand((1 << Map::kIsAccessCheckNeeded) | (1 << interceptor_bit))); |
| 429 __ b(nz, slow); | 429 __ b(nz, slow); |
| 430 // Check that the object is some kind of JS object EXCEPT JS Value type. | 430 // Check that the object is some kind of JS object EXCEPT JS Value type. |
| 431 // In the case that the object is a value-wrapper object, | 431 // In the case that the object is a value-wrapper object, |
| 432 // we enter the runtime system to make sure that indexing into string | 432 // we enter the runtime system to make sure that indexing into string |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 // ----------------------------------- | 742 // ----------------------------------- |
| 743 | 743 |
| 744 // Get the receiver of the function from the stack into r1. | 744 // Get the receiver of the function from the stack into r1. |
| 745 __ ldr(r1, MemOperand(sp, argc * kPointerSize)); | 745 __ ldr(r1, MemOperand(sp, argc * kPointerSize)); |
| 746 | 746 |
| 747 Label do_call, slow_call, slow_load, slow_reload_receiver; | 747 Label do_call, slow_call, slow_load, slow_reload_receiver; |
| 748 Label check_number_dictionary, check_string, lookup_monomorphic_cache; | 748 Label check_number_dictionary, check_string, lookup_monomorphic_cache; |
| 749 Label index_smi, index_string; | 749 Label index_smi, index_string; |
| 750 | 750 |
| 751 // Check that the key is a smi. | 751 // Check that the key is a smi. |
| 752 __ BranchOnNotSmi(r2, &check_string); | 752 __ JumpIfNotSmi(r2, &check_string); |
| 753 __ bind(&index_smi); | 753 __ bind(&index_smi); |
| 754 // Now the key is known to be a smi. This place is also jumped to from below | 754 // Now the key is known to be a smi. This place is also jumped to from below |
| 755 // where a numeric string is converted to a smi. | 755 // where a numeric string is converted to a smi. |
| 756 | 756 |
| 757 GenerateKeyedLoadReceiverCheck( | 757 GenerateKeyedLoadReceiverCheck( |
| 758 masm, r1, r0, r3, Map::kHasIndexedInterceptor, &slow_call); | 758 masm, r1, r0, r3, Map::kHasIndexedInterceptor, &slow_call); |
| 759 | 759 |
| 760 GenerateFastArrayLoad( | 760 GenerateFastArrayLoad( |
| 761 masm, r1, r2, r4, r3, r0, r1, &check_number_dictionary, &slow_load); | 761 masm, r1, r2, r4, r3, r0, r1, &check_number_dictionary, &slow_load); |
| 762 __ IncrementCounter(&Counters::keyed_call_generic_smi_fast, 1, r0, r3); | 762 __ IncrementCounter(&Counters::keyed_call_generic_smi_fast, 1, r0, r3); |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 // -- r0 : key | 1158 // -- r0 : key |
| 1159 // -- r1 : receiver | 1159 // -- r1 : receiver |
| 1160 // ----------------------------------- | 1160 // ----------------------------------- |
| 1161 Label slow, check_string, index_smi, index_string, property_array_property; | 1161 Label slow, check_string, index_smi, index_string, property_array_property; |
| 1162 Label check_pixel_array, probe_dictionary, check_number_dictionary; | 1162 Label check_pixel_array, probe_dictionary, check_number_dictionary; |
| 1163 | 1163 |
| 1164 Register key = r0; | 1164 Register key = r0; |
| 1165 Register receiver = r1; | 1165 Register receiver = r1; |
| 1166 | 1166 |
| 1167 // Check that the key is a smi. | 1167 // Check that the key is a smi. |
| 1168 __ BranchOnNotSmi(key, &check_string); | 1168 __ JumpIfNotSmi(key, &check_string); |
| 1169 __ bind(&index_smi); | 1169 __ bind(&index_smi); |
| 1170 // Now the key is known to be a smi. This place is also jumped to from below | 1170 // Now the key is known to be a smi. This place is also jumped to from below |
| 1171 // where a numeric string is converted to a smi. | 1171 // where a numeric string is converted to a smi. |
| 1172 | 1172 |
| 1173 GenerateKeyedLoadReceiverCheck( | 1173 GenerateKeyedLoadReceiverCheck( |
| 1174 masm, receiver, r2, r3, Map::kHasIndexedInterceptor, &slow); | 1174 masm, receiver, r2, r3, Map::kHasIndexedInterceptor, &slow); |
| 1175 | 1175 |
| 1176 // Check the "has fast elements" bit in the receiver's map which is | 1176 // Check the "has fast elements" bit in the receiver's map which is |
| 1177 // now in r2. | 1177 // now in r2. |
| 1178 __ ldrb(r3, FieldMemOperand(r2, Map::kBitField2Offset)); | 1178 __ ldrb(r3, FieldMemOperand(r2, Map::kBitField2Offset)); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1339 | 1339 |
| 1340 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { | 1340 void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
| 1341 // ---------- S t a t e -------------- | 1341 // ---------- S t a t e -------------- |
| 1342 // -- lr : return address | 1342 // -- lr : return address |
| 1343 // -- r0 : key | 1343 // -- r0 : key |
| 1344 // -- r1 : receiver | 1344 // -- r1 : receiver |
| 1345 // ----------------------------------- | 1345 // ----------------------------------- |
| 1346 Label slow; | 1346 Label slow; |
| 1347 | 1347 |
| 1348 // Check that the receiver isn't a smi. | 1348 // Check that the receiver isn't a smi. |
| 1349 __ BranchOnSmi(r1, &slow); | 1349 __ JumpIfSmi(r1, &slow); |
| 1350 | 1350 |
| 1351 // Check that the key is an array index, that is Uint32. | 1351 // Check that the key is an array index, that is Uint32. |
| 1352 __ tst(r0, Operand(kSmiTagMask | kSmiSignMask)); | 1352 __ tst(r0, Operand(kSmiTagMask | kSmiSignMask)); |
| 1353 __ b(ne, &slow); | 1353 __ b(ne, &slow); |
| 1354 | 1354 |
| 1355 // Get the map of the receiver. | 1355 // Get the map of the receiver. |
| 1356 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); | 1356 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset)); |
| 1357 | 1357 |
| 1358 // Check that it has indexed interceptor and access checks | 1358 // Check that it has indexed interceptor and access checks |
| 1359 // are not enabled for this object. | 1359 // are not enabled for this object. |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1463 GenerateRuntimeSetProperty(masm); | 1463 GenerateRuntimeSetProperty(masm); |
| 1464 | 1464 |
| 1465 // Check whether the elements is a pixel array. | 1465 // Check whether the elements is a pixel array. |
| 1466 // r4: elements map. | 1466 // r4: elements map. |
| 1467 __ bind(&check_pixel_array); | 1467 __ bind(&check_pixel_array); |
| 1468 __ LoadRoot(ip, Heap::kPixelArrayMapRootIndex); | 1468 __ LoadRoot(ip, Heap::kPixelArrayMapRootIndex); |
| 1469 __ cmp(r4, ip); | 1469 __ cmp(r4, ip); |
| 1470 __ b(ne, &slow); | 1470 __ b(ne, &slow); |
| 1471 // Check that the value is a smi. If a conversion is needed call into the | 1471 // Check that the value is a smi. If a conversion is needed call into the |
| 1472 // runtime to convert and clamp. | 1472 // runtime to convert and clamp. |
| 1473 __ BranchOnNotSmi(value, &slow); | 1473 __ JumpIfNotSmi(value, &slow); |
| 1474 __ mov(r4, Operand(key, ASR, kSmiTagSize)); // Untag the key. | 1474 __ mov(r4, Operand(key, ASR, kSmiTagSize)); // Untag the key. |
| 1475 __ ldr(ip, FieldMemOperand(elements, PixelArray::kLengthOffset)); | 1475 __ ldr(ip, FieldMemOperand(elements, PixelArray::kLengthOffset)); |
| 1476 __ cmp(r4, Operand(ip)); | 1476 __ cmp(r4, Operand(ip)); |
| 1477 __ b(hs, &slow); | 1477 __ b(hs, &slow); |
| 1478 __ mov(r5, Operand(value, ASR, kSmiTagSize)); // Untag the value. | 1478 __ mov(r5, Operand(value, ASR, kSmiTagSize)); // Untag the value. |
| 1479 __ Usat(r5, 8, Operand(r5)); // Clamp the value to [0..255]. | 1479 __ Usat(r5, 8, Operand(r5)); // Clamp the value to [0..255]. |
| 1480 | 1480 |
| 1481 // Get the pointer to the external array. This clobbers elements. | 1481 // Get the pointer to the external array. This clobbers elements. |
| 1482 __ ldr(elements, | 1482 __ ldr(elements, |
| 1483 FieldMemOperand(elements, PixelArray::kExternalPointerOffset)); | 1483 FieldMemOperand(elements, PixelArray::kExternalPointerOffset)); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1582 // to JSArray. | 1582 // to JSArray. |
| 1583 // Value must be a number, but only smis are accepted as the most common case. | 1583 // Value must be a number, but only smis are accepted as the most common case. |
| 1584 | 1584 |
| 1585 Label miss; | 1585 Label miss; |
| 1586 | 1586 |
| 1587 Register receiver = r1; | 1587 Register receiver = r1; |
| 1588 Register value = r0; | 1588 Register value = r0; |
| 1589 Register scratch = r3; | 1589 Register scratch = r3; |
| 1590 | 1590 |
| 1591 // Check that the receiver isn't a smi. | 1591 // Check that the receiver isn't a smi. |
| 1592 __ BranchOnSmi(receiver, &miss); | 1592 __ JumpIfSmi(receiver, &miss); |
| 1593 | 1593 |
| 1594 // Check that the object is a JS array. | 1594 // Check that the object is a JS array. |
| 1595 __ CompareObjectType(receiver, scratch, scratch, JS_ARRAY_TYPE); | 1595 __ CompareObjectType(receiver, scratch, scratch, JS_ARRAY_TYPE); |
| 1596 __ b(ne, &miss); | 1596 __ b(ne, &miss); |
| 1597 | 1597 |
| 1598 // Check that elements are FixedArray. | 1598 // Check that elements are FixedArray. |
| 1599 // We rely on StoreIC_ArrayLength below to deal with all types of | 1599 // We rely on StoreIC_ArrayLength below to deal with all types of |
| 1600 // fast elements (including COW). | 1600 // fast elements (including COW). |
| 1601 __ ldr(scratch, FieldMemOperand(receiver, JSArray::kElementsOffset)); | 1601 __ ldr(scratch, FieldMemOperand(receiver, JSArray::kElementsOffset)); |
| 1602 __ CompareObjectType(scratch, scratch, scratch, FIXED_ARRAY_TYPE); | 1602 __ CompareObjectType(scratch, scratch, scratch, FIXED_ARRAY_TYPE); |
| 1603 __ b(ne, &miss); | 1603 __ b(ne, &miss); |
| 1604 | 1604 |
| 1605 // Check that value is a smi. | 1605 // Check that value is a smi. |
| 1606 __ BranchOnNotSmi(value, &miss); | 1606 __ JumpIfNotSmi(value, &miss); |
| 1607 | 1607 |
| 1608 // Prepare tail call to StoreIC_ArrayLength. | 1608 // Prepare tail call to StoreIC_ArrayLength. |
| 1609 __ Push(receiver, value); | 1609 __ Push(receiver, value); |
| 1610 | 1610 |
| 1611 ExternalReference ref = ExternalReference(IC_Utility(kStoreIC_ArrayLength)); | 1611 ExternalReference ref = ExternalReference(IC_Utility(kStoreIC_ArrayLength)); |
| 1612 __ TailCallExternalReference(ref, 2, 1); | 1612 __ TailCallExternalReference(ref, 2, 1); |
| 1613 | 1613 |
| 1614 __ bind(&miss); | 1614 __ bind(&miss); |
| 1615 | 1615 |
| 1616 GenerateMiss(masm); | 1616 GenerateMiss(masm); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1704 | 1704 |
| 1705 | 1705 |
| 1706 void PatchInlinedSmiCode(Address address) { | 1706 void PatchInlinedSmiCode(Address address) { |
| 1707 // Currently there is no smi inlining in the ARM full code generator. | 1707 // Currently there is no smi inlining in the ARM full code generator. |
| 1708 } | 1708 } |
| 1709 | 1709 |
| 1710 | 1710 |
| 1711 } } // namespace v8::internal | 1711 } } // namespace v8::internal |
| 1712 | 1712 |
| 1713 #endif // V8_TARGET_ARCH_ARM | 1713 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |