diff options
-rw-r--r-- | lightening.h | 6 | ||||
-rw-r--r-- | lightening/aarch64-fpu.c | 26 | ||||
-rw-r--r-- | lightening/arm-vfp.c | 14 | ||||
-rw-r--r-- | lightening/x86-sse.c | 36 | ||||
-rw-r--r-- | tests/movr_dl.c | 26 | ||||
-rw-r--r-- | tests/movr_fi.c | 24 |
6 files changed, 128 insertions, 4 deletions
diff --git a/lightening.h b/lightening.h index efa5dfdf1..1b296bd66 100644 --- a/lightening.h +++ b/lightening.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2020 Free Software Foundation, Inc. + * Copyright (C) 2012-2020, 2025 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -622,6 +622,10 @@ jit_load_args_3(jit_state_t *_jit, jit_operand_t a, jit_operand_t b, M(_FF__, extr_f_d) \ M(_FF__, movr_f) \ M(_FF__, movr_d) \ + M(_GF__, movr_i_f) \ + M(_FG__, movr_f_i) \ + WHEN_64(M(_GF__, movr_l_d)) \ + WHEN_64(M(_FG__, movr_d_l)) \ M(_Ff__, movi_f) \ M(_Fd__, movi_d) \ M(_GF__, truncr_d_i) \ diff --git a/lightening/aarch64-fpu.c b/lightening/aarch64-fpu.c index 629734264..80dee334d 100644 --- a/lightening/aarch64-fpu.c +++ b/lightening/aarch64-fpu.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013-2019 Free Software Foundation, Inc. + * Copyright (C) 2013-2019, 2025 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -638,6 +638,18 @@ movi_f(jit_state_t *_jit, int32_t r0, float i0) } } +static void +movr_f_i(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + FMOVSW(_jit, r0, r1); +} + +static void +movr_i_f(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + FMOVWS(_jit, r0, r1); +} + static jit_reloc_t buneqr_f(jit_state_t *_jit, int32_t r0, int32_t r1) { @@ -759,6 +771,18 @@ movi_d(jit_state_t *_jit, int32_t r0, double i0) } } +static void +movr_d_l(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + FMOVDX(_jit, r0, r1); +} + +static void +movr_l_d(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + FMOVXD(_jit, r0, r1); +} + static jit_reloc_t buneqr_d(jit_state_t *_jit, int32_t r0, int32_t r1) { diff --git a/lightening/arm-vfp.c b/lightening/arm-vfp.c index 208edc316..63134dcf5 100644 --- a/lightening/arm-vfp.c +++ b/lightening/arm-vfp.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2017, 2019 Free Software Foundation, Inc. + * Copyright (C) 2012-2017, 2019, 2025 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -914,6 +914,18 @@ movi_d(jit_state_t *_jit, int32_t r0, jit_float64_t i0) } static void +movr_f_i(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + VMOV_S_A(_jit, r0, r1); +} + +static void +movr_i_f(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + VMOV_A_S32(_jit, r0, r1); +} + +static void extr_d_f(jit_state_t *_jit, int32_t r0, int32_t r1) { VCVT_F64_F32(_jit, r0, r1); diff --git a/lightening/x86-sse.c b/lightening/x86-sse.c index ab66dc7c5..0331ff056 100644 --- a/lightening/x86-sse.c +++ b/lightening/x86-sse.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2017, 2019 Free Software Foundation, Inc. + * Copyright (C) 2012-2017, 2019, 2025 Free Software Foundation, Inc. * * This file is part of GNU lightning. * @@ -128,13 +128,24 @@ movdlxr(jit_state_t *_jit, int32_t r0, int32_t r1) { ssexr(_jit, 0x66, X86_SSE_X2G, r0, r1); } +static void +movdlrx(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + ssexr(_jit, 0x66, X86_SSE_G2X, r0, r1); +} static void movdqxr(jit_state_t *_jit, int32_t r0, int32_t r1) maybe_unused; +static void movdqrx(jit_state_t *_jit, int32_t r0, int32_t r1) maybe_unused; static void movdqxr(jit_state_t *_jit, int32_t r0, int32_t r1) { sselxr(_jit, 0x66, X86_SSE_X2G, r0, r1); } +static void +movdqrx(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + sselxr(_jit, 0x66, X86_SSE_G2X, r0, r1); +} static void movssmr(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms, int32_t rd) @@ -172,6 +183,29 @@ movr_d(jit_state_t *_jit, int32_t r0, int32_t r1) } static void +movr_i_f(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + movdlrx(_jit, r0, r1); +} +static void +movr_f_i(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + movdlxr(_jit, r0, r1); +} +#if __X64 +static void +movr_l_d(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + movdqrx(_jit, r0, r1); +} +static void +movr_d_l(jit_state_t *_jit, int32_t r0, int32_t r1) +{ + movdqxr(_jit, r0, r1); +} +#endif + +static void addssr(jit_state_t *_jit, int32_t r0, int32_t r1) { ssexr(_jit, 0xf3, X86_SSE_ADD, r0, r1); diff --git a/tests/movr_dl.c b/tests/movr_dl.c new file mode 100644 index 000000000..029d41bcc --- /dev/null +++ b/tests/movr_dl.c @@ -0,0 +1,26 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ +#if __WORDSIZE > 32 + jit_begin(j, arena_base, arena_size); + size_t align = jit_enter_jit_abi(j, 0, 0, 0); + + jit_movi_d(j, JIT_F0, 3.14159); + jit_movr_l_d(j, JIT_R0, JIT_F0); + jit_movr_d_l(j, JIT_F1, JIT_R0); + jit_leave_jit_abi(j, 0, 0, align); + jit_retr_d(j, JIT_F1); + + double (*f)(void) = jit_end(j, NULL); + + ASSERT(f() == 3.14159); +#endif +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +} diff --git a/tests/movr_fi.c b/tests/movr_fi.c new file mode 100644 index 000000000..f8d3bdf4c --- /dev/null +++ b/tests/movr_fi.c @@ -0,0 +1,24 @@ +#include "test.h" + +static void +run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + size_t align = jit_enter_jit_abi(j, 0, 0, 0); + + jit_movi_f(j, JIT_F0, 3.14159); + jit_movr_i_f(j, JIT_R0, JIT_F0); + jit_movr_f_i(j, JIT_F1, JIT_R0); + jit_leave_jit_abi(j, 0, 0, align); + jit_retr_f(j, JIT_F1); + + float (*f)(void) = jit_end(j, NULL); + + ASSERT(f() == 3.14159f); +} + +int +main (int argc, char *argv[]) +{ + return main_helper(argc, argv, run_test); +} |