diff --git a/ChangeLog b/ChangeLog index 0a37f6f1c..81d391916 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2014-19-02 Paulo Andrade + + * include/lightning/jit_aarch64.h, include/lightning/jit_arm.h, + include/lightning/jit_hppa.h, include/lightning/jit_ia64.h, + include/lightning/jit_mips.h, include/lightning/jit_ppc.h, + include/lightning/jit_s390x.h, include/lightning/jit_sparc.h, + include/lightning/jit_x86.h: Change jit_regset_t to an + unsigned type, to allow safe right shift. + + * lib/lightning.c: Rewrite jit_regset_scan1 to allow easier + compiler optimization. + 2013-12-03 Paulo Andrade * lib/jit_x86-x87.c: Correct wrong optimization when diff --git a/include/lightning/jit_aarch64.h b/include/lightning/jit_aarch64.h index b42f7093f..8e6a7eb26 100644 --- a/include/lightning/jit_aarch64.h +++ b/include/lightning/jit_aarch64.h @@ -90,6 +90,6 @@ typedef enum { #define JIT_NOREG _NOREG } jit_reg_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* _jit_aarch64_h */ diff --git a/include/lightning/jit_arm.h b/include/lightning/jit_arm.h index 1db759388..c8d2b14ce 100644 --- a/include/lightning/jit_arm.h +++ b/include/lightning/jit_arm.h @@ -123,7 +123,7 @@ typedef struct { jit_uint32_t ldrt_strt : 1; } jit_cpu_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; /* * Initialization diff --git a/include/lightning/jit_hppa.h b/include/lightning/jit_hppa.h index e7c5fe4e1..a24b2df23 100644 --- a/include/lightning/jit_hppa.h +++ b/include/lightning/jit_hppa.h @@ -133,6 +133,6 @@ typedef enum { _NOREG, } jit_reg_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* _jit_hppa */ diff --git a/include/lightning/jit_ia64.h b/include/lightning/jit_ia64.h index 29f4189c0..12c61adbd 100644 --- a/include/lightning/jit_ia64.h +++ b/include/lightning/jit_ia64.h @@ -118,10 +118,10 @@ typedef enum { } jit_reg_t; typedef struct { - jit_int64_t rl; - jit_int64_t rh; - jit_int64_t fl; - jit_int64_t fh; + jit_uint64_t rl; + jit_uint64_t rh; + jit_uint64_t fl; + jit_uint64_t fh; } jit_regset_t; #endif /* _jit_ia64_h */ diff --git a/include/lightning/jit_mips.h b/include/lightning/jit_mips.h index e361c220a..54e57db5a 100644 --- a/include/lightning/jit_mips.h +++ b/include/lightning/jit_mips.h @@ -119,6 +119,6 @@ typedef enum { _NOREG, } jit_reg_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* _jit_mips_h */ diff --git a/include/lightning/jit_ppc.h b/include/lightning/jit_ppc.h index 4daf9de76..802189149 100644 --- a/include/lightning/jit_ppc.h +++ b/include/lightning/jit_ppc.h @@ -103,6 +103,6 @@ typedef enum { #define JIT_NOREG _NOREG } jit_reg_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* _jit_ppc_h */ diff --git a/include/lightning/jit_s390x.h b/include/lightning/jit_s390x.h index 072e72880..f84290c0d 100644 --- a/include/lightning/jit_s390x.h +++ b/include/lightning/jit_s390x.h @@ -67,6 +67,6 @@ typedef enum { #define JIT_NOREG _NOREG } jit_reg_t; -typedef jit_int32_t jit_regset_t; +typedef jit_uint32_t jit_regset_t; #endif /* _jit_s390x_h */ diff --git a/include/lightning/jit_sparc.h b/include/lightning/jit_sparc.h index 946d38284..63c7d7405 100644 --- a/include/lightning/jit_sparc.h +++ b/include/lightning/jit_sparc.h @@ -65,6 +65,6 @@ typedef enum { _NOREG, } jit_reg_t; -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* _jit_sparc_h */ diff --git a/include/lightning/jit_x86.h b/include/lightning/jit_x86.h index 3166f7170..5c85adb9b 100644 --- a/include/lightning/jit_x86.h +++ b/include/lightning/jit_x86.h @@ -139,9 +139,9 @@ typedef struct { } jit_cpu_t; #if __WORDSIZE == 32 -typedef jit_int32_t jit_regset_t; +typedef jit_uint32_t jit_regset_t; #else -typedef jit_int64_t jit_regset_t; +typedef jit_uint64_t jit_regset_t; #endif /* diff --git a/lib/lightning.c b/lib/lightning.c index ebc76c114..de93e9fc5 100644 --- a/lib/lightning.c +++ b/lib/lightning.c @@ -496,10 +496,15 @@ jit_regset_scan1(jit_regset_t *set, jit_int32_t offset) unsigned long jit_regset_scan1(jit_regset_t *set, jit_int32_t offset) { + jit_regset_t mask; assert(offset >= 0 && offset <= 63); - for (; offset < 64; offset++) { - if (*set & (1LL << offset)) - return (offset); + if ((mask = *set >> offset)) { + for (;;) { + if (mask & 1) + return (offset); + mask >>= 1; + ++offset; + } } return (ULONG_MAX); }