guile-commits
[Top][All Lists]
Advanced

[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
 }



reply via email to

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