1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-26 21:20:30 +02:00
Commit graph

111 commits

Author SHA1 Message Date
Helmut Eller
f31fb0044d Fix some problems with callr and calli.
The problem with callr is that the register that contains the
function to be called, can be overwritten by the logic that moves
the values into argument registers.  To fix this, I added a
get_callr_temp function that should return a platform specific
register that is not used to pass arguments.  For Aarch64/Arm the
link registers seems to work; for Amd64/i686 the RAX register.
The function/tmp pair becomes an additional argument to the
parallel assigment; this way the original function register is not
accidentally overwritten.

The problem with calli is that it may not have enough temp
registers to move arguments.  The windmill paper says that at most
one temporary register is needed for the parallel assignment.
However, we also need a temp register for mem-to-mem moves.  So it
seems that we need a second temporary.  For Amd64/i686 we have
only one temporary GPR and one temporary FPR.  To fix this, I
modified the algorithm from the paper a bit: we perform the
mem-to-mem moves before the other moves.  Later when we need the
temp to break cycles, there shouldn't be any mem-to-mem moves
left.  So we should never need two temps at the same time.

* lightening/lightening.c: (get_callr_temp): New function; need
for each platform.
(prepare_call_args): Include the function/callr_temp pair in the
arguments for the parallel assignment.

* lightening/x86.c, lightening/arm.c, lightening/aarch64.c
(get_callr_temp): Implementation for each platform.

* lightening/arm.c (next_abi_arg): Fix the stack size for doubles.

* tests/call_10_2.c, tests/callr_10.c: New tests.
* tests/regarrays.inc: New file. Common code between the above two
tests that would be tedious to duplicate.
2022-06-08 16:20:42 +02:00
Andy Wingo
35cd7fac8b Fix jmp-shortening on x64 when target within instruction.
* lightening/x86.c (jit_try_shorten): If the address is within the
  last instruction, don't shorten.  If the intstruction is a jump, we
  could elide it entirely in some cases, but we don't know if the user
  captured the PC before calling jit_patch_here.  Better to leave this
  to the user.

Thanks to Helmut Eller for the bug report and test case in
https://gitlab.com/wingo/lightening/-/issues/17.
2021-01-07 11:04:17 +01:00
Andy Wingo
44b07aef4b Allow jit_begin_data to declare max data size
* lightening.h:
* lightening/lightening.c (jit_begin_data): Add max data size
  parameter.  If nonzero, can allow the JIT to avoid prematurely
  emitting a constant pool.
  (jit_end_data): Allow pending literals.
* tests/jmp_table.c (run_test): Use new API.
2020-07-30 13:41:02 +02:00
Andy Wingo
91c1591e41 Add support for emitting inline data and table switches
* lightening.h:
* lightening/lightening.c (jit_begin_data, jit_end_data)
  (jit_emit_u8, jit_emit_u16, jit_emit_u32, jit_emit_u64): Add new raw
  data-emitting primitives, bracketed by begin/end so that we can flush
  constant pools first, if needed.
* lightening/lightening.c (struct jit_state): Add new emitting_data
  flag.
  (jit_begin, jit_reset, jit_end): Handle the new flag.
  (emit_abs_reloc): Move here, from x86.c.
* lightening/x86.c (emit_abs_reloc): Remove.
  (jit_try_shorten): Don't shorten if loc == start; could be raw data.
* tests/jmp_table.c: New test.
2020-07-30 13:02:46 +02:00
Andy Wingo
6c7813a05f Ensure tail caller and callee in jmpi test have compatible ABI
* tests/jmpi.c: Emit the tail callee using the JIT, to ensure that it
  saves and restores registers in the same way as the caller.  Fixes
  #16.
2020-07-30 11:52:57 +02:00
Dale P. Smith
24ef197b12 Add 'movi' test.
This is a followup to 1bb909a44d.  It
reproduces the bug that 1bb909a44d fixes
on ARMv7.

* tests/movi.c: New file.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
2020-06-20 16:34:37 +02:00
Ludovic Courtès
e20ca01d9b tests: Remove 'glibc' from the 'guix environment' command line.
* tests/Makefile (CC_IA32, CC_AARCH64, CC_ARMv7): Remove 'glibc' from
the 'guix environment' command line since it's redundant with
'gcc-toolchain'.
2020-06-20 16:14:10 +02:00
Ludovic Courtès
e3d9bdf03f tests: Make 'TARGETS' overridable.
This allows users to run "make TARGETS=armv7", for instance.

* tests/Makefile (TARGETS): Make it overridable.
2020-06-20 16:13:16 +02:00
Icecream95
1656fc1d81
Add a test for local forward and backward jumps 2020-04-09 17:31:25 +12:00
Andy Wingo
62183fb098 Add jmpi_with_link instruction
The existing calli / callr interface is for ABI calls.  Sometimes though
you want to call some of your own code, just to get the current return
address.  ARM's branch-and-link instructions are ideal for this but they
don't exist on x86; there we emulate them by adding corresponding
pop_link_register / push_link_register instructions that are no-ops on
ARM.

* lightening.h (FOR_EACH_INSTRUCTION): Add jit_jmpi_with_link,
  pop_link_register, push_link_register.
* lightening/arm-cpu.c:
* lightening/x86-cpu.c:
* lightening/aarch64-cpu.c (jmpi_with_link, push_link_register)
  (pop_link_register): Add implementations.
* lightening/arm.h:
* lightening/aarch64.h:
* lightening/x86.h (JIT_LR): New definition.
* tests/link-register.c: New test.
2019-06-20 10:13:37 +02:00
Andy Wingo
bcdde6656b Add atomic operations
These operations emit the same code that GCC does for corresponding
operations under the sequential consistency memory model.  It would be
possible to relax to acquire/release or something in the future.
2019-05-27 11:34:13 +02:00
Andy Wingo
eaf702765d Remove software floating-point ARMv7 support; ARMv7 test env 2019-05-17 09:39:01 +02:00
Andy Wingo
c0e9302e9f Update README and guix invocations in test suite 2019-05-16 13:56:56 +02:00
Andy Wingo
826d5a95c3 Fix dpkg --add-architecture invocation 2019-05-16 12:08:22 +02:00
Andy Wingo
926275e123 Add support for aarch64 in CI 2019-05-16 12:03:38 +02:00
Andy Wingo
9d4185af2b Remove jit_nop
Instead, jit_align will call nop() internally.  You can't nop 3 bytes on
most architectures.
2019-05-16 11:40:24 +02:00
Andy Wingo
5b8262e804 Rework register saving to avoid push/pop
Push and pop are not well supported on AArch64, so we might as well just
bump the stack pointer once and fill in by offset.
2019-05-15 15:41:02 +02:00
Andy Wingo
04cd8874de Stack alignment takes saved return address into account 2019-04-28 12:37:19 +02:00
Andy Wingo
59ead16eab Mark test files as precious to prevent them from being deleted by make 2019-04-28 10:47:52 +02:00
Andy Wingo
d8bdefbd2f Add test for JIT callee with many args 2019-04-27 23:11:13 +02:00
Andy Wingo
d11864f098 Add {enter,leave}_jit_abi calls in tests
This saves and restores RBP on x86-32.
2019-04-27 22:54:38 +02:00
Andy Wingo
81ba8830a2 Fix ABI of arg to extr_d_f test 2019-04-27 22:36:06 +02:00
Andy Wingo
e0cf51e482 Small bug fixes for ia32 2019-04-26 17:41:43 +02:00
Andy Wingo
42bc762d26 Add facility to enter and leave JIT ABI
This allows us to save and restore callee-save temporaries, i.e. RBP on
32-bit x86.  Otherwise it's a disaster shuffling stack arguments using
temporaries.
2019-04-26 17:28:29 +02:00
Andy Wingo
b116314591 Fix compile warnings for 32-bit tests 2019-04-26 15:56:08 +02:00
Andy Wingo
e9d1567f7f Use jit_word_t for register-sized values instead of intmax_t 2019-04-26 15:00:29 +02:00
Andy Wingo
2602f17fb4 Simplify register representation again
There's only one flag, "callee-save".  Also the regno range is limited
to 0-63 inclusive, to allow for cheap register sets as uint64_t values.
2019-04-25 19:12:55 +02:00
Andy Wingo
99e5672726 Renumber x86 registers
Now that there's no hazard to using a register used for passing
arguments, renumber to give JIT_R/JIT_F/JIT_V names to all registers.

Choose a temp register that's not used for passing arguments.  Our
previous choice was an argument register (doh!) which made function
calls with many arguments fail.
2019-04-25 17:14:28 +02:00
Andy Wingo
0be4f7a2a1 Simplify API for loading call arguments 2019-04-22 09:15:03 +02:00
Andy Wingo
668196aa27 Fix lightening name 2019-04-05 16:25:22 +02:00
Andy Wingo
a45d651755 Add support for "make test-ia32" in tests/ 2019-04-05 16:24:21 +02:00
Andy Wingo
e6ac66a348 Allow test suite to test multiple targets.
* tests/Makefile: Allow for testing multiple targets.
2019-04-05 16:07:01 +02:00
Andy Wingo
bbfb03ac30 Fix implementation of jit_{gpr,fpr}_is_callee_save 2019-04-04 11:08:54 +02:00
Andy Wingo
22d06620ee Allow users to pass custom allocators 2019-04-03 15:25:21 +02:00
Andy Wingo
f348b8ed6d Change headers and files to be named "lightening" instead of "jit"
This improves integration with other projects.  Like for example Guile
already has files named jit.c and jit.h; it's easier to manage if
lightening uses its own file names.
2019-04-03 13:57:48 +02:00
Andy Wingo
99b4fd2d79 Provide some type safety for jit_gpr_t and jit_fpr_t 2019-04-03 11:50:32 +02:00
Andy Wingo
40ebd5de44 Add movi_[df] tests 2019-03-26 22:34:04 +01:00
Andy Wingo
bbb8bd94f2 Add int->float tests 2019-03-26 22:32:40 +01:00
Andy Wingo
ece71ef64c Add float/double cast inst tests 2019-03-26 22:29:48 +01:00
Andy Wingo
44fc164098 Add truncr_[df]_[li] tests 2019-03-26 22:26:05 +01:00
Andy Wingo
69665c7f80 Add abs/sqrt tests 2019-03-26 22:01:52 +01:00
Andy Wingo
bf4d8b4a24 Add push/pop test 2019-03-26 21:50:17 +01:00
Andy Wingo
281cca514f Add some nop and jmp tests, and fix a hazard with jmpi/calli 2019-03-26 16:28:38 +01:00
Andy Wingo
8a8273c45c Add sub-and-branch-on-overflow tests 2019-03-26 16:09:07 +01:00
Andy Wingo
6dbad81afd Add add-and-branch-on-overflow tests 2019-03-26 15:53:48 +01:00
Andy Wingo
0d0c6b1a4b Add flag-checking test-and-branch tests 2019-03-26 15:25:57 +01:00
Andy Wingo
a021c73438 Add unordered float compare-and-branch tests 2019-03-26 15:22:14 +01:00
Andy Wingo
3d4c22ad33 Add anti-float comparison tests 2019-03-26 15:04:50 +01:00
Andy Wingo
329fc7936c Add int/int reg/imm compare-and-branch tests 2019-03-26 14:53:25 +01:00
Andy Wingo
ab0d17286a Add floating-point reg/reg compare-and-branch tests 2019-03-26 14:43:53 +01:00