[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 01/02: Better ursh/ulsh/srsh JIT on 32-bit platforms
From: |
Andy Wingo |
Subject: |
[Guile-commits] 01/02: Better ursh/ulsh/srsh JIT on 32-bit platforms |
Date: |
Tue, 9 Oct 2018 06:32:46 -0400 (EDT) |
wingo pushed a commit to branch master
in repository guile.
commit d41f2e9978c77195857bfe434cc9388c3ac55c61
Author: Andy Wingo <address@hidden>
Date: Tue Oct 9 12:01:24 2018 +0200
Better ursh/ulsh/srsh JIT on 32-bit platforms
* libguile/jit.c (compile_ursh_immediate, compile_ulsh_immediate)
(compile_srsh_immediate): Special-case shifts by 32 bits on 32-bit
platforms. Avoids shifting by 0.
---
libguile/jit.c | 60 ++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 39 insertions(+), 21 deletions(-)
diff --git a/libguile/jit.c b/libguile/jit.c
index c69ea92..2bb50f2 100644
--- a/libguile/jit.c
+++ b/libguile/jit.c
@@ -2948,13 +2948,7 @@ compile_ursh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
{
/* Nothing to do. */
}
- else if (b >= 32)
- {
- /* hi = 0, lo = hi >> (s-32) */
- emit_rshi_u (j, T0, T1, b - 32);
- emit_movi (j, T1, 0);
- }
- else
+ else if (b < 32)
{
/* 0 < s < 32: hi = hi >> s, lo = lo >> s + hi << (32-s) */
emit_lshi (j, T2, T1, 32 - b);
@@ -2962,6 +2956,18 @@ compile_ursh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
emit_rshi_u (j, T0, T0, b);
emit_addr (j, T0, T0, T2);
}
+ else if (b == 32)
+ {
+ /* hi = 0, lo = hi */
+ emit_movi (j, T0, T1);
+ emit_movi (j, T1, 0);
+ }
+ else /* b > 32 */
+ {
+ /* hi = 0, lo = hi >> (s-32) */
+ emit_rshi_u (j, T0, T1, b - 32);
+ emit_movi (j, T1, 0);
+ }
emit_sp_set_u64 (j, dst, T0, T1);
#endif
}
@@ -2982,13 +2988,7 @@ compile_ulsh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
{
/* Nothing to do. */
}
- else if (b >= 32)
- {
- /* hi = lo << (s-32), lo = 0 */
- emit_lshr (j, T1, T0, b - 32);
- emit_movi (j, T0, 0);
- }
- else
+ else if (b < 32)
{
/* hi = hi << s + lo >> (32-s), lo = lo << s */
emit_rshi_u (j, T2, T0, 32 - b);
@@ -2996,6 +2996,18 @@ compile_ulsh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
emit_lshi (j, T0, T0, b);
emit_addr (j, T1, T1, T2);
}
+ else if (b == 32)
+ {
+ /* hi = lo, lo = 0 */
+ emit_movi (j, T1, T0);
+ emit_movi (j, T0, 0);
+ }
+ else /* b > 32 */
+ {
+ /* hi = lo << (s-32), lo = 0 */
+ emit_lshr (j, T1, T0, b - 32);
+ emit_movi (j, T0, 0);
+ }
emit_sp_set_u64 (j, dst, T0, T1);
#endif
}
@@ -3664,13 +3676,7 @@ compile_srsh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
{
/* Nothing to do. */
}
- else if (b >= 32)
- {
- /* hi = sign-ext, lo = hi >> (s-32) */
- emit_rshi (j, T0, T1, b - 32);
- emit_rshi (j, T1, T1, 31);
- }
- else
+ else if (b < 32)
{
/* 0 < s < 32: hi = hi >> s, lo = lo >> s + hi << (32-s) */
emit_lshi (j, T2, T1, 32 - b);
@@ -3678,6 +3684,18 @@ compile_srsh_immediate (scm_jit_state *j, uint8_t dst,
uint8_t a, uint8_t b)
emit_rshi_u (j, T0, T0, b);
emit_addr (j, T0, T0, T2);
}
+ else if (b == 32)
+ {
+ /* hi = sign-ext, lo = hi */
+ emit_movr (j, T0, T1);
+ emit_rshi (j, T1, T1, 31);
+ }
+ else /* b > 32 */
+ {
+ /* hi = sign-ext, lo = hi >> (s-32) */
+ emit_rshi (j, T0, T1, b - 32);
+ emit_rshi (j, T1, T1, 31);
+ }
emit_sp_set_s64 (j, dst, T0, T1);
#endif
}