summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2017-01-25 19:50:10 +0200
committerArnold D. Robbins <arnold@skeeve.com>2017-01-25 19:50:10 +0200
commit4c19bff0e44c358deb8efacf2cda0dbaf4a45823 (patch)
tree420dfcbd448b608644218be9463456d479a4a0e6
parenta703fd5dc965f2ba253d07ca94771098d5db974e (diff)
parent2da83e944e432692f5576ce4baa9831dce13eb77 (diff)
downloadgawk-4c19bff0e44c358deb8efacf2cda0dbaf4a45823.tar.gz
Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/gawk
-rw-r--r--ChangeLog9
-rw-r--r--awk.h43
2 files changed, 36 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 44aa7304..944b26e9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2017-01-22 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * awk.h (numtype_choose): New backend macro used to implement
+ various macros whose calculations depend on how a number is
+ actually represented. This improves readability and should give
+ a small performance improvement when not using extended precision.
+ (get_number_ui, get_number_si, get_number_d, get_number_uj, iszero):
+ Rewrite using new numtype_choose macro.
+
2017-01-04 Arnold Robbins <arnold@skeeve.com>
Trade space for time for programs that toggle IGNORECASE a lot.
diff --git a/awk.h b/awk.h
index d5c88fd9..34c0e07d 100644
--- a/awk.h
+++ b/awk.h
@@ -1251,23 +1251,34 @@ DEREF(NODE *r)
/* ------------------------- Pseudo-functions ------------------------- */
#ifdef HAVE_MPFR
+
+#if 0
+
+/*
+ * In principle, there is no need to have both the MPFN and MPZN flags,
+ * since we are using 2 bits to encode 1 bit of information. But
+ * there may be some minor performance advantages from testing only the
+ * node flag bits without needing also to access the global do_mpfr flag bit.
+ */
+#define numtype_choose(n, mpfrval, mpzval, dblval) \
+ (!do_mpfr ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval)))
+
+#endif
+
+/* N.B. This implementation seems to give the fastest results. */
+#define numtype_choose(n, mpfrval, mpzval, dblval) \
+ (!((n)->flags & (MPFN|MPZN)) ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval)))
+
/* conversion to C types */
-#define get_number_ui(n) (((n)->flags & MPFN) ? mpfr_get_ui((n)->mpg_numbr, ROUND_MODE) \
- : ((n)->flags & MPZN) ? mpz_get_ui((n)->mpg_i) \
- : (unsigned long) (n)->numbr)
-#define get_number_si(n) (((n)->flags & MPFN) ? mpfr_get_si((n)->mpg_numbr, ROUND_MODE) \
- : ((n)->flags & MPZN) ? mpz_get_si((n)->mpg_i) \
- : (long) (n)->numbr)
-#define get_number_d(n) (((n)->flags & MPFN) ? mpfr_get_d((n)->mpg_numbr, ROUND_MODE) \
- : ((n)->flags & MPZN) ? mpz_get_d((n)->mpg_i) \
- : (double) (n)->numbr)
-#define get_number_uj(n) (((n)->flags & MPFN) ? mpfr_get_uj((n)->mpg_numbr, ROUND_MODE) \
- : ((n)->flags & MPZN) ? (uintmax_t) mpz_get_d((n)->mpg_i) \
- : (uintmax_t) (n)->numbr)
-
-#define iszero(n) (((n)->flags & MPFN) ? mpfr_zero_p((n)->mpg_numbr) \
- : ((n)->flags & MPZN) ? (mpz_sgn((n)->mpg_i) == 0) \
- : ((n)->numbr == 0.0))
+#define get_number_ui(n) numtype_choose((n), mpfr_get_ui((n)->mpg_numbr, ROUND_MODE), mpz_get_ui((n)->mpg_i), (unsigned long) (n)->numbr)
+
+#define get_number_si(n) numtype_choose((n), mpfr_get_si((n)->mpg_numbr, ROUND_MODE), mpz_get_si((n)->mpg_i), (long) (n)->numbr)
+
+#define get_number_d(n) numtype_choose((n), mpfr_get_d((n)->mpg_numbr, ROUND_MODE), mpz_get_d((n)->mpg_i), (double) (n)->numbr)
+
+#define get_number_uj(n) numtype_choose((n), mpfr_get_uj((n)->mpg_numbr, ROUND_MODE), (uintmax_t) mpz_get_d((n)->mpg_i), (uintmax_t) (n)->numbr)
+
+#define iszero(n) numtype_choose((n), mpfr_zero_p((n)->mpg_numbr), (mpz_sgn((n)->mpg_i) == 0), ((n)->numbr == 0.0))
#define IEEE_FMT(r, t) (void) (do_ieee_fmt && format_ieee(r, t))