[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 04/27: Add movr_f_i, movr_i_f, movr_d_l, movr_l_d
From: |
Andy Wingo |
Subject: |
[Guile-commits] 04/27: Add movr_f_i, movr_i_f, movr_d_l, movr_l_d |
Date: |
Wed, 29 Jan 2025 10:52:58 -0500 (EST) |
wingo pushed a commit to branch main
in repository guile.
commit 11918685e122597a3443df3e273e0c8327d1251a
Author: Andy Wingo <wingo@igalia.com>
AuthorDate: Wed Jan 29 12:14:59 2025 +0100
Add movr_f_i, movr_i_f, movr_d_l, movr_l_d
These move values verbatim between FPRs and GPRs.
---
lightening.h | 6 +++++-
lightening/aarch64-fpu.c | 26 +++++++++++++++++++++++++-
lightening/arm-vfp.c | 14 +++++++++++++-
lightening/x86-sse.c | 36 +++++++++++++++++++++++++++++++++++-
tests/movr_dl.c | 26 ++++++++++++++++++++++++++
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.
*
@@ -913,6 +913,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)
{
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)
@@ -171,6 +182,29 @@ movr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
ssexr(_jit, 0xf2, X86_SSE_MOV, r0, 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)
{
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);
+}
- [Guile-commits] branch main updated (624d78625 -> 5d3f561d7), Andy Wingo, 2025/01/29
- [Guile-commits] 06/27: Makefile: RISCV support and optional vars, Andy Wingo, 2025/01/29
- [Guile-commits] 03/27: Merge branch 'callr-fix3' into 'main', Andy Wingo, 2025/01/29
- [Guile-commits] 25/27: riscv: error if not little endian, Andy Wingo, 2025/01/29
- [Guile-commits] 04/27: Add movr_f_i, movr_i_f, movr_d_l, movr_l_d,
Andy Wingo <=
- [Guile-commits] 10/27: riscv: Add fence, Andy Wingo, 2025/01/29
- [Guile-commits] 18/27: riscv: fix load size for ldxi instructions, Andy Wingo, 2025/01/29
- [Guile-commits] 16/27: riscv: fix literal pool guard jump address calc, Andy Wingo, 2025/01/29
- [Guile-commits] 09/27: Fix CI, Andy Wingo, 2025/01/29
- [Guile-commits] 23/27: riscv: change stack alignment to 16, Andy Wingo, 2025/01/29
- [Guile-commits] 12/27: riscv: don't pack veneers, use padding, Andy Wingo, 2025/01/29
- [Guile-commits] 17/27: riscv: simplify load from pool, Andy Wingo, 2025/01/29
- [Guile-commits] 26/27: Merge branch 'main' into 'main', Andy Wingo, 2025/01/29
- [Guile-commits] 07/27: RISC-V Support, Andy Wingo, 2025/01/29
- [Guile-commits] 14/27: riscv: fix the B and J type size check, Andy Wingo, 2025/01/29