Created
November 13, 2023 12:56
-
-
Save feliwir/5a8d71909bb4df285613a0388627036a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Compiler::compile_put_by_value(Bytecode::Op::PutByValue const& op) | |
{ | |
load_vm_register(ARG1, op.base()); | |
load_vm_register(ARG2, op.property()); | |
Assembler::Label end {}; | |
Assembler::Label slow_case {}; | |
branch_if_object(ARG1, [&] { | |
branch_if_int32(ARG2, [&] { | |
// if (ARG2 < 0) goto slow_case; | |
m_assembler.mov( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Operand::Register(ARG2)); | |
m_assembler.sign_extend_32_to_64_bits(GPR0); | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Condition::SignedLessThan, | |
Assembler::Operand::Imm(0), | |
slow_case); | |
// GPR0 = extract_pointer(ARG1) | |
extract_object_pointer(GPR0, ARG1); | |
// if (object->may_interfere_with_indexed_property_access()) goto slow_case; | |
m_assembler.mov8( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, Object::may_interfere_with_indexed_property_access_offset())); | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Condition::NotEqualTo, | |
Assembler::Operand::Imm(0), | |
slow_case); | |
// GPR0 = object->indexed_properties().storage() | |
m_assembler.mov( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, Object::indexed_properties_offset() + IndexedProperties::storage_offset())); | |
// if (GPR0 == nullptr) goto slow_case; | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Condition::EqualTo, | |
Assembler::Operand::Imm(0), | |
slow_case); | |
// if (!GPR0->is_simple_storage()) goto slow_case; | |
m_assembler.mov8( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, IndexedPropertyStorage::is_simple_storage_offset())); | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Condition::EqualTo, | |
Assembler::Operand::Imm(0), | |
slow_case); | |
// GPR2 = extract_int32(ARG2) | |
m_assembler.mov32( | |
Assembler::Operand::Register(GPR2), | |
Assembler::Operand::Register(ARG2)); | |
// if (GPR2 >= GPR0->array_like_size()) goto slow_case; | |
m_assembler.mov( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, SimpleIndexedPropertyStorage::array_size_offset())); | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR2), | |
Assembler::Condition::SignedGreaterThanOrEqualTo, | |
Assembler::Operand::Register(GPR1), | |
slow_case); | |
// GPR0 = GPR0->elements().outline_buffer() | |
m_assembler.mov( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, SimpleIndexedPropertyStorage::elements_offset() + Vector<Value>::outline_buffer_offset())); | |
// GPR2 *= sizeof(Value) | |
m_assembler.mul32( | |
Assembler::Operand::Register(GPR2), | |
Assembler::Operand::Imm(sizeof(Value)), | |
slow_case); | |
// GPR0 = &GPR0[GPR2] | |
m_assembler.add( | |
Assembler::Operand::Register(GPR0), | |
Assembler::Operand::Register(GPR2)); | |
// GPR2 = *GPR0 | |
m_assembler.mov( | |
Assembler::Operand::Register(GPR2), | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, 0)); | |
// if (GPR0.is_accessor()) goto slow_case; | |
m_assembler.mov(Assembler::Operand::Register(GPR1), Assembler::Operand::Register(GPR2)); | |
m_assembler.shift_right(Assembler::Operand::Register(GPR1), Assembler::Operand::Imm(TAG_SHIFT)); | |
m_assembler.jump_if( | |
Assembler::Operand::Register(GPR1), | |
Assembler::Condition::EqualTo, | |
Assembler::Operand::Imm(ACCESSOR_TAG), | |
slow_case); | |
// *GPR0 = value | |
load_accumulator(GPR1); | |
m_assembler.mov( | |
Assembler::Operand::Mem64BaseAndOffset(GPR0, 0), | |
Assembler::Operand::Register(GPR1)); | |
m_assembler.jump(end); | |
}); | |
}); | |
slow_case.link(m_assembler); | |
load_accumulator(ARG3); | |
m_assembler.mov( | |
Assembler::Operand::Register(ARG4), | |
Assembler::Operand::Imm(to_underlying(op.kind()))); | |
native_call((void*)cxx_put_by_value); | |
store_accumulator(RET); | |
check_exception(); | |
end.link(m_assembler); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment