f4302924b5580b96256eddda4c21222cc82dace1
[novacoin.git] / src / crypto / sha2 / asm / copy_swap.c
1 // Copyright (c) 2015 The Novacoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include <stdint.h>
6 #include <immintrin.h>
7
8 void copy_swap_hashes(uint32_t *blocks, uint32_t *state)
9 {
10     blocks[0] = __builtin_bswap32(state[0]);
11     blocks[1] = __builtin_bswap32(state[1]);
12     blocks[2] = __builtin_bswap32(state[2]);
13     blocks[3] = __builtin_bswap32(state[3]);
14     blocks[4] = __builtin_bswap32(state[4]);
15     blocks[5] = __builtin_bswap32(state[5]);
16     blocks[6] = __builtin_bswap32(state[6]);
17     blocks[7] = __builtin_bswap32(state[7]);
18     blocks[8] = __builtin_bswap32(state[8]);
19     blocks[9] = __builtin_bswap32(state[9]);
20     blocks[10] = __builtin_bswap32(state[10]);
21     blocks[11] = __builtin_bswap32(state[11]);
22     blocks[12] = __builtin_bswap32(state[12]);
23     blocks[13] = __builtin_bswap32(state[13]);
24     blocks[14] = __builtin_bswap32(state[14]);
25     blocks[15] = __builtin_bswap32(state[15]);
26     blocks[16] = __builtin_bswap32(state[16]);
27     blocks[17] = __builtin_bswap32(state[17]);
28     blocks[18] = __builtin_bswap32(state[18]);
29     blocks[19] = __builtin_bswap32(state[19]);
30     blocks[20] = __builtin_bswap32(state[20]);
31     blocks[21] = __builtin_bswap32(state[21]);
32     blocks[22] = __builtin_bswap32(state[22]);
33     blocks[23] = __builtin_bswap32(state[23]);
34     blocks[24] = __builtin_bswap32(state[24]);
35     blocks[25] = __builtin_bswap32(state[25]);
36     blocks[26] = __builtin_bswap32(state[26]);
37     blocks[27] = __builtin_bswap32(state[27]);
38     blocks[28] = __builtin_bswap32(state[28]);
39     blocks[29] = __builtin_bswap32(state[29]);
40     blocks[30] = __builtin_bswap32(state[30]);
41     blocks[31] = __builtin_bswap32(state[31]);
42 }
43
44 #ifdef USE_SSSE3
45 void copy_swap_hashes_ssse3(uint32_t *blocks, uint32_t *state) 
46 {
47     __m128i mask = _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3);
48     _mm_storeu_si128((__m128i *)&blocks[0], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[0]), mask));
49     _mm_storeu_si128((__m128i *)&blocks[4], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[4]), mask));
50     _mm_storeu_si128((__m128i *)&blocks[8], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[8]), mask));
51     _mm_storeu_si128((__m128i *)&blocks[12], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[12]), mask));
52     _mm_storeu_si128((__m128i *)&blocks[16], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[16]), mask));
53     _mm_storeu_si128((__m128i *)&blocks[20], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[20]), mask));
54     _mm_storeu_si128((__m128i *)&blocks[24], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[24]), mask));
55     _mm_storeu_si128((__m128i *)&blocks[28], _mm_shuffle_epi8(_mm_loadu_si128((__m128i *)&state[28]), mask));
56 }
57 #endif