Annotation of nono/lib/bitops.h, revision 1.1.1.6

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
1.1.1.2   root        7: //
                      8: // 各種ビット操作
                      9: //
                     10: 
1.1       root       11: #pragma once
                     12: 
                     13: #include "header.h"
                     14: 
1.1.1.5   root       15: #if defined(HAVE___BUILTIN_BITREVERSE8) && \
                     16:     defined(HAVE___BUILTIN_BITREVERSE16) && \
                     17:     defined(HAVE___BUILTIN_BITREVERSE32)
                     18: #define HAVE___BUILTIN_BITREVERSE
                     19: #endif
                     20: 
                     21: #if defined(HAVE___BUILTIN_BITREVERSE)
                     22: #define bitrev8(x)     __builtin_bitreverse8(x)
                     23: #define bitrev16(x)    __builtin_bitreverse16(x)
                     24: #define bitrev32(x)    __builtin_bitreverse32(x)
1.1.1.4   root       25: #else
1.1       root       26: extern const uint8 bitrev_table[256];
                     27: 
1.1.1.4   root       28: // 8ビットを左右反転する
1.1.1.6 ! root       29: inline uint8
1.1.1.5   root       30: bitrev8(uint8 x)
1.1       root       31: {
                     32:        return bitrev_table[x];
                     33: }
1.1.1.5   root       34: 
                     35: // 16ビットを左右反転する
1.1.1.6 ! root       36: inline uint16
1.1.1.5   root       37: bitrev16(uint16 x)
                     38: {
                     39:        return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
                     40: }
                     41: 
                     42: // 32ビットを左右反転する
1.1.1.6 ! root       43: inline uint32
1.1.1.5   root       44: bitrev32(uint32 x)
                     45: {
                     46:        return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16);
                     47: }
1.1.1.4   root       48: #endif
                     49: 
                     50: // 左ローテート
                     51: #if defined(HAVE___BUILTIN_ROTATELEFT32)
                     52: #define ROL32(a, n)    __builtin_rotateleft32(a, n)
                     53: #else
1.1.1.6 ! root       54: inline uint32
1.1.1.4   root       55: ROL32(uint32 a, int n)
                     56: {
                     57:        n &= 31;
                     58:        if (__predict_false(n == 0)) {
                     59:                return a;
                     60:        } else {
                     61:                return (a << n) | (a >> (32 - n));
                     62:        }
                     63: }
                     64: #endif
1.1       root       65: 
1.1.1.2   root       66: // 右ローテート
1.1.1.4   root       67: #if defined(HAVE___BUILTIN_ROTATERIGHT32)
                     68: #define ROR32(a, n)    __builtin_rotateright32(a, n)
                     69: #else
1.1.1.6 ! root       70: inline uint32
1.1.1.2   root       71: ROR32(uint32 a, int n)
                     72: {
                     73:        n &= 31;
1.1.1.4   root       74:        if (__predict_false(n == 0)) {
1.1.1.2   root       75:                return a;
                     76:        } else {
                     77:                return (a >> n) | (a << (32 - n));
                     78:        }
                     79: }
1.1.1.4   root       80: #endif
1.1.1.2   root       81: 
1.1       root       82: // mask で指定したいずれかのビットが 0 -> 1 に変化したら true
1.1.1.6 ! root       83: constexpr bool
1.1       root       84: bit_rising(uint before, uint after, uint mask)
                     85: {
1.1.1.3   root       86:        // before が 0 で mask が 1 のビットだけを立てる。
                     87:        // それが 1 で after が 1 なら立ち上がり。
1.1       root       88:        return (~before & mask) & after;
                     89: }
                     90: 
                     91: // mask で指定したいずれかのビットが 1 -> 0 に変化したら true
1.1.1.6 ! root       92: constexpr bool
1.1       root       93: bit_falling(uint before, uint after, uint mask)
                     94: {
1.1.1.3   root       95:        // before が 1 で mask が 1 のビットだけを立てる。
                     96:        // それが 1 で after が 0 なら立ち下がり。
1.1       root       97:        return (before & mask) & ~after;
                     98: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.