1*bed243d3SAndroid Build Coastguard Worker /*===--------------- sha512intrin.h - SHA512 intrinsics -----------------===
2*bed243d3SAndroid Build Coastguard Worker *
3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker *
7*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker */
9*bed243d3SAndroid Build Coastguard Worker
10*bed243d3SAndroid Build Coastguard Worker #ifndef __IMMINTRIN_H
11*bed243d3SAndroid Build Coastguard Worker #error "Never use <sha512intrin.h> directly; include <immintrin.h> instead."
12*bed243d3SAndroid Build Coastguard Worker #endif // __IMMINTRIN_H
13*bed243d3SAndroid Build Coastguard Worker
14*bed243d3SAndroid Build Coastguard Worker #ifndef __SHA512INTRIN_H
15*bed243d3SAndroid Build Coastguard Worker #define __SHA512INTRIN_H
16*bed243d3SAndroid Build Coastguard Worker
17*bed243d3SAndroid Build Coastguard Worker #define __DEFAULT_FN_ATTRS256 \
18*bed243d3SAndroid Build Coastguard Worker __attribute__((__always_inline__, __nodebug__, __target__("sha512"), \
19*bed243d3SAndroid Build Coastguard Worker __min_vector_width__(256)))
20*bed243d3SAndroid Build Coastguard Worker
21*bed243d3SAndroid Build Coastguard Worker /// This intrinisc is one of the two SHA512 message scheduling instructions.
22*bed243d3SAndroid Build Coastguard Worker /// The intrinsic performs an intermediate calculation for the next four
23*bed243d3SAndroid Build Coastguard Worker /// SHA512 message qwords. The calculated results are stored in \a dst.
24*bed243d3SAndroid Build Coastguard Worker ///
25*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
26*bed243d3SAndroid Build Coastguard Worker ///
27*bed243d3SAndroid Build Coastguard Worker /// \code
28*bed243d3SAndroid Build Coastguard Worker /// __m256i _mm256_sha512msg1_epi64(__m256i __A, __m128i __B)
29*bed243d3SAndroid Build Coastguard Worker /// \endcode
30*bed243d3SAndroid Build Coastguard Worker ///
31*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c VSHA512MSG1 instruction.
32*bed243d3SAndroid Build Coastguard Worker ///
33*bed243d3SAndroid Build Coastguard Worker /// \param __A
34*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
35*bed243d3SAndroid Build Coastguard Worker /// \param __B
36*bed243d3SAndroid Build Coastguard Worker /// A 128-bit vector of [2 x long long].
37*bed243d3SAndroid Build Coastguard Worker /// \returns
38*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
39*bed243d3SAndroid Build Coastguard Worker ///
40*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
41*bed243d3SAndroid Build Coastguard Worker /// DEFINE ROR64(qword, n) {
42*bed243d3SAndroid Build Coastguard Worker /// count := n % 64
43*bed243d3SAndroid Build Coastguard Worker /// dest := (qword >> count) | (qword << (64 - count))
44*bed243d3SAndroid Build Coastguard Worker /// RETURN dest
45*bed243d3SAndroid Build Coastguard Worker /// }
46*bed243d3SAndroid Build Coastguard Worker /// DEFINE SHR64(qword, n) {
47*bed243d3SAndroid Build Coastguard Worker /// RETURN qword >> n
48*bed243d3SAndroid Build Coastguard Worker /// }
49*bed243d3SAndroid Build Coastguard Worker /// DEFINE s0(qword):
50*bed243d3SAndroid Build Coastguard Worker /// RETURN ROR64(qword,1) ^ ROR64(qword, 8) ^ SHR64(qword, 7)
51*bed243d3SAndroid Build Coastguard Worker /// }
52*bed243d3SAndroid Build Coastguard Worker /// W[4] := __B.qword[0]
53*bed243d3SAndroid Build Coastguard Worker /// W[3] := __A.qword[3]
54*bed243d3SAndroid Build Coastguard Worker /// W[2] := __A.qword[2]
55*bed243d3SAndroid Build Coastguard Worker /// W[1] := __A.qword[1]
56*bed243d3SAndroid Build Coastguard Worker /// W[0] := __A.qword[0]
57*bed243d3SAndroid Build Coastguard Worker /// dst.qword[3] := W[3] + s0(W[4])
58*bed243d3SAndroid Build Coastguard Worker /// dst.qword[2] := W[2] + s0(W[3])
59*bed243d3SAndroid Build Coastguard Worker /// dst.qword[1] := W[1] + s0(W[2])
60*bed243d3SAndroid Build Coastguard Worker /// dst.qword[0] := W[0] + s0(W[1])
61*bed243d3SAndroid Build Coastguard Worker /// dst[MAX:256] := 0
62*bed243d3SAndroid Build Coastguard Worker /// \endcode
63*bed243d3SAndroid Build Coastguard Worker static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_sha512msg1_epi64(__m256i __A,__m128i __B)64*bed243d3SAndroid Build Coastguard Worker _mm256_sha512msg1_epi64(__m256i __A, __m128i __B) {
65*bed243d3SAndroid Build Coastguard Worker return (__m256i)__builtin_ia32_vsha512msg1((__v4du)__A, (__v2du)__B);
66*bed243d3SAndroid Build Coastguard Worker }
67*bed243d3SAndroid Build Coastguard Worker
68*bed243d3SAndroid Build Coastguard Worker /// This intrinisc is one of the two SHA512 message scheduling instructions.
69*bed243d3SAndroid Build Coastguard Worker /// The intrinsic performs the final calculation for the next four SHA512
70*bed243d3SAndroid Build Coastguard Worker /// message qwords. The calculated results are stored in \a dst.
71*bed243d3SAndroid Build Coastguard Worker ///
72*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
73*bed243d3SAndroid Build Coastguard Worker ///
74*bed243d3SAndroid Build Coastguard Worker /// \code
75*bed243d3SAndroid Build Coastguard Worker /// __m256i _mm256_sha512msg2_epi64(__m256i __A, __m256i __B)
76*bed243d3SAndroid Build Coastguard Worker /// \endcode
77*bed243d3SAndroid Build Coastguard Worker ///
78*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c VSHA512MSG2 instruction.
79*bed243d3SAndroid Build Coastguard Worker ///
80*bed243d3SAndroid Build Coastguard Worker /// \param __A
81*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
82*bed243d3SAndroid Build Coastguard Worker /// \param __B
83*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
84*bed243d3SAndroid Build Coastguard Worker /// \returns
85*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
86*bed243d3SAndroid Build Coastguard Worker ///
87*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
88*bed243d3SAndroid Build Coastguard Worker /// DEFINE ROR64(qword, n) {
89*bed243d3SAndroid Build Coastguard Worker /// count := n % 64
90*bed243d3SAndroid Build Coastguard Worker /// dest := (qword >> count) | (qword << (64 - count))
91*bed243d3SAndroid Build Coastguard Worker /// RETURN dest
92*bed243d3SAndroid Build Coastguard Worker /// }
93*bed243d3SAndroid Build Coastguard Worker /// DEFINE SHR64(qword, n) {
94*bed243d3SAndroid Build Coastguard Worker /// RETURN qword >> n
95*bed243d3SAndroid Build Coastguard Worker /// }
96*bed243d3SAndroid Build Coastguard Worker /// DEFINE s1(qword) {
97*bed243d3SAndroid Build Coastguard Worker /// RETURN ROR64(qword,19) ^ ROR64(qword, 61) ^ SHR64(qword, 6)
98*bed243d3SAndroid Build Coastguard Worker /// }
99*bed243d3SAndroid Build Coastguard Worker /// W[14] := __B.qword[2]
100*bed243d3SAndroid Build Coastguard Worker /// W[15] := __B.qword[3]
101*bed243d3SAndroid Build Coastguard Worker /// W[16] := __A.qword[0] + s1(W[14])
102*bed243d3SAndroid Build Coastguard Worker /// W[17] := __A.qword[1] + s1(W[15])
103*bed243d3SAndroid Build Coastguard Worker /// W[18] := __A.qword[2] + s1(W[16])
104*bed243d3SAndroid Build Coastguard Worker /// W[19] := __A.qword[3] + s1(W[17])
105*bed243d3SAndroid Build Coastguard Worker /// dst.qword[3] := W[19]
106*bed243d3SAndroid Build Coastguard Worker /// dst.qword[2] := W[18]
107*bed243d3SAndroid Build Coastguard Worker /// dst.qword[1] := W[17]
108*bed243d3SAndroid Build Coastguard Worker /// dst.qword[0] := W[16]
109*bed243d3SAndroid Build Coastguard Worker /// dst[MAX:256] := 0
110*bed243d3SAndroid Build Coastguard Worker /// \endcode
111*bed243d3SAndroid Build Coastguard Worker static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_sha512msg2_epi64(__m256i __A,__m256i __B)112*bed243d3SAndroid Build Coastguard Worker _mm256_sha512msg2_epi64(__m256i __A, __m256i __B) {
113*bed243d3SAndroid Build Coastguard Worker return (__m256i)__builtin_ia32_vsha512msg2((__v4du)__A, (__v4du)__B);
114*bed243d3SAndroid Build Coastguard Worker }
115*bed243d3SAndroid Build Coastguard Worker
116*bed243d3SAndroid Build Coastguard Worker /// This intrinisc performs two rounds of SHA512 operation using initial SHA512
117*bed243d3SAndroid Build Coastguard Worker /// state (C,D,G,H) from \a __A, an initial SHA512 state (A,B,E,F) from
118*bed243d3SAndroid Build Coastguard Worker /// \a __A, and a pre-computed sum of the next two round message qwords and
119*bed243d3SAndroid Build Coastguard Worker /// the corresponding round constants from \a __C (only the two lower qwords
120*bed243d3SAndroid Build Coastguard Worker /// of the third operand). The updated SHA512 state (A,B,E,F) is written to
121*bed243d3SAndroid Build Coastguard Worker /// \a __A, and \a __A can be used as the updated state (C,D,G,H) in later
122*bed243d3SAndroid Build Coastguard Worker /// rounds.
123*bed243d3SAndroid Build Coastguard Worker ///
124*bed243d3SAndroid Build Coastguard Worker /// \headerfile <immintrin.h>
125*bed243d3SAndroid Build Coastguard Worker ///
126*bed243d3SAndroid Build Coastguard Worker /// \code
127*bed243d3SAndroid Build Coastguard Worker /// __m256i _mm256_sha512rnds2_epi64(__m256i __A, __m256i __B, __m128i __C)
128*bed243d3SAndroid Build Coastguard Worker /// \endcode
129*bed243d3SAndroid Build Coastguard Worker ///
130*bed243d3SAndroid Build Coastguard Worker /// This intrinsic corresponds to the \c VSHA512RNDS2 instruction.
131*bed243d3SAndroid Build Coastguard Worker ///
132*bed243d3SAndroid Build Coastguard Worker /// \param __A
133*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
134*bed243d3SAndroid Build Coastguard Worker /// \param __B
135*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
136*bed243d3SAndroid Build Coastguard Worker /// \param __C
137*bed243d3SAndroid Build Coastguard Worker /// A 128-bit vector of [2 x long long].
138*bed243d3SAndroid Build Coastguard Worker /// \returns
139*bed243d3SAndroid Build Coastguard Worker /// A 256-bit vector of [4 x long long].
140*bed243d3SAndroid Build Coastguard Worker ///
141*bed243d3SAndroid Build Coastguard Worker /// \code{.operation}
142*bed243d3SAndroid Build Coastguard Worker /// DEFINE ROR64(qword, n) {
143*bed243d3SAndroid Build Coastguard Worker /// count := n % 64
144*bed243d3SAndroid Build Coastguard Worker /// dest := (qword >> count) | (qword << (64 - count))
145*bed243d3SAndroid Build Coastguard Worker /// RETURN dest
146*bed243d3SAndroid Build Coastguard Worker /// }
147*bed243d3SAndroid Build Coastguard Worker /// DEFINE SHR64(qword, n) {
148*bed243d3SAndroid Build Coastguard Worker /// RETURN qword >> n
149*bed243d3SAndroid Build Coastguard Worker /// }
150*bed243d3SAndroid Build Coastguard Worker /// DEFINE cap_sigma0(qword) {
151*bed243d3SAndroid Build Coastguard Worker /// RETURN ROR64(qword,28) ^ ROR64(qword, 34) ^ ROR64(qword, 39)
152*bed243d3SAndroid Build Coastguard Worker /// }
153*bed243d3SAndroid Build Coastguard Worker /// DEFINE cap_sigma1(qword) {
154*bed243d3SAndroid Build Coastguard Worker /// RETURN ROR64(qword,14) ^ ROR64(qword, 18) ^ ROR64(qword, 41)
155*bed243d3SAndroid Build Coastguard Worker /// }
156*bed243d3SAndroid Build Coastguard Worker /// DEFINE MAJ(a,b,c) {
157*bed243d3SAndroid Build Coastguard Worker /// RETURN (a & b) ^ (a & c) ^ (b & c)
158*bed243d3SAndroid Build Coastguard Worker /// }
159*bed243d3SAndroid Build Coastguard Worker /// DEFINE CH(e,f,g) {
160*bed243d3SAndroid Build Coastguard Worker /// RETURN (e & f) ^ (g & ~e)
161*bed243d3SAndroid Build Coastguard Worker /// }
162*bed243d3SAndroid Build Coastguard Worker /// A[0] := __B.qword[3]
163*bed243d3SAndroid Build Coastguard Worker /// B[0] := __B.qword[2]
164*bed243d3SAndroid Build Coastguard Worker /// C[0] := __C.qword[3]
165*bed243d3SAndroid Build Coastguard Worker /// D[0] := __C.qword[2]
166*bed243d3SAndroid Build Coastguard Worker /// E[0] := __B.qword[1]
167*bed243d3SAndroid Build Coastguard Worker /// F[0] := __B.qword[0]
168*bed243d3SAndroid Build Coastguard Worker /// G[0] := __C.qword[1]
169*bed243d3SAndroid Build Coastguard Worker /// H[0] := __C.qword[0]
170*bed243d3SAndroid Build Coastguard Worker /// WK[0]:= __A.qword[0]
171*bed243d3SAndroid Build Coastguard Worker /// WK[1]:= __A.qword[1]
172*bed243d3SAndroid Build Coastguard Worker /// FOR i := 0 to 1:
173*bed243d3SAndroid Build Coastguard Worker /// A[i+1] := CH(E[i], F[i], G[i]) +
174*bed243d3SAndroid Build Coastguard Worker /// cap_sigma1(E[i]) + WK[i] + H[i] +
175*bed243d3SAndroid Build Coastguard Worker /// MAJ(A[i], B[i], C[i]) +
176*bed243d3SAndroid Build Coastguard Worker /// cap_sigma0(A[i])
177*bed243d3SAndroid Build Coastguard Worker /// B[i+1] := A[i]
178*bed243d3SAndroid Build Coastguard Worker /// C[i+1] := B[i]
179*bed243d3SAndroid Build Coastguard Worker /// D[i+1] := C[i]
180*bed243d3SAndroid Build Coastguard Worker /// E[i+1] := CH(E[i], F[i], G[i]) +
181*bed243d3SAndroid Build Coastguard Worker /// cap_sigma1(E[i]) + WK[i] + H[i] + D[i]
182*bed243d3SAndroid Build Coastguard Worker /// F[i+1] := E[i]
183*bed243d3SAndroid Build Coastguard Worker /// G[i+1] := F[i]
184*bed243d3SAndroid Build Coastguard Worker /// H[i+1] := G[i]
185*bed243d3SAndroid Build Coastguard Worker /// ENDFOR
186*bed243d3SAndroid Build Coastguard Worker /// dst.qword[3] := A[2]
187*bed243d3SAndroid Build Coastguard Worker /// dst.qword[2] := B[2]
188*bed243d3SAndroid Build Coastguard Worker /// dst.qword[1] := E[2]
189*bed243d3SAndroid Build Coastguard Worker /// dst.qword[0] := F[2]
190*bed243d3SAndroid Build Coastguard Worker /// dst[MAX:256] := 0
191*bed243d3SAndroid Build Coastguard Worker /// \endcode
192*bed243d3SAndroid Build Coastguard Worker static __inline__ __m256i __DEFAULT_FN_ATTRS256
_mm256_sha512rnds2_epi64(__m256i __A,__m256i __B,__m128i __C)193*bed243d3SAndroid Build Coastguard Worker _mm256_sha512rnds2_epi64(__m256i __A, __m256i __B, __m128i __C) {
194*bed243d3SAndroid Build Coastguard Worker return (__m256i)__builtin_ia32_vsha512rnds2((__v4du)__A, (__v4du)__B,
195*bed243d3SAndroid Build Coastguard Worker (__v2du)__C);
196*bed243d3SAndroid Build Coastguard Worker }
197*bed243d3SAndroid Build Coastguard Worker
198*bed243d3SAndroid Build Coastguard Worker #undef __DEFAULT_FN_ATTRS256
199*bed243d3SAndroid Build Coastguard Worker
200*bed243d3SAndroid Build Coastguard Worker #endif // __SHA512INTRIN_H
201