14#include "third_party/zlib/google/compression_utils_portable.h"
24 explicit OperandBase(uint32_t value) :
value_(value) {}
31class SmallUnsignedOperand :
public OperandBase {
33 explicit SmallUnsignedOperand(uint32_t value) : OperandBase(value) {
36 void WriteVLQ(ZoneVector<uint8_t>* buffer) { buffer->push_back(
value()); }
37 bool IsSigned()
const {
return false; }
40class UnsignedOperand :
public OperandBase {
42 explicit UnsignedOperand(int32_t value)
43 : UnsignedOperand(static_cast<uint32_t>(value)) {
46 explicit UnsignedOperand(uint32_t value) : OperandBase(value) {}
47 void WriteVLQ(ZoneVector<uint8_t>* buffer) {
49 [buffer](uint8_t value) { buffer->push_back(value); },
value());
51 bool IsSigned()
const {
return false; }
54class SignedOperand :
public OperandBase {
56 explicit SignedOperand(int32_t value) : OperandBase(value) {}
58 explicit SignedOperand(uint32_t value) =
delete;
59 void WriteVLQ(ZoneVector<uint8_t>* buffer) {
61 [buffer](uint8_t value) {
62 buffer->push_back(value);
63 return &buffer->back();
67 bool IsSigned()
const {
return true; }
70template <
typename... T>
71inline bool OperandsEqual(uint32_t* expected_operands, T... operands) {
72 return (... && (*(expected_operands++) == operands.value()));
77template <
typename... T>
86template <
typename... T>
95template <
typename... T>
97 auto opcode = update_feedback ? TranslationOpcode::BEGIN_WITH_FEEDBACK
98 : TranslationOpcode::BEGIN_WITHOUT_FEEDBACK;
103#ifdef ENABLE_SLOW_DCHECKS
105 all_instructions_.emplace_back(opcode, operands...);
113 bool update_feedback) {
115 int start_index =
Size();
116 int distance_from_last_start = 0;
145 AddRawBegin(update_feedback, UnsignedOperand(distance_from_last_start),
146 SignedOperand(frame_count), SignedOperand(jsframe_count));
159 const int kMaxShortenableOperand =
167 TranslationOpcode::MATCH_PREVIOUS_TRANSLATION,
174template <
typename... T>
181#ifdef ENABLE_SLOW_DCHECKS
183 all_instructions_.emplace_back(opcode, operands...);
213 uLongf compressed_data_size = compressBound(input_size);
218 zlib_internal::CompressHelper(
219 zlib_internal::ZRAW, compressed_data.
data(), &compressed_data_size,
221 input_size, Z_DEFAULT_COMPRESSION,
nullptr,
nullptr),
224 const int translation_array_size =
225 static_cast<int>(compressed_data_size) +
226 DeoptimizationFrameTranslation::kUncompressedSizeSize;
230 result->set_int(DeoptimizationFrameTranslation::kUncompressedSizeOffset,
233 result->begin() + DeoptimizationFrameTranslation::kCompressedDataOffset,
234 compressed_data.
data(), compressed_data_size);
245#ifdef ENABLE_SLOW_DCHECKS
256#ifdef ENABLE_SLOW_DCHECKS
265#ifdef ENABLE_SLOW_DCHECKS
268 for (
size_t i = 0;
i < all_instructions_.
size(); ++
i) {
274 uint32_t operand = instruction.is_operand_signed[j]
277 CHECK_EQ(instruction.operands[j], operand);
285 BytecodeOffset bytecode_offset,
int literal_id,
unsigned height) {
286 auto opcode = TranslationOpcode::BUILTIN_CONTINUATION_FRAME;
287 Add(opcode, SignedOperand(bytecode_offset.
ToInt()), SignedOperand(literal_id),
288 UnsignedOperand(height));
291#if V8_ENABLE_WEBASSEMBLY
292void FrameTranslationBuilder::BeginJSToWasmBuiltinContinuationFrame(
294 std::optional<wasm::ValueKind> return_kind) {
295 auto opcode = TranslationOpcode::JS_TO_WASM_BUILTIN_CONTINUATION_FRAME;
296 Add(opcode, SignedOperand(bytecode_offset.
ToInt()), SignedOperand(literal_id),
297 UnsignedOperand(height),
298 SignedOperand(return_kind ?
static_cast<int>(return_kind.value())
302void FrameTranslationBuilder::BeginWasmInlinedIntoJSFrame(
303 BytecodeOffset bailout_id,
int literal_id,
unsigned height) {
304 auto opcode = TranslationOpcode::WASM_INLINED_INTO_JS_FRAME;
305 Add(opcode, SignedOperand(bailout_id.ToInt()), SignedOperand(literal_id),
306 UnsignedOperand(height));
309void FrameTranslationBuilder::BeginLiftoffFrame(BytecodeOffset bailout_id,
311 uint32_t wasm_function_index) {
312 auto opcode = TranslationOpcode::LIFTOFF_FRAME;
313 Add(opcode, SignedOperand(bailout_id.ToInt()), UnsignedOperand(height),
314 UnsignedOperand(wasm_function_index));
319 BytecodeOffset bytecode_offset,
int literal_id,
unsigned height) {
320 auto opcode = TranslationOpcode::JAVASCRIPT_BUILTIN_CONTINUATION_FRAME;
321 Add(opcode, SignedOperand(bytecode_offset.
ToInt()), SignedOperand(literal_id),
322 UnsignedOperand(height));
326 BytecodeOffset bytecode_offset,
int literal_id,
unsigned height) {
328 TranslationOpcode::JAVASCRIPT_BUILTIN_CONTINUATION_WITH_CATCH_FRAME;
329 Add(opcode, SignedOperand(bytecode_offset.
ToInt()), SignedOperand(literal_id),
330 UnsignedOperand(height));
335 auto opcode = TranslationOpcode::CONSTRUCT_CREATE_STUB_FRAME;
336 Add(opcode, SignedOperand(literal_id), UnsignedOperand(height));
340 auto opcode = TranslationOpcode::CONSTRUCT_INVOKE_STUB_FRAME;
341 Add(opcode, SignedOperand(literal_id));
346 auto opcode = TranslationOpcode::INLINED_EXTRA_ARGUMENTS;
347 Add(opcode, SignedOperand(literal_id), UnsignedOperand(height),
352 BytecodeOffset bytecode_offset,
int literal_id,
int bytecode_array_id,
353 unsigned height,
int return_value_offset,
int return_value_count) {
354 if (return_value_count == 0) {
355 auto opcode = TranslationOpcode::INTERPRETED_FRAME_WITHOUT_RETURN;
356 Add(opcode, SignedOperand(bytecode_offset.
ToInt()),
357 SignedOperand(literal_id), SignedOperand(bytecode_array_id),
358 UnsignedOperand(height));
360 auto opcode = TranslationOpcode::INTERPRETED_FRAME_WITH_RETURN;
361 Add(opcode, SignedOperand(bytecode_offset.
ToInt()),
362 SignedOperand(literal_id), SignedOperand(bytecode_array_id),
363 UnsignedOperand(height), SignedOperand(return_value_offset),
364 SignedOperand(return_value_count));
369 auto opcode = TranslationOpcode::ARGUMENTS_ELEMENTS;
370 Add(opcode, SignedOperand(
static_cast<uint8_t
>(type)));
374 auto opcode = TranslationOpcode::ARGUMENTS_LENGTH;
379 auto opcode = TranslationOpcode::REST_LENGTH;
384 auto opcode = TranslationOpcode::CAPTURED_OBJECT;
385 Add(opcode, SignedOperand(length));
389 auto opcode = TranslationOpcode::DUPLICATED_OBJECT;
390 Add(opcode, SignedOperand(object_index));
394 auto opcode = TranslationOpcode::STRING_CONCAT;
401 Add(opcode, SmallUnsignedOperand(
static_cast<uint8_t
>(
reg.code())));
405 auto opcode = TranslationOpcode::REGISTER;
410 auto opcode = TranslationOpcode::INT32_REGISTER;
416 : TranslationOpcode::INT64_REGISTER;
421 auto opcode = TranslationOpcode::INT64_REGISTER;
426 auto opcode = TranslationOpcode::SIGNED_BIGINT64_REGISTER;
431 auto opcode = TranslationOpcode::UNSIGNED_BIGINT64_REGISTER;
436 auto opcode = TranslationOpcode::UINT32_REGISTER;
441 auto opcode = TranslationOpcode::BOOL_REGISTER;
447 auto opcode = TranslationOpcode::FLOAT_REGISTER;
448 Add(opcode, SmallUnsignedOperand(
static_cast<uint8_t
>(
reg.code())));
453 auto opcode = TranslationOpcode::DOUBLE_REGISTER;
454 Add(opcode, SmallUnsignedOperand(
static_cast<uint8_t
>(
reg.code())));
459 auto opcode = TranslationOpcode::HOLEY_DOUBLE_REGISTER;
460 Add(opcode, SmallUnsignedOperand(
static_cast<uint8_t
>(
reg.code())));
465 auto opcode = TranslationOpcode::SIMD128_REGISTER;
466 Add(opcode, SmallUnsignedOperand(
static_cast<uint8_t
>(
reg.code())));
470 auto opcode = TranslationOpcode::TAGGED_STACK_SLOT;
471 Add(opcode, SignedOperand(index));
475 auto opcode = TranslationOpcode::INT32_STACK_SLOT;
476 Add(opcode, SignedOperand(index));
481 : TranslationOpcode::INT64_STACK_SLOT;
482 Add(opcode, SignedOperand(index));
486 auto opcode = TranslationOpcode::INT64_STACK_SLOT;
487 Add(opcode, SignedOperand(index));
491 auto opcode = TranslationOpcode::SIGNED_BIGINT64_STACK_SLOT;
492 Add(opcode, SignedOperand(index));
496 auto opcode = TranslationOpcode::UNSIGNED_BIGINT64_STACK_SLOT;
497 Add(opcode, SignedOperand(index));
501 auto opcode = TranslationOpcode::UINT32_STACK_SLOT;
502 Add(opcode, SignedOperand(index));
506 auto opcode = TranslationOpcode::BOOL_STACK_SLOT;
507 Add(opcode, SignedOperand(index));
511 auto opcode = TranslationOpcode::FLOAT_STACK_SLOT;
512 Add(opcode, SignedOperand(index));
516 auto opcode = TranslationOpcode::DOUBLE_STACK_SLOT;
517 Add(opcode, SignedOperand(index));
521 auto opcode = TranslationOpcode::SIMD128_STACK_SLOT;
522 Add(opcode, SignedOperand(index));
526 auto opcode = TranslationOpcode::HOLEY_DOUBLE_STACK_SLOT;
527 Add(opcode, SignedOperand(index));
531 auto opcode = TranslationOpcode::LITERAL;
533 Add(opcode, SignedOperand(literal_id));
537 auto opcode = TranslationOpcode::OPTIMIZED_OUT;
542 auto opcode = TranslationOpcode::UPDATE_FEEDBACK;
543 Add(opcode, SignedOperand(vector_literal), SignedOperand(slot));
constexpr int ToInt() const
static constexpr int kCallerPCOffset
uint32_t NextOperandUnsigned()
bool HasNextOpcode() const
TranslationOpcode NextOpcode()
DirectHandle< DeoptimizationFrameTranslation > NewDeoptimizationFrameTranslation(int length)
int BeginTranslation(int frame_count, int jsframe_count, bool update_feedback)
void StoreBoolStackSlot(int index)
void ValidateBytes(DeoptTranslationIterator &iter) const
ZoneVector< Instruction > basis_instructions_
void BeginJavaScriptBuiltinContinuationFrame(BytecodeOffset bailout_id, int literal_id, unsigned height)
bool match_previous_allowed_
void StoreSimd128StackSlot(int index)
void AddRawToContentsForCompression(TranslationOpcode opcode, T... operands)
base::Vector< const uint8_t > ToFrameTranslationWasm()
void StoreUint32StackSlot(int index)
void StoreFloatStackSlot(int index)
ZoneVector< uint8_t > contents_
void StoreRegister(TranslationOpcode opcode, Register reg)
void StoreFloatRegister(FloatRegister reg)
size_t total_matching_instructions_in_current_translation_
void StoreUint32Register(Register reg)
void BeginCapturedObject(int length)
void BeginJavaScriptBuiltinContinuationWithCatchFrame(BytecodeOffset bailout_id, int literal_id, unsigned height)
size_t matching_instructions_count_
void StoreInt32StackSlot(int index)
void BeginInlinedExtraArguments(int literal_id, unsigned height, uint32_t parameter_count)
void StoreHoleyDoubleRegister(DoubleRegister reg)
void StoreUnsignedBigInt64Register(Register reg)
void ArgumentsElements(CreateArgumentsType type)
void FinishPendingInstructionIfNeeded()
void AddUpdateFeedback(int vector_literal, int slot)
void BeginConstructCreateStubFrame(int literal_id, unsigned height)
void BeginBuiltinContinuationFrame(BytecodeOffset bailout_id, int literal_id, unsigned height)
void StoreBoolRegister(Register reg)
void StoreStackSlot(int index)
void StoreIntPtrRegister(Register reg)
void StoreLiteral(int literal_id)
void StoreInt64Register(Register reg)
void StoreDoubleStackSlot(int index)
size_t instruction_index_within_translation_
int index_of_basis_translation_start_
void StoreInt32Register(Register reg)
void StoreHoleyDoubleStackSlot(int index)
void BeginConstructInvokeStubFrame(int literal_id)
void StoreIntPtrStackSlot(int index)
void StoreDoubleRegister(DoubleRegister reg)
void StoreSignedBigInt64StackSlot(int index)
void StoreSignedBigInt64Register(Register reg)
void StoreJSFrameFunction()
void DuplicateObject(int object_index)
void BeginInterpretedFrame(BytecodeOffset bytecode_offset, int literal_id, int bytecode_array_id, unsigned height, int return_value_offset, int return_value_count)
ZoneVector< int32_t > contents_for_compression_
void StoreInt64StackSlot(int index)
DirectHandle< DeoptimizationFrameTranslation > ToFrameTranslation(LocalFactory *factory)
void AddRawBegin(bool update_feedback, T... operands)
void Add(TranslationOpcode opcode, T... operands)
void StoreUnsignedBigInt64StackSlot(int index)
void StoreSimd128Register(Simd128Register reg)
void AddRawToContents(TranslationOpcode opcode, T... operands)
static constexpr int8_t kNumRegisters
static constexpr int kFunctionOffset
void push_back(const T &value)
ZoneVector< RpoNumber > & result
void VLQEncode(Function &&process_byte, int32_t value)
static constexpr uint32_t kDataMask
constexpr Vector< T > VectorOf(T *start, size_t size)
void VLQEncodeUnsigned(Function &&process_byte, uint32_t value)
const int kNoWasmReturnKind
int TranslationOpcodeOperandCount(TranslationOpcode o)
static constexpr int kNumTranslationOpcodes
constexpr int kSystemPointerSize
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_LE(v1, v2)
#define DCHECK_GE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)