Idan Horowitz
78cac671b6
LibJS: Pass the expression string to cxx_call as a stack argument
...
This restores the bytecode interpreter's original call exception
throwing behaviour to the JIT.
This also fixes 8 of the 10 failing test-js tests when running with the
JIT enabled.
2023-10-28 14:44:45 +02:00
Idan Horowitz
538a570852
LibJIT+LibJS: Consolidate sized immediate assembler operands
...
This replaces the existing sized immediate operands with a unified
immediate operand that leaves the size handling to the assembler,
instead of the user.
This has 2 benefits:
1. The user doesn't need to know which specific operand size the
instruction expects when using it
2. The assembler automatically chooses the minimal operand size that
fits the given value, resulting in smaller code size without any
additional effort from the user. While the change is small, it still
has a noticeable effect on performance (since it increases the I$ hit
rate), resulting in 5% speedup on kraken a-star.
2023-10-28 07:04:14 +02:00
Simon Wanner
ec8330b647
LibJS/JIT: Dump disassembly of generated code using LibX86
...
This avoids the need for redirecting stdout to a file and using
ndisasm, which can lead to problems if other things are printed.
2023-10-27 21:49:55 +02:00
Andreas Kling
c1551a64dc
LibJS/JIT: Compile the NewRegExp bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
d6756decb9
LibJS/JIT: Compile the JumpNullish bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
17b2c7d965
LibJS/JIT: Compile the TypeofLocal bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
a645b9c6c3
LibJS/JIT: Stub out the JIT compiler on everything but ARCH(X86_64)
...
We don't support other architectures yet!
2023-10-27 19:07:22 +02:00
Andreas Kling
d1c701f79f
LibJS/JIT: Compile the Create/LeaveLexicalEnvironment instructions
2023-10-27 19:07:22 +02:00
Andreas Kling
935d67cfcf
LibJS/JIT: Compile the GetCalleeAndThisFromEnvironment instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
dabaaabfc0
LibJS/JIT: Support the GetVariable bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
17657d012f
LibJS/JIT: Consider compilation failed if mprotect(PROT_EXEC) fails
2023-10-27 19:07:22 +02:00
Andreas Kling
8c745ca223
LibJS+LibJIT: Fix GCC build
2023-10-27 19:07:22 +02:00
Andreas Kling
8eba60d015
LibJS/JIT: Only try JIT compilation when LIBJS_JIT is set in environment
...
Instead of adding a flag to everything everywhere, let's try using an
environment variable this time.
2023-10-27 19:07:22 +02:00
Andreas Kling
ae273e8e20
LibJS/JIT: Add simple compile-time flags for logging & dumping code
2023-10-27 19:07:22 +02:00
Andreas Kling
3b239b64ff
LibJS/JIT: Remove debug spam in cxx_increment()
2023-10-27 19:07:22 +02:00
Andreas Kling
e2f5bfb4c4
LibJS/JIT: Always mask everything but LSB in ToBoolean
...
As it turns out, cxx_to_boolean() may return "bool" as other values
than just 0 or 1. This happens when the C++ compiler decides to only
update the AL portion of the RAX return value register instead of
the whole thing.
2023-10-27 19:07:22 +02:00
Andreas Kling
5b198ccf32
LibJS+LibJIT: Don't turn patchable movs into xors with self
...
If a mov instruction is meant to be patchable, we don't want to rewrite
it as a xor, since that removes the slot where we'd patch in the right
value later.
Also, make sure to set both size bits in the REX prefix for xoring a
register with itself.
2023-10-27 19:07:22 +02:00
Andreas Kling
8b32e98f3f
LibJS/JIT: Simplify Increment Int32 fast path
...
When we know the value is a positive Int32 less than 0x7fffffff,
it's safe to just add 1 to it and use that as the final result.
This avoids the work of re-adding the INT32_TAG.
2023-10-27 19:07:22 +02:00
Andreas Kling
b43e38112c
LibJS/JIT: Use JIT::Assembler::jump_if_zero() to improve code size
2023-10-27 19:07:22 +02:00
Andreas Kling
5b87d26027
LibJIT+LibJS: Move JIT::Assembler into a new LibJIT library
...
This will allow other parts of the system to generate machine code
at runtime. :^)
2023-10-27 19:07:22 +02:00
Andreas Kling
bfb527e614
LibJS/JIT: Call throw_if_needed_for_call() in cxx_call()
...
This allows test-js to run to completion (although we do still have
some bugs to track down.)
2023-10-27 19:07:22 +02:00
Andreas Kling
bcf7cdb679
LibJS/Bytecode: Un-templatize throw_if_needed_for_call()
2023-10-27 19:07:22 +02:00
Andreas Kling
72c31fdd01
LibJS: Remove all interactions between Assembler and BasicBlock
...
With this change, Assembler is now free from LibJS concepts and could
move out to its own apartment. :^)
2023-10-27 19:07:22 +02:00
Andreas Kling
022974a43a
LibJS/JIT: Let Compiler keep per-BasicBlock state internally
...
Compiler now has a BasicBlockData struct for each BasicBlock. The struct
contains all the stuff that we previously stored with the
Bytecode::BasicBlock.
2023-10-27 19:07:22 +02:00
Andreas Kling
8a24d00b1a
LibJS/JIT: Preserve the accumulator across PutByFoo
...
This ensures that we don't clobber the accumulator when putting a value
to a setter.
2023-10-27 19:07:22 +02:00
Andreas Kling
5bd93f34af
LibJS/JIT: Sign-extend integers before comparing in LessThan fast path
2023-10-27 19:07:22 +02:00
Andreas Kling
4b7f5f4ae7
LibJS/JIT: Allow multiple jumps to the same Assembler::Label
2023-10-27 19:07:22 +02:00
Andreas Kling
1fb95c7df9
LibJS/JIT: Add fast path for LessThan Int32 < Int32
...
This uses a new branch_if_both_int32() helper.
It's interesting to note that we can compare encoded Int32 values
without stripping the INT32_TAG, since it doesn't affect signedness
of values.
2023-10-27 19:07:22 +02:00
Andreas Kling
895c613400
LibJS/JIT: Fix encoding of CMP reg,reg
2023-10-27 19:07:22 +02:00
Andreas Kling
ea65214c57
LibJS/JIT: Add fast path for Increment with Int32 value
...
This uses a new branch_if_int32() mechanism that takes a code generating
lambda whose code will run if the input register is an Int32 JS::Value.
2023-10-27 19:07:22 +02:00
Andreas Kling
aeb9bd3bf1
LibJS/JIT: Fix encoding of x86_64 AND reg, reg
2023-10-27 19:07:22 +02:00
Andreas Kling
e4c4fb09f9
LibJS/JIT: Add fast path for the ResolveThisBinding codegen
...
We now generate a fast path for cached `this` values. The first time
`this` is resolved within a function, we call out to C++, but then
all subsequent accesses will hit the cache in Register::this_value().
2023-10-27 19:07:22 +02:00
Andreas Kling
7097169967
LibJS/JIT: Compile the PutByValue bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
c2aad0f573
LibJS/Bytecode: Move PutByValue impl to CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
9c93d100d1
LibJS/JIT: Compile the NewFunction bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
9f61cda27e
LibJS/Bytecode: Move NewFunction impl into CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
a913ac5799
LibJS/JIT: Compile the NewArray bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
6a16783c66
LibJS/JIT: Compile the SetVariable bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
393d90abe1
LibJS/Bytecode: Move SetVariable implementation to CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
e946440ed3
LibJS/JIT: Compile the TypeofVariable bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
d368dc5d25
LibJS/Bytecode: Move TypeofVariable impl to CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
c65aecd878
LibJS/JIT: Compile all the unary bytecode instructions
2023-10-27 19:07:22 +02:00
Andreas Kling
640455b1d2
LibJS/JIT: Compile the Call bytecode instruction
...
I've left a FIXME about dealing with some throwsy cases.
2023-10-27 19:07:22 +02:00
Andreas Kling
7fc35fde09
LibJS/Bytecode: Move throw_if_needed_for_call to CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
b56ecc7e34
LibJS/Bytecode: Move perform_call helper to CommonImplementations
2023-10-27 19:07:22 +02:00
Andreas Kling
d866780235
LibJS/JIT: Compile the NewObject bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
580249d650
LibJS/JIT: Compile the PutById bytecode instruction
2023-10-27 19:07:22 +02:00
Andreas Kling
10bf25999c
LibJS/JIT: Move VM pointers from R8,R9,R10 to R13,R14,R15
...
This way they don't clash with the SysV ABI function argument registers.
2023-10-27 19:07:22 +02:00
Andreas Kling
decc221109
LibJS/JIT: Save and restore callee-saved registers in jitted code
2023-10-27 19:07:22 +02:00
Andreas Kling
3974ce2069
LibJS/JIT: Compile the GetGlobal bytecode instruction
2023-10-27 19:07:22 +02:00