OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 2787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 __ Mul(descriptors_length, descriptors_length, x15); | 2798 __ Mul(descriptors_length, descriptors_length, x15); |
2799 // Calculate location of the first key name. | 2799 // Calculate location of the first key name. |
2800 __ Add(descriptors, descriptors, | 2800 __ Add(descriptors, descriptors, |
2801 DescriptorArray::kFirstOffset - kHeapObjectTag); | 2801 DescriptorArray::kFirstOffset - kHeapObjectTag); |
2802 // Calculate the end of the descriptor array. | 2802 // Calculate the end of the descriptor array. |
2803 __ Add(descriptors_end, descriptors, | 2803 __ Add(descriptors_end, descriptors, |
2804 Operand(descriptors_length, LSL, kPointerSizeLog2)); | 2804 Operand(descriptors_length, LSL, kPointerSizeLog2)); |
2805 | 2805 |
2806 // Loop through all the keys in the descriptor array. If one of these is the | 2806 // Loop through all the keys in the descriptor array. If one of these is the |
2807 // string "valueOf" the result is false. | 2807 // string "valueOf" the result is false. |
2808 // TODO(all): optimise this loop to combine the add and ldr into an | |
2809 // addressing mode. | |
2810 Register valueof_string = x1; | 2808 Register valueof_string = x1; |
| 2809 int descriptor_size = DescriptorArray::kDescriptorSize * kPointerSize; |
2811 __ Mov(valueof_string, Operand(isolate()->factory()->value_of_string())); | 2810 __ Mov(valueof_string, Operand(isolate()->factory()->value_of_string())); |
2812 __ Bind(&loop); | 2811 __ Bind(&loop); |
2813 __ Ldr(x15, MemOperand(descriptors)); | 2812 __ Ldr(x15, MemOperand(descriptors, descriptor_size, PostIndex)); |
2814 __ Cmp(x15, valueof_string); | 2813 __ Cmp(x15, valueof_string); |
2815 __ B(eq, if_false); | 2814 __ B(eq, if_false); |
2816 __ Add(descriptors, descriptors, | |
2817 DescriptorArray::kDescriptorSize * kPointerSize); | |
2818 __ Cmp(descriptors, descriptors_end); | 2815 __ Cmp(descriptors, descriptors_end); |
2819 __ B(ne, &loop); | 2816 __ B(ne, &loop); |
2820 | 2817 |
2821 __ Bind(&done); | 2818 __ Bind(&done); |
2822 | 2819 |
2823 // Set the bit in the map to indicate that there is no local valueOf field. | 2820 // Set the bit in the map to indicate that there is no local valueOf field. |
2824 __ Ldrb(x2, FieldMemOperand(map, Map::kBitField2Offset)); | 2821 __ Ldrb(x2, FieldMemOperand(map, Map::kBitField2Offset)); |
2825 __ Orr(x2, x2, 1 << Map::kStringWrapperSafeForDefaultValueOf); | 2822 __ Orr(x2, x2, 1 << Map::kStringWrapperSafeForDefaultValueOf); |
2826 __ Strb(x2, FieldMemOperand(map, Map::kBitField2Offset)); | 2823 __ Strb(x2, FieldMemOperand(map, Map::kBitField2Offset)); |
2827 | 2824 |
(...skipping 2176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5004 return previous_; | 5001 return previous_; |
5005 } | 5002 } |
5006 | 5003 |
5007 | 5004 |
5008 #undef __ | 5005 #undef __ |
5009 | 5006 |
5010 | 5007 |
5011 } } // namespace v8::internal | 5008 } } // namespace v8::internal |
5012 | 5009 |
5013 #endif // V8_TARGET_ARCH_A64 | 5010 #endif // V8_TARGET_ARCH_A64 |
OLD | NEW |