Changeset View
Changeset View
Standalone View
Standalone View
src/crypto/sha256_shani.cpp
Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | |||||
__m128i inline __attribute__((always_inline)) Load(const uint8_t *in) { | __m128i inline __attribute__((always_inline)) Load(const uint8_t *in) { | ||||
return _mm_shuffle_epi8(_mm_loadu_si128((const __m128i *)in), MASK); | return _mm_shuffle_epi8(_mm_loadu_si128((const __m128i *)in), MASK); | ||||
} | } | ||||
inline void __attribute__((always_inline)) Save(uint8_t *out, __m128i s) { | inline void __attribute__((always_inline)) Save(uint8_t *out, __m128i s) { | ||||
_mm_storeu_si128((__m128i *)out, _mm_shuffle_epi8(s, MASK)); | _mm_storeu_si128((__m128i *)out, _mm_shuffle_epi8(s, MASK)); | ||||
} | } | ||||
} | } // namespace | ||||
namespace sha256_shani { | namespace sha256_shani { | ||||
void Transform(uint32_t *s, const uint8_t *chunk, size_t blocks) { | void Transform(uint32_t *s, const uint8_t *chunk, size_t blocks) { | ||||
__m128i m0, m1, m2, m3, s0, s1, so0, so1; | __m128i m0, m1, m2, m3, s0, s1, so0, so1; | ||||
/* Load state */ | /* Load state */ | ||||
s0 = _mm_loadu_si128((const __m128i *)s); | s0 = _mm_loadu_si128((const __m128i *)s); | ||||
s1 = _mm_loadu_si128((const __m128i *)(s + 4)); | s1 = _mm_loadu_si128((const __m128i *)(s + 4)); | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | while (blocks--) { | ||||
/* Advance */ | /* Advance */ | ||||
chunk += 64; | chunk += 64; | ||||
} | } | ||||
Unshuffle(s0, s1); | Unshuffle(s0, s1); | ||||
_mm_storeu_si128((__m128i *)s, s0); | _mm_storeu_si128((__m128i *)s, s0); | ||||
_mm_storeu_si128((__m128i *)(s + 4), s1); | _mm_storeu_si128((__m128i *)(s + 4), s1); | ||||
} | } | ||||
} | } // namespace sha256_shani | ||||
namespace sha256d64_shani { | namespace sha256d64_shani { | ||||
void Transform_2way(uint8_t *out, const uint8_t *in) { | void Transform_2way(uint8_t *out, const uint8_t *in) { | ||||
__m128i am0, am1, am2, am3, as0, as1, aso0, aso1; | __m128i am0, am1, am2, am3, as0, as1, aso0, aso1; | ||||
__m128i bm0, bm1, bm2, bm3, bs0, bs1, bso0, bso1; | __m128i bm0, bm1, bm2, bm3, bs0, bs1, bso0, bso1; | ||||
/* Transform 1 */ | /* Transform 1 */ | ||||
▲ Show 20 Lines • Show All 195 Lines • ▼ Show 20 Lines | void Transform_2way(uint8_t *out, const uint8_t *in) { | ||||
/* Extract hash into out */ | /* Extract hash into out */ | ||||
Unshuffle(as0, as1); | Unshuffle(as0, as1); | ||||
Unshuffle(bs0, bs1); | Unshuffle(bs0, bs1); | ||||
Save(out, as0); | Save(out, as0); | ||||
Save(out + 16, as1); | Save(out + 16, as1); | ||||
Save(out + 32, bs0); | Save(out + 32, bs0); | ||||
Save(out + 48, bs1); | Save(out + 48, bs1); | ||||
} | } | ||||
} | } // namespace sha256d64_shani | ||||
#endif | #endif |