Compiler.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /*
  2. * Copyright (c) 2023, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibJS/Bytecode/Executable.h>
  8. #include <LibJS/Bytecode/Op.h>
  9. #include <LibJS/JIT/Assembler.h>
  10. #include <LibJS/JIT/NativeExecutable.h>
  11. namespace JS::JIT {
  12. class Compiler {
  13. public:
  14. static OwnPtr<NativeExecutable> compile(Bytecode::Executable&);
  15. private:
  16. static constexpr auto GPR0 = Assembler::Reg::RAX;
  17. static constexpr auto GPR1 = Assembler::Reg::RCX;
  18. static constexpr auto ARG0 = Assembler::Reg::RDI;
  19. static constexpr auto ARG1 = Assembler::Reg::RSI;
  20. static constexpr auto ARG2 = Assembler::Reg::RDX;
  21. static constexpr auto RET = Assembler::Reg::RAX;
  22. static constexpr auto STACK_POINTER = Assembler::Reg::RSP;
  23. static constexpr auto REGISTER_ARRAY_BASE = Assembler::Reg::R8;
  24. static constexpr auto LOCALS_ARRAY_BASE = Assembler::Reg::R9;
  25. static constexpr auto UNWIND_CONTEXT_BASE = Assembler::Reg::R10;
  26. void compile_load_immediate(Bytecode::Op::LoadImmediate const&);
  27. void compile_load(Bytecode::Op::Load const&);
  28. void compile_store(Bytecode::Op::Store const&);
  29. void compile_get_local(Bytecode::Op::GetLocal const&);
  30. void compile_set_local(Bytecode::Op::SetLocal const&);
  31. void compile_jump(Bytecode::Op::Jump const&);
  32. void compile_jump_conditional(Bytecode::Op::JumpConditional const&);
  33. void compile_less_than(Bytecode::Op::LessThan const&);
  34. void compile_increment(Bytecode::Op::Increment const&);
  35. void compile_enter_unwind_context(Bytecode::Op::EnterUnwindContext const&);
  36. void compile_leave_unwind_context(Bytecode::Op::LeaveUnwindContext const&);
  37. void compile_throw(Bytecode::Op::Throw const&);
  38. void compile_add(Bytecode::Op::Add const&);
  39. void compile_sub(Bytecode::Op::Sub const&);
  40. void compile_mul(Bytecode::Op::Mul const&);
  41. void compile_div(Bytecode::Op::Div const&);
  42. void compile_return(Bytecode::Op::Return const&);
  43. void compile_new_string(Bytecode::Op::NewString const&);
  44. void store_vm_register(Bytecode::Register, Assembler::Reg);
  45. void load_vm_register(Assembler::Reg, Bytecode::Register);
  46. void store_vm_local(size_t, Assembler::Reg);
  47. void load_vm_local(Assembler::Reg, size_t);
  48. void compile_to_boolean(Assembler::Reg dst, Assembler::Reg src);
  49. void check_exception();
  50. void push_unwind_context(bool valid, Optional<Bytecode::Label> const& handler, Optional<Bytecode::Label> const& finalizer);
  51. void pop_unwind_context();
  52. explicit Compiler(Bytecode::Executable& bytecode_executable)
  53. : m_bytecode_executable(bytecode_executable)
  54. {
  55. }
  56. Vector<u8> m_output;
  57. Assembler m_assembler { m_output };
  58. Bytecode::Executable& m_bytecode_executable;
  59. };
  60. }