Skip to content

Commit acece90

Browse files
committed
LibJS/JIT: Make Assembler::Reg represent X86 registers
And move the generic register aliases to JIT::Compiler.
1 parent f9041c7 commit acece90

File tree

3 files changed

+53
-40
lines changed

3 files changed

+53
-40
lines changed

Userland/Libraries/LibJS/JIT/Assembler.h

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,22 @@ struct Assembler {
2020
Vector<u8>& m_output;
2121

2222
enum class Reg {
23-
GPR0 = 0, // RAX
24-
GPR1 = 1, // RCX
25-
26-
Arg0 = 7, // RDI
27-
Arg1 = 6, // RSI
28-
Arg2 = 2, // RDX
29-
30-
Ret = 0, // RAX
31-
32-
// FIXME: These are LibJS specific.
33-
RegisterArrayBase = 8, // R8
34-
LocalsArrayBase = 9, // R9
23+
RAX = 0,
24+
RCX = 1,
25+
RDX = 2,
26+
RBX = 3,
27+
RSP = 4,
28+
RBP = 5,
29+
RSI = 6,
30+
RDI = 7,
31+
R8 = 8,
32+
R9 = 9,
33+
R10 = 10,
34+
R11 = 11,
35+
R12 = 12,
36+
R13 = 13,
37+
R14 = 14,
38+
R15 = 15,
3539
};
3640

3741
struct Operand {

Userland/Libraries/LibJS/JIT/Compiler.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,61 +15,61 @@ namespace JS::JIT {
1515
void Compiler::store_vm_register(Bytecode::Register dst, Assembler::Reg src)
1616
{
1717
m_assembler.mov(
18-
Assembler::Operand::Mem64BaseAndOffset(Assembler::Reg::RegisterArrayBase, dst.index() * sizeof(Value)),
18+
Assembler::Operand::Mem64BaseAndOffset(REGISTER_ARRAY_BASE, dst.index() * sizeof(Value)),
1919
Assembler::Operand::Register(src));
2020
}
2121

2222
void Compiler::load_vm_register(Assembler::Reg dst, Bytecode::Register src)
2323
{
2424
m_assembler.mov(
2525
Assembler::Operand::Register(dst),
26-
Assembler::Operand::Mem64BaseAndOffset(Assembler::Reg::RegisterArrayBase, src.index() * sizeof(Value)));
26+
Assembler::Operand::Mem64BaseAndOffset(REGISTER_ARRAY_BASE, src.index() * sizeof(Value)));
2727
}
2828

2929
void Compiler::store_vm_local(size_t dst, Assembler::Reg src)
3030
{
3131
m_assembler.mov(
32-
Assembler::Operand::Mem64BaseAndOffset(Assembler::Reg::LocalsArrayBase, dst * sizeof(Value)),
32+
Assembler::Operand::Mem64BaseAndOffset(LOCALS_ARRAY_BASE, dst * sizeof(Value)),
3333
Assembler::Operand::Register(src));
3434
}
3535

3636
void Compiler::load_vm_local(Assembler::Reg dst, size_t src)
3737
{
3838
m_assembler.mov(
3939
Assembler::Operand::Register(dst),
40-
Assembler::Operand::Mem64BaseAndOffset(Assembler::Reg::LocalsArrayBase, src * sizeof(Value)));
40+
Assembler::Operand::Mem64BaseAndOffset(LOCALS_ARRAY_BASE, src * sizeof(Value)));
4141
}
4242

4343
void Compiler::compile_load_immediate(Bytecode::Op::LoadImmediate const& op)
4444
{
4545
m_assembler.mov(
46-
Assembler::Operand::Register(Assembler::Reg::GPR0),
46+
Assembler::Operand::Register(GPR0),
4747
Assembler::Operand::Imm64(op.value().encoded()));
48-
store_vm_register(Bytecode::Register::accumulator(), Assembler::Reg::GPR0);
48+
store_vm_register(Bytecode::Register::accumulator(), GPR0);
4949
}
5050

5151
void Compiler::compile_load(Bytecode::Op::Load const& op)
5252
{
53-
load_vm_register(Assembler::Reg::GPR0, op.src());
54-
store_vm_register(Bytecode::Register::accumulator(), Assembler::Reg::GPR0);
53+
load_vm_register(GPR0, op.src());
54+
store_vm_register(Bytecode::Register::accumulator(), GPR0);
5555
}
5656

5757
void Compiler::compile_store(Bytecode::Op::Store const& op)
5858
{
59-
load_vm_register(Assembler::Reg::GPR0, Bytecode::Register::accumulator());
60-
store_vm_register(op.dst(), Assembler::Reg::GPR0);
59+
load_vm_register(GPR0, Bytecode::Register::accumulator());
60+
store_vm_register(op.dst(), GPR0);
6161
}
6262

6363
void Compiler::compile_get_local(Bytecode::Op::GetLocal const& op)
6464
{
65-
load_vm_local(Assembler::Reg::GPR0, op.index());
66-
store_vm_register(Bytecode::Register::accumulator(), Assembler::Reg::GPR0);
65+
load_vm_local(GPR0, op.index());
66+
store_vm_register(Bytecode::Register::accumulator(), GPR0);
6767
}
6868

6969
void Compiler::compile_set_local(Bytecode::Op::SetLocal const& op)
7070
{
71-
load_vm_register(Assembler::Reg::GPR0, Bytecode::Register::accumulator());
72-
store_vm_local(op.index(), Assembler::Reg::GPR0);
71+
load_vm_register(GPR0, Bytecode::Register::accumulator());
72+
store_vm_local(op.index(), GPR0);
7373
}
7474

7575
void Compiler::compile_jump(Bytecode::Op::Jump const& op)
@@ -119,24 +119,24 @@ void Compiler::compile_to_boolean(Assembler::Reg dst, Assembler::Reg src)
119119
// slow_case: // call C++ helper
120120
slow_case.link(m_assembler);
121121
m_assembler.mov(
122-
Assembler::Operand::Register(Assembler::Reg::Arg1),
122+
Assembler::Operand::Register(ARG1),
123123
Assembler::Operand::Register(src));
124124
m_assembler.native_call((void*)cxx_to_boolean);
125125
m_assembler.mov(
126126
Assembler::Operand::Register(dst),
127-
Assembler::Operand::Register(Assembler::Reg::Ret));
127+
Assembler::Operand::Register(RET));
128128

129129
// end:
130130
end.link(m_assembler);
131131
}
132132

133133
void Compiler::compile_jump_conditional(Bytecode::Op::JumpConditional const& op)
134134
{
135-
load_vm_register(Assembler::Reg::GPR1, Bytecode::Register::accumulator());
135+
load_vm_register(GPR1, Bytecode::Register::accumulator());
136136

137-
compile_to_boolean(Assembler::Reg::GPR0, Assembler::Reg::GPR1);
137+
compile_to_boolean(GPR0, GPR1);
138138

139-
m_assembler.jump_conditional(Assembler::Reg::GPR0,
139+
m_assembler.jump_conditional(GPR0,
140140
const_cast<Bytecode::BasicBlock&>(op.true_target()->block()),
141141
const_cast<Bytecode::BasicBlock&>(op.false_target()->block()));
142142
}
@@ -149,10 +149,10 @@ void Compiler::compile_jump_conditional(Bytecode::Op::JumpConditional const& op)
149149

150150
void Compiler::compile_less_than(Bytecode::Op::LessThan const& op)
151151
{
152-
load_vm_register(Assembler::Reg::Arg1, op.lhs());
153-
load_vm_register(Assembler::Reg::Arg2, Bytecode::Register::accumulator());
152+
load_vm_register(ARG1, op.lhs());
153+
load_vm_register(ARG2, Bytecode::Register::accumulator());
154154
m_assembler.native_call((void*)cxx_less_than);
155-
store_vm_register(Bytecode::Register::accumulator(), Assembler::Reg::Ret);
155+
store_vm_register(Bytecode::Register::accumulator(), RET);
156156
}
157157

158158
[[maybe_unused]] static Value cxx_increment(VM& vm, Value value)
@@ -166,9 +166,9 @@ void Compiler::compile_less_than(Bytecode::Op::LessThan const& op)
166166

167167
void Compiler::compile_increment(Bytecode::Op::Increment const&)
168168
{
169-
load_vm_register(Assembler::Reg::Arg1, Bytecode::Register::accumulator());
169+
load_vm_register(ARG1, Bytecode::Register::accumulator());
170170
m_assembler.native_call((void*)cxx_increment);
171-
store_vm_register(Bytecode::Register::accumulator(), Assembler::Reg::Ret);
171+
store_vm_register(Bytecode::Register::accumulator(), RET);
172172
}
173173

174174
OwnPtr<NativeExecutable> Compiler::compile(Bytecode::Executable const& bytecode_executable)
@@ -179,12 +179,12 @@ OwnPtr<NativeExecutable> Compiler::compile(Bytecode::Executable const& bytecode_
179179
Compiler compiler;
180180

181181
compiler.m_assembler.mov(
182-
Assembler::Operand::Register(Assembler::Reg::RegisterArrayBase),
183-
Assembler::Operand::Register(Assembler::Reg::Arg1));
182+
Assembler::Operand::Register(REGISTER_ARRAY_BASE),
183+
Assembler::Operand::Register(ARG1));
184184

185185
compiler.m_assembler.mov(
186-
Assembler::Operand::Register(Assembler::Reg::LocalsArrayBase),
187-
Assembler::Operand::Register(Assembler::Reg::Arg2));
186+
Assembler::Operand::Register(LOCALS_ARRAY_BASE),
187+
Assembler::Operand::Register(ARG2));
188188

189189
for (auto& block : bytecode_executable.basic_blocks) {
190190
block->offset = compiler.m_output.size();

Userland/Libraries/LibJS/JIT/Compiler.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ class Compiler {
1818
static OwnPtr<NativeExecutable> compile(Bytecode::Executable const&);
1919

2020
private:
21+
static constexpr auto GPR0 = Assembler::Reg::RAX;
22+
static constexpr auto GPR1 = Assembler::Reg::RCX;
23+
static constexpr auto ARG0 = Assembler::Reg::RDI;
24+
static constexpr auto ARG1 = Assembler::Reg::RSI;
25+
static constexpr auto ARG2 = Assembler::Reg::RDX;
26+
static constexpr auto RET = Assembler::Reg::RAX;
27+
static constexpr auto REGISTER_ARRAY_BASE = Assembler::Reg::R8;
28+
static constexpr auto LOCALS_ARRAY_BASE = Assembler::Reg::R9;
29+
2130
void compile_load_immediate(Bytecode::Op::LoadImmediate const&);
2231
void compile_load(Bytecode::Op::Load const&);
2332
void compile_store(Bytecode::Op::Store const&);

0 commit comments

Comments
 (0)