1 /*
2   This file is for loading/storing data in a little-endian fashion
3 */
4 
5 #include "util.h"
6 
PQCLEAN_MCELIECE348864_AVX_store_i(unsigned char * out,uint64_t in,int i)7 void PQCLEAN_MCELIECE348864_AVX_store_i(unsigned char *out, uint64_t in, int i) {
8     int j;
9 
10     for (j = 0; j < i; j++) {
11         out[j] = (in >> (j * 8)) & 0xFF;
12     }
13 }
14 
PQCLEAN_MCELIECE348864_AVX_store2(unsigned char * dest,gf a)15 void PQCLEAN_MCELIECE348864_AVX_store2(unsigned char *dest, gf a) {
16     dest[0] = a & 0xFF;
17     dest[1] = a >> 8;
18 }
19 
PQCLEAN_MCELIECE348864_AVX_load2(const unsigned char * src)20 uint16_t PQCLEAN_MCELIECE348864_AVX_load2(const unsigned char *src) {
21     uint16_t a;
22 
23     a = src[1];
24     a <<= 8;
25     a |= src[0];
26 
27     return a & GFMASK;
28 }
29 
PQCLEAN_MCELIECE348864_AVX_load4(const unsigned char * src)30 uint32_t PQCLEAN_MCELIECE348864_AVX_load4(const unsigned char *src) {
31     uint32_t a;
32 
33     a  = src[3];
34     a <<= 8;
35     a |= src[2];
36     a <<= 8;
37     a |= src[1];
38     a <<= 8;
39     a |= src[0];
40 
41     return a;
42 }
43 
PQCLEAN_MCELIECE348864_AVX_irr_load(uint64_t * out,const unsigned char * in)44 void PQCLEAN_MCELIECE348864_AVX_irr_load(uint64_t *out, const unsigned char *in) {
45     int i, j;
46     uint16_t irr[ SYS_T + 1 ];
47 
48     for (i = 0; i < SYS_T; i++) {
49         irr[i] = PQCLEAN_MCELIECE348864_AVX_load2(in + i * 2);
50         irr[i] &= GFMASK;
51     }
52 
53     irr[ SYS_T ] = 1;
54 
55     for (i = 0; i < GFBITS; i++) {
56         out[i] = 0;
57     }
58 
59     for (i = SYS_T; i >= 0; i--) {
60         for (j = 0; j < GFBITS; j++) {
61             out[j] <<= 1;
62             out[j] |= (irr[i] >> j) & 1;
63         }
64     }
65 }
66 
PQCLEAN_MCELIECE348864_AVX_store8(unsigned char * out,uint64_t in)67 void PQCLEAN_MCELIECE348864_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_MCELIECE348864_AVX_load8(const unsigned char * in)78 uint64_t PQCLEAN_MCELIECE348864_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_MCELIECE348864_AVX_bitrev(gf a)90 gf PQCLEAN_MCELIECE348864_AVX_bitrev(gf a) {
91     a = ((a & 0x00FF) << 8) | ((a & 0xFF00) >> 8);
92     a = ((a & 0x0F0F) << 4) | ((a & 0xF0F0) >> 4);
93     a = ((a & 0x3333) << 2) | ((a & 0xCCCC) >> 2);
94     a = ((a & 0x5555) << 1) | ((a & 0xAAAA) >> 1);
95 
96     return a >> 4;
97 }
98 
PQCLEAN_MCELIECE348864_AVX_load16(const unsigned char * in)99 vec128 PQCLEAN_MCELIECE348864_AVX_load16(const unsigned char *in) {
100     return PQCLEAN_MCELIECE348864_AVX_vec128_set2x( PQCLEAN_MCELIECE348864_AVX_load8(in), PQCLEAN_MCELIECE348864_AVX_load8(in + 8) );
101 }
102 
PQCLEAN_MCELIECE348864_AVX_store16(unsigned char * out,vec128 in)103 void PQCLEAN_MCELIECE348864_AVX_store16(unsigned char *out, vec128 in) {
104     PQCLEAN_MCELIECE348864_AVX_store8(out + 0, PQCLEAN_MCELIECE348864_AVX_vec128_extract(in, 0));
105     PQCLEAN_MCELIECE348864_AVX_store8(out + 8, PQCLEAN_MCELIECE348864_AVX_vec128_extract(in, 1));
106 }
107