1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:57:35 +00:00

LibJS/JIT: Use mov8/mov32 for loads in compile_get_variable

This commit is contained in:
Simon Wanner 2023-11-07 14:28:50 +01:00 committed by Andreas Kling
parent ff63222425
commit 8eeb4e0aff

View file

@ -1098,13 +1098,9 @@ void Compiler::compile_get_variable(Bytecode::Op::GetVariable const& op)
Assembler::Operand::Register(ARG2), Assembler::Operand::Register(ARG2),
Assembler::Operand::Imm(bit_cast<u64>(&m_bytecode_executable.environment_variable_caches[op.cache_index()]))); Assembler::Operand::Imm(bit_cast<u64>(&m_bytecode_executable.environment_variable_caches[op.cache_index()])));
// FIXME: Figure out a nicer way to load a single byte. :^) m_assembler.mov8(
m_assembler.mov(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::has_value_offset())); Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::has_value_offset()));
m_assembler.bitwise_and(
Assembler::Operand::Register(GPR0),
Assembler::Operand::Imm(0xff));
m_assembler.jump_if( m_assembler.jump_if(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
@ -1122,16 +1118,9 @@ void Compiler::compile_get_variable(Bytecode::Op::GetVariable const& op)
// environment = environment->outer_environment(); // environment = environment->outer_environment();
// GPR0 = hops // GPR0 = hops
// FIXME: Load 32 bits directly instead of 64 and masking. m_assembler.mov32(
m_assembler.mov(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::value_offset() + EnvironmentCoordinate::hops_offset())); Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::value_offset() + EnvironmentCoordinate::hops_offset()));
m_assembler.mov(
Assembler::Operand::Register(GPR2),
Assembler::Operand::Imm(0xffffffff));
m_assembler.bitwise_and(
Assembler::Operand::Register(GPR0),
Assembler::Operand::Register(GPR2));
{ {
// while (GPR0--) // while (GPR0--)
@ -1157,13 +1146,9 @@ void Compiler::compile_get_variable(Bytecode::Op::GetVariable const& op)
// GPR1 now points to the environment holding our binding. // GPR1 now points to the environment holding our binding.
// if (environment->is_permanently_screwed_by_eval()) goto slow_case; // if (environment->is_permanently_screwed_by_eval()) goto slow_case;
// FIXME: Load 8 bits here directly instead of loading 64 and masking. m_assembler.mov8(
m_assembler.mov(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
Assembler::Operand::Mem64BaseAndOffset(GPR1, Environment::is_permanently_screwed_by_eval_offset())); Assembler::Operand::Mem64BaseAndOffset(GPR1, Environment::is_permanently_screwed_by_eval_offset()));
m_assembler.bitwise_and(
Assembler::Operand::Register(GPR0),
Assembler::Operand::Imm(0xff));
m_assembler.jump_if( m_assembler.jump_if(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
Assembler::Condition::NotEqualTo, Assembler::Condition::NotEqualTo,
@ -1176,16 +1161,9 @@ void Compiler::compile_get_variable(Bytecode::Op::GetVariable const& op)
Assembler::Operand::Mem64BaseAndOffset(GPR1, DeclarativeEnvironment::bindings_offset() + Vector<DeclarativeEnvironment::Binding>::outline_buffer_offset())); Assembler::Operand::Mem64BaseAndOffset(GPR1, DeclarativeEnvironment::bindings_offset() + Vector<DeclarativeEnvironment::Binding>::outline_buffer_offset()));
// GPR0 = index // GPR0 = index
// FIXME: Load 32 bits directly instead of 64 and masking. m_assembler.mov32(
m_assembler.mov(
Assembler::Operand::Register(GPR0), Assembler::Operand::Register(GPR0),
Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::value_offset() + EnvironmentCoordinate::index_offset())); Assembler::Operand::Mem64BaseAndOffset(ARG2, Bytecode::EnvironmentVariableCache::value_offset() + EnvironmentCoordinate::index_offset()));
m_assembler.mov(
Assembler::Operand::Register(GPR2),
Assembler::Operand::Imm(0xffffffff));
m_assembler.bitwise_and(
Assembler::Operand::Register(GPR0),
Assembler::Operand::Register(GPR2));
// GPR0 *= sizeof(DeclarativeEnvironment::Binding) // GPR0 *= sizeof(DeclarativeEnvironment::Binding)
m_assembler.mul32( m_assembler.mul32(