|
12 | 12 | * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
13 | 13 | * Portions Copyright (c) 1994, Regents of the University of California
|
14 | 14 | *
|
15 |
| - * $Id: c.h,v 1.131 2002/11/11 03:02:19 momjian Exp $ |
| 15 | + * $Id: c.h,v 1.132 2002/11/13 00:37:06 momjian Exp $ |
16 | 16 | *
|
17 | 17 | *-------------------------------------------------------------------------
|
18 | 18 | */
|
@@ -577,26 +577,36 @@ typedef NameData *Name;
|
577 | 577 | * memset() functions. More research needs to be done, perhaps with
|
578 | 578 | * platform-specific MEMSET_LOOP_LIMIT values or tests in configure.
|
579 | 579 | *
|
| 580 | + * MemSet has been split into two parts so MemSetTest can be optimized |
| 581 | + * away for constant 'val' and 'len'. This is used by palloc0(). |
| 582 | + * |
| 583 | + * Note, arguments are evaluated more than once. |
| 584 | + * |
580 | 585 | * bjm 2002-10-08
|
581 | 586 | */
|
582 |
| -#define MemSet(start, val, len) \ |
583 |
| - do \ |
584 |
| - { \ |
585 |
| - int32 * _start = (int32 *) (start); \ |
586 |
| - int _val = (val); \ |
587 |
| - Size _len = (len); \ |
| 587 | +#define MemSetTest(val, len) \ |
| 588 | + ( ((len) & INT_ALIGN_MASK) == 0 && \ |
| 589 | + (len) <= MEMSET_LOOP_LIMIT && \ |
| 590 | + (val) == 0 ) |
| 591 | + |
| 592 | +#define MemSetLoop(start, val, len) \ |
| 593 | +do \ |
| 594 | +{ \ |
| 595 | + int32 * _start = (int32 *) (start); \ |
| 596 | + int32 * _stop = (int32 *) ((char *) _start + (len)); \ |
588 | 597 | \
|
589 |
| - if ((( ((long) _start) | _len) & INT_ALIGN_MASK) == 0 && \ |
590 |
| - _val == 0 && \ |
591 |
| - _len <= MEMSET_LOOP_LIMIT) \ |
592 |
| - { \ |
593 |
| - int32 * _stop = (int32 *) ((char *) _start + _len); \ |
594 |
| - while (_start < _stop) \ |
595 |
| - *_start++ = 0; \ |
596 |
| - } \ |
597 |
| - else \ |
598 |
| - memset((char *) _start, _val, _len); \ |
599 |
| - } while (0) |
| 598 | + while (_start < _stop) \ |
| 599 | + *_start++ = 0; \ |
| 600 | +} while (0) |
| 601 | + |
| 602 | +#define MemSet(start, val, len) \ |
| 603 | +do \ |
| 604 | +{ \ |
| 605 | + if (MemSetTest(val, len) && ((long)(start) & INT_ALIGN_MASK) == 0 ) \ |
| 606 | + MemSetLoop(start, val, len); \ |
| 607 | + else \ |
| 608 | + memset((char *)(start), (val), (len)); \ |
| 609 | +} while (0) |
600 | 610 |
|
601 | 611 | #define MEMSET_LOOP_LIMIT 1024
|
602 | 612 |
|
|
0 commit comments