1 /*
2 This file is for loading/storing data in a little-endian fashion
3 */
4 #include "util.h"
5
6 #include "vec128.h"
7
8 #include <stdint.h>
9
PQCLEAN_MCELIECE8192128F_AVX_store_i(unsigned char * out,uint64_t in,int i)10 void PQCLEAN_MCELIECE8192128F_AVX_store_i(unsigned char *out, uint64_t in, int i) {
11 for (int j = 0; j < i; j++) {
12 out[j] = (in >> (j * 8)) & 0xFF;
13 }
14 }
15
PQCLEAN_MCELIECE8192128F_AVX_store2(unsigned char * dest,uint16_t a)16 void PQCLEAN_MCELIECE8192128F_AVX_store2(unsigned char *dest, uint16_t a) {
17 dest[0] = a & 0xFF;
18 dest[1] = a >> 8;
19 }
20
PQCLEAN_MCELIECE8192128F_AVX_load2(const unsigned char * src)21 uint16_t PQCLEAN_MCELIECE8192128F_AVX_load2(const unsigned char *src) {
22 uint16_t a;
23
24 a = src[1];
25 a <<= 8;
26 a |= src[0];
27
28 return a & GFMASK;
29 }
30
PQCLEAN_MCELIECE8192128F_AVX_load4(const unsigned char * src)31 uint32_t PQCLEAN_MCELIECE8192128F_AVX_load4(const unsigned char *src) {
32 uint32_t a;
33
34 a = src[3];
35 a <<= 8;
36 a |= src[2];
37 a <<= 8;
38 a |= src[1];
39 a <<= 8;
40 a |= src[0];
41
42 return a;
43 }
44
PQCLEAN_MCELIECE8192128F_AVX_irr_load(vec128 * out,const unsigned char * in)45 void PQCLEAN_MCELIECE8192128F_AVX_irr_load(vec128 *out, const unsigned char *in) {
46 int i, j;
47 uint64_t v0 = 0, v1 = 0;
48 uint16_t irr[ SYS_T ];
49
50 for (i = 0; i < SYS_T; i++) {
51 irr[i] = PQCLEAN_MCELIECE8192128F_AVX_load2(in + i * 2);
52 irr[i] &= GFMASK;
53 }
54
55 for (i = 0; i < GFBITS; i++) {
56 for (j = 63; j >= 0; j--) {
57 v0 <<= 1;
58 v1 <<= 1;
59 v0 |= (irr[j] >> i) & 1;
60 v1 |= (irr[j + 64] >> i) & 1;
61 }
62
63 out[i] = PQCLEAN_MCELIECE8192128F_AVX_vec128_set2x(v0, v1);
64 }
65 }
66
PQCLEAN_MCELIECE8192128F_AVX_store8(unsigned char * out,uint64_t in)67 void PQCLEAN_MCELIECE8192128F_AVX_store8(unsigned char *out, uint64_t in) {
68 out[0] = (in >> 0x00) & 0xFF;
69 out[1] = (in >> 0x08) & 0xFF;
70 out[2] = (in >> 0x10) & 0xFF;
71 out[3] = (in >> 0x18) & 0xFF;
72 out[4] = (in >> 0x20) & 0xFF;
73 out[5] = (in >> 0x28) & 0xFF;
74 out[6] = (in >> 0x30) & 0xFF;
75 out[7] = (in >> 0x38) & 0xFF;
76 }
77
PQCLEAN_MCELIECE8192128F_AVX_load8(const unsigned char * in)78 uint64_t PQCLEAN_MCELIECE8192128F_AVX_load8(const unsigned char *in) {
79 int i;
80 uint64_t ret = in[7];
81
82 for (i = 6; i >= 0; i--) {
83 ret <<= 8;
84 ret |= in[i];
85 }
86
87 return ret;
88 }
89
PQCLEAN_MCELIECE8192128F_AVX_load16(const unsigned char * in)90 vec128 PQCLEAN_MCELIECE8192128F_AVX_load16(const unsigned char *in) {
91 return PQCLEAN_MCELIECE8192128F_AVX_vec128_set2x( PQCLEAN_MCELIECE8192128F_AVX_load8(in), PQCLEAN_MCELIECE8192128F_AVX_load8(in + 8) );
92 }
93
PQCLEAN_MCELIECE8192128F_AVX_store16(unsigned char * out,vec128 in)94 void PQCLEAN_MCELIECE8192128F_AVX_store16(unsigned char *out, vec128 in) {
95 PQCLEAN_MCELIECE8192128F_AVX_store8(out + 0, PQCLEAN_MCELIECE8192128F_AVX_vec128_extract(in, 0));
96 PQCLEAN_MCELIECE8192128F_AVX_store8(out + 8, PQCLEAN_MCELIECE8192128F_AVX_vec128_extract(in, 1));
97 }
98