mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +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
	
	 Andreas Kling
						Andreas Kling