From decc2211097305383554cb1544d0f6d05e8a3b36 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 20 Oct 2023 13:04:51 +0200 Subject: [PATCH] LibJS/JIT: Save and restore callee-saved registers in jitted code --- Userland/Libraries/LibJS/JIT/Assembler.h | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Userland/Libraries/LibJS/JIT/Assembler.h b/Userland/Libraries/LibJS/JIT/Assembler.h index 9b9e111388..b67c364d27 100644 --- a/Userland/Libraries/LibJS/JIT/Assembler.h +++ b/Userland/Libraries/LibJS/JIT/Assembler.h @@ -311,6 +311,8 @@ struct Assembler { void enter() { + push_callee_saved_registers(); + push(Operand::Register(Reg::RBP)); mov(Operand::Register(Reg::RBP), Operand::Register(Reg::RSP)); sub(Operand::Register(Reg::RSP), Operand::Imm8(8)); @@ -321,10 +323,35 @@ struct Assembler { // leave emit8(0xc9); + pop_callee_saved_registers(); + // ret emit8(0xc3); } + void push_callee_saved_registers() + { + // FIXME: Don't push RBX twice :^) + push(Operand::Register(Reg::RBX)); + push(Operand::Register(Reg::RBX)); + push(Operand::Register(Reg::R12)); + push(Operand::Register(Reg::R13)); + push(Operand::Register(Reg::R14)); + push(Operand::Register(Reg::R15)); + } + + void pop_callee_saved_registers() + { + pop(Operand::Register(Reg::R15)); + pop(Operand::Register(Reg::R14)); + pop(Operand::Register(Reg::R13)); + pop(Operand::Register(Reg::R12)); + + // FIXME: Don't pop RBX twice :^) + pop(Operand::Register(Reg::RBX)); + pop(Operand::Register(Reg::RBX)); + } + void push(Operand op) { if (op.type == Operand::Type::Reg) {