You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
1.9 KiB

  1. #include "vec128.h"
  2. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_set1_16b(uint16_t a) {
  3. return _mm_set1_epi16(a);
  4. }
  5. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_setzero(void) {
  6. return _mm_setzero_si128();
  7. }
  8. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_and(vec128 a, vec128 b) {
  9. return _mm_and_si128(a, b);
  10. }
  11. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_xor(vec128 a, vec128 b) {
  12. return _mm_xor_si128(a, b);
  13. }
  14. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_or(vec128 a, vec128 b) {
  15. return _mm_or_si128(a, b);
  16. }
  17. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_sll_2x(vec128 a, int s) {
  18. return _mm_slli_epi64(a, s);
  19. }
  20. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_srl_2x(vec128 a, int s) {
  21. return _mm_srli_epi64(a, s);
  22. }
  23. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_set2x(uint64_t a0, uint64_t a1) {
  24. return _mm_set_epi64x(a1, a0);
  25. }
  26. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_unpack_low(vec128 a, vec128 b) {
  27. return _mm_unpacklo_epi64(a, b);
  28. }
  29. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_unpack_high(vec128 a, vec128 b) {
  30. return _mm_unpackhi_epi64(a, b);
  31. }
  32. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_setbits(uint64_t a) {
  33. return _mm_set1_epi64x(-a);
  34. }
  35. void PQCLEAN_MCELIECE460896F_AVX_vec128_copy(vec128 *dest, const vec128 *src) {
  36. int i;
  37. for (i = 0; i < GFBITS; i++) {
  38. dest[i] = src[i];
  39. }
  40. }
  41. void PQCLEAN_MCELIECE460896F_AVX_vec128_add(vec128 *c, const vec128 *a, const vec128 *b) {
  42. int i;
  43. for (i = 0; i < GFBITS; i++) {
  44. c[i] = PQCLEAN_MCELIECE460896F_AVX_vec128_xor(a[i], b[i]);
  45. }
  46. }
  47. vec128 PQCLEAN_MCELIECE460896F_AVX_vec128_or_reduce(const vec128 *a) {
  48. int i;
  49. vec128 ret;
  50. ret = a[0];
  51. for (i = 1; i < GFBITS; i++) {
  52. ret = PQCLEAN_MCELIECE460896F_AVX_vec128_or(ret, a[i]);
  53. }
  54. return ret;
  55. }
  56. /* bitsliced field multiplications */
  57. void PQCLEAN_MCELIECE460896F_AVX_vec128_mul(vec128 *h, vec128 *f, const vec128 *g) {
  58. PQCLEAN_MCELIECE460896F_AVX_vec128_mul_asm(h, f, g, 16);
  59. }