mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 04:38:11 +00:00
Revert "LibJS/Bytecode: Fuse [Not, JumpIf] instructions into JumpIfNot"
This reverts commit 795149e585
.
This commit is contained in:
parent
ea0b7192fa
commit
c4a0afbe28
5 changed files with 0 additions and 53 deletions
|
@ -69,7 +69,6 @@
|
||||||
O(IteratorToArray) \
|
O(IteratorToArray) \
|
||||||
O(Jump) \
|
O(Jump) \
|
||||||
O(JumpIf) \
|
O(JumpIf) \
|
||||||
O(JumpIfNot) \
|
|
||||||
O(JumpGreaterThan) \
|
O(JumpGreaterThan) \
|
||||||
O(JumpGreaterThanEquals) \
|
O(JumpGreaterThanEquals) \
|
||||||
O(JumpLessThan) \
|
O(JumpLessThan) \
|
||||||
|
|
|
@ -360,12 +360,6 @@ void Interpreter::run_bytecode()
|
||||||
else
|
else
|
||||||
m_current_block = &static_cast<Op::JumpIf const&>(instruction).false_target()->block();
|
m_current_block = &static_cast<Op::JumpIf const&>(instruction).false_target()->block();
|
||||||
goto start;
|
goto start;
|
||||||
case Instruction::Type::JumpIfNot:
|
|
||||||
if (!get(static_cast<Op::JumpIfNot const&>(instruction).condition()).to_boolean())
|
|
||||||
m_current_block = &static_cast<Op::JumpIfNot const&>(instruction).true_target()->block();
|
|
||||||
else
|
|
||||||
m_current_block = &static_cast<Op::JumpIfNot const&>(instruction).false_target()->block();
|
|
||||||
goto start;
|
|
||||||
|
|
||||||
#define JS_HANDLE_FUSABLE_BINARY_JUMP(PreOp, int32_operator, slow_case) \
|
#define JS_HANDLE_FUSABLE_BINARY_JUMP(PreOp, int32_operator, slow_case) \
|
||||||
case Instruction::Type::Jump##PreOp: { \
|
case Instruction::Type::Jump##PreOp: { \
|
||||||
|
@ -1288,12 +1282,6 @@ ThrowCompletionOr<void> JumpIf::execute_impl(Bytecode::Interpreter&) const
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
ThrowCompletionOr<void> JumpIfNot::execute_impl(Bytecode::Interpreter&) const
|
|
||||||
{
|
|
||||||
// Handled in the interpreter loop.
|
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
|
|
||||||
#define JS_DEFINE_FUSABLE_BINARY_OP(PreOp, ...) \
|
#define JS_DEFINE_FUSABLE_BINARY_OP(PreOp, ...) \
|
||||||
ThrowCompletionOr<void> Jump##PreOp::execute_impl(Bytecode::Interpreter&) const { __builtin_unreachable(); } \
|
ThrowCompletionOr<void> Jump##PreOp::execute_impl(Bytecode::Interpreter&) const { __builtin_unreachable(); } \
|
||||||
\
|
\
|
||||||
|
@ -1974,14 +1962,6 @@ ByteString JumpIf::to_byte_string_impl(Bytecode::Executable const& executable) c
|
||||||
true_string, false_string);
|
true_string, false_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteString JumpIfNot::to_byte_string_impl(Bytecode::Executable const& executable) const
|
|
||||||
{
|
|
||||||
return ByteString::formatted("JumpIfNot {}, \033[32mtrue\033[0m:{} \033[32mfalse\033[0m:{}",
|
|
||||||
format_operand("condition"sv, m_condition, executable),
|
|
||||||
*m_true_target,
|
|
||||||
*m_false_target);
|
|
||||||
}
|
|
||||||
|
|
||||||
ByteString JumpNullish::to_byte_string_impl(Bytecode::Executable const& executable) const
|
ByteString JumpNullish::to_byte_string_impl(Bytecode::Executable const& executable) const
|
||||||
{
|
{
|
||||||
auto true_string = m_true_target.has_value() ? ByteString::formatted("{}", *m_true_target) : "<empty>";
|
auto true_string = m_true_target.has_value() ? ByteString::formatted("{}", *m_true_target) : "<empty>";
|
||||||
|
|
|
@ -1123,23 +1123,6 @@ private:
|
||||||
Operand m_condition;
|
Operand m_condition;
|
||||||
};
|
};
|
||||||
|
|
||||||
class JumpIfNot final : public Jump {
|
|
||||||
public:
|
|
||||||
explicit JumpIfNot(Operand condition, Label true_target, Label false_target)
|
|
||||||
: Jump(Type::JumpIfNot, move(true_target), move(false_target), sizeof(*this))
|
|
||||||
, m_condition(condition)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ThrowCompletionOr<void> execute_impl(Bytecode::Interpreter&) const;
|
|
||||||
ByteString to_byte_string_impl(Bytecode::Executable const&) const;
|
|
||||||
|
|
||||||
Operand condition() const { return m_condition; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Operand m_condition;
|
|
||||||
};
|
|
||||||
|
|
||||||
// NOTE: The raw operator is used for comparing two Int32 values.
|
// NOTE: The raw operator is used for comparing two Int32 values.
|
||||||
#define JS_ENUMERATE_FUSABLE_BINARY_OPS(X) \
|
#define JS_ENUMERATE_FUSABLE_BINARY_OPS(X) \
|
||||||
X(GreaterThan, >, greater_than) \
|
X(GreaterThan, >, greater_than) \
|
||||||
|
|
|
@ -71,7 +71,6 @@ static void generate_cfg_for_block(BasicBlock const& current_block, PassPipeline
|
||||||
#undef JS_ENUMERATE_FUSABLE_BINARY_OP
|
#undef JS_ENUMERATE_FUSABLE_BINARY_OP
|
||||||
|
|
||||||
case JumpIf:
|
case JumpIf:
|
||||||
case JumpIfNot:
|
|
||||||
case JumpNullish:
|
case JumpNullish:
|
||||||
case JumpUndefined: {
|
case JumpUndefined: {
|
||||||
// FIXME: It would be nice if we could avoid this copy, if we know that the unwind context stays the same in both paths
|
// FIXME: It would be nice if we could avoid this copy, if we know that the unwind context stays the same in both paths
|
||||||
|
|
|
@ -38,20 +38,6 @@ void Peephole::perform(PassPipelineExecutable& executable)
|
||||||
if (next_instruction.type() == Instruction::Type::JumpIf) {
|
if (next_instruction.type() == Instruction::Type::JumpIf) {
|
||||||
auto const& jump = static_cast<Op::JumpIf const&>(next_instruction);
|
auto const& jump = static_cast<Op::JumpIf const&>(next_instruction);
|
||||||
|
|
||||||
if (instruction.type() == Instruction::Type::Not) {
|
|
||||||
auto const& not_ = static_cast<Op::Not const&>(instruction);
|
|
||||||
VERIFY(jump.condition() == not_.dst());
|
|
||||||
new_block->append<Op::JumpIfNot>(
|
|
||||||
not_.source_record().source_start_offset,
|
|
||||||
not_.source_record().source_end_offset,
|
|
||||||
not_.src(),
|
|
||||||
*jump.true_target(),
|
|
||||||
*jump.false_target());
|
|
||||||
++it;
|
|
||||||
VERIFY(it.at_end());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DO_FUSE_JUMP(PreOp, ...) \
|
#define DO_FUSE_JUMP(PreOp, ...) \
|
||||||
if (instruction.type() == Instruction::Type::PreOp) { \
|
if (instruction.type() == Instruction::Type::PreOp) { \
|
||||||
auto const& compare = static_cast<Op::PreOp const&>(instruction); \
|
auto const& compare = static_cast<Op::PreOp const&>(instruction); \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue