Commit Graph
370 Commits
Author SHA1 Message Date
Ryan Houdek fd857e4966 Makes threaded compilation not rely on a global mutex
As we run more threaded applications it is becoming apparent that this
needs to be fixed now.
This duplicates the FrontendDecoder and Passmanager per thread so they
no longer block each other while compiling.
Increases a bit of memory usage but completely worth it.
2020-05-27 10:18:02 -07:00
Stefanos Kornilios Mitsis Poiitidis a773a4e627 Merge pull request #211 from Sonicadvance1/softfloat
Implements softfloat library for x87
2020-05-27 14:30:02 +03:00
Stefanos Kornilios Mitsis Poiitidis 6669bcfffd Merge pull request #209 from Sonicadvance1/minor_opts
Minor memory allocation optimizations in the IR passes.
2020-05-27 14:27:08 +03:00
Stefanos Kornilios Mitsis Poiitidis 2fd8e617ff Merge pull request #207 from Sonicadvance1/interpreter_fallback
Adds support for interpreter fallback
2020-05-27 14:20:58 +03:00
Stefanos Kornilios Mitsis Poiitidis 22a4c5185d Merge pull request #208 from Sonicadvance1/fence_ops
Implements fence ops
2020-05-27 14:18:21 +03:00
Ryan Houdek 56087a029d Implements softfloat library for x87 2020-05-27 00:05:48 -07:00
Ryan Houdek 77e444e8a5 Fixes SCAS
Adds a couple of assets in the other repeat instructions.
Jump targets were accidently inverted.
SCAS and LODS are the two repeat instructions we don't have unit tests
for.
Unit tests are forthcoming for this
2020-05-26 22:51:11 -07:00
Ryan Houdek b3b6727a8e Minor optimization in IRCompaction pass
Codeblock array was constantly being reallocated.
Changes the remap array over to a allocate in multiples of the alignment
size.
Was hitting a pedantic case where the compaction would hit slightly
increasing function sizes so large numbers of reallocations occured
quickly.
2020-05-26 22:25:15 -07:00
Ryan Houdek f8579d5458 Minor optimization in the RCLSE pass
We already have an unmodified classification struct. Just memcpy it to
reset the state. Reduces a bunch of temporary allocations.
Also disables the CFG calculation since we aren't using it currently
2020-05-26 22:23:10 -07:00
Ryan Houdek 38ff936c81 Adds support for interpreter fallback
The IRHeader itself contains a flag for if a block should fallback to
the interpreter.
This is necessary for the case that an IR is loaded and the Frontend
object no longer has the data necessary to know if it should do an
interpreter fallback.
This is super useful for bisecting JIT versus Intepreter failures, and
also cases where falling back to intepreter for compatibility is a lot
more simple than wiring things through the JIT (ala x87)

This isn't currently utilized, but will be once x87 work lands
2020-05-26 19:08:18 -07:00
Ryan Houdek 5569894d81 Implements fence ops
These map directly to x86 fence instructions, which have equivalent ARM
versions as well.
2020-05-26 19:04:35 -07:00
Stefanos Kornilios Mitsis Poiitidis 66a0293cdb Merge pull request #201 from Sonicadvance1/fix_file_flags
Fixes FD flags mismatch between x86 and ARM64
2020-05-26 12:52:26 +03:00
Ryan Houdek f23a0997e7 Merge pull request #200 from Sonicadvance1/finish_x87_table
Finishes x87 instruction table flags
2020-05-26 01:31:32 -07:00
Ryan Houdek 56128d98b0 Merge pull request #202 from Sonicadvance1/fix_pid_tid_problem
Forces the primary application thread to be host primary thread
2020-05-26 00:41:07 -07:00
Stefanos Kornilios Mitsis Poiitidis 25ddef17c1 Merge pull request #203 from Sonicadvance1/fix_includes
Fixes some missing includes
2020-05-26 10:04:08 +03:00
Stefanos Kornilios Mitsis Poiitidis 7799cd43a4 Merge pull request #199 from Sonicadvance1/ir_has_sideeffects
Implements HasSideEffects IR option
2020-05-26 09:36:02 +03:00
Stefanos Kornilios Mitsis Poiitidis 7a9a95583c Merge pull request #190 from Sonicadvance1/fix_128bit_div
Fixes 128bit divisions on AArch64
2020-05-26 09:34:32 +03:00
Stefanos Kornilios Mitsis Poiitidis 6c2b66894b Merge pull request #196 from Sonicadvance1/fix_32bit_gdt_classification_dse
Fixes RCLSE CPUState classification
2020-05-26 09:32:59 +03:00
Ryan Houdek 7c8f7c732f Fixes some missing includes 2020-05-25 20:04:17 -07:00
Ryan Houdek 0130b41a10 Forces the primary application thread to be host primary thread
This is a bit of a peculiar one, we want to ensure a single threaded
application is running on the emulator's primary thread.
This mitigates the problem that an application can do a getpid versus
gettid comparison and notice a problem.
Some games rely on getpid being the actual process ID and will spin
forever if it isn't the case.

This is also necessary for wine bringup since thread creation needs a
bit more finesse there.

Fixes #186
2020-05-25 19:56:05 -07:00
Ryan Houdek 160da69c21 Fixes FD flags mismatch between x86 and ARM64
AArch64 redefines these four flags so they don't match between
architectures.
This is what was actually causing ls to fail, the x86 side was passing
in O_DIRECTORY which the AArch64 side was interpreting at O_DIRECT.
This made it return EINVAL
2020-05-26 02:44:11 +01:00
Ryan Houdek 566d83e334 Finishes x87 instruction table flags 2020-05-25 18:02:27 -07:00
Ryan Houdek f41700cd58 Lets DCE pass use the new HasSideEffects IR attribute
This will be less prone to breaking since you should have the sideeffect
described in the IR
2020-05-25 17:55:26 -07:00
Ryan Houdek 98d6feabae Marks IR ops that have side effects in the IR file 2020-05-25 17:53:57 -07:00
Ryan Houdek 277d0c6e22 Adds JSON IR option HasSideEffects
This will be useful for making sure our DCE pass isn't so fragile
2020-05-25 17:50:07 -07:00
Stefanos Kornilios Mitsis Poiitidis f5d69722d7 Merge pull request #195 from Sonicadvance1/implement_get_rusage
Implements get_rusage syscall
2020-05-25 18:11:36 +03:00
Stefanos Kornilios Mitsis Poiitidis ec8eac2836 Merge pull request #197 from Sonicadvance1/remove_xop
Removes XOP frontend handling
2020-05-25 17:16:44 +03:00
Stefanos Kornilios Mitsis Poiitidis cd4e29f83f Merge pull request #194 from Sonicadvance1/fix_getcwd
Changes getcwd to use the syscall directly.
2020-05-25 17:10:28 +03:00
Stefanos Kornilios Mitsis Poiitidis a69a821773 Merge pull request #192 from Sonicadvance1/fix_aarch64_llvm9
Fixes LLVM on AArch64
2020-05-25 17:06:28 +03:00
Ryan Houdek 45bf39ca0f Removes XOP frontend handling
This keeps the XOP instruction tables around but removes the decoding
assert.
This lets us implement the POP instruction that overlapped the XOP
prefix without having to deal with XOP at all.

I don't believe we have any real need to support XOP, but if it is a
thing later then it'll be easy to add back
2020-05-25 00:53:14 -07:00
Ryan Houdek 6cdbab9846 Fixes RCLSE CPUState classification
We were missing the newly added GDT classifications.
Wouldn't have caused any issues in any 64bit applications, but threw an
assert in debug builds
2020-05-25 00:34:19 -07:00
Ryan Houdek 136a2e4291 Implements get_rusage syscall 2020-05-24 00:22:40 -07:00
Ryan Houdek a95d43fa37 Changes getcwd to use the syscall directly.
The glibc implementation and syscall implementation differ quite
significantly.
Just use the kernel interface one for now.
2020-05-24 00:21:51 -07:00
Ryan Houdek 7c98f5a3ac Fixes LLVM on AArch64
LLVM-9 doesn have the include, while LLVM-10 does
2020-05-24 00:19:54 -07:00
Ryan Houdek 61c0fde8fe Fixes ASHR on AArch64
Smaller than 8byte wasn't sexting to the full register so it was causing issues
2020-05-24 00:18:51 -07:00
Ryan Houdek 600ad7f597 Fixes 128bit divisions on AArch64
These were only doing 64bit divisions.
Function calls are a bit ugly but once the new RA lands we can clean them up
2020-05-23 23:45:52 -07:00
Ryan Houdek 10087f7757 Implements initial 32bit syscall support
This adds the initial 32bit syscalls for testing. No where near complete
2020-05-15 03:23:15 -07:00
Ryan Houdek 64556e3eac Ensures passmanager gets the syscall handler during core init 2020-05-14 01:04:04 -07:00
Ryan Houdek d2cf07a4fd Passes the running mode through from FEX to FEXCore 2020-05-14 00:56:31 -07:00
Ryan Houdek c171fbb71e Add 64bit config option
Not currently wired up to anything
2020-05-14 00:55:52 -07:00
Stefanos Kornilios Mitsis Poiitidis c555577d07 Merge pull request #184 from Sonicadvance1/RA_Fix
Works around a spill bug in the RA
2020-05-12 23:44:48 +03:00
Stefanos Kornilios Mitsis Poiitidis a65bb87fa8 Merge pull request #183 from Sonicadvance1/fix_frontend_imm
Fixes a bug in the frontend regarding constants
2020-05-12 19:52:43 +03:00
Ryan Houdek 0a1a52860d Works around a spill bug in the RA
Spilling is a mess in this version of the RA and there was a significant
bug that effectively made spilling either infinite loop or crash.

This adds a bunch of new comments about the logic of the spilling and
ipmroves it so it shouldn't break as easily.

There are still some edge cases that can be hit that break spilling but
a lot of this code is going to be scrapped for the new RA coming up
anyway.
This is temporary until the new RA merges in.
2020-05-11 16:19:08 -07:00
Ryan Houdek 0b88984005 Fixes a bug in the frontend regarding constants
Optimization passes found a bug in the frontend regarding constants.

Specifically in the case of instructions that have a 32bit constant that
are sign extended to 64bit was being incorrectly set to have a size of
32bits (the size of the constant).
So an optimization pass would rematerialize constants of the expected
size, thus ~0ULL would turn in to ~0U and generate invalid code.

Now watch the destination size and set the constant to that size, which
matches what its size will be.
2020-05-11 16:10:50 -07:00
Ryan Houdek e6e4634651 Ensures LLVM JIT doesn't crash if DebugInfo isn't provided
IR doesn't have DebugInfo, all the other backends already handle this
2020-05-09 12:21:54 -07:00
Ryan Houdek 718b3e6b4c Refactors PassManager to ingest IREmitter class instead of OpDispatcher
The Passmanager passes need very little or zero x86 knowledge to do
their work. They don't need the x86 OpDispatcher handling code at all.
Convert this entirely over to using the IREmitter class so it can
actually optimize IR code from the IRLoader frontend
2020-05-09 12:14:59 -07:00
Ryan Houdek dc87134af3 Switches the OpcodeDispatcher over to using the new IREmitter class 2020-05-08 19:08:14 -07:00
Ryan Houdek 1b720479c4 Adds a self contained IREmitter class
This class does IR emitting and some basic handling of IR specific
tasks.

This is going to be used to split the x86 OpDispatcher from the IR
emission so the IR emitter can be passed around without caring about x86
dependencies.
2020-05-08 19:03:22 -07:00
Ryan Houdek bb7e58b3f1 Adds more IR documentation 2020-05-08 18:40:21 -07:00
Ryan Houdek 4269cef98f Adds the ability for the IR printer to dump TypeDefinition
No IR uses this currently directly but it could definitely happen.
2020-05-07 17:40:29 -07:00