summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lightening.h6
-rw-r--r--lightening/aarch64-fpu.c26
-rw-r--r--lightening/arm-vfp.c14
-rw-r--r--lightening/x86-sse.c36
-rw-r--r--tests/movr_dl.c26
-rw-r--r--tests/movr_fi.c24
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);
+}