1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 11:18:13 +00:00
Commit graph

55782 commits

Author SHA1 Message Date
Idan Horowitz
2b65a80ecb LibJS: Compile the NewBigInt bytecode instruction 2023-10-28 20:27:16 +02:00
Idan Horowitz
d200361620 LibJS: Remove useless indirection in compile_new_{function, regexp}
The cxx_new_* functions have the exact same signature as the underlying
function they redirect to, so there's no need for them. Removing them
saves us a couple of opcodes.
2023-10-28 20:27:16 +02:00
Andreas Kling
9c0c672839 LibJS/JIT: Store the VM register array base in RBX
This allows us to use the displacement-less MOV encoding when accessing
register $0 (the accumulator).

This reduces code size by 158 KiB on Kraken/ai-astar.js :^)
2023-10-28 20:26:35 +02:00
Andreas Kling
32d3a47058 LibJIT: Generate MOV ModR/M without displacement when possible
For non-extended register bases and 0x0 offset, we can emit a ModR/M
byte without displacement.
2023-10-28 20:26:35 +02:00
Nico Weber
4cc24548f6 LibPDF: Call dbgln() for unimplemented flex upcodes 2023-10-28 13:28:05 -04:00
Nico Weber
e484fae8e1 LibPDF: Don't do special subr processing for type 2 CFFs
This is a subset of #21484: Type 2 CFFs never use the special subrs,
so stop doing them for type 2 at least for now.

Fixes an assert in 0000064.pdf in 0000.zip in the pdfa dataset
(a stack underflow because a subr is supposed to push a bunch of
stuff, but instead it ran one of the built-in routines instead of
the subr from the font file).

As discussed in #21484, this isn't right for type 1 CFFs either,
but just removing the code there regresses Tests/LibPDF/type1.pdf.
A slightly more involved thing is needed there; I added a FIXME
for that here.
2023-10-28 13:28:05 -04:00
Tim Ledbetter
5c0c55d2c0 LibPDF: Ensure xref stream field widths are within expected range
Previously, an xref stream with a field with larger than 8 would
result in an undefined shift occurring. We now ensure that each field
width is a number and is less than or equal to 8.
2023-10-28 13:17:09 -04:00
Sam Atkins
596773f12f LibWeb: Stop forward-declaring NavigationParams twice 2023-10-28 13:15:51 -04:00
MacDue
3659149888 LibWeb: Fix stroke-opacity for stroked paths that use PaintStyles
Ref test included :)
2023-10-28 19:06:12 +02:00
Timothy Flynn
8dc25dffc2 LibWebView: Protect URL highlighting against partially-typed URLs
The current helpers assume that a valid URL is a full URL (i.e. contains
the "://" separator between the scheme and domain). This isn't true, as
"file:" alone is parsed as a valid URL.

We must also avoid simply searching for the parsed public suffix in the
original URL string. For example, "com" is a public suffix. If we search
for that in the URL "com.com", we will think the public suffix starts at
index 0.
2023-10-28 19:03:19 +02:00
Sönke Holz
194bf5a677 Kernel/riscv64: Add RISC-V Processor class 2023-10-28 10:36:06 -06:00
Sönke Holz
24e64cac7e Kernel/riscv64: Add register state related headers 2023-10-28 10:36:06 -06:00
Sönke Holz
978cc1c197 Kernel/riscv64: Add a header for reading/writing RISC-V CSRs 2023-10-28 10:36:06 -06:00
Andreas Kling
87baf140f2 LibJS/JIT: Use PUSH imm when pushing null unwind context pointer(s)
Small code size optimization, saves 252 bytes on Kraken/ai-astar.js :^)
2023-10-28 18:20:07 +02:00
Andreas Kling
bbde64e0b6 LibJIT: Emit 8-bit PUSH imm when possible 2023-10-28 18:20:07 +02:00
Andreas Kling
fff82c5ffe LibJS/JIT: Only preserve VM& when making native call to C++
Instead of pushing and popping every single caller-saved registers,
we can optimize code size (and speed!) by only pushing the one register
we actually care about: RDI (since it holds our VM&).

This means that native calls may clobber every other caller-saved
register, so this is something that you have to be aware of when
emitting native calls in the JIT.

This reduces code size on Kraken/ai-astar.js by 553 KiB and makes
execution time ~6% faster as well! :^)
2023-10-28 18:20:07 +02:00
Andreas Kling
926786e8d1 LibJS+LibJIT: Let users of JIT::Assembler handle caller-saved registers
Instead of JIT::Assembler making the decision for everyone and forcing
out every caller-saved register in the ABI onto the stack, we now leave
that decision to users of JIT::Assembler.
2023-10-28 18:20:07 +02:00
Andreas Kling
9afd12a8ba LibJS/JIT: Consolidate exits from the jitted code
Instead of emitting the "restore callee-saved registers and return"
sequence again and again, just emit it once at the end of the generated
code, and have everyone jump to it.

This is a code size optimization that saves 207KiB on Kraken/ai-astar.js
2023-10-28 18:20:07 +02:00
Idan Horowitz
0768bf2623 LibJS: Execute the finalizer when returning from a try block in the JIT
This fixes 1 of the 2 remaining failing test-js tests.
2023-10-28 17:11:47 +02:00
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
863314ff10 LibJIT: Support passing stack arguments to native_call()s
The x86-64 SystemV ABI specifies that additional arguments after the
first 6 register-passed ones should be passed on the stack.
2023-10-28 14:44:45 +02:00
Andreas Kling
e63423554f LibJIT: Keep the stack pointer aligned for making native calls
Instead of adjusting the stack pointer before/after making native calls,
just make sure we come out of enter() with the stack pointer aligned
for making calls.

This is strictly a code size reduction. :^)
2023-10-28 09:10:38 +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
Tim Ledbetter
e4715aa82a AK: Use correct type when calculating integral exp2()
Previously, integral `exp2()` would produce the incorrect result for
exponents above 31.
2023-10-27 21:59:44 -04:00
Andrew Kaster
810bbeaed1 Ladybird: Set Settings org to SerenityOS to load proper plist on macOS 2023-10-27 16:51:03 -06:00
Andrew Kaster
faa8ef98c9 Meta: Port recent changes to gn BUILD
5c7e5cc738
a8f0fa5dd4
0d417cd604
5b87d26027
 (and other friends from the JIT PR)
f915aa70cd
2023-10-27 16:51:03 -06:00
Andrew Kaster
d8ab9ed87c LibGfx+Userland: Remove dependency on GUI::TabWidget from StylePainter
Move TabPosition into its own file, and using it into the global
namespace the same way we do for Gfx::Orientation. This unbreaks the gn
build, and out of tree builds.
2023-10-27 16:51:03 -06:00
Idan Horowitz
702dd0ca55 AK: Use array element count instead of memory size in backtrace call
The backtrace execinfo API takes the number of addresses the result
buffer can hold instead of its size, for some reason. Previously
backtraces larger than 256 frames deep would write past the end of the
result buffer.
2023-10-27 16:06:35 -04: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
Simon Wanner
1d68c64b98 LibX86: Apply REX.W to B9-BF MOVs
All the MOVs in the B8-BF range can use the REX.W prefix, not just B8.
Previously instructions like `48 B9... mov rcx, imm64` were interpreted
as `mov rcx, imm32` because the REX.W prefix was only applied to
`48 B8... mov rax, imm64`.
2023-10-27 21:49:55 +02:00
Martin Janiczek
4fc1daa69f LibTest: Change #define-d constants into constexpr and a runtime flag
MAX_GENERATED_VALUES_PER_TEST is now the --randomized_runs flag:
$ ./Build/lagom/bin/TestGenerator --randomized_runs 1000

It's sometimes useful to try larger numbers for it instead of the
default of 100.

MAX_GEN_ATTEMPTS_PER_VALUE is now a constexpr. It's not usually needed
to tweak this value; we can recompile with a different value on the rare
occasion.
2023-10-27 12:26:06 -06:00
Martin Janiczek
ed60a032a8 LibTest: Clean up an unneeded import 2023-10-27 12:26:06 -06:00
Martin Janiczek
4c068ba921 LibTest: Minimize footprint of Gen::unsigned_int, simplify code
unsigned_int(0) doesn't need to draw bits from RandomnessSource.

An expression for getting INT_MAX for u32 didn't need to be
special-cased over the general formula.

This is a follow-up on a few comments
2023-10-27 12:26:06 -06:00
Andreas Kling
230aa1404c LibJIT: Only compile Assembler on x86_64 for now 2023-10-27 19:07:22 +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