guile-commits
[Top][All Lists]
Advanced

[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);
+}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]