1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 03:40:34 +02:00

Add movr_f_i, movr_i_f, movr_d_l, movr_l_d

These move values verbatim between FPRs and GPRs.
This commit is contained in:
Andy Wingo 2025-01-29 12:14:59 +01:00
parent 434fe2b4aa
commit 11918685e1
6 changed files with 128 additions and 4 deletions

View file

@ -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. * 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__, extr_f_d) \
M(_FF__, movr_f) \ M(_FF__, movr_f) \
M(_FF__, movr_d) \ 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(_Ff__, movi_f) \
M(_Fd__, movi_d) \ M(_Fd__, movi_d) \
M(_GF__, truncr_d_i) \ M(_GF__, truncr_d_i) \

View file

@ -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. * 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 static jit_reloc_t
buneqr_f(jit_state_t *_jit, int32_t r0, int32_t r1) 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 static jit_reloc_t
buneqr_d(jit_state_t *_jit, int32_t r0, int32_t r1) buneqr_d(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {

View file

@ -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. * 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 static void
extr_d_f(jit_state_t *_jit, int32_t r0, int32_t r1) extr_d_f(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {

View file

@ -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. * 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); 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 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 static void
movdqxr(jit_state_t *_jit, int32_t r0, int32_t r1) movdqxr(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {
sselxr(_jit, 0x66, X86_SSE_X2G, r0, 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 static void
movssmr(jit_state_t *_jit, int32_t md, int32_t rb, int32_t ri, int32_t ms, int32_t rd) 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); 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 static void
addssr(jit_state_t *_jit, int32_t r0, int32_t r1) addssr(jit_state_t *_jit, int32_t r0, int32_t r1)
{ {

26
tests/movr_dl.c Normal file
View file

@ -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);
}

24
tests/movr_fi.c Normal file
View file

@ -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);
}