| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 #endif | 812 #endif |
| 813 | 813 |
| 814 | 814 |
| 815 #ifdef ENABLE_DISASSEMBLER | 815 #ifdef ENABLE_DISASSEMBLER |
| 816 const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { | 816 const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { |
| 817 switch (rmode) { | 817 switch (rmode) { |
| 818 case NONE32: | 818 case NONE32: |
| 819 return "no reloc 32"; | 819 return "no reloc 32"; |
| 820 case NONE64: | 820 case NONE64: |
| 821 return "no reloc 64"; | 821 return "no reloc 64"; |
| 822 case NONEINTPTR: |
| 823 return "no reloc intptr"; |
| 822 case EMBEDDED_OBJECT: | 824 case EMBEDDED_OBJECT: |
| 823 return "embedded object"; | 825 return "embedded object"; |
| 824 case DEBUGGER_STATEMENT: | 826 case DEBUGGER_STATEMENT: |
| 825 return "debugger statement"; | 827 return "debugger statement"; |
| 826 case CODE_TARGET: | 828 case CODE_TARGET: |
| 827 return "code target"; | 829 return "code target"; |
| 828 case CODE_TARGET_WITH_ID: | 830 case CODE_TARGET_WITH_ID: |
| 829 return "code target with id"; | 831 return "code target with id"; |
| 830 case CELL: | 832 case CELL: |
| 831 return "property cell"; | 833 return "property cell"; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 959 case VENEER_POOL: | 961 case VENEER_POOL: |
| 960 case DEBUG_BREAK_SLOT_AT_POSITION: | 962 case DEBUG_BREAK_SLOT_AT_POSITION: |
| 961 case DEBUG_BREAK_SLOT_AT_RETURN: | 963 case DEBUG_BREAK_SLOT_AT_RETURN: |
| 962 case DEBUG_BREAK_SLOT_AT_CALL: | 964 case DEBUG_BREAK_SLOT_AT_CALL: |
| 963 case DEBUG_BREAK_SLOT_AT_TAIL_CALL: | 965 case DEBUG_BREAK_SLOT_AT_TAIL_CALL: |
| 964 case GENERATOR_CONTINUATION: | 966 case GENERATOR_CONTINUATION: |
| 965 case WASM_MEMORY_REFERENCE: | 967 case WASM_MEMORY_REFERENCE: |
| 966 case WASM_MEMORY_SIZE_REFERENCE: | 968 case WASM_MEMORY_SIZE_REFERENCE: |
| 967 case NONE32: | 969 case NONE32: |
| 968 case NONE64: | 970 case NONE64: |
| 971 case NONEINTPTR: |
| 969 break; | 972 break; |
| 970 case NUMBER_OF_MODES: | 973 case NUMBER_OF_MODES: |
| 971 case PC_JUMP: | 974 case PC_JUMP: |
| 972 UNREACHABLE(); | 975 UNREACHABLE(); |
| 973 break; | 976 break; |
| 974 case CODE_AGE_SEQUENCE: | 977 case CODE_AGE_SEQUENCE: |
| 975 DCHECK(Code::IsYoungSequence(isolate, pc_) || code_age_stub()->IsCode()); | 978 DCHECK(Code::IsYoungSequence(isolate, pc_) || code_age_stub()->IsCode()); |
| 976 break; | 979 break; |
| 977 } | 980 } |
| 978 } | 981 } |
| (...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1911 } else { | 1914 } else { |
| 1912 DCHECK(type == ConstantPoolEntry::INTPTR); | 1915 DCHECK(type == ConstantPoolEntry::INTPTR); |
| 1913 if (!is_uintn(ptr_offset, info.regular_reach_bits)) { | 1916 if (!is_uintn(ptr_offset, info.regular_reach_bits)) { |
| 1914 return ConstantPoolEntry::OVERFLOWED; | 1917 return ConstantPoolEntry::OVERFLOWED; |
| 1915 } | 1918 } |
| 1916 } | 1919 } |
| 1917 | 1920 |
| 1918 return ConstantPoolEntry::REGULAR; | 1921 return ConstantPoolEntry::REGULAR; |
| 1919 } | 1922 } |
| 1920 | 1923 |
| 1921 | |
| 1922 ConstantPoolEntry::Access ConstantPoolBuilder::AddEntry( | 1924 ConstantPoolEntry::Access ConstantPoolBuilder::AddEntry( |
| 1923 ConstantPoolEntry& entry, ConstantPoolEntry::Type type) { | 1925 ConstantPoolEntry& entry) { |
| 1924 DCHECK(!emitted_label_.is_bound()); | 1926 DCHECK(!emitted_label_.is_bound()); |
| 1925 PerTypeEntryInfo& info = info_[type]; | 1927 PerTypeEntryInfo& info = info_[entry.type()]; |
| 1926 const int entry_size = ConstantPoolEntry::size(type); | |
| 1927 bool merged = false; | 1928 bool merged = false; |
| 1928 | 1929 |
| 1929 if (entry.sharing_ok()) { | 1930 if (entry.sharing_ok()) { |
| 1930 // Try to merge entries | 1931 // Try to merge entries |
| 1931 std::vector<ConstantPoolEntry>::iterator it = info.shared_entries.begin(); | 1932 std::vector<ConstantPoolEntry>::iterator it = info.shared_entries.begin(); |
| 1932 int end = static_cast<int>(info.shared_entries.size()); | 1933 int end = static_cast<int>(info.shared_entries.size()); |
| 1933 for (int i = 0; i < end; i++, it++) { | 1934 for (int i = 0; i < end; i++, it++) { |
| 1934 if ((entry_size == kPointerSize) ? entry.value() == it->value() | 1935 if (entry.MayBeMergedWith(*it)) { |
| 1935 : entry.value64() == it->value64()) { | |
| 1936 // Merge with found entry. | 1936 // Merge with found entry. |
| 1937 entry.set_merged_index(i); | 1937 entry.set_merged_index(i); |
| 1938 merged = true; | 1938 merged = true; |
| 1939 break; | 1939 break; |
| 1940 } | 1940 } |
| 1941 } | 1941 } |
| 1942 } | 1942 } |
| 1943 | 1943 |
| 1944 // By definition, merged entries have regular access. | 1944 // By definition, merged entries have regular access. |
| 1945 DCHECK(!merged || entry.merged_index() < info.regular_count); | 1945 DCHECK(!merged || entry.merged_index() < info.regular_count); |
| 1946 ConstantPoolEntry::Access access = | 1946 ConstantPoolEntry::Access access = |
| 1947 (merged ? ConstantPoolEntry::REGULAR : NextAccess(type)); | 1947 (merged ? ConstantPoolEntry::REGULAR : NextAccess(entry.type())); |
| 1948 | 1948 |
| 1949 // Enforce an upper bound on search time by limiting the search to | 1949 // Enforce an upper bound on search time by limiting the search to |
| 1950 // unique sharable entries which fit in the regular section. | 1950 // unique sharable entries which fit in the regular section. |
| 1951 if (entry.sharing_ok() && !merged && access == ConstantPoolEntry::REGULAR) { | 1951 if (entry.sharing_ok() && !merged && access == ConstantPoolEntry::REGULAR) { |
| 1952 info.shared_entries.push_back(entry); | 1952 info.shared_entries.push_back(entry); |
| 1953 } else { | 1953 } else { |
| 1954 info.entries.push_back(entry); | 1954 info.entries.push_back(entry); |
| 1955 } | 1955 } |
| 1956 | 1956 |
| 1957 // We're done if we found a match or have already triggered the | 1957 // We're done if we found a match or have already triggered the |
| 1958 // overflow state. | 1958 // overflow state. |
| 1959 if (merged || info.overflow()) return access; | 1959 if (merged || info.overflow()) return access; |
| 1960 | 1960 |
| 1961 if (access == ConstantPoolEntry::REGULAR) { | 1961 if (access == ConstantPoolEntry::REGULAR) { |
| 1962 info.regular_count++; | 1962 info.regular_count++; |
| 1963 } else { | 1963 } else { |
| 1964 info.overflow_start = static_cast<int>(info.entries.size()) - 1; | 1964 info.overflow_start = static_cast<int>(info.entries.size()) - 1; |
| 1965 } | 1965 } |
| 1966 | 1966 |
| 1967 return access; | 1967 return access; |
| 1968 } | 1968 } |
| 1969 | 1969 |
| 1970 | 1970 |
| 1971 void ConstantPoolBuilder::EmitSharedEntries(Assembler* assm, | 1971 void ConstantPoolBuilder::EmitSharedEntries(Assembler* assm, |
| 1972 ConstantPoolEntry::Type type) { | 1972 ConstantPoolEntry::Type type) { |
| 1973 PerTypeEntryInfo& info = info_[type]; | 1973 PerTypeEntryInfo& info = info_[type]; |
| 1974 std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; | 1974 std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; |
| 1975 const int entry_size = ConstantPoolEntry::size(type); | 1975 const int entry_size = ConstantPoolEntry::SizeOfType(type); |
| 1976 int base = emitted_label_.pos(); | 1976 int base = emitted_label_.pos(); |
| 1977 DCHECK(base > 0); | 1977 DCHECK(base > 0); |
| 1978 int shared_end = static_cast<int>(shared_entries.size()); | 1978 int shared_end = static_cast<int>(shared_entries.size()); |
| 1979 std::vector<ConstantPoolEntry>::iterator shared_it = shared_entries.begin(); | 1979 std::vector<ConstantPoolEntry>::iterator shared_it = shared_entries.begin(); |
| 1980 for (int i = 0; i < shared_end; i++, shared_it++) { | 1980 for (int i = 0; i < shared_end; i++, shared_it++) { |
| 1981 int offset = assm->pc_offset() - base; | 1981 int offset = assm->pc_offset() - base; |
| 1982 shared_it->set_offset(offset); // Save offset for merged entries. | 1982 shared_it->set_offset(offset); // Save offset for merged entries. |
| 1983 if (entry_size == kPointerSize) { | 1983 if (entry_size == kPointerSize) { |
| 1984 assm->dp(shared_it->value()); | 1984 assm->dp(shared_it->value()); |
| 1985 } else { | 1985 } else { |
| 1986 assm->dq(shared_it->value64()); | 1986 assm->dq(shared_it->value64()); |
| 1987 } | 1987 } |
| 1988 DCHECK(is_uintn(offset, info.regular_reach_bits)); | 1988 DCHECK(is_uintn(offset, info.regular_reach_bits)); |
| 1989 | 1989 |
| 1990 // Patch load sequence with correct offset. | 1990 // Patch load sequence with correct offset. |
| 1991 assm->PatchConstantPoolAccessInstruction(shared_it->position(), offset, | 1991 assm->PatchConstantPoolAccessInstruction(shared_it->position(), offset, |
| 1992 ConstantPoolEntry::REGULAR, type); | 1992 ConstantPoolEntry::REGULAR, type); |
| 1993 } | 1993 } |
| 1994 } | 1994 } |
| 1995 | 1995 |
| 1996 | 1996 |
| 1997 void ConstantPoolBuilder::EmitGroup(Assembler* assm, | 1997 void ConstantPoolBuilder::EmitGroup(Assembler* assm, |
| 1998 ConstantPoolEntry::Access access, | 1998 ConstantPoolEntry::Access access, |
| 1999 ConstantPoolEntry::Type type) { | 1999 ConstantPoolEntry::Type type) { |
| 2000 PerTypeEntryInfo& info = info_[type]; | 2000 PerTypeEntryInfo& info = info_[type]; |
| 2001 const bool overflow = info.overflow(); | 2001 const bool overflow = info.overflow(); |
| 2002 std::vector<ConstantPoolEntry>& entries = info.entries; | 2002 std::vector<ConstantPoolEntry>& entries = info.entries; |
| 2003 std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; | 2003 std::vector<ConstantPoolEntry>& shared_entries = info.shared_entries; |
| 2004 const int entry_size = ConstantPoolEntry::size(type); | 2004 const int entry_size = ConstantPoolEntry::SizeOfType(type); |
| 2005 int base = emitted_label_.pos(); | 2005 int base = emitted_label_.pos(); |
| 2006 DCHECK(base > 0); | 2006 DCHECK(base > 0); |
| 2007 int begin; | 2007 int begin; |
| 2008 int end; | 2008 int end; |
| 2009 | 2009 |
| 2010 if (access == ConstantPoolEntry::REGULAR) { | 2010 if (access == ConstantPoolEntry::REGULAR) { |
| 2011 // Emit any shared entries first | 2011 // Emit any shared entries first |
| 2012 EmitSharedEntries(assm, type); | 2012 EmitSharedEntries(assm, type); |
| 2013 } | 2013 } |
| 2014 | 2014 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 | 2117 |
| 2118 | 2118 |
| 2119 void Assembler::DataAlign(int m) { | 2119 void Assembler::DataAlign(int m) { |
| 2120 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); | 2120 DCHECK(m >= 2 && base::bits::IsPowerOfTwo32(m)); |
| 2121 while ((pc_offset() & (m - 1)) != 0) { | 2121 while ((pc_offset() & (m - 1)) != 0) { |
| 2122 db(0); | 2122 db(0); |
| 2123 } | 2123 } |
| 2124 } | 2124 } |
| 2125 } // namespace internal | 2125 } // namespace internal |
| 2126 } // namespace v8 | 2126 } // namespace v8 |
| OLD | NEW |