1 while (bytes >= 64) { 2 __m128i diag0 = _mm_loadu_si128((__m128i *) (x + 0)); 3 __m128i diag1 = _mm_loadu_si128((__m128i *) (x + 4)); 4 __m128i diag2 = _mm_loadu_si128((__m128i *) (x + 8)); 5 __m128i diag3 = _mm_loadu_si128((__m128i *) (x + 12)); 6 __m128i a0, a1, a2, a3, a4, a5, a6, a7; 7 __m128i b0, b1, b2, b3, b4, b5, b6, b7; 8 9 uint32_t in8; 10 uint32_t in9; 11 int i; 12 13 a0 = diag1; 14 for (i = 0; i < ROUNDS; i += 4) { 15 a0 = _mm_add_epi32(a0, diag0); 16 a1 = diag0; 17 b0 = a0; 18 a0 = _mm_slli_epi32(a0, 7); 19 b0 = _mm_srli_epi32(b0, 25); 20 diag3 = _mm_xor_si128(diag3, a0); 21 22 diag3 = _mm_xor_si128(diag3, b0); 23 24 a1 = _mm_add_epi32(a1, diag3); 25 a2 = diag3; 26 b1 = a1; 27 a1 = _mm_slli_epi32(a1, 9); 28 b1 = _mm_srli_epi32(b1, 23); 29 diag2 = _mm_xor_si128(diag2, a1); 30 diag3 = _mm_shuffle_epi32(diag3, 0x93); 31 diag2 = _mm_xor_si128(diag2, b1); 32 33 a2 = _mm_add_epi32(a2, diag2); 34 a3 = diag2; 35 b2 = a2; 36 a2 = _mm_slli_epi32(a2, 13); 37 b2 = _mm_srli_epi32(b2, 19); 38 diag1 = _mm_xor_si128(diag1, a2); 39 diag2 = _mm_shuffle_epi32(diag2, 0x4e); 40 diag1 = _mm_xor_si128(diag1, b2); 41 42 a3 = _mm_add_epi32(a3, diag1); 43 a4 = diag3; 44 b3 = a3; 45 a3 = _mm_slli_epi32(a3, 18); 46 b3 = _mm_srli_epi32(b3, 14); 47 diag0 = _mm_xor_si128(diag0, a3); 48 diag1 = _mm_shuffle_epi32(diag1, 0x39); 49 diag0 = _mm_xor_si128(diag0, b3); 50 51 a4 = _mm_add_epi32(a4, diag0); 52 a5 = diag0; 53 b4 = a4; 54 a4 = _mm_slli_epi32(a4, 7); 55 b4 = _mm_srli_epi32(b4, 25); 56 diag1 = _mm_xor_si128(diag1, a4); 57 58 diag1 = _mm_xor_si128(diag1, b4); 59 60 a5 = _mm_add_epi32(a5, diag1); 61 a6 = diag1; 62 b5 = a5; 63 a5 = _mm_slli_epi32(a5, 9); 64 b5 = _mm_srli_epi32(b5, 23); 65 diag2 = _mm_xor_si128(diag2, a5); 66 diag1 = _mm_shuffle_epi32(diag1, 0x93); 67 diag2 = _mm_xor_si128(diag2, b5); 68 69 a6 = _mm_add_epi32(a6, diag2); 70 a7 = diag2; 71 b6 = a6; 72 a6 = _mm_slli_epi32(a6, 13); 73 b6 = _mm_srli_epi32(b6, 19); 74 diag3 = _mm_xor_si128(diag3, a6); 75 diag2 = _mm_shuffle_epi32(diag2, 0x4e); 76 diag3 = _mm_xor_si128(diag3, b6); 77 78 a7 = _mm_add_epi32(a7, diag3); 79 a0 = diag1; 80 b7 = a7; 81 a7 = _mm_slli_epi32(a7, 18); 82 b7 = _mm_srli_epi32(b7, 14); 83 diag0 = _mm_xor_si128(diag0, a7); 84 diag3 = _mm_shuffle_epi32(diag3, 0x39); 85 diag0 = _mm_xor_si128(diag0, b7); 86 87 a0 = _mm_add_epi32(a0, diag0); 88 a1 = diag0; 89 b0 = a0; 90 a0 = _mm_slli_epi32(a0, 7); 91 b0 = _mm_srli_epi32(b0, 25); 92 diag3 = _mm_xor_si128(diag3, a0); 93 94 diag3 = _mm_xor_si128(diag3, b0); 95 96 a1 = _mm_add_epi32(a1, diag3); 97 a2 = diag3; 98 b1 = a1; 99 a1 = _mm_slli_epi32(a1, 9); 100 b1 = _mm_srli_epi32(b1, 23); 101 diag2 = _mm_xor_si128(diag2, a1); 102 diag3 = _mm_shuffle_epi32(diag3, 0x93); 103 diag2 = _mm_xor_si128(diag2, b1); 104 105 a2 = _mm_add_epi32(a2, diag2); 106 a3 = diag2; 107 b2 = a2; 108 a2 = _mm_slli_epi32(a2, 13); 109 b2 = _mm_srli_epi32(b2, 19); 110 diag1 = _mm_xor_si128(diag1, a2); 111 diag2 = _mm_shuffle_epi32(diag2, 0x4e); 112 diag1 = _mm_xor_si128(diag1, b2); 113 114 a3 = _mm_add_epi32(a3, diag1); 115 a4 = diag3; 116 b3 = a3; 117 a3 = _mm_slli_epi32(a3, 18); 118 b3 = _mm_srli_epi32(b3, 14); 119 diag0 = _mm_xor_si128(diag0, a3); 120 diag1 = _mm_shuffle_epi32(diag1, 0x39); 121 diag0 = _mm_xor_si128(diag0, b3); 122 123 a4 = _mm_add_epi32(a4, diag0); 124 a5 = diag0; 125 b4 = a4; 126 a4 = _mm_slli_epi32(a4, 7); 127 b4 = _mm_srli_epi32(b4, 25); 128 diag1 = _mm_xor_si128(diag1, a4); 129 130 diag1 = _mm_xor_si128(diag1, b4); 131 132 a5 = _mm_add_epi32(a5, diag1); 133 a6 = diag1; 134 b5 = a5; 135 a5 = _mm_slli_epi32(a5, 9); 136 b5 = _mm_srli_epi32(b5, 23); 137 diag2 = _mm_xor_si128(diag2, a5); 138 diag1 = _mm_shuffle_epi32(diag1, 0x93); 139 diag2 = _mm_xor_si128(diag2, b5); 140 141 a6 = _mm_add_epi32(a6, diag2); 142 a7 = diag2; 143 b6 = a6; 144 a6 = _mm_slli_epi32(a6, 13); 145 b6 = _mm_srli_epi32(b6, 19); 146 diag3 = _mm_xor_si128(diag3, a6); 147 diag2 = _mm_shuffle_epi32(diag2, 0x4e); 148 diag3 = _mm_xor_si128(diag3, b6); 149 150 a7 = _mm_add_epi32(a7, diag3); 151 a0 = diag1; 152 b7 = a7; 153 a7 = _mm_slli_epi32(a7, 18); 154 b7 = _mm_srli_epi32(b7, 14); 155 diag0 = _mm_xor_si128(diag0, a7); 156 diag3 = _mm_shuffle_epi32(diag3, 0x39); 157 diag0 = _mm_xor_si128(diag0, b7); 158 } 159 160 diag0 = _mm_add_epi32(diag0, _mm_loadu_si128((__m128i *) (x + 0))); 161 diag1 = _mm_add_epi32(diag1, _mm_loadu_si128((__m128i *) (x + 4))); 162 diag2 = _mm_add_epi32(diag2, _mm_loadu_si128((__m128i *) (x + 8))); 163 diag3 = _mm_add_epi32(diag3, _mm_loadu_si128((__m128i *) (x + 12))); 164 165 #define ONEQUAD_SHUFFLE(A, B, C, D) \ 166 do { \ 167 uint32_t in##A = _mm_cvtsi128_si32(diag0); \ 168 uint32_t in##B = _mm_cvtsi128_si32(diag1); \ 169 uint32_t in##C = _mm_cvtsi128_si32(diag2); \ 170 uint32_t in##D = _mm_cvtsi128_si32(diag3); \ 171 diag0 = _mm_shuffle_epi32(diag0, 0x39); \ 172 diag1 = _mm_shuffle_epi32(diag1, 0x39); \ 173 diag2 = _mm_shuffle_epi32(diag2, 0x39); \ 174 diag3 = _mm_shuffle_epi32(diag3, 0x39); \ 175 in##A ^= *(uint32_t *) (m + (A * 4)); \ 176 in##B ^= *(uint32_t *) (m + (B * 4)); \ 177 in##C ^= *(uint32_t *) (m + (C * 4)); \ 178 in##D ^= *(uint32_t *) (m + (D * 4)); \ 179 *(uint32_t *) (c + (A * 4)) = in##A; \ 180 *(uint32_t *) (c + (B * 4)) = in##B; \ 181 *(uint32_t *) (c + (C * 4)) = in##C; \ 182 *(uint32_t *) (c + (D * 4)) = in##D; \ 183 } while (0) 184 185 #define ONEQUAD(A, B, C, D) ONEQUAD_SHUFFLE(A, B, C, D) 186 187 ONEQUAD(0, 12, 8, 4); 188 ONEQUAD(5, 1, 13, 9); 189 ONEQUAD(10, 6, 2, 14); 190 ONEQUAD(15, 11, 7, 3); 191 192 #undef ONEQUAD 193 #undef ONEQUAD_SHUFFLE 194 195 in8 = x[8]; 196 in9 = x[13]; 197 in8++; 198 if (in8 == 0) { 199 in9++; 200 } 201 x[8] = in8; 202 x[13] = in9; 203 204 c += 64; 205 m += 64; 206 bytes -= 64; 207 } 208