| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 Context::kHeaderSize + Context::SECURITY_TOKEN_INDEX * kPointerSize; | 1882 Context::kHeaderSize + Context::SECURITY_TOKEN_INDEX * kPointerSize; |
| 1883 movq(scratch, FieldOperand(scratch, token_offset)); | 1883 movq(scratch, FieldOperand(scratch, token_offset)); |
| 1884 cmpq(scratch, FieldOperand(kScratchRegister, token_offset)); | 1884 cmpq(scratch, FieldOperand(kScratchRegister, token_offset)); |
| 1885 j(not_equal, miss); | 1885 j(not_equal, miss); |
| 1886 | 1886 |
| 1887 bind(&same_contexts); | 1887 bind(&same_contexts); |
| 1888 } | 1888 } |
| 1889 | 1889 |
| 1890 | 1890 |
| 1891 void MacroAssembler::LoadAllocationTopHelper(Register result, | 1891 void MacroAssembler::LoadAllocationTopHelper(Register result, |
| 1892 Register result_end, | |
| 1893 Register scratch, | 1892 Register scratch, |
| 1894 AllocationFlags flags) { | 1893 AllocationFlags flags) { |
| 1895 ExternalReference new_space_allocation_top = | 1894 ExternalReference new_space_allocation_top = |
| 1896 ExternalReference::new_space_allocation_top_address(); | 1895 ExternalReference::new_space_allocation_top_address(); |
| 1897 | 1896 |
| 1898 // Just return if allocation top is already known. | 1897 // Just return if allocation top is already known. |
| 1899 if ((flags & RESULT_CONTAINS_TOP) != 0) { | 1898 if ((flags & RESULT_CONTAINS_TOP) != 0) { |
| 1900 // No use of scratch if allocation top is provided. | 1899 // No use of scratch if allocation top is provided. |
| 1901 ASSERT(!scratch.is_valid()); | 1900 ASSERT(!scratch.is_valid()); |
| 1902 #ifdef DEBUG | 1901 #ifdef DEBUG |
| 1903 // Assert that result actually contains top on entry. | 1902 // Assert that result actually contains top on entry. |
| 1904 movq(kScratchRegister, new_space_allocation_top); | 1903 movq(kScratchRegister, new_space_allocation_top); |
| 1905 cmpq(result, Operand(kScratchRegister, 0)); | 1904 cmpq(result, Operand(kScratchRegister, 0)); |
| 1906 Check(equal, "Unexpected allocation top"); | 1905 Check(equal, "Unexpected allocation top"); |
| 1907 #endif | 1906 #endif |
| 1908 return; | 1907 return; |
| 1909 } | 1908 } |
| 1910 | 1909 |
| 1911 // Move address of new object to result. Use scratch register if available, | 1910 // Move address of new object to result. Use scratch register if available, |
| 1912 // and keep address in scratch until call to UpdateAllocationTopHelper. | 1911 // and keep address in scratch until call to UpdateAllocationTopHelper. |
| 1913 if (scratch.is_valid()) { | 1912 if (scratch.is_valid()) { |
| 1914 ASSERT(!scratch.is(result_end)); | |
| 1915 movq(scratch, new_space_allocation_top); | 1913 movq(scratch, new_space_allocation_top); |
| 1916 movq(result, Operand(scratch, 0)); | 1914 movq(result, Operand(scratch, 0)); |
| 1917 } else if (result.is(rax)) { | 1915 } else if (result.is(rax)) { |
| 1918 load_rax(new_space_allocation_top); | 1916 load_rax(new_space_allocation_top); |
| 1919 } else { | 1917 } else { |
| 1920 movq(kScratchRegister, new_space_allocation_top); | 1918 movq(kScratchRegister, new_space_allocation_top); |
| 1921 movq(result, Operand(kScratchRegister, 0)); | 1919 movq(result, Operand(kScratchRegister, 0)); |
| 1922 } | 1920 } |
| 1923 } | 1921 } |
| 1924 | 1922 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1965 if (scratch.is_valid()) { | 1963 if (scratch.is_valid()) { |
| 1966 movl(scratch, Immediate(0x7291)); | 1964 movl(scratch, Immediate(0x7291)); |
| 1967 } | 1965 } |
| 1968 } | 1966 } |
| 1969 jmp(gc_required); | 1967 jmp(gc_required); |
| 1970 return; | 1968 return; |
| 1971 } | 1969 } |
| 1972 ASSERT(!result.is(result_end)); | 1970 ASSERT(!result.is(result_end)); |
| 1973 | 1971 |
| 1974 // Load address of new object into result. | 1972 // Load address of new object into result. |
| 1975 LoadAllocationTopHelper(result, result_end, scratch, flags); | 1973 LoadAllocationTopHelper(result, scratch, flags); |
| 1976 | 1974 |
| 1977 // Calculate new top and bail out if new space is exhausted. | 1975 // Calculate new top and bail out if new space is exhausted. |
| 1978 ExternalReference new_space_allocation_limit = | 1976 ExternalReference new_space_allocation_limit = |
| 1979 ExternalReference::new_space_allocation_limit_address(); | 1977 ExternalReference::new_space_allocation_limit_address(); |
| 1980 | 1978 |
| 1981 Register top_reg = result_end.is_valid() ? result_end : result; | 1979 Register top_reg = result_end.is_valid() ? result_end : result; |
| 1982 | 1980 |
| 1983 if (top_reg.is(result)) { | 1981 if (top_reg.is(result)) { |
| 1984 addq(top_reg, Immediate(object_size)); | 1982 addq(top_reg, Immediate(object_size)); |
| 1985 } else { | 1983 } else { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2022 movl(scratch, Immediate(0x7291)); | 2020 movl(scratch, Immediate(0x7291)); |
| 2023 } | 2021 } |
| 2024 // Register element_count is not modified by the function. | 2022 // Register element_count is not modified by the function. |
| 2025 } | 2023 } |
| 2026 jmp(gc_required); | 2024 jmp(gc_required); |
| 2027 return; | 2025 return; |
| 2028 } | 2026 } |
| 2029 ASSERT(!result.is(result_end)); | 2027 ASSERT(!result.is(result_end)); |
| 2030 | 2028 |
| 2031 // Load address of new object into result. | 2029 // Load address of new object into result. |
| 2032 LoadAllocationTopHelper(result, result_end, scratch, flags); | 2030 LoadAllocationTopHelper(result, scratch, flags); |
| 2033 | 2031 |
| 2034 // Calculate new top and bail out if new space is exhausted. | 2032 // Calculate new top and bail out if new space is exhausted. |
| 2035 ExternalReference new_space_allocation_limit = | 2033 ExternalReference new_space_allocation_limit = |
| 2036 ExternalReference::new_space_allocation_limit_address(); | 2034 ExternalReference::new_space_allocation_limit_address(); |
| 2037 lea(result_end, Operand(result, element_count, element_size, header_size)); | 2035 lea(result_end, Operand(result, element_count, element_size, header_size)); |
| 2038 movq(kScratchRegister, new_space_allocation_limit); | 2036 movq(kScratchRegister, new_space_allocation_limit); |
| 2039 cmpq(result_end, Operand(kScratchRegister, 0)); | 2037 cmpq(result_end, Operand(kScratchRegister, 0)); |
| 2040 j(above, gc_required); | 2038 j(above, gc_required); |
| 2041 | 2039 |
| 2042 // Update allocation top. | 2040 // Update allocation top. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2064 movl(scratch, Immediate(0x7291)); | 2062 movl(scratch, Immediate(0x7291)); |
| 2065 } | 2063 } |
| 2066 // object_size is left unchanged by this function. | 2064 // object_size is left unchanged by this function. |
| 2067 } | 2065 } |
| 2068 jmp(gc_required); | 2066 jmp(gc_required); |
| 2069 return; | 2067 return; |
| 2070 } | 2068 } |
| 2071 ASSERT(!result.is(result_end)); | 2069 ASSERT(!result.is(result_end)); |
| 2072 | 2070 |
| 2073 // Load address of new object into result. | 2071 // Load address of new object into result. |
| 2074 LoadAllocationTopHelper(result, result_end, scratch, flags); | 2072 LoadAllocationTopHelper(result, scratch, flags); |
| 2075 | 2073 |
| 2076 // Calculate new top and bail out if new space is exhausted. | 2074 // Calculate new top and bail out if new space is exhausted. |
| 2077 ExternalReference new_space_allocation_limit = | 2075 ExternalReference new_space_allocation_limit = |
| 2078 ExternalReference::new_space_allocation_limit_address(); | 2076 ExternalReference::new_space_allocation_limit_address(); |
| 2079 if (!object_size.is(result_end)) { | 2077 if (!object_size.is(result_end)) { |
| 2080 movq(result_end, object_size); | 2078 movq(result_end, object_size); |
| 2081 } | 2079 } |
| 2082 addq(result_end, result); | 2080 addq(result_end, result); |
| 2083 movq(kScratchRegister, new_space_allocation_limit); | 2081 movq(kScratchRegister, new_space_allocation_limit); |
| 2084 cmpq(result_end, Operand(kScratchRegister, 0)); | 2082 cmpq(result_end, Operand(kScratchRegister, 0)); |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2329 CPU::FlushICache(address_, size_); | 2327 CPU::FlushICache(address_, size_); |
| 2330 | 2328 |
| 2331 // Check that the code was patched as expected. | 2329 // Check that the code was patched as expected. |
| 2332 ASSERT(masm_.pc_ == address_ + size_); | 2330 ASSERT(masm_.pc_ == address_ + size_); |
| 2333 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); | 2331 ASSERT(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); |
| 2334 } | 2332 } |
| 2335 | 2333 |
| 2336 } } // namespace v8::internal | 2334 } } // namespace v8::internal |
| 2337 | 2335 |
| 2338 #endif // V8_TARGET_ARCH_X64 | 2336 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |