22 std::span<const uint8_t> input8,
28 const uint32x4_t C0 = vdupq_n_u32(0x5A827999);
29 const uint32x4_t C1 = vdupq_n_u32(0x6ED9EBA1);
30 const uint32x4_t C2 = vdupq_n_u32(0x8F1BBCDC);
31 const uint32x4_t C3 = vdupq_n_u32(0xCA62C1D6);
33 ABCD = vld1q_u32(&digest[0]);
37 const uint32_t* input32 =
reinterpret_cast<const uint32_t*
>(
reinterpret_cast<const void*
>(input8.data()));
41 const uint32x4_t ABCD_SAVED = ABCD;
42 const uint32_t E0_SAVED = E0;
44 uint32x4_t MSG0, MSG1, MSG2, MSG3;
45 uint32x4_t TMP0, TMP1;
48 MSG0 = vld1q_u32(input32 + 0);
49 MSG1 = vld1q_u32(input32 + 4);
50 MSG2 = vld1q_u32(input32 + 8);
51 MSG3 = vld1q_u32(input32 + 12);
53 MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0)));
54 MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1)));
55 MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2)));
56 MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3)));
58 TMP0 = vaddq_u32(MSG0, C0);
59 TMP1 = vaddq_u32(MSG1, C0);
62 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
63 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
64 TMP0 = vaddq_u32(MSG2, C0);
65 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
68 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
69 ABCD = vsha1cq_u32(ABCD, E1, TMP1);
70 TMP1 = vaddq_u32(MSG3, C0);
71 MSG0 = vsha1su1q_u32(MSG0, MSG3);
72 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
75 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
76 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
77 TMP0 = vaddq_u32(MSG0, C0);
78 MSG1 = vsha1su1q_u32(MSG1, MSG0);
79 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
82 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
83 ABCD = vsha1cq_u32(ABCD, E1, TMP1);
84 TMP1 = vaddq_u32(MSG1, C1);
85 MSG2 = vsha1su1q_u32(MSG2, MSG1);
86 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
89 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
90 ABCD = vsha1cq_u32(ABCD, E0, TMP0);
91 TMP0 = vaddq_u32(MSG2, C1);
92 MSG3 = vsha1su1q_u32(MSG3, MSG2);
93 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
96 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
97 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
98 TMP1 = vaddq_u32(MSG3, C1);
99 MSG0 = vsha1su1q_u32(MSG0, MSG3);
100 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
103 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
104 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
105 TMP0 = vaddq_u32(MSG0, C1);
106 MSG1 = vsha1su1q_u32(MSG1, MSG0);
107 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
110 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
111 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
112 TMP1 = vaddq_u32(MSG1, C1);
113 MSG2 = vsha1su1q_u32(MSG2, MSG1);
114 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
117 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
118 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
119 TMP0 = vaddq_u32(MSG2, C2);
120 MSG3 = vsha1su1q_u32(MSG3, MSG2);
121 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
124 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
125 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
126 TMP1 = vaddq_u32(MSG3, C2);
127 MSG0 = vsha1su1q_u32(MSG0, MSG3);
128 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
131 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
132 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
133 TMP0 = vaddq_u32(MSG0, C2);
134 MSG1 = vsha1su1q_u32(MSG1, MSG0);
135 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
138 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
139 ABCD = vsha1mq_u32(ABCD, E1, TMP1);
140 TMP1 = vaddq_u32(MSG1, C2);
141 MSG2 = vsha1su1q_u32(MSG2, MSG1);
142 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
145 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
146 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
147 TMP0 = vaddq_u32(MSG2, C2);
148 MSG3 = vsha1su1q_u32(MSG3, MSG2);
149 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
152 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
153 ABCD = vsha1mq_u32(ABCD, E1, TMP1);
154 TMP1 = vaddq_u32(MSG3, C3);
155 MSG0 = vsha1su1q_u32(MSG0, MSG3);
156 MSG1 = vsha1su0q_u32(MSG1, MSG2, MSG3);
159 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
160 ABCD = vsha1mq_u32(ABCD, E0, TMP0);
161 TMP0 = vaddq_u32(MSG0, C3);
162 MSG1 = vsha1su1q_u32(MSG1, MSG0);
163 MSG2 = vsha1su0q_u32(MSG2, MSG3, MSG0);
166 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
167 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
168 TMP1 = vaddq_u32(MSG1, C3);
169 MSG2 = vsha1su1q_u32(MSG2, MSG1);
170 MSG3 = vsha1su0q_u32(MSG3, MSG0, MSG1);
173 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
174 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
175 TMP0 = vaddq_u32(MSG2, C3);
176 MSG3 = vsha1su1q_u32(MSG3, MSG2);
177 MSG0 = vsha1su0q_u32(MSG0, MSG1, MSG2);
180 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
181 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
182 TMP1 = vaddq_u32(MSG3, C3);
183 MSG0 = vsha1su1q_u32(MSG0, MSG3);
186 E1 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
187 ABCD = vsha1pq_u32(ABCD, E0, TMP0);
190 E0 = vsha1h_u32(vgetq_lane_u32(ABCD, 0));
191 ABCD = vsha1pq_u32(ABCD, E1, TMP1);
195 ABCD = vaddq_u32(ABCD_SAVED, ABCD);
202 vst1q_u32(&digest[0], ABCD);