From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sa.int.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,DNS_FROM_OPENWHOIS autolearn=no version=3.2.5 From: "Kirill A. Shutsemov" To: "Dmitry V. Levin" , Alexey Tourbin Date: Fri, 26 Nov 2010 00:04:25 +0200 Message-Id: <1290722666-24606-3-git-send-email-kirill@shutemov.name> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1290722666-24606-1-git-send-email-kirill@shutemov.name> References: <1290722666-24606-1-git-send-email-kirill@shutemov.name> Cc: "Alexey I. Froloff" , devel@lists.altlinux.org, Alexey Gladkov , "Kirill A. Shutemov" Subject: [devel] [PATCH 2/3] set.c: optimize putbits() X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Nov 2010 22:04:37 -0000 Archived-At: List-Archive: List-Post: From: Kirill A. Shutemov Use bit operations instead of cycles. Signed-off-by: Kirill A. Shutemov --- lib/set.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/set.c b/lib/set.c index 4b91dab..02a6c31 100644 --- a/lib/set.c +++ b/lib/set.c @@ -21,6 +21,7 @@ #define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE) #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_LONG) #define BIT(nr) (1UL << (nr)) +#define MASK(nbits) (BIT(nbits) - 1) static inline int get_bit(const unsigned long *bitmap, int offset) @@ -157,13 +158,22 @@ int char_to_num(int c) } static inline -void putbits(unsigned long *bitmap, int *offset, int c, int nbits) +void putbits(unsigned long *bitmap, int *offset, unsigned long c, int nbits) { - int i; + int quot, rem; + + assert(!(c & ~MASK(nbits))); + + quot = *offset / BITS_PER_LONG; + rem = *offset % BITS_PER_LONG; + + bitmap[quot] |= c << rem; + c >>= BITS_PER_LONG - rem; + + if (nbits + rem > (int) BITS_PER_LONG) + bitmap[quot + 1] = c; - for (i = 0; i < nbits; i++, (*offset)++) - if (c & BIT(i)) - set_bit(bitmap, *offset); + *offset += nbits; } /* Main base62 decoding routine: unpack base62 string into bitmap. */ @@ -208,7 +218,7 @@ int decode_base62(unsigned long *bitmap, const char *base62) break; } - putbits(bitmap, &offset, num6b, 4); + putbits(bitmap, &offset, num6b & MASK(4), 4); } return offset; -- 1.7.3.2