|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.