提交 ebd38e3c 编写于 作者: B Bruce Momjian

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.
上级 59bb1473
...@@ -21516,6 +21516,17 @@ _ACEOF ...@@ -21516,6 +21516,17 @@ _ACEOF
SHMEM_IMPLEMENTATION="src/backend/port/sysv_shmem.c" 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 if test "$enable_nls" = yes ; then
echo "$as_me:$LINENO: checking for library containing gettext" >&5 echo "$as_me:$LINENO: checking for library containing gettext" >&5
......
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
dnl $PostgreSQL: pgsql/configure.in,v 1.443 2006/01/17 23:52:30 tgl Exp $ dnl $PostgreSQL: pgsql/configure.in,v 1.444 2006/02/03 13:53:15 momjian Exp $
dnl dnl
dnl Developers, please strive to achieve this order: dnl Developers, please strive to achieve this order:
dnl dnl
...@@ -1249,6 +1249,13 @@ AC_DEFINE(USE_SYSV_SHARED_MEMORY, 1, [Define to select SysV-style shared memory. ...@@ -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" 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 if test "$enable_nls" = yes ; then
PGAC_CHECK_GETTEXT PGAC_CHECK_GETTEXT
fi fi
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/c.h,v 1.194 2006/01/05 03:01:37 momjian Exp $ * $PostgreSQL: pgsql/src/include/c.h,v 1.195 2006/02/03 13:53:15 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -614,9 +614,7 @@ typedef NameData *Name; ...@@ -614,9 +614,7 @@ typedef NameData *Name;
* overhead. However, we have also found that the loop is faster than * overhead. However, we have also found that the loop is faster than
* native libc memset() on some platforms, even those with assembler * native libc memset() on some platforms, even those with assembler
* memset() functions. More research needs to be done, perhaps with * memset() functions. More research needs to be done, perhaps with
* platform-specific MEMSET_LOOP_LIMIT values or tests in configure. * MEMSET_LOOP_LIMIT tests in configure.
*
* bjm 2002-10-08
*/ */
#define MemSet(start, val, len) \ #define MemSet(start, val, len) \
do \ do \
...@@ -629,7 +627,12 @@ typedef NameData *Name; ...@@ -629,7 +627,12 @@ typedef NameData *Name;
if ((((long) _vstart) & INT_ALIGN_MASK) == 0 && \ if ((((long) _vstart) & INT_ALIGN_MASK) == 0 && \
(_len & INT_ALIGN_MASK) == 0 && \ (_len & INT_ALIGN_MASK) == 0 && \
_val == 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 *_start = (int32 *) _vstart; \
int32 *_stop = (int32 *) ((char *) _start + _len); \ int32 *_stop = (int32 *) ((char *) _start + _len); \
...@@ -640,8 +643,6 @@ typedef NameData *Name; ...@@ -640,8 +643,6 @@ typedef NameData *Name;
memset(_vstart, _val, _len); \ memset(_vstart, _val, _len); \
} while (0) } while (0)
#define MEMSET_LOOP_LIMIT 1024
/* /*
* MemSetAligned is the same as MemSet except it omits the test to see if * 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 * "start" is word-aligned. This is okay to use if the caller knows a-priori
...@@ -657,7 +658,8 @@ typedef NameData *Name; ...@@ -657,7 +658,8 @@ typedef NameData *Name;
\ \
if ((_len & INT_ALIGN_MASK) == 0 && \ if ((_len & INT_ALIGN_MASK) == 0 && \
_val == 0 && \ _val == 0 && \
_len <= MEMSET_LOOP_LIMIT) \ _len <= MEMSET_LOOP_LIMIT && \
MEMSET_LOOP_LIMIT != 0) \
{ \ { \
int32 *_stop = (int32 *) ((char *) _start + _len); \ int32 *_stop = (int32 *) ((char *) _start + _len); \
while (_start < _stop) \ while (_start < _stop) \
...@@ -679,6 +681,7 @@ typedef NameData *Name; ...@@ -679,6 +681,7 @@ typedef NameData *Name;
#define MemSetTest(val, len) \ #define MemSetTest(val, len) \
( ((len) & INT_ALIGN_MASK) == 0 && \ ( ((len) & INT_ALIGN_MASK) == 0 && \
(len) <= MEMSET_LOOP_LIMIT && \ (len) <= MEMSET_LOOP_LIMIT && \
MEMSET_LOOP_LIMIT != 0 && \
(val) == 0 ) (val) == 0 )
#define MemSetLoop(start, val, len) \ #define MemSetLoop(start, val, len) \
......
...@@ -576,6 +576,9 @@ ...@@ -576,6 +576,9 @@
/* Define as the maximum alignment requirement of any C data type. */ /* Define as the maximum alignment requirement of any C data type. */
#undef MAXIMUM_ALIGNOF #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. */ /* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT #undef PACKAGE_BUGREPORT
......
...@@ -8,3 +8,7 @@ if test "$GCC" != yes ; then ...@@ -8,3 +8,7 @@ if test "$GCC" != yes ; then
;; ;;
esac esac
fi 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册