/src/botan/build/include/botan/internal/rotate.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Word Rotation Operations |
3 | | * (C) 1999-2008,2023 Jack Lloyd |
4 | | * |
5 | | * Botan is released under the Simplified BSD License (see license.txt) |
6 | | */ |
7 | | |
8 | | #ifndef BOTAN_WORD_ROTATE_H_ |
9 | | #define BOTAN_WORD_ROTATE_H_ |
10 | | |
11 | | #include <botan/types.h> |
12 | | |
13 | | namespace Botan { |
14 | | |
15 | | /** |
16 | | * Bit rotation left by a compile-time constant amount |
17 | | * @param input the input word |
18 | | * @return input rotated left by ROT bits |
19 | | */ |
20 | | template<size_t ROT, typename T> |
21 | | inline constexpr T rotl(T input) |
22 | | requires (ROT > 0 && ROT < 8*sizeof(T)) |
23 | 38.8M | { |
24 | 38.8M | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); |
25 | 38.8M | } Unexecuted instantiation: unsigned int Botan::rotl<3ul, unsigned int>(unsigned int) unsigned int Botan::rotl<7ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<11ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
Unexecuted instantiation: unsigned int Botan::rotl<19ul, unsigned int>(unsigned int) unsigned int Botan::rotl<5ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 19.3M | { | 24 | 19.3M | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 19.3M | } |
unsigned int Botan::rotl<9ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 15.6k | { | 24 | 15.6k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 15.6k | } |
Unexecuted instantiation: unsigned int Botan::rotl<13ul, unsigned int>(unsigned int) unsigned int Botan::rotl<15ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<12ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<17ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<22ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<14ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<20ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 15.6k | { | 24 | 15.6k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 15.6k | } |
unsigned int Botan::rotl<4ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 15.6k | { | 24 | 15.6k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 15.6k | } |
unsigned int Botan::rotl<16ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<23ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<6ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 15.6k | { | 24 | 15.6k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 15.6k | } |
unsigned int Botan::rotl<10ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
unsigned int Botan::rotl<21ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 11.0k | { | 24 | 11.0k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 11.0k | } |
Unexecuted instantiation: unsigned int Botan::rotl<8ul, unsigned int>(unsigned int) unsigned int Botan::rotl<1ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 21.5k | { | 24 | 21.5k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 21.5k | } |
unsigned int Botan::rotl<30ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 19.2M | { | 24 | 19.2M | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 19.2M | } |
Unexecuted instantiation: unsigned long Botan::rotl<1ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<44ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<43ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<21ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<14ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<28ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<20ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<3ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<45ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<61ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<6ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<25ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<8ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<18ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<27ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<36ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<10ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<15ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<56ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<62ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<55ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<39ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<41ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<2ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<46ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<19ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<37ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<33ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<42ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<17ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<49ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<9ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<54ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<30ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<34ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<24ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<13ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<50ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<29ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<35ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<22ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned int Botan::rotl<27ul, unsigned int>(unsigned int) Unexecuted instantiation: unsigned long Botan::rotl<16ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotl<32ul, unsigned long>(unsigned long) unsigned int Botan::rotl<18ul, unsigned int>(unsigned int) Line | Count | Source | 23 | 4.58k | { | 24 | 4.58k | return static_cast<T>((input << ROT) | (input >> (8*sizeof(T) - ROT))); | 25 | 4.58k | } |
Unexecuted instantiation: unsigned int Botan::rotl<2ul, unsigned int>(unsigned int) Unexecuted instantiation: unsigned int Botan::rotl<24ul, unsigned int>(unsigned int) |
26 | | |
27 | | /** |
28 | | * Bit rotation right by a compile-time constant amount |
29 | | * @param input the input word |
30 | | * @return input rotated right by ROT bits |
31 | | */ |
32 | | template<size_t ROT, typename T> |
33 | | inline constexpr T rotr(T input) |
34 | | requires (ROT > 0 && ROT < 8*sizeof(T)) |
35 | 812M | { |
36 | 812M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); |
37 | 812M | } unsigned int Botan::rotr<2ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<13ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<22ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<6ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<11ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<25ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<17ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<19ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<7ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned int Botan::rotr<18ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 74.3M | { | 36 | 74.3M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 74.3M | } |
unsigned long Botan::rotr<14ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<18ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<41ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<28ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<34ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<39ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<19ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<61ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<1ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
unsigned long Botan::rotr<8ul, unsigned long>(unsigned long) Line | Count | Source | 35 | 6.87M | { | 36 | 6.87M | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 6.87M | } |
Unexecuted instantiation: unsigned long Botan::rotr<16ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<24ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<32ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<40ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<48ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<56ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<35ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<22ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<25ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<29ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<43ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<13ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<50ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<10ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<17ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<30ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<44ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<9ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<54ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<49ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<36ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<33ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<27ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<42ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<46ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<37ul, unsigned long>(unsigned long) Unexecuted instantiation: unsigned long Botan::rotr<63ul, unsigned long>(unsigned long) unsigned int Botan::rotr<20ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 4.58k | { | 36 | 4.58k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 4.58k | } |
unsigned int Botan::rotr<4ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 224k | { | 36 | 224k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 224k | } |
unsigned int Botan::rotr<1ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 4.58k | { | 36 | 4.58k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 4.58k | } |
unsigned int Botan::rotr<9ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 4.58k | { | 36 | 4.58k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 4.58k | } |
unsigned int Botan::rotr<8ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 3.25k | { | 36 | 3.25k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 3.25k | } |
Unexecuted instantiation: unsigned int Botan::rotr<5ul, unsigned int>(unsigned int) Unexecuted instantiation: unsigned int Botan::rotr<3ul, unsigned int>(unsigned int) unsigned int Botan::rotr<16ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 26.4k | { | 36 | 26.4k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 26.4k | } |
unsigned int Botan::rotr<24ul, unsigned int>(unsigned int) Line | Count | Source | 35 | 3.25k | { | 36 | 3.25k | return static_cast<T>((input >> ROT) | (input << (8*sizeof(T) - ROT))); | 37 | 3.25k | } |
|
38 | | |
39 | | /** |
40 | | * SHA-2 Sigma style function |
41 | | */ |
42 | | template<size_t R1, size_t R2, size_t S, typename T> |
43 | | inline constexpr T sigma(T x) |
44 | 162M | { |
45 | 162M | return rotr<R1>(x) ^ rotr<R2>(x) ^ (x >> S); |
46 | 162M | } unsigned int Botan::sigma<17ul, 19ul, 10ul, unsigned int>(unsigned int) Line | Count | Source | 44 | 74.3M | { | 45 | 74.3M | return rotr<R1>(x) ^ rotr<R2>(x) ^ (x >> S); | 46 | 74.3M | } |
unsigned int Botan::sigma<7ul, 18ul, 3ul, unsigned int>(unsigned int) Line | Count | Source | 44 | 74.3M | { | 45 | 74.3M | return rotr<R1>(x) ^ rotr<R2>(x) ^ (x >> S); | 46 | 74.3M | } |
unsigned long Botan::sigma<19ul, 61ul, 6ul, unsigned long>(unsigned long) Line | Count | Source | 44 | 6.87M | { | 45 | 6.87M | return rotr<R1>(x) ^ rotr<R2>(x) ^ (x >> S); | 46 | 6.87M | } |
unsigned long Botan::sigma<1ul, 8ul, 7ul, unsigned long>(unsigned long) Line | Count | Source | 44 | 6.87M | { | 45 | 6.87M | return rotr<R1>(x) ^ rotr<R2>(x) ^ (x >> S); | 46 | 6.87M | } |
|
47 | | |
48 | | /** |
49 | | * SHA-2 Sigma style function |
50 | | */ |
51 | | template<size_t R1, size_t R2, size_t R3, typename T> |
52 | | inline constexpr T rho(T x) |
53 | 162M | { |
54 | 162M | return rotr<R1>(x) ^ rotr<R2>(x) ^ rotr<R3>(x); |
55 | 162M | } unsigned int Botan::rho<2ul, 13ul, 22ul, unsigned int>(unsigned int) Line | Count | Source | 53 | 74.3M | { | 54 | 74.3M | return rotr<R1>(x) ^ rotr<R2>(x) ^ rotr<R3>(x); | 55 | 74.3M | } |
unsigned int Botan::rho<6ul, 11ul, 25ul, unsigned int>(unsigned int) Line | Count | Source | 53 | 74.3M | { | 54 | 74.3M | return rotr<R1>(x) ^ rotr<R2>(x) ^ rotr<R3>(x); | 55 | 74.3M | } |
unsigned long Botan::rho<14ul, 18ul, 41ul, unsigned long>(unsigned long) Line | Count | Source | 53 | 6.87M | { | 54 | 6.87M | return rotr<R1>(x) ^ rotr<R2>(x) ^ rotr<R3>(x); | 55 | 6.87M | } |
unsigned long Botan::rho<28ul, 34ul, 39ul, unsigned long>(unsigned long) Line | Count | Source | 53 | 6.87M | { | 54 | 6.87M | return rotr<R1>(x) ^ rotr<R2>(x) ^ rotr<R3>(x); | 55 | 6.87M | } |
|
56 | | |
57 | | /** |
58 | | * Bit rotation left, variable rotation amount |
59 | | * @param input the input word |
60 | | * @param rot the number of bits to rotate, must be between 0 and sizeof(T)*8-1 |
61 | | * @return input rotated left by rot bits |
62 | | */ |
63 | | template<typename T> |
64 | | inline constexpr T rotl_var(T input, size_t rot) |
65 | | { |
66 | | return rot ? static_cast<T>((input << rot) | (input >> (sizeof(T)*8 - rot))) : input; |
67 | | } |
68 | | |
69 | | /** |
70 | | * Bit rotation right, variable rotation amount |
71 | | * @param input the input word |
72 | | * @param rot the number of bits to rotate, must be between 0 and sizeof(T)*8-1 |
73 | | * @return input rotated right by rot bits |
74 | | */ |
75 | | template<typename T> |
76 | | inline constexpr T rotr_var(T input, size_t rot) |
77 | | { |
78 | | return rot ? static_cast<T>((input >> rot) | (input << (sizeof(T)*8 - rot))) : input; |
79 | | } |
80 | | |
81 | | #if defined(BOTAN_USE_GCC_INLINE_ASM) |
82 | | |
83 | | #if defined(BOTAN_TARGET_ARCH_IS_X86_64) || defined(BOTAN_TARGET_ARCH_IS_X86_32) |
84 | | |
85 | | template<> |
86 | | inline uint32_t rotl_var(uint32_t input, size_t rot) |
87 | 0 | { |
88 | 0 | asm("roll %1,%0" |
89 | 0 | : "+r" (input) |
90 | 0 | : "c" (static_cast<uint8_t>(rot)) |
91 | 0 | : "cc"); |
92 | 0 | return input; |
93 | 0 | } |
94 | | |
95 | | template<> |
96 | | inline uint32_t rotr_var(uint32_t input, size_t rot) |
97 | 0 | { |
98 | 0 | asm("rorl %1,%0" |
99 | 0 | : "+r" (input) |
100 | 0 | : "c" (static_cast<uint8_t>(rot)) |
101 | 0 | : "cc"); |
102 | 0 | return input; |
103 | 0 | } |
104 | | |
105 | | #endif |
106 | | |
107 | | #endif |
108 | | |
109 | | } |
110 | | |
111 | | #endif |