summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2006-02-03 13:53:15 +0000
committerBruce Momjian2006-02-03 13:53:15 +0000
commitaa7501e9757cb41e74b353a69533cf1b5b23607d (patch)
tree95be5016955712e778a1d7eb8fa1152870fe1f21
parent903c6271f23c561064dab71e8a9fd26c4a3669d8 (diff)
Allow MEMSET_LOOP_LIMIT to be set on a per-platform basis, and turn off
MemSet on AIX by setting MEMSET_LOOP_LIMIT to zero. Add optimization to skip MemSet tests in MEMSET_LOOP_LIMIT == 0 case and just call memset() directly.
-rwxr-xr-xconfigure11
-rw-r--r--configure.in7
-rw-r--r--src/include/c.h17
-rw-r--r--src/include/pg_config.h.in3
-rw-r--r--src/template/aix4
5 files changed, 35 insertions, 7 deletions
diff --git a/configure b/configure
index 0c6fc28610..0cd5260f30 100755
--- a/configure
+++ b/configure
@@ -21516,6 +21516,17 @@ _ACEOF
SHMEM_IMPLEMENTATION="src/backend/port/sysv_shmem.c"
+# If not set in template file, set bytes to use libc memset()
+if test x"$MEMSET_LOOP_LIMIT" = x"" ; then
+ MEMSET_LOOP_LIMIT=1024
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define MEMSET_LOOP_LIMIT ${MEMSET_LOOP_LIMIT}
+_ACEOF
+
+
+
if test "$enable_nls" = yes ; then
echo "$as_me:$LINENO: checking for library containing gettext" >&5
diff --git a/configure.in b/configure.in
index c4d712ba20..a2aa4ac817 100644
--- a/configure.in
+++ b/configure.in
@@ -1249,6 +1249,13 @@ AC_DEFINE(USE_SYSV_SHARED_MEMORY, 1, [Define to select SysV-style shared memory.
SHMEM_IMPLEMENTATION="src/backend/port/sysv_shmem.c"
+# If not set in template file, set bytes to use libc memset()
+if test x"$MEMSET_LOOP_LIMIT" = x"" ; then
+ MEMSET_LOOP_LIMIT=1024
+fi
+AC_DEFINE_UNQUOTED(MEMSET_LOOP_LIMIT, ${MEMSET_LOOP_LIMIT}, [Define bytes to use libc memset().])
+
+
if test "$enable_nls" = yes ; then
PGAC_CHECK_GETTEXT
fi
diff --git a/src/include/c.h b/src/include/c.h
index 6e92bc542c..4f91289682 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -614,9 +614,7 @@ typedef NameData *Name;
* overhead. However, we have also found that the loop is faster than
* native libc memset() on some platforms, even those with assembler
* memset() functions. More research needs to be done, perhaps with
- * platform-specific MEMSET_LOOP_LIMIT values or tests in configure.
- *
- * bjm 2002-10-08
+ * MEMSET_LOOP_LIMIT tests in configure.
*/
#define MemSet(start, val, len) \
do \
@@ -629,7 +627,12 @@ typedef NameData *Name;
if ((((long) _vstart) & INT_ALIGN_MASK) == 0 && \
(_len & INT_ALIGN_MASK) == 0 && \
_val == 0 && \
- _len <= MEMSET_LOOP_LIMIT) \
+ _len <= MEMSET_LOOP_LIMIT && \
+ /* \
+ * If MEMSET_LOOP_LIMIT == 0, optimizer should find \
+ * the whole "if" false at compile time. \
+ */ \
+ MEMSET_LOOP_LIMIT != 0) \
{ \
int32 *_start = (int32 *) _vstart; \
int32 *_stop = (int32 *) ((char *) _start + _len); \
@@ -640,8 +643,6 @@ typedef NameData *Name;
memset(_vstart, _val, _len); \
} while (0)
-#define MEMSET_LOOP_LIMIT 1024
-
/*
* MemSetAligned is the same as MemSet except it omits the test to see if
* "start" is word-aligned. This is okay to use if the caller knows a-priori
@@ -657,7 +658,8 @@ typedef NameData *Name;
\
if ((_len & INT_ALIGN_MASK) == 0 && \
_val == 0 && \
- _len <= MEMSET_LOOP_LIMIT) \
+ _len <= MEMSET_LOOP_LIMIT && \
+ MEMSET_LOOP_LIMIT != 0) \
{ \
int32 *_stop = (int32 *) ((char *) _start + _len); \
while (_start < _stop) \
@@ -679,6 +681,7 @@ typedef NameData *Name;
#define MemSetTest(val, len) \
( ((len) & INT_ALIGN_MASK) == 0 && \
(len) <= MEMSET_LOOP_LIMIT && \
+ MEMSET_LOOP_LIMIT != 0 && \
(val) == 0 )
#define MemSetLoop(start, val, len) \
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 2c24ce3d81..8db19b4c48 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -576,6 +576,9 @@
/* Define as the maximum alignment requirement of any C data type. */
#undef MAXIMUM_ALIGNOF
+/* Define bytes to use libc memset(). */
+#undef MEMSET_LOOP_LIMIT
+
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
diff --git a/src/template/aix b/src/template/aix
index 48f1110f3e..d875a08083 100644
--- a/src/template/aix
+++ b/src/template/aix
@@ -8,3 +8,7 @@ if test "$GCC" != yes ; then
;;
esac
fi
+
+# native memset() is faster, 2006-02-03
+# XLC 6.0, (IBM's cc), tested on AIX 5.2 and 5.1
+MEMSET_LOOP_LIMIT=0