30#if defined(PHP_HASH_INTRIN_SHA_NATIVE) || defined(PHP_HASH_INTRIN_SHA_RESOLVER)
32# include <immintrin.h>
34# if defined(PHP_HASH_INTRIN_SHA_RESOLVER) && defined(HAVE_FUNC_ATTRIBUTE_TARGET)
35static __m128i be32dec_128(
const uint8_t * src)
__attribute__((target(
"ssse3")));
58be32dec_128(
const uint8_t * src)
60 const __m128i SHUF = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11,
61 4, 5, 6, 7, 0, 1, 2, 3);
65 x = _mm_loadu_si128((
const __m128i *)src);
68 return (_mm_shuffle_epi8(x, SHUF));
72#define I32(a) ((UINT32_C(a) >= UINT32_C(0x80000000)) ? \
73 -(int32_t)(UINT32_C(0xffffffff) - UINT32_C(a)) - 1 : (int32_t)INT32_C(a))
76#define IMM4(a, b, c, d) _mm_set_epi32(I32(a), I32(b), I32(c), I32(d))
79#define RND4(S, W, K0, K1, K2, K3) do { \
83 M = _mm_add_epi32(W, IMM4(K3, K2, K1, K0)); \
86 S[1] = _mm_sha256rnds2_epu32(S[1], S[0], M); \
89 M = _mm_srli_si128(M, 8); \
90 S[0] = _mm_sha256rnds2_epu32(S[0], S[1], M); \
94#define MSG4(W, i) do { \
95 W[(i + 0) % 4] = _mm_sha256msg1_epu32(W[(i + 0) % 4], W[(i + 1) % 4]); \
96 W[(i + 0) % 4] = _mm_add_epi32(W[(i + 0) % 4], \
97 _mm_alignr_epi8(W[(i + 3) % 4], W[(i + 2) % 4], 4)); \
98 W[(i + 0) % 4] = _mm_sha256msg2_epu32(W[(i + 0) % 4], W[(i + 3) % 4]); \
102#define RNDMSG(S, W, i, K0, K1, K2, K3) do { \
103 RND4(S, W[i % 4], K0, K1, K2, K3); \
119 __m128i S3210, S7654;
120 __m128i S0123, S4567;
121 __m128i S0145, S2367;
126 S3210 = _mm_loadu_si128((
const __m128i *)&
state[0]);
127 S7654 = _mm_loadu_si128((
const __m128i *)&
state[4]);
130 S0123 = _mm_shuffle_epi32(S3210, 0x1B);
131 S4567 = _mm_shuffle_epi32(S7654, 0x1B);
132 S0145 = _mm_unpackhi_epi64(S4567, S0123);
133 S2367 = _mm_unpacklo_epi64(S4567, S0123);
136 W[0] = be32dec_128(&block[0]);
137 W[1] = be32dec_128(&block[16]);
138 W[2] = be32dec_128(&block[32]);
139 W[3] = be32dec_128(&block[48]);
146 RNDMSG(
S,
W, 0, 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5);
147 RNDMSG(
S,
W, 1, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5);
148 RNDMSG(
S,
W, 2, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3);
149 RNDMSG(
S,
W, 3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174);
150 RNDMSG(
S,
W, 4, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc);
151 RNDMSG(
S,
W, 5, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da);
152 RNDMSG(
S,
W, 6, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7);
153 RNDMSG(
S,
W, 7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967);
154 RNDMSG(
S,
W, 8, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13);
155 RNDMSG(
S,
W, 9, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85);
156 RNDMSG(
S,
W, 10, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3);
157 RNDMSG(
S,
W, 11, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070);
158 RNDMSG(
S,
W, 12, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5);
159 RNDMSG(
S,
W, 13, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3);
160 RNDMSG(
S,
W, 14, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208);
161 RNDMSG(
S,
W, 15, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2);
164 S0145 = _mm_add_epi32(S0145,
S[0]);
165 S2367 = _mm_add_epi32(S2367,
S[1]);
168 S0123 = _mm_unpackhi_epi64(S2367, S0145);
169 S4567 = _mm_unpacklo_epi64(S2367, S0145);
170 S3210 = _mm_shuffle_epi32(S0123, 0x1B);
171 S7654 = _mm_shuffle_epi32(S4567, 0x1B);
172 _mm_storeu_si128((__m128i *)&
state[0], S3210);
173 _mm_storeu_si128((__m128i *)&
state[4], S7654);
#define PHP_STATIC_RESTRICT