• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 11844561993

14 Nov 2024 07:58PM UTC coverage: 91.178% (+0.1%) from 91.072%
11844561993

Pull #4435

github

web-flow
Merge 81dcb29da into e430f157a
Pull Request #4435: Test duration values ​​are now presented in seconds with six digits of precision. Tests without time measurements have been edited.

91856 of 100744 relevant lines covered (91.18%)

9311006.71 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.67
/src/tests/test_simd.cpp
1
/*
2
* (C) 2017 Jack Lloyd
3
*
4
* Botan is released under the Simplified BSD License (see license.txt)
5
*/
6

7
#include "tests.h"
8

9
#if defined(BOTAN_HAS_SIMD_32)
10
   #include <botan/internal/bswap.h>
11
   #include <botan/internal/cpuid.h>
12
   #include <botan/internal/loadstor.h>
13
   #include <botan/internal/rotate.h>
14
   #include <botan/internal/simd_32.h>
15
   #include <botan/internal/stl_util.h>
16
#endif
17

18
namespace Botan_Tests {
19

20
#if defined(BOTAN_HAS_SIMD_32)
21

22
class SIMD_32_Tests final : public Test {
×
23
   public:
24
      std::vector<Test::Result> run() override {
1✔
25
         Test::Result result("SIMD_4x32");
1✔
26
         result.start_timer();
1✔
27

28
         if(Botan::CPUID::has_simd_32() == false) {
1✔
29
            result.test_note("Skipping SIMD_4x32 tests due to missing CPU support at runtime");
×
30
            return {result};
×
31
         }
32

33
         const uint32_t pat1 = 0xAABBCCDD;
1✔
34
         const uint32_t pat2 = 0x87654321;
1✔
35
         const uint32_t pat3 = 0x01234567;
1✔
36
         const uint32_t pat4 = 0xC0D0E0F0;
1✔
37

38
         // pat1 + pat{1,2,3,4}
39
         // precomputed to avoid integer overflow warnings
40
         const uint32_t pat1_1 = 0x557799BA;
1✔
41
         const uint32_t pat1_2 = 0x32210FFE;
1✔
42
         const uint32_t pat1_3 = 0xABDF1244;
1✔
43
         const uint32_t pat1_4 = 0x6B8CADCD;
1✔
44

45
         test_eq(result, "default init", Botan::SIMD_4x32(), 0, 0, 0, 0);
1✔
46
         test_eq(result, "SIMD scalar constructor", Botan::SIMD_4x32(1, 2, 3, 4), 1, 2, 3, 4);
1✔
47

48
         const Botan::SIMD_4x32 splat = Botan::SIMD_4x32::splat(pat1);
1✔
49

50
         test_eq(result, "splat", splat, pat1, pat1, pat1, pat1);
1✔
51

52
         const Botan::SIMD_4x32 input(pat1, pat2, pat3, pat4);
1✔
53

54
         Botan::SIMD_4x32 rol = input.rotl<3>();
1✔
55

56
         test_eq(result,
1✔
57
                 "rotl",
58
                 rol,
59
                 Botan::rotl<3>(pat1),
60
                 Botan::rotl<3>(pat2),
61
                 Botan::rotl<3>(pat3),
62
                 Botan::rotl<3>(pat4));
63

64
         Botan::SIMD_4x32 ror = input.rotr<9>();
1✔
65

66
         test_eq(result,
1✔
67
                 "rotr",
68
                 ror,
69
                 Botan::rotr<9>(pat1),
70
                 Botan::rotr<9>(pat2),
71
                 Botan::rotr<9>(pat3),
72
                 Botan::rotr<9>(pat4));
73

74
         Botan::SIMD_4x32 add = input + splat;
1✔
75
         test_eq(result, "add +", add, pat1_1, pat1_2, pat1_3, pat1_4);
1✔
76

77
         add -= splat;
1✔
78
         test_eq(result, "sub -=", add, pat1, pat2, pat3, pat4);
1✔
79

80
         add += splat;
1✔
81
         test_eq(result, "add +=", add, pat1_1, pat1_2, pat1_3, pat1_4);
1✔
82

83
         test_eq(result, "xor", input ^ splat, 0, pat2 ^ pat1, pat3 ^ pat1, pat4 ^ pat1);
1✔
84
         test_eq(result, "or", input | splat, pat1, pat2 | pat1, pat3 | pat1, pat4 | pat1);
1✔
85
         test_eq(result, "and", input & splat, pat1, pat2 & pat1, pat3 & pat1, pat4 & pat1);
1✔
86

87
         Botan::SIMD_4x32 blender = input;
1✔
88
         blender |= splat;
1✔
89
         test_eq(result, "|=", blender, pat1, pat2 | pat1, pat3 | pat1, pat4 | pat1);
1✔
90
         blender &= splat;
1✔
91
         test_eq(result, "&=", blender, pat1, pat1, pat1, pat1);
1✔
92
         blender ^= splat;
1✔
93
         test_eq(result, "^=", blender, 0, 0, 0, 0);
1✔
94

95
         blender = ~blender;
1✔
96
         test_eq(result, "~", blender, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
1✔
97

98
         blender = blender.shr<23>();
1✔
99
         test_eq(result, ">>", blender, 0x1FF, 0x1FF, 0x1FF, 0x1FF);
1✔
100

101
         blender = blender.shl<27>();
1✔
102
         test_eq(result, "<<", blender, 0xF8000000, 0xF8000000, 0xF8000000, 0xF8000000);
1✔
103

104
         blender = ~blender;
1✔
105
         test_eq(result, "~", blender, 0x7FFFFFF, 0x7FFFFFF, 0x7FFFFFF, 0x7FFFFFF);
1✔
106

107
         blender = input.andc(~blender);
1✔
108
         test_eq(
1✔
109
            result, "andc", blender, ~pat1 & 0xF8000000, ~pat2 & 0xF8000000, ~pat3 & 0xF8000000, ~pat4 & 0xF8000000);
110

111
         test_eq(result,
1✔
112
                 "bswap",
113
                 input.bswap(),
1✔
114
                 Botan::reverse_bytes(pat1),
115
                 Botan::reverse_bytes(pat2),
116
                 Botan::reverse_bytes(pat3),
117
                 Botan::reverse_bytes(pat4));
118

119
         Botan::SIMD_4x32 t1(pat1, pat2, pat3, pat4);
1✔
120
         Botan::SIMD_4x32 t2(pat1 + 1, pat2 + 1, pat3 + 1, pat4 + 1);
1✔
121
         Botan::SIMD_4x32 t3(pat1 + 2, pat2 + 2, pat3 + 2, pat4 + 2);
1✔
122
         Botan::SIMD_4x32 t4(pat1 + 3, pat2 + 3, pat3 + 3, pat4 + 3);
1✔
123

124
         Botan::SIMD_4x32::transpose(t1, t2, t3, t4);
1✔
125

126
         test_eq(result, "transpose t1", t1, pat1, pat1 + 1, pat1 + 2, pat1 + 3);
1✔
127
         test_eq(result, "transpose t2", t2, pat2, pat2 + 1, pat2 + 2, pat2 + 3);
1✔
128
         test_eq(result, "transpose t3", t3, pat3, pat3 + 1, pat3 + 2, pat3 + 3);
1✔
129
         test_eq(result, "transpose t4", t4, pat4, pat4 + 1, pat4 + 2, pat4 + 3);
1✔
130

131
         test_eq(result, "shift left 1", input.shift_elems_left<1>(), 0, pat1, pat2, pat3);
1✔
132
         test_eq(result, "shift left 2", input.shift_elems_left<2>(), 0, 0, pat1, pat2);
1✔
133
         test_eq(result, "shift left 3", input.shift_elems_left<3>(), 0, 0, 0, pat1);
1✔
134

135
         test_eq(result, "shift right 1", input.shift_elems_right<1>(), pat2, pat3, pat4, 0);
1✔
136
         test_eq(result, "shift right 2", input.shift_elems_right<2>(), pat3, pat4, 0, 0);
1✔
137
         test_eq(result, "shift right 3", input.shift_elems_right<3>(), pat4, 0, 0, 0);
1✔
138

139
         // Test load/stores SIMD wrapper types
140
         const auto simd_le_in = Botan::hex_decode("ABCDEF01234567890123456789ABCDEF");
2✔
141
         const auto simd_be_in = Botan::hex_decode("0123456789ABCDEFABCDEF0123456789");
1✔
142
         const auto simd_le_array_in = Botan::concat(simd_le_in, simd_be_in);
1✔
143
         const auto simd_be_array_in = Botan::concat(simd_be_in, simd_le_in);
1✔
144

145
         auto simd_le = Botan::load_le<Botan::SIMD_4x32>(simd_le_in);
1✔
146
         auto simd_be = Botan::load_be<Botan::SIMD_4x32>(simd_be_in);
1✔
147
         auto simd_le_array = Botan::load_le<std::array<Botan::SIMD_4x32, 2>>(simd_le_array_in);
3✔
148
         auto simd_be_array = Botan::load_be<std::array<Botan::SIMD_4x32, 2>>(simd_be_array_in);
149

150
         auto simd_le_vec = Botan::store_le<std::vector<uint8_t>>(simd_le);
1✔
151
         auto simd_be_vec = Botan::store_be(simd_be);
1✔
152
         auto simd_le_array_vec = Botan::store_le<std::vector<uint8_t>>(simd_le_array);
1✔
153
         auto simd_be_array_vec = Botan::store_be(simd_be_array);
1✔
154

155
         result.test_is_eq("roundtrip SIMD little-endian", simd_le_vec, simd_le_in);
1✔
156
         result.test_is_eq(
2✔
157
            "roundtrip SIMD big-endian", std::vector(simd_be_vec.begin(), simd_be_vec.end()), simd_be_in);
1✔
158
         result.test_is_eq("roundtrip SIMD array little-endian", simd_le_array_vec, simd_le_array_in);
1✔
159
         result.test_is_eq("roundtrip SIMD array big-endian",
2✔
160
                           std::vector(simd_be_array_vec.begin(), simd_be_array_vec.end()),
1✔
161
                           simd_be_array_in);
162

163
         using StrongSIMD = Botan::Strong<Botan::SIMD_4x32, struct StrongSIMD_>;
1✔
164
         const auto simd_le_strong = Botan::load_le<StrongSIMD>(simd_le_in);
1✔
165
         const auto simd_be_strong = Botan::load_be<StrongSIMD>(simd_be_in);
1✔
166

167
         result.test_is_eq(
2✔
168
            "roundtrip SIMD strong little-endian", Botan::store_le<std::vector<uint8_t>>(simd_le_strong), simd_le_in);
1✔
169
         result.test_is_eq(
2✔
170
            "roundtrip SIMD strong big-endian", Botan::store_be<std::vector<uint8_t>>(simd_be_strong), simd_be_in);
1✔
171

172
         result.end_timer();
1✔
173
         return {result};
2✔
174
      }
7✔
175

176
   private:
177
      static void test_eq(Test::Result& result,
30✔
178
                          const std::string& op,
179
                          const Botan::SIMD_4x32& simd,
180
                          uint32_t exp0,
181
                          uint32_t exp1,
182
                          uint32_t exp2,
183
                          uint32_t exp3) {
184
         uint8_t arr_be[16 + 15];
30✔
185
         uint8_t arr_be2[16 + 15];
30✔
186
         uint8_t arr_le[16 + 15];
30✔
187
         uint8_t arr_le2[16 + 15];
30✔
188

189
         for(size_t misalignment = 0; misalignment != 16; ++misalignment) {
510✔
190
            uint8_t* mem_be = arr_be + misalignment;
480✔
191
            uint8_t* mem_be2 = arr_be2 + misalignment;
480✔
192
            uint8_t* mem_le = arr_le + misalignment;
480✔
193
            uint8_t* mem_le2 = arr_le2 + misalignment;
480✔
194

195
            simd.store_be(mem_be);
480✔
196

197
            result.test_int_eq(
960✔
198
               "SIMD_4x32 " + op + " elem0 BE", Botan::make_uint32(mem_be[0], mem_be[1], mem_be[2], mem_be[3]), exp0);
1,440✔
199
            result.test_int_eq(
480✔
200
               "SIMD_4x32 " + op + " elem1 BE", Botan::make_uint32(mem_be[4], mem_be[5], mem_be[6], mem_be[7]), exp1);
1,440✔
201
            result.test_int_eq(
480✔
202
               "SIMD_4x32 " + op + " elem2 BE", Botan::make_uint32(mem_be[8], mem_be[9], mem_be[10], mem_be[11]), exp2);
1,440✔
203
            result.test_int_eq("SIMD_4x32 " + op + " elem3 BE",
480✔
204
                               Botan::make_uint32(mem_be[12], mem_be[13], mem_be[14], mem_be[15]),
480✔
205
                               exp3);
206

207
            // Check load_be+store_be results in same value
208
            const Botan::SIMD_4x32 reloaded_be = Botan::SIMD_4x32::load_be(mem_be);
480✔
209
            reloaded_be.store_be(mem_be2);
480✔
210
            result.test_eq(nullptr, "SIMD_4x32 load_be", mem_be, 16, mem_be2, 16);
480✔
211

212
            simd.store_le(mem_le);
480✔
213

214
            result.test_int_eq(
960✔
215
               "SIMD_4x32 " + op + " elem0 LE", Botan::make_uint32(mem_le[3], mem_le[2], mem_le[1], mem_le[0]), exp0);
1,440✔
216
            result.test_int_eq(
480✔
217
               "SIMD_4x32 " + op + " elem1 LE", Botan::make_uint32(mem_le[7], mem_le[6], mem_le[5], mem_le[4]), exp1);
1,440✔
218
            result.test_int_eq(
480✔
219
               "SIMD_4x32 " + op + " elem2 LE", Botan::make_uint32(mem_le[11], mem_le[10], mem_le[9], mem_le[8]), exp2);
1,440✔
220
            result.test_int_eq("SIMD_4x32 " + op + " elem3 LE",
480✔
221
                               Botan::make_uint32(mem_le[15], mem_le[14], mem_le[13], mem_le[12]),
480✔
222
                               exp3);
223

224
            // Check load_le+store_le results in same value
225
            const Botan::SIMD_4x32 reloaded_le = Botan::SIMD_4x32::load_le(mem_le);
480✔
226
            reloaded_le.store_le(mem_le2);
480✔
227
            result.test_eq(nullptr, "SIMD_4x32 load_le", mem_le, 16, mem_le2, 16);
960✔
228
         }
229
      }
30✔
230
};
231

232
BOTAN_REGISTER_TEST("utils", "simd_32", SIMD_32_Tests);
233
#endif
234

235
}  // namespace Botan_Tests
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc