131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/safepoint-table.h" 8c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disasm.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h" 14a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 { 16a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal { 17a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 18c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 19c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgbool SafepointEntry::HasRegisters() const { 20e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_valid()); 21e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 22c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; 23c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (int i = 0; i < num_reg_bytes; i++) { 24c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (bits_[i] != SafepointTable::kNoRegisters) return true; 25c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 26c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return false; 27c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 28c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 29c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 30c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgbool SafepointEntry::HasRegisterAt(int reg_index) const { 31e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(is_valid()); 32e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(reg_index >= 0 && reg_index < kNumSafepointRegisters); 33c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int byte_index = reg_index >> kBitsPerByteLog2; 34c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org int bit_index = reg_index & (kBitsPerByte - 1); 35c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return (bits_[byte_index] & (1 << bit_index)) != 0; 36c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 37c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 38c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgSafepointTable::SafepointTable(Code* code) { 40e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(code->is_crankshafted()); 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org code_ = code; 4283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org Address header = code->instruction_start() + code->safepoint_table_offset(); 43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org length_ = Memory::uint32_at(header + kLengthOffset); 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org entry_size_ = Memory::uint32_at(header + kEntrySizeOffset); 45a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pc_and_deoptimization_indexes_ = header + kHeaderSize; 469e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org entries_ = pc_and_deoptimization_indexes_ + 479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org (length_ * kPcAndDeoptimizationIndexSize); 48e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_size_ > 0); 4983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org STATIC_ASSERT(SafepointEntry::DeoptimizationIndexField::kMax == 5083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org Safepoint::kNoDeoptimizationIndex); 51a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 52a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 53a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 54c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgSafepointEntry SafepointTable::FindEntry(Address pc) const { 55c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org unsigned pc_offset = static_cast<unsigned>(pc - code_->instruction_start()); 56c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org for (unsigned i = 0; i < length(); i++) { 57c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // TODO(kasperl): Replace the linear search with binary search. 58c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (GetPcOffset(i) == pc_offset) return GetEntry(i); 59a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 60c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org return SafepointEntry(); 61a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 62a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 63a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 64f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgvoid SafepointTable::PrintEntry(unsigned index, OStream& os) const { // NOLINT 65a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org disasm::NameConverter converter; 66c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org SafepointEntry entry = GetEntry(index); 67c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org uint8_t* bits = entry.bits(); 68a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 69a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Print the stack slot bits. 70a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (entry_size_ > 0) { 71e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 72a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int first = kNumSafepointRegisters >> kBitsPerByteLog2; 73a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int last = entry_size_ - 1; 74f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org for (int i = first; i < last; i++) PrintBits(os, bits[i], kBitsPerByte); 75a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int last_bits = code_->stack_slots() - ((last - first) * kBitsPerByte); 76f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org PrintBits(os, bits[last], last_bits); 77a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 78a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Print the registers (if any). 79c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (!entry.HasRegisters()) return; 80a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int j = 0; j < kNumSafepointRegisters; j++) { 81c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org if (entry.HasRegisterAt(j)) { 82f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << " | " << converter.NameOfCPURegister(j); 83a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 86a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 87a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 88a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 89f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgvoid SafepointTable::PrintBits(OStream& os, // NOLINT 90f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org uint8_t byte, int digits) { 91e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(digits >= 0 && digits <= kBitsPerByte); 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < digits; i++) { 93f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org os << (((byte & (1 << i)) == 0) ? "0" : "1"); 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 96a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid Safepoint::DefinePointerRegister(Register reg, Zone* zone) { 997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org registers_->Add(reg.code(), zone); 100c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org} 101c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 102c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 103378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgSafepoint SafepointTableBuilder::DefineSafepoint( 10427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Assembler* assembler, 10527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Safepoint::Kind kind, 10627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org int arguments, 10727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org Safepoint::DeoptMode deopt_mode) { 108e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(arguments >= 0); 10927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org DeoptimizationInfo info; 11027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org info.pc = assembler->pc_offset(); 11127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org info.arguments = arguments; 11227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org info.has_doubles = (kind & Safepoint::kWithDoubles); 1137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org deoptimization_info_.Add(info, zone_); 1147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org deopt_index_list_.Add(Safepoint::kNoDeoptimizationIndex, zone_); 11527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org if (deopt_mode == Safepoint::kNoLazyDeopt) { 11627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org last_lazy_safepoint_ = deopt_index_list_.length(); 11727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org } 1187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org indexes_.Add(new(zone_) ZoneList<int>(8, zone_), zone_); 119378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org registers_.Add((kind & Safepoint::kWithRegisters) 1207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ? new(zone_) ZoneList<int>(4, zone_) 1217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org : NULL, 1227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org zone_); 1239e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org return Safepoint(indexes_.last(), registers_.last()); 124a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 125a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 12727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgvoid SafepointTableBuilder::RecordLazyDeoptimizationIndex(int index) { 12827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org while (last_lazy_safepoint_ < deopt_index_list_.length()) { 12927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org deopt_index_list_[last_lazy_safepoint_++] = index; 13027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org } 13127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org} 13227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org 133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgunsigned SafepointTableBuilder::GetCodeOffset() const { 134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(emitted_); 135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return offset_; 136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 138a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid SafepointTableBuilder::Emit(Assembler* assembler, int bits_per_entry) { 140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Make sure the safepoint table is properly aligned. Pad with nops. 141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->Align(kIntSize); 142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->RecordComment(";;; Safepoint table."); 143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org offset_ = assembler->pc_offset(); 144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Take the register bits into account. 146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bits_per_entry += kNumSafepointRegisters; 147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 148a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Compute the number of bytes per safepoint entry. 149a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int bytes_per_entry = 150a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org RoundUp(bits_per_entry, kBitsPerByte) >> kBitsPerByteLog2; 151a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Emit the table header. 153a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int length = deoptimization_info_.length(); 154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->dd(length); 155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->dd(bytes_per_entry); 156a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 15727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org // Emit sorted table of pc offsets together with deoptimization indexes. 158a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < length; i++) { 159a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->dd(deoptimization_info_[i].pc); 16027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org assembler->dd(EncodeExceptPC(deoptimization_info_[i], 16127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org deopt_index_list_[i])); 162a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Emit table of bitmaps. 1657028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ZoneList<uint8_t> bits(bytes_per_entry, zone_); 166a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < length; i++) { 167a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ZoneList<int>* indexes = indexes_[i]; 168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ZoneList<int>* registers = registers_[i]; 169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bits.Clear(); 1707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org bits.AddBlock(0, bytes_per_entry, zone_); 171a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 172a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Run through the registers (if any). 173e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsAligned(kNumSafepointRegisters, kBitsPerByte)); 174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (registers == NULL) { 175a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int num_reg_bytes = kNumSafepointRegisters >> kBitsPerByteLog2; 176a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int j = 0; j < num_reg_bytes; j++) { 177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bits[j] = SafepointTable::kNoRegisters; 178a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } else { 180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int j = 0; j < registers->length(); j++) { 181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int index = registers->at(j); 182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(index >= 0 && index < kNumSafepointRegisters); 183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int byte_index = index >> kBitsPerByteLog2; 184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int bit_index = index & (kBitsPerByte - 1); 185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bits[byte_index] |= (1 << bit_index); 186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Run through the indexes and build a bitmap. 190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int j = 0; j < indexes->length(); j++) { 191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int index = bits_per_entry - 1 - indexes->at(j); 192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int byte_index = index >> kBitsPerByteLog2; 193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int bit_index = index & (kBitsPerByte - 1); 194a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bits[byte_index] |= (1U << bit_index); 195a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 196a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Emit the bitmap for the current entry. 198a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int k = 0; k < bytes_per_entry; k++) { 199a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org assembler->db(bits[k]); 200a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 201a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 202a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org emitted_ = true; 203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 205a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 20627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orguint32_t SafepointTableBuilder::EncodeExceptPC(const DeoptimizationInfo& info, 20727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org unsigned index) { 208c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org uint32_t encoding = SafepointEntry::DeoptimizationIndexField::encode(index); 209c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org encoding |= SafepointEntry::ArgumentsField::encode(info.arguments); 210c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org encoding |= SafepointEntry::SaveDoublesField::encode(info.has_doubles); 211a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return encoding; 212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 21583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org 216a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} } // namespace v8::internal 217