@@ -150,44 +150,40 @@ static size_t get_frame_length(struct lwan_request *request, uint16_t header)
150
150
151
151
static void unmask (char * msg , size_t msg_len , char mask [static 4 ])
152
152
{
153
- const uint32_t mask32 = string_as_uint32 (mask );
154
- char * msg_end = msg + msg_len ;
155
-
156
- if (sizeof (void * ) == 8 ) {
157
- const uint64_t mask64 = (uint64_t )mask32 << 32 | mask32 ;
153
+ const int32_t mask32 = (int32_t )string_as_uint32 (mask );
154
+ const char * msg_end = msg + msg_len ;
158
155
159
156
#if defined(__AVX2__ )
160
- const size_t len256 = msg_len / 32 ;
161
- if (len256 ) {
162
- const __m256i mask256 =
163
- _mm256_setr_epi64x ((int64_t )mask64 , (int64_t )mask64 ,
164
- (int64_t )mask64 , (int64_t )mask64 );
165
- for (size_t i = 0 ; i < len256 ; i ++ ) {
166
- __m256i v = _mm256_loadu_si256 ((__m256i * )msg );
167
- _mm256_storeu_si256 ((__m256i * )msg ,
168
- _mm256_xor_si256 (v , mask256 ));
169
- msg += 32 ;
170
- }
171
-
172
- msg_len = (size_t )(msg_end - msg );
157
+ const size_t len256 = msg_len / 32 ;
158
+ if (len256 ) {
159
+ const __m256i mask256 = _mm256_setr_epi32 (
160
+ mask32 , mask32 , mask32 , mask32 , mask32 , mask32 , mask32 , mask32 );
161
+ for (size_t i = 0 ; i < len256 ; i ++ ) {
162
+ __m256i v = _mm256_loadu_si256 ((__m256i * )msg );
163
+ _mm256_storeu_si256 ((__m256i * )msg , _mm256_xor_si256 (v , mask256 ));
164
+ msg += 32 ;
173
165
}
166
+
167
+ msg_len = (size_t )(msg_end - msg );
168
+ }
174
169
#endif
175
170
176
171
#if defined(__SSE2__ )
177
- const size_t len128 = msg_len / 16 ;
178
- if (len128 ) {
179
- const __m128i mask128 =
180
- _mm_setr_epi64 ((__m64 )mask64 , (__m64 )mask64 );
181
- for (size_t i = 0 ; i < len128 ; i ++ ) {
182
- __m128i v = _mm_loadu_si128 ((__m128i * )msg );
183
- _mm_storeu_si128 ((__m128i * )msg , _mm_xor_si128 (v , mask128 ));
184
- msg += 16 ;
185
- }
186
-
187
- msg_len = (size_t )(msg_end - msg );
172
+ const size_t len128 = msg_len / 16 ;
173
+ if (len128 ) {
174
+ const __m128i mask128 = _mm_setr_epi32 (mask32 , mask32 , mask32 , mask32 );
175
+ for (size_t i = 0 ; i < len128 ; i ++ ) {
176
+ __m128i v = _mm_loadu_si128 ((__m128i * )msg );
177
+ _mm_storeu_si128 ((__m128i * )msg , _mm_xor_si128 (v , mask128 ));
178
+ msg += 16 ;
188
179
}
180
+
181
+ msg_len = (size_t )(msg_end - msg );
182
+ }
189
183
#endif
190
184
185
+ if (sizeof (void * ) == 8 ) {
186
+ const uint64_t mask64 = (uint64_t )mask32 << 32 | (uint64_t )mask32 ;
191
187
const size_t len64 = msg_len / 8 ;
192
188
for (size_t i = 0 ; i < len64 ; i ++ ) {
193
189
uint64_t v = string_as_uint64 (msg );
@@ -199,7 +195,7 @@ static void unmask(char *msg, size_t msg_len, char mask[static 4])
199
195
const size_t len32 = (size_t )((msg_end - msg ) / 4 );
200
196
for (size_t i = 0 ; i < len32 ; i ++ ) {
201
197
uint32_t v = string_as_uint32 (msg );
202
- v ^= mask32 ;
198
+ v ^= ( uint32_t ) mask32 ;
203
199
msg = mempcpy (msg , & v , sizeof (v ));
204
200
}
205
201
0 commit comments