Repository: fplll/g6k (language: python)

Issue:
AVX2 v Intel(R) Xeon(R) CPU E5-2667 v2 @ 3.30GHz
We might simply accept this but G6K won't compile/work any longer on a CPU without AVX2:

```
.../include/avxintrin.h:1266:1: error: inlining failed in call to always_inline '__m256i _mm256_set_epi16(short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int, short int)': target specific option mismatch
 _mm256_set_epi16 (short __q15, short __q14, short __q13, short __q12,
 ^~~~~~~~~~~~~~~~
In file included from fht_lsh.cpp:3:0:
fht_lsh.h:23:51: note: called from here
 const __m256i mixmask_threshold = _mm256_set_epi16(
                                   ~~~~~~~~~~~~~~~~^
     0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555,
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA);
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make[1]: *** [Makefile:13: fht_lsh.o] Error 1

```
Illegal instruction

Illegal instruction

Illegal instruction



Discussion / hints:
@malb I think the goal now is:
1) to detect avx2 compile support at build time => disable bdgl if not
2) add avx2 cpu support runtime detection into bdgl => throw error if no avx2 cpu support. 

Could we not fall back to something slower if AVX2 is not available? But otherwise, I agree.
Sorry I don't have all the right debugging tools installed. All of the examples in README.md give output similar to this:

lwe_challenge.py n --lwe/alpha alpha
------------------------------------------------------------------------
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7f18)[0x7fb25b1daf18]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7fb8)[0x7fb25b1dafb8]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x9e6b)[0x7fb25b1dce6b]
/lib64/libpthread.so.0(+0xf820)[0x7fb265359820]
/usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so(+0x14638)[0x7fb25922d638]
/lib64/ld-linux-x86-64.so.2(+0xe7ea)[0x7fb265ad47ea]
/lib64/ld-linux-x86-64.so.2(+0xe8d3)[0x7fb265ad48d3]
/lib64/ld-linux-x86-64.so.2(+0x12a38)[0x7fb265ad8a38]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/ld-linux-x86-64.so.2(+0x1222b)[0x7fb265ad822b]
/lib64/libdl.so.2(+0x101b)[0x7fb26514701b]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/libdl.so.2(+0x15cd)[0x7fb2651475cd]
/lib64/libdl.so.2(dlopen+0x31)[0x7fb2651470b1]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_FindSharedFuncptr+0x180)[0x7fb26573ee80]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_LoadDynamicModuleWithSpec+0x14a)[0x7fb26570b11a]
/usr/lib64/libpython3.7m.so.1.0(+0x1a21df)[0x7fb2657091df]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(+0x184e7d)[0x7fb2656ebe7d]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(PyRun_FileExFlags+0xaa)[0x7fb265722aaa]
/usr/lib64/libpython3.7m.so.1.0(PyRun_SimpleFileExFlags+0xdf)[0x7fb265722bff]
/usr/lib64/libpython3.7m.so.1.0(+0x1de7ac)[0x7fb2657457ac]
/usr/lib64/libpython3.7m.so.1.0(_Py_UnixMain+0x6a)[0x7fb265745e6a]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb2648b8b15]
/usr/bin/python3[0x4006de]
------------------------------------------------------------------------
Attaching gdb to process id 24130.
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
0x00007fb265359429 in waitpid () from /lib64/libpthread.so.0

Stack backtrace
---------------
No symbol table info available.
#1  0x00007fb25b1d99d2 in print_enhanced_backtrace ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#2  0x00007fb25b1daff5 in sigdie ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#3  0x00007fb25b1dce6b in cysigs_signal_handler ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#4  <signal handler called>
No symbol table info available.
#5  0x00007fb25922d638 in _GLOBAL__sub_I_fht_lsh.cpp ()
   from /usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#6  0x00007fb265ad47ea in call_init.part () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#7  0x00007fb265ad48d3 in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#8  0x00007fb265ad8a38 in dl_open_worker () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#9  0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#10 0x00007fb265ad822b in _dl_open () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#11 0x00007fb26514701b in dlopen_doit () from /lib64/libdl.so.2
No symbol table info available.
#12 0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#13 0x00007fb2651475cd in _dlerror_run () from /lib64/libdl.so.2
No symbol table info available.
#14 0x00007fb2651470b1 in dlopen@@GLIBC_2.2.5 () from /lib64/libdl.so.2
No symbol table info available.
#15 0x00007fb26573ee80 in _PyImport_FindSharedFuncptr ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#16 0x00007fb26570b11a in _PyImport_LoadDynamicModuleWithSpec ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#17 0x00007fb2657091df in _imp_create_dynamic ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#18 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#19 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#20 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#21 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#22 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#23 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#24 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#25 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#26 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#27 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#28 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#29 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#30 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#31 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#32 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#33 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#34 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#35 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#36 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#37 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#38 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#39 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#40 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#41 0x00007fb2656ebe7d in builtin_exec () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#42 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#43 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#44 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#45 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#46 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#47 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#48 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#49 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#50 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#51 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#52 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#53 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#54 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#55 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#56 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#57 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#58 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#59 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#60 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#61 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#62 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#63 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#64 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#65 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#66 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#67 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#68 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#69 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#70 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#71 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#72 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#73 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#74 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#75 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#76 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#77 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#78 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#79 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#80 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#81 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#82 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#83 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#84 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#85 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#86 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#87 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#88 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#89 0x00007fb265722aaa in PyRun_FileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#90 0x00007fb265722bff in PyRun_SimpleFileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#91 0x00007fb2657457ac in pymain_main.constprop ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#92 0x00007fb265745e6a in _Py_UnixMain () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#93 0x00007fb2648b8b15 in __libc_start_main () from /lib64/libc.so.6
No symbol table info available.
#94 0x00000000004006de in _start ()
No symbol table info available.
Traceback (most recent call last):
  File "<string>", line 25, in <module>
ImportError: No module named Cython.Debugger
Error while executing Python code.

Your system GDB uses an incompatible version of Python.
Install gdb for enhanced tracebacks.
------------------------------------------------------------------------
Unhandled SIGILL: An illegal instruction occurred.
This probably occurred because a *compiled* module has a bug
in it and is not properly wrapped with sig_on(), sig_off().
Python will now terminate.
------------------------------------------------------------------------
Illegal instruction

Maybe same as https://github.com/fplll/g6k/issues/72 ?
Sorry I don't have all the right debugging tools installed. All of the examples in README.md give output similar to this:

lwe_challenge.py n --lwe/alpha alpha
------------------------------------------------------------------------
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7f18)[0x7fb25b1daf18]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7fb8)[0x7fb25b1dafb8]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x9e6b)[0x7fb25b1dce6b]
/lib64/libpthread.so.0(+0xf820)[0x7fb265359820]
/usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so(+0x14638)[0x7fb25922d638]
/lib64/ld-linux-x86-64.so.2(+0xe7ea)[0x7fb265ad47ea]
/lib64/ld-linux-x86-64.so.2(+0xe8d3)[0x7fb265ad48d3]
/lib64/ld-linux-x86-64.so.2(+0x12a38)[0x7fb265ad8a38]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/ld-linux-x86-64.so.2(+0x1222b)[0x7fb265ad822b]
/lib64/libdl.so.2(+0x101b)[0x7fb26514701b]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/libdl.so.2(+0x15cd)[0x7fb2651475cd]
/lib64/libdl.so.2(dlopen+0x31)[0x7fb2651470b1]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_FindSharedFuncptr+0x180)[0x7fb26573ee80]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_LoadDynamicModuleWithSpec+0x14a)[0x7fb26570b11a]
/usr/lib64/libpython3.7m.so.1.0(+0x1a21df)[0x7fb2657091df]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(+0x184e7d)[0x7fb2656ebe7d]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(PyRun_FileExFlags+0xaa)[0x7fb265722aaa]
/usr/lib64/libpython3.7m.so.1.0(PyRun_SimpleFileExFlags+0xdf)[0x7fb265722bff]
/usr/lib64/libpython3.7m.so.1.0(+0x1de7ac)[0x7fb2657457ac]
/usr/lib64/libpython3.7m.so.1.0(_Py_UnixMain+0x6a)[0x7fb265745e6a]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb2648b8b15]
/usr/bin/python3[0x4006de]
------------------------------------------------------------------------
Attaching gdb to process id 24130.
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
0x00007fb265359429 in waitpid () from /lib64/libpthread.so.0

Stack backtrace
---------------
No symbol table info available.
#1  0x00007fb25b1d99d2 in print_enhanced_backtrace ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#2  0x00007fb25b1daff5 in sigdie ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#3  0x00007fb25b1dce6b in cysigs_signal_handler ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#4  <signal handler called>
No symbol table info available.
#5  0x00007fb25922d638 in _GLOBAL__sub_I_fht_lsh.cpp ()
   from /usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#6  0x00007fb265ad47ea in call_init.part () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#7  0x00007fb265ad48d3 in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#8  0x00007fb265ad8a38 in dl_open_worker () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#9  0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#10 0x00007fb265ad822b in _dl_open () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#11 0x00007fb26514701b in dlopen_doit () from /lib64/libdl.so.2
No symbol table info available.
#12 0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#13 0x00007fb2651475cd in _dlerror_run () from /lib64/libdl.so.2
No symbol table info available.
#14 0x00007fb2651470b1 in dlopen@@GLIBC_2.2.5 () from /lib64/libdl.so.2
No symbol table info available.
#15 0x00007fb26573ee80 in _PyImport_FindSharedFuncptr ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#16 0x00007fb26570b11a in _PyImport_LoadDynamicModuleWithSpec ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#17 0x00007fb2657091df in _imp_create_dynamic ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#18 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#19 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#20 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#21 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#22 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#23 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#24 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#25 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#26 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#27 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#28 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#29 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#30 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#31 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#32 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#33 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#34 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#35 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#36 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#37 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#38 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#39 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#40 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#41 0x00007fb2656ebe7d in builtin_exec () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#42 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#43 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#44 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#45 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#46 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#47 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#48 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#49 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#50 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#51 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#52 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#53 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#54 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#55 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#56 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#57 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#58 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#59 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#60 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#61 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#62 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#63 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#64 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#65 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#66 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#67 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#68 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#69 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#70 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#71 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#72 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#73 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#74 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#75 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#76 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#77 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#78 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#79 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#80 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#81 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#82 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#83 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#84 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#85 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#86 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#87 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#88 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#89 0x00007fb265722aaa in PyRun_FileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#90 0x00007fb265722bff in PyRun_SimpleFileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#91 0x00007fb2657457ac in pymain_main.constprop ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#92 0x00007fb265745e6a in _Py_UnixMain () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#93 0x00007fb2648b8b15 in __libc_start_main () from /lib64/libc.so.6
No symbol table info available.
#94 0x00000000004006de in _start ()
No symbol table info available.
Traceback (most recent call last):
  File "<string>", line 25, in <module>
ImportError: No module named Cython.Debugger
Error while executing Python code.

Your system GDB uses an incompatible version of Python.
Install gdb for enhanced tracebacks.
------------------------------------------------------------------------
Unhandled SIGILL: An illegal instruction occurred.
This probably occurred because a *compiled* module has a bug
in it and is not properly wrapped with sig_on(), sig_off().
Python will now terminate.
------------------------------------------------------------------------
Illegal instruction

Maybe same as https://github.com/fplll/g6k/issues/72 ?
Sorry I don't have all the right debugging tools installed. All of the examples in README.md give output similar to this:

lwe_challenge.py n --lwe/alpha alpha
------------------------------------------------------------------------
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7f18)[0x7fb25b1daf18]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x7fb8)[0x7fb25b1dafb8]
/usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so(+0x9e6b)[0x7fb25b1dce6b]
/lib64/libpthread.so.0(+0xf820)[0x7fb265359820]
/usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so(+0x14638)[0x7fb25922d638]
/lib64/ld-linux-x86-64.so.2(+0xe7ea)[0x7fb265ad47ea]
/lib64/ld-linux-x86-64.so.2(+0xe8d3)[0x7fb265ad48d3]
/lib64/ld-linux-x86-64.so.2(+0x12a38)[0x7fb265ad8a38]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/ld-linux-x86-64.so.2(+0x1222b)[0x7fb265ad822b]
/lib64/libdl.so.2(+0x101b)[0x7fb26514701b]
/lib64/ld-linux-x86-64.so.2(+0xe674)[0x7fb265ad4674]
/lib64/libdl.so.2(+0x15cd)[0x7fb2651475cd]
/lib64/libdl.so.2(dlopen+0x31)[0x7fb2651470b1]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_FindSharedFuncptr+0x180)[0x7fb26573ee80]
/usr/lib64/libpython3.7m.so.1.0(_PyImport_LoadDynamicModuleWithSpec+0x14a)[0x7fb26570b11a]
/usr/lib64/libpython3.7m.so.1.0(+0x1a21df)[0x7fb2657091df]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(+0x184e7d)[0x7fb2656ebe7d]
/usr/lib64/libpython3.7m.so.1.0(_PyMethodDef_RawFastCallDict+0x2d1)[0x7fb2656025e1]
/usr/lib64/libpython3.7m.so.1.0(_PyCFunction_FastCallDict+0x25)[0x7fb265602675]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x8ee6)[0x7fb2655da3c6]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7cba)[0x7fb2655d919a]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(+0x1834e4)[0x7fb2656ea4e4]
/usr/lib64/libpython3.7m.so.1.0(PyCFunction_Call+0x108)[0x7fb265603d28]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7e00)[0x7fb2655d92e0]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallKeywords+0x8f)[0x7fb265601a5f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x6a45)[0x7fb2655d7f25]
/usr/lib64/libpython3.7m.so.1.0(+0x693df)[0x7fb2655d03df]
/usr/lib64/libpython3.7m.so.1.0(_PyFunction_FastCallDict+0x28f)[0x7fb2656019bf]
/usr/lib64/libpython3.7m.so.1.0(+0x9bd22)[0x7fb265602d22]
/usr/lib64/libpython3.7m.so.1.0(_PyObject_CallMethodIdObjArgs+0xa5)[0x7fb265602fd5]
/usr/lib64/libpython3.7m.so.1.0(PyImport_ImportModuleLevelObject+0x4df)[0x7fb26570a25f]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalFrameDefault+0x7ed9)[0x7fb2655d93b9]
/usr/lib64/libpython3.7m.so.1.0(_PyEval_EvalCodeWithName+0xa7b)[0x7fb2656eeb4b]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCodeEx+0x3e)[0x7fb2656eec4e]
/usr/lib64/libpython3.7m.so.1.0(PyEval_EvalCode+0x1b)[0x7fb2656eec7b]
/usr/lib64/libpython3.7m.so.1.0(PyRun_FileExFlags+0xaa)[0x7fb265722aaa]
/usr/lib64/libpython3.7m.so.1.0(PyRun_SimpleFileExFlags+0xdf)[0x7fb265722bff]
/usr/lib64/libpython3.7m.so.1.0(+0x1de7ac)[0x7fb2657457ac]
/usr/lib64/libpython3.7m.so.1.0(_Py_UnixMain+0x6a)[0x7fb265745e6a]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fb2648b8b15]
/usr/bin/python3[0x4006de]
------------------------------------------------------------------------
Attaching gdb to process id 24130.
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
0x00007fb265359429 in waitpid () from /lib64/libpthread.so.0

Stack backtrace
---------------
No symbol table info available.
#1  0x00007fb25b1d99d2 in print_enhanced_backtrace ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#2  0x00007fb25b1daff5 in sigdie ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#3  0x00007fb25b1dce6b in cysigs_signal_handler ()
   from /usr/lib/python3.7/site-packages/cysignals/signals.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#4  <signal handler called>
No symbol table info available.
#5  0x00007fb25922d638 in _GLOBAL__sub_I_fht_lsh.cpp ()
   from /usr/lib/python3.7/site-packages/g6k/siever_params.cpython-37m-x86_64-linux-gnu.so
No symbol table info available.
#6  0x00007fb265ad47ea in call_init.part () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#7  0x00007fb265ad48d3 in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#8  0x00007fb265ad8a38 in dl_open_worker () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#9  0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#10 0x00007fb265ad822b in _dl_open () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#11 0x00007fb26514701b in dlopen_doit () from /lib64/libdl.so.2
No symbol table info available.
#12 0x00007fb265ad4674 in _dl_catch_error () from /lib64/ld-linux-x86-64.so.2
No symbol table info available.
#13 0x00007fb2651475cd in _dlerror_run () from /lib64/libdl.so.2
No symbol table info available.
#14 0x00007fb2651470b1 in dlopen@@GLIBC_2.2.5 () from /lib64/libdl.so.2
No symbol table info available.
#15 0x00007fb26573ee80 in _PyImport_FindSharedFuncptr ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#16 0x00007fb26570b11a in _PyImport_LoadDynamicModuleWithSpec ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#17 0x00007fb2657091df in _imp_create_dynamic ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#18 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#19 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#20 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#21 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#22 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#23 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#24 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#25 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#26 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#27 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#28 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#29 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#30 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#31 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#32 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#33 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#34 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#35 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#36 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#37 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#38 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#39 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#40 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#41 0x00007fb2656ebe7d in builtin_exec () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#42 0x00007fb2656025e1 in _PyMethodDef_RawFastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#43 0x00007fb265602675 in _PyCFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#44 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#45 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#46 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#47 0x00007fb2655da3c6 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#48 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#49 0x00007fb2655d919a in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#50 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#51 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#52 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#53 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#54 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#55 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#56 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#57 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#58 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#59 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#60 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#61 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#62 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#63 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#64 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#65 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#66 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#67 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#68 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#69 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#70 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#71 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#72 0x00007fb2656ea4e4 in builtin___import__ ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#73 0x00007fb265603d28 in PyCFunction_Call ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#74 0x00007fb2655d92e0 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#75 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#76 0x00007fb265601a5f in _PyFunction_FastCallKeywords ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#77 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#78 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#79 0x00007fb2655d7f25 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#80 0x00007fb2655d03df in function_code_fastcall ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#81 0x00007fb2656019bf in _PyFunction_FastCallDict ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#82 0x00007fb265602d22 in object_vacall () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#83 0x00007fb265602fd5 in _PyObject_CallMethodIdObjArgs ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#84 0x00007fb26570a25f in PyImport_ImportModuleLevelObject ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#85 0x00007fb2655d93b9 in _PyEval_EvalFrameDefault ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#86 0x00007fb2656eeb4b in _PyEval_EvalCodeWithName ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#87 0x00007fb2656eec4e in PyEval_EvalCodeEx ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#88 0x00007fb2656eec7b in PyEval_EvalCode ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#89 0x00007fb265722aaa in PyRun_FileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#90 0x00007fb265722bff in PyRun_SimpleFileExFlags ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#91 0x00007fb2657457ac in pymain_main.constprop ()
   from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#92 0x00007fb265745e6a in _Py_UnixMain () from /usr/lib64/libpython3.7m.so.1.0
No symbol table info available.
#93 0x00007fb2648b8b15 in __libc_start_main () from /lib64/libc.so.6
No symbol table info available.
#94 0x00000000004006de in _start ()
No symbol table info available.
Traceback (most recent call last):
  File "<string>", line 25, in <module>
ImportError: No module named Cython.Debugger
Error while executing Python code.

Your system GDB uses an incompatible version of Python.
Install gdb for enhanced tracebacks.
------------------------------------------------------------------------
Unhandled SIGILL: An illegal instruction occurred.
This probably occurred because a *compiled* module has a bug
in it and is not properly wrapped with sig_on(), sig_off().
Python will now terminate.
------------------------------------------------------------------------
Illegal instruction

Maybe same as https://github.com/fplll/g6k/issues/72 ?

Fix patch:
diff --git a/.gitignore b/.gitignore
index 6045d201..f121072c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,32 @@
 /build/
 /dist/
 /G6K.egg-info/
+/Makefile
+/Makefile.in
+/aclocal.m4
+/autom4te.cache/
+/compile
+/config.guess
+/config.status
+/config.sub
+/configure
+/depcomp
+/g6k.pc
+/install-sh
+/kernel/.deps/
+/kernel/.libs/
+*.lo
+*~
+/kernel/libg6k.la
+stamp-h1
+/kernel/g6k_config.h
+/kernel/Makefile.in
+/kernel/Makefile
+/m4/lt~obsolete.m4
+/m4/ltversion.m4
+/m4/ltsugar.m4
+/m4/ltoptions.m4
+/m4/libtool.m4
+/missing
+/ltmain.sh
+/libtool
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..45bdce85
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,13 @@
+global-include README.rst requirements.txt install-dependencies.sh
+global-include setup.py *.pyx
+graft g6k
+include tests/test_*
+include examples/*.py
+include kernel/*.cpp kernel/*.inl kernel/*.hpp kernel/*.h kernel/untemplate.mac
+include configure.ac Makefile.am kernel/Makefile.am m4/*
+include configure Makefile.in kernel/Makefile.in g6k.pc.in kernel/g6k_config.h.in 
+include install-sh config.sub config.guess ltmain.sh compile depcomp missing
+include Dockerfile Dockerfile.sagemath
+include LICENSE
+prune build
+prune dist
diff --git a/Makefile b/Makefile
deleted file mode 100755
index e7dd6f96..00000000
--- a/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-SUBDIRS := kernel
-
-all: $(SUBDIRS)
-
-$(SUBDIRS):
-	$(MAKE) -C $@
-
-clean:
-	for dir in "${SUBDIRS}"; do make -C "$${dir}" clean; done
-	-rm -f g6k/*.so
-	-rm -rf build
-	-rm -f g6k/siever.cpp
-	-rm -f g6k/siever.so
-
-.PHONY: all $(SUBDIRS) clean python
diff --git a/Makefile.am b/Makefile.am
new file mode 100755
index 00000000..5c6d0a0f
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,6 @@
+ACLOCAL_AMFLAGS    = -I m4
+
+SUBDIRS = kernel
+
+clean-local:
+	-rm -rf build/*
diff --git a/README.rst b/README.rst
index fb2ee901..4302c526 100644
--- a/README.rst
+++ b/README.rst
@@ -20,12 +20,17 @@ You will need the current master of FPyLLL. See ``bootstrap.sh`` for creating (a
 
 .. code-block:: bash
 
-    ./bootstrap.sh [ -j # ]       # once only: creates local python env, builds fplll, fpylll and G6K
-    source ./activate             # for every new shell: activates local python env
-    ./rebuild.sh -f [ -j # ]      # whenever you want to rebuild G6K
+    # once only: creates local python env, builds fplll, fpylll and G6K
+    ./bootstrap.sh [ -j # ]
+    
+    # for every new shell: activates local python env
+    source ./activate                   
 
 On systems with co-existing python2 and 3, you can force a specific version installation using ``PYTHON=<pythoncmd> ./boostrap.sh`` instead.
-The number of parallel compilation jobs can be controlled with `-j #`, which defaults to 4.
+The number of parallel compilation jobs can be controlled with `-j #`.
+
+If building via ```./bootstrap.sh``` fails, then the script will return an error code. 
+The error codes are documented in ```bootstrap.sh.```
 
 Otherwise, you will need fplll and fpylll already installed and build the G6K Cython extension **in place** like so:
 
@@ -33,13 +38,16 @@ Otherwise, you will need fplll and fpylll already installed and build the G6K Cy
 
     pip install Cython
     pip install -r requirements.txt
-    ./rebuild.sh -f
+    python setup.py build [ -j # ]
 
-Remove ``-f`` option to compile faster (fewer optimisations). See ``rebuild.sh`` for more options.
+It's possible to alter the C++ kernel build configuration as follows:
 
-If building via ```./bootstrap.sh``` fails, then the script will return an error code. 
-The error codes are documented in ```bootstrap.sh.```
+.. code-block:: bash
 
+    make clean
+    ./configure [opts...]           # e.g. opts: --enable-native --enable-templated-dim --with-max-sieving-dim=128
+                                    # see ./configure --help for more options
+    python setup.py build [ -j # ]
 
 Tests
 =====
diff --git a/bootstrap.sh b/bootstrap.sh
index 11a06506..8b0da2be 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -109,13 +109,13 @@ $PIP install Cython
 $PIP install -r requirements.txt
 $PIP install -r suggestions.txt
 $PYTHON setup.py clean
-$PYTHON setup.py build_ext $jobs || $PYTHON setup.py build_ext
+$PYTHON setup.py build $jobs || $PYTHON setup.py build
 $PYTHON setup.py install
 cd ..
 
 $PIP install -r requirements.txt
 $PYTHON setup.py clean
-$PYTHON setup.py build_ext $jobs --inplace || $PYTHON setup.py build_ext --inplace
+$PYTHON setup.py build $jobs --inplace || $PYTHON setup.py build --inplace
 
 echo " "
 echo "Don't forget to activate environment each time:"
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 00000000..cc4236d9
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,180 @@
+# -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ(2.61)
+AC_INIT(g6k-kernel, 0.1.1)
+AC_CANONICAL_HOST
+AC_CONFIG_SRCDIR([kernel/sieving.cpp])
+AM_MAINTAINER_MODE([enable])
+
+AC_CONFIG_MACRO_DIR([m4])
+AM_INIT_AUTOMAKE([foreign subdir-objects])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+#
+# First extract pieces from the version number string
+# 
+G6K_MAJOR_VERSION=`echo AC_PACKAGE_VERSION | awk -F. '{print $1}'`
+G6K_MINOR_VERSION=`echo AC_PACKAGE_VERSION | awk -F. '{print $2}'`
+G6K_MICRO_VERSION=`echo AC_PACKAGE_VERSION | awk -F. '{print $3}'`
+G6K_VERSION=$G6K_MAJOR_VERSION.$G6K_MINOR_VERSION.$G6K_MICRO_VERSION$G6K_MICRO_VERSION_SUFFIX
+G6K_VERSION_NUMBER=`expr $G6K_MAJOR_VERSION \* 1000000 + $G6K_MINOR_VERSION \* 1000 + $G6K_MICRO_VERSION`
+
+#
+# Store version numbers in header
+#
+AC_DEFINE_UNQUOTED([G6K_MAJOR_VERSION],[$G6K_MAJOR_VERSION],[major version])
+AC_DEFINE_UNQUOTED([G6K_MINOR_VERSION],[$G6K_MINOR_VERSION],[minor version])
+AC_DEFINE_UNQUOTED([G6K_MICRO_VERSION],[$G6K_MICRO_VERSION],[micro version])
+AC_DEFINE_UNQUOTED([G6K_VERSION],[$G6K_VERSION],[full version])
+AC_DEFINE_UNQUOTED([G6K_VERSION_INFO],[$G6K_VERSION_INFO],[long version string])
+
+#
+# Libtool
+# 
+AC_PROG_LIBTOOL
+
+# The version of the libtool library is of the form current:revision:age
+#
+# See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+#
+# When doing a release, they should be updated like this:
+# 1. If no interfaces changed, only implementations: just increment
+#    revision.
+# 2. If interfaces were added, none removed: increment current, set
+#    revision to zero and increment age.
+# 3. If interfaces were removed (breaks backward compatibility): increment
+#    current, and set both revision and age to zero.
+
+G6K_LT_CURRENT=1
+G6K_LT_REVISION=0
+G6K_LT_AGE=0
+
+AC_SUBST(G6K_LT_CURRENT)
+AC_SUBST(G6K_LT_REVISION)
+AC_SUBST(G6K_LT_AGE)
+
+
+#
+# Default flags.
+#
+
+DEFAULT_CXXFLAGS="-Ofast -ftree-vectorize -funroll-loops -Wall -Wextra"
+CXXFLAGS=${CXXFLAGS:-$DEFAULT_CXXFLAGS}
+
+#
+# Checks for programs.
+#
+AC_LANG_CPLUSPLUS
+AC_PROG_CXX
+AX_CXX_COMPILE_STDCXX([11],[noext],[mandatory])
+
+AX_PTHREAD
+
+#
+# Distributions may want to disable extensions in their build
+#
+
+AC_ARG_ENABLE(native,
+AC_HELP_STRING([--enable-native],
+               [build a binary optimized for the CPU found at compile time on systems that support it [default=yes]]),
+               [case $enableval in
+                  yes|no) ;;
+                  *) AC_MSG_ERROR([bad value $enableval for --enable-native, need yes or no]) ;;
+                esac],
+               [enable_native=yes]
+)
+
+if test $enable_native = "yes"; then
+  AX_CHECK_COMPILE_FLAG([-march=native], [], [enable_native=no])
+  AX_EXT
+  CXXFLAGS="${CXXFLAGS} ${SIMD_FLAGS}"
+fi
+
+#
+# Template Dimensions
+#
+
+AC_ARG_ENABLE(templated-dim,
+AC_HELP_STRING([--enable-templated-dim],
+               [enable templated dimensions (longer compilation time, better performance) [default=no]]),
+               [case $enableval in
+                  yes|no) ;;
+                  *) AC_MSG_ERROR([bad value $enableval for --enable-templated-dim, need yes or no]) ;;
+                esac],
+               [enable_templated_dim=no]
+)
+
+if test $enable_templated_dim = "yes"; then
+     AC_DEFINE_UNQUOTED([TEMPLATED_DIM], 1, [enable templated dimensions])
+fi
+
+#
+# Enable CPU counters
+#
+
+AC_ARG_ENABLE(cpucounters,
+AC_HELP_STRING([--enable-cpucounters],
+               [enable cpu performance counters [default=no]]),
+               [case $enableval in
+                  yes|no) ;;
+                  *) AC_MSG_ERROR([bad value $enableval for --enable-cpucounters, need yes or no]) ;;
+                esac],
+               [enable_cpucounters=no]
+)
+
+if test $enable_cpucounters = "yes"; then
+   CXXFLAGS="${CXXFLAGS} -DPERFORMANCE_COUNTING"
+fi
+
+#
+# Enable stats
+# 
+
+enable_stats=0
+
+AC_ARG_WITH(stats,
+    AC_HELP_STRING([--with-stats@<:@=STATS@:>@], [enable statistics [supported=0,1,2; default=0]]),
+    [enable_stats=$withval],
+    [enable_stats=0]
+)
+
+if test $enable_stats = "1"; then
+    AC_DEFINE_UNQUOTED([ENABLE_STATS], 1, [enable statistics])
+elif test $enable_stats = "2"; then
+    AC_DEFINE_UNQUOTED([ENABLE_EXTENDED_STATS], 1, [enable extended statistics])
+fi
+
+#
+# Sieving parameters
+#
+
+AC_ARG_WITH(max-sieving-dim,
+        AS_HELP_STRING([--with-max-sieving-dim@<:@=DIM@:>@], [maximum supported sieving dimension [default=128]]),
+        [max_sieving_dim=$withval],
+        [max_sieving_dim=128])
+
+AC_DEFINE_UNQUOTED([MAX_SIEVING_DIM], $max_sieving_dim, [maximum supported sieving dimension])
+
+AC_ARG_WITH(xpc-bucket-threshold,
+        AS_HELP_STRING([--with-xpc-bucket-threshold@<:@=DIM@:>@], [XPC bucket threshold [default=102]]),
+        [xpc_bucket_threshold=$withval],
+        [xpc_bucket_threshold=102])
+
+AC_DEFINE_UNQUOTED([XPC_BUCKET_THRESHOLD], $xpc_bucket_threshold, [popcount hamming weight threshold for buckets])
+
+AC_ARG_WITH(xpc-threshold,
+        AS_HELP_STRING([--with-xpc-threshold@<:@=DIM@:>@], [XPC threshold [default=96]]),
+        [xpc_threshold=$withval],
+        [xpc_threshold=96])
+
+AC_DEFINE_UNQUOTED([XPC_THRESHOLD], $xpc_threshold, [popcount hamming weight threshold for pairs])
+
+CXXFLAGS="${CXXFLAGS}"
+
+AC_CONFIG_HEADER(kernel/g6k_config.h)
+AC_CONFIG_FILES([Makefile
+                 kernel/Makefile
+                 g6k.pc])
+
+AC_OUTPUT
diff --git a/g6k.pc.in b/g6k.pc.in
new file mode 100644
index 00000000..ac985be8
--- /dev/null
+++ b/g6k.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: @PACKAGE_NAME@
+Description: lattice algorithms with floating-point computations
+Version: @PACKAGE_VERSION@
+Cflags: @PTHREAD_CFLAGS@ @CXXFLAGS@
+Libs: @PTHREAD_LIBS@ @LIBS@ 
diff --git a/g6k/__init__.py b/g6k/__init__.py
index 810dc40f..891e7e1c 100644
--- a/g6k/__init__.py
+++ b/g6k/__init__.py
@@ -19,7 +19,8 @@
 ####
 
 
-
 from __future__ import absolute_import
-from .siever_params import SieverParams # noqa
-from .siever import Siever # noqa
+from .siever_params import SieverParams  # noqa
+from .siever import Siever  # noqa
+
+__version__ = "0.1.1"
diff --git a/install-dependencies.sh b/install-dependencies.sh
index af5306b5..2089b408 100755
--- a/install-dependencies.sh
+++ b/install-dependencies.sh
@@ -18,7 +18,7 @@ pip install Cython
 pip install -r requirements.txt
 pip install -r suggestions.txt
 python setup.py clean
-python setup.py build_ext
+python setup.py build
 python setup.py install
 cd ..
 
diff --git a/kernel/Makefile b/kernel/Makefile
deleted file mode 100644
index 39a54019..00000000
--- a/kernel/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-CXXFLAGS += -fPIC -Ofast -mavx2 -maes -ftree-vectorize -funroll-loops -std=c++11 -pthread -Wall -Wextra $(EXTRAFLAGS)
-LDFLAGS += -shared -pthread
-LIBADD += -lpthread
-OBJ = sieving.o control.o bgj1_sieve.o bdgl_sieve.o fht_lsh.o params.o cpuperf.o hk3_sieve.o
-HEADERS = siever.h siever.inl hash_table.inl db.inl simhash.inl fht_lsh.h
-
-all: G6Klib.so
-
-G6Klib.so: $(OBJ)
-	$(CXX) $(LDFLAGS)  $(LIBADD) $^ -o $@
-
-%.o: %.cpp siever.h siever.inl
-	$(CXX) $(CXXFLAGS) -c $< -o $@
-
-clean:
-	-rm *.o *.so
diff --git a/kernel/Makefile.am b/kernel/Makefile.am
new file mode 100644
index 00000000..8bc3cf04
--- /dev/null
+++ b/kernel/Makefile.am
@@ -0,0 +1,7 @@
+lib_LTLIBRARIES=libg6k.la
+
+libg6k_la_LDFLAGS=-no-undefined -version-info @G6K_LT_CURRENT@:@G6K_LT_REVISION@:@G6K_LT_AGE@ $(PTHREAD_CFLAGS)
+libg6k_la_LIBADD=$(LIBQD_LIBS)
+# We need this all to be on one line, setup.py reads this. Yep, it's a HACK
+libg6k_la_SOURCES=sieving.cpp control.cpp bgj1_sieve.cpp bdgl_sieve.cpp hk3_sieve.cpp fht_lsh.cpp params.cpp cpuperf.cpp
+include_HEADERS=compat.hpp cpuperformance.hpp db.inl fht_lsh.h hash_table.inl parallel_algorithms.hpp random.hpp siever.h siever.inl simhash.inl statistics.hpp thread_pool.hpp untemplate.mac
diff --git a/kernel/bdgl_sieve.cpp b/kernel/bdgl_sieve.cpp
index 66c172c0..03fc5ddb 100644
--- a/kernel/bdgl_sieve.cpp
+++ b/kernel/bdgl_sieve.cpp
@@ -58,6 +58,8 @@ std::pair<LFT, int8_t> Siever::reduce_to_QEntry(CompressedEntry *ce1, Compressed
     return { new_l, sign };
 }
 
+#ifdef HAVE_AVX2
+
 inline int Siever::bdgl_reduce_with_delayed_replace(const size_t i1, const size_t i2, LFT const lenbound, std::vector<Entry>& transaction_db, int64_t& write_index, LFT new_l, int8_t sign)
 {
     if (new_l < lenbound)
@@ -376,7 +378,7 @@ void Siever::bdgl_queue(std::vector<std::vector<QEntry>> &t_queues, std::vector<
 }
 
 bool Siever::bdgl_sieve(size_t nr_buckets_aim, const size_t blocks, const size_t multi_hash) {
-
+    assert(this->supports_bdgl);
     switch_mode_to(SieveStatus::plain);
     parallel_sort_cdb();
     statistics.inc_stats_sorting_sieve();
@@ -419,3 +421,77 @@ bool Siever::bdgl_sieve(size_t nr_buckets_aim, const size_t blocks, const size_t
         it++;
     }
 }
+
+#else
+// These are defined solely to make the Cython layer happy.
+// Please note that the parameters are deliberately unnamed -- this is solely to silence the plethora
+// of unused parameter warnings.
+inline int Siever::bdgl_reduce_with_delayed_replace(const size_t, const size_t, LFT const, std::vector<Entry>&, int64_t&, LFT, int8_t)
+{
+    assert(false);
+    __builtin_unreachable(); // Not necessary but silences compiler warning on return value.
+}
+
+inline void Siever::bdgl_lift(const size_t, const size_t, LFT, int8_t)
+{   
+    assert(false);
+}
+
+bool Siever::bdgl_replace_in_db(size_t, Entry&)
+{
+    assert(false);
+    __builtin_unreachable();
+}
+
+void Siever::bdgl_bucketing_task(const size_t, std::vector<uint32_t>&, 
+		std::vector<atomic_size_t_wrapper> &, ProductLSH &)
+{ 
+   assert(false);
+}
+
+// assumes buckets and buckets_index are resized and resetted correctly.
+void Siever::bdgl_bucketing(const size_t, const size_t, const size_t, 
+    std::vector<uint32_t>&, std::vector<atomic_size_t_wrapper>&)
+{
+	assert(false);
+}
+
+void Siever::bdgl_process_buckets_task(const size_t, 
+    const std::vector<uint32_t>&, 
+    const std::vector<atomic_size_t_wrapper>&, std::vector<QEntry> &)
+{
+    assert(false);
+}
+
+// Returned queue is sorted
+void Siever::bdgl_process_buckets(const std::vector<uint32_t> &, 
+		const std::vector<atomic_size_t_wrapper> &, 
+    std::vector<std::vector<QEntry>> &)
+{
+	assert(false);
+}
+
+void Siever::bdgl_queue_dup_remove_task( std::vector<QEntry>&) {
+    	assert(false);
+}
+
+void Siever::bdgl_queue_create_task( const size_t, const std::vector<QEntry>&, 
+		std::vector<Entry>&, int64_t&) {
+	assert(false);
+}
+
+size_t Siever::bdgl_queue_insert_task(const size_t, std::vector<Entry>&, int64_t) {
+	assert(false);
+	__builtin_unreachable();
+}
+
+void Siever::bdgl_queue(std::vector<std::vector<QEntry>>&, std::vector<std::vector<Entry>>&) {
+	assert(false);
+}
+
+bool Siever::bdgl_sieve(size_t, const size_t, const size_t) {
+	assert(false);
+	__builtin_unreachable();
+}
+
+#endif
diff --git a/kernel/fht_lsh.cpp b/kernel/fht_lsh.cpp
index 6c5db779..a0c84f02 100644
--- a/kernel/fht_lsh.cpp
+++ b/kernel/fht_lsh.cpp
@@ -20,6 +20,9 @@
 
 //// https://github.com/lducas/AVX2-BDGL-bucketer commit 630c2286a440fae1eddd9f90341ff2020f18b614
 
+#include "g6k_config.h"
+
+#ifdef HAVE_AVX2
 #include "fht_lsh.h"
 
 
@@ -598,3 +601,4 @@ void ProductLSH::hash(const float * const v, int32_t * const res)
     }
 
 }
+#endif
diff --git a/kernel/fht_lsh.h b/kernel/fht_lsh.h
index 779d1ebe..1ff76b46 100644
--- a/kernel/fht_lsh.h
+++ b/kernel/fht_lsh.h
@@ -17,12 +17,12 @@
 *
 ****/
 
-
 //// https://github.com/lducas/AVX2-BDGL-bucketer commit 630c2286a440fae1eddd9f90341ff2020f18b614
 
 #ifndef G6K_FHTLSH_H
 #define G6K_FHTLSH_H
 
+#ifdef HAVE_AVX2
 #include <immintrin.h>
 #include <stdio.h>
 #include <assert.h>
@@ -341,3 +341,4 @@ class ProductLSH
     };
 
 #endif
+#endif
diff --git a/kernel/g6k_config.h.in b/kernel/g6k_config.h.in
new file mode 100644
index 00000000..a015e31f
--- /dev/null
+++ b/kernel/g6k_config.h.in
@@ -0,0 +1,207 @@
+/* kernel/g6k_config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* enable extended statistics */
+#undef ENABLE_EXTENDED_STATS
+
+/* enable statistics */
+#undef ENABLE_STATS
+
+/* major version */
+#undef G6K_MAJOR_VERSION
+
+/* micro version */
+#undef G6K_MICRO_VERSION
+
+/* minor version */
+#undef G6K_MINOR_VERSION
+
+/* full version */
+#undef G6K_VERSION
+
+/* long version string */
+#undef G6K_VERSION_INFO
+
+/* Define to 1 to support Advanced Bit Manipulation */
+#undef HAVE_ABM
+
+/* Define to 1 to support Multi-Precision Add-Carry Instruction Extensions */
+#undef HAVE_ADX
+
+/* Define to 1 to support Advanced Encryption Standard New Instruction Set
+   (AES-NI) */
+#undef HAVE_AES
+
+/* Support Altivec instructions */
+#undef HAVE_ALTIVEC
+
+/* Define to 1 to support Advanced Vector Extensions */
+#undef HAVE_AVX
+
+/* Define to 1 to support Advanced Vector Extensions 2 */
+#undef HAVE_AVX2
+
+/* Define to 1 to support AVX-512 Byte and Word Instructions */
+#undef HAVE_AVX512_BW
+
+/* Define to 1 to support AVX-512 Conflict Detection Instructions */
+#undef HAVE_AVX512_CD
+
+/* Define to 1 to support AVX-512 Doubleword and Quadword Instructions */
+#undef HAVE_AVX512_DQ
+
+/* Define to 1 to support AVX-512 Exponential & Reciprocal Instructions */
+#undef HAVE_AVX512_ER
+
+/* Define to 1 to support AVX-512 Foundation Extensions */
+#undef HAVE_AVX512_F
+
+/* Define to 1 to support AVX-512 Integer Fused Multiply Add Instructions */
+#undef HAVE_AVX512_IFMA
+
+/* Define to 1 to support AVX-512 Conflict Prefetch Instructions */
+#undef HAVE_AVX512_PF
+
+/* Define to 1 to support AVX-512 Vector Byte Manipulation Instructions */
+#undef HAVE_AVX512_VBMI
+
+/* Define to 1 to support AVX-512 Vector Length Extensions */
+#undef HAVE_AVX512_VL
+
+/* Define to 1 to support Bit Manipulation Instruction Set 1 */
+#undef HAVE_BMI1
+
+/* Define to 1 to support Bit Manipulation Instruction Set 2 */
+#undef HAVE_BMI2
+
+/* define if the compiler supports basic C++11 syntax */
+#undef HAVE_CXX11
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 to support Fused Multiply-Add Extensions 3 */
+#undef HAVE_FMA3
+
+/* Define to 1 to support Fused Multiply-Add Extensions 4 */
+#undef HAVE_FMA4
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 to support Multimedia Extensions */
+#undef HAVE_MMX
+
+/* Define to 1 to support Memory Protection Extensions */
+#undef HAVE_MPX
+
+/* Define to 1 to support Prefetch Vector Data Into Caches WT1 */
+#undef HAVE_PREFETCHWT1
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
+
+/* Define to 1 to support Digital Random Number Generator */
+#undef HAVE_RDRND
+
+/* Define to 1 to support Secure Hash Algorithm Extension */
+#undef HAVE_SHA
+
+/* Define to 1 to support Streaming SIMD Extensions */
+#undef HAVE_SSE
+
+/* Define to 1 to support Streaming SIMD Extensions */
+#undef HAVE_SSE2
+
+/* Define to 1 to support Streaming SIMD Extensions 3 */
+#undef HAVE_SSE3
+
+/* Define to 1 to support Streaming SIMD Extensions 4.1 */
+#undef HAVE_SSE4_1
+
+/* Define to 1 to support Streaming SIMD Extensions 4.2 */
+#undef HAVE_SSE4_2
+
+/* Define to 1 to support AMD Streaming SIMD Extensions 4a */
+#undef HAVE_SSE4a
+
+/* Define to 1 to support Supplemental Streaming SIMD Extensions 3 */
+#undef HAVE_SSSE3
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Support VSX instructions */
+#undef HAVE_VSX
+
+/* Define to 1 to support eXtended Operations Extensions */
+#undef HAVE_XOP
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* maximum supported sieving dimension */
+#undef MAX_SIEVING_DIM
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* enable templated dimensions */
+#undef TEMPLATED_DIM
+
+/* Version number of package */
+#undef VERSION
+
+/* popcount hamming weight threshold for buckets */
+#undef XPC_BUCKET_THRESHOLD
+
+/* popcount hamming weight threshold for pairs */
+#undef XPC_THRESHOLD
diff --git a/kernel/siever.h b/kernel/siever.h
index b9de6306..241331c9 100644
--- a/kernel/siever.h
+++ b/kernel/siever.h
@@ -41,6 +41,7 @@
 #include <condition_variable>
 #include "compat.hpp"
 #include "statistics.hpp"
+#include "g6k_config.h"
 
 using std::size_t;
 
@@ -431,9 +432,9 @@ class Siever
     */
 
     explicit Siever(const SieverParams &params, unsigned long int seed = 0) :
-        full_n(0), full_muT(), full_rr(), ll(0), l(0), r(-1), n(0), muT(), db(), cdb(),
-        best_lifts_so_far(), histo(),
-        rng(seed), sim_hashes(rng.rng_nolock())
+      full_n(0), full_muT(), full_rr(), ll(0), l(0), r(-1), n(0),
+      supports_bdgl{__builtin_cpu_supports("avx2") > 0}, muT(), db(), cdb(),
+      best_lifts_so_far(), histo(), rng(seed), sim_hashes(rng.rng_nolock())
 #ifdef PERFORMANCE_COUNTING
         , _totalcpu(perfcounters[0])
 #endif
@@ -444,6 +445,7 @@ class Siever
     explicit Siever(unsigned int full_n, double const* mu, const SieverParams &params, unsigned long int seed = 0)
         : Siever(params, seed)
     {
+        
         load_gso(full_n, mu);
         r = full_n;
     }
@@ -566,6 +568,8 @@ class Siever
     unsigned int r;                           // current context right position
     unsigned int n;                           // current context dimension, n = r - l
 
+    const bool supports_bdgl;                       // true if the machine supports bdgl at runtime, false otherwise 
+  
     // gso_update_postprocessing post-processes the database with the change-of-basis transformation M
     // - Thread-safety ensured by each thread working on different data
     // - Matrix M should have dimension old_n * new_n
diff --git a/m4/ax_check_compile_flag.m4 b/m4/ax_check_compile_flag.m4
new file mode 100644
index 00000000..bd753b34
--- /dev/null
+++ b/m4/ax_check_compile_flag.m4
@@ -0,0 +1,53 @@
+# ===========================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
+#
+# DESCRIPTION
+#
+#   Check whether the given FLAG works with the current language's compiler
+#   or gives an error.  (Warnings, however, are ignored)
+#
+#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
+#   success/failure.
+#
+#   If EXTRA-FLAGS is defined, it is added to the current language's default
+#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with
+#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be used to
+#   force the compiler to issue an error when a bad flag is given.
+#
+#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
+#
+#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
+#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 6
+
+AC_DEFUN([AX_CHECK_COMPILE_FLAG],
+[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
+AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
+  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
+  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
+  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
+    [AS_VAR_SET(CACHEVAR,[yes])],
+    [AS_VAR_SET(CACHEVAR,[no])])
+  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
+AS_VAR_IF(CACHEVAR,yes,
+  [m4_default([$2], :)],
+  [m4_default([$3], :)])
+AS_VAR_POPDEF([CACHEVAR])dnl
+])dnl AX_CHECK_COMPILE_FLAGS
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
new file mode 100644
index 00000000..43087b2e
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx.m4
@@ -0,0 +1,951 @@
+# ===========================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+#   Check for baseline language coverage in the compiler for the specified
+#   version of the C++ standard.  If necessary, add switches to CXX and
+#   CXXCPP to enable support.  VERSION may be '11' (for the C++11 standard)
+#   or '14' (for the C++14 standard).
+#
+#   The second argument, if specified, indicates whether you insist on an
+#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+#   -std=c++11).  If neither is specified, you get whatever works, with
+#   preference for an extended mode.
+#
+#   The third argument, if specified 'mandatory' or if left unspecified,
+#   indicates that baseline support for the specified C++ standard is
+#   required and that the macro should error out if no mode with that
+#   support is found.  If specified 'optional', then configuration proceeds
+#   regardless, after defining HAVE_CXX${VERSION} if and only if a
+#   supporting mode is found.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
+#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
+#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
+#   Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com>
+#   Copyright (c) 2015 Paul Norman <penorman@mac.com>
+#   Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu>
+#   Copyright (c) 2016, 2018 Krzesimir Nowak <qdlacz@gmail.com>
+#   Copyright (c) 2019 Enji Cooper <yaneurabeya@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved.  This file is offered as-is, without any
+#   warranty.
+
+#serial 11
+
+dnl  This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl  (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+  m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"],
+        [$1], [14], [ax_cxx_compile_alternatives="14 1y"],
+        [$1], [17], [ax_cxx_compile_alternatives="17 1z"],
+        [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+  m4_if([$2], [], [],
+        [$2], [ext], [],
+        [$2], [noext], [],
+        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+  m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+        [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+        [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+        [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+  AC_LANG_PUSH([C++])dnl
+  ac_success=no
+
+  m4_if([$2], [noext], [], [dnl
+  if test x$ac_success = xno; then
+    for alternative in ${ax_cxx_compile_alternatives}; do
+      switch="-std=gnu++${alternative}"
+      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+      AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+                     $cachevar,
+        [ac_save_CXX="$CXX"
+         CXX="$CXX $switch"
+         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+          [eval $cachevar=yes],
+          [eval $cachevar=no])
+         CXX="$ac_save_CXX"])
+      if eval test x\$$cachevar = xyes; then
+        CXX="$CXX $switch"
+        if test -n "$CXXCPP" ; then
+          CXXCPP="$CXXCPP $switch"
+        fi
+        ac_success=yes
+        break
+      fi
+    done
+  fi])
+
+  m4_if([$2], [ext], [], [dnl
+  if test x$ac_success = xno; then
+    dnl HP's aCC needs +std=c++11 according to:
+    dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+    dnl Cray's crayCC needs "-h std=c++11"
+    for alternative in ${ax_cxx_compile_alternatives}; do
+      for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do
+        cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+        AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+                       $cachevar,
+          [ac_save_CXX="$CXX"
+           CXX="$CXX $switch"
+           AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+            [eval $cachevar=yes],
+            [eval $cachevar=no])
+           CXX="$ac_save_CXX"])
+        if eval test x\$$cachevar = xyes; then
+          CXX="$CXX $switch"
+          if test -n "$CXXCPP" ; then
+            CXXCPP="$CXXCPP $switch"
+          fi
+          ac_success=yes
+          break
+        fi
+      done
+      if test x$ac_success = xyes; then
+        break
+      fi
+    done
+  fi])
+  AC_LANG_POP([C++])
+  if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+    if test x$ac_success = xno; then
+      AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+    fi
+  fi
+  if test x$ac_success = xno; then
+    HAVE_CXX$1=0
+    AC_MSG_NOTICE([No compiler with C++$1 support was found])
+  else
+    HAVE_CXX$1=1
+    AC_DEFINE(HAVE_CXX$1,1,
+              [define if the compiler supports basic C++$1 syntax])
+  fi
+  AC_SUBST(HAVE_CXX$1)
+])
+
+
+dnl  Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+
+dnl  Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17],
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+  _AX_CXX_COMPILE_STDCXX_testbody_new_in_17
+)
+
+dnl  Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+  namespace test_static_assert
+  {
+
+    template <typename T>
+    struct check
+    {
+      static_assert(sizeof(int) <= sizeof(T), "not big enough");
+    };
+
+  }
+
+  namespace test_final_override
+  {
+
+    struct Base
+    {
+      virtual ~Base() {}
+      virtual void f() {}
+    };
+
+    struct Derived : public Base
+    {
+      virtual ~Derived() override {}
+      virtual void f() override {}
+    };
+
+  }
+
+  namespace test_double_right_angle_brackets
+  {
+
+    template < typename T >
+    struct check {};
+
+    typedef check<void> single_type;
+    typedef check<check<void>> double_type;
+    typedef check<check<check<void>>> triple_type;
+    typedef check<check<check<check<void>>>> quadruple_type;
+
+  }
+
+  namespace test_decltype
+  {
+
+    int
+    f()
+    {
+      int a = 1;
+      decltype(a) b = 2;
+      return a + b;
+    }
+
+  }
+
+  namespace test_type_deduction
+  {
+
+    template < typename T1, typename T2 >
+    struct is_same
+    {
+      static const bool value = false;
+    };
+
+    template < typename T >
+    struct is_same<T, T>
+    {
+      static const bool value = true;
+    };
+
+    template < typename T1, typename T2 >
+    auto
+    add(T1 a1, T2 a2) -> decltype(a1 + a2)
+    {
+      return a1 + a2;
+    }
+
+    int
+    test(const int c, volatile int v)
+    {
+      static_assert(is_same<int, decltype(0)>::value == true, "");
+      static_assert(is_same<int, decltype(c)>::value == false, "");
+      static_assert(is_same<int, decltype(v)>::value == false, "");
+      auto ac = c;
+      auto av = v;
+      auto sumi = ac + av + 'x';
+      auto sumf = ac + av + 1.0;
+      static_assert(is_same<int, decltype(ac)>::value == true, "");
+      static_assert(is_same<int, decltype(av)>::value == true, "");
+      static_assert(is_same<int, decltype(sumi)>::value == true, "");
+      static_assert(is_same<int, decltype(sumf)>::value == false, "");
+      static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+      return (sumf > 0.0) ? sumi : add(c, v);
+    }
+
+  }
+
+  namespace test_noexcept
+  {
+
+    int f() { return 0; }
+    int g() noexcept { return 0; }
+
+    static_assert(noexcept(f()) == false, "");
+    static_assert(noexcept(g()) == true, "");
+
+  }
+
+  namespace test_constexpr
+  {
+
+    template < typename CharT >
+    unsigned long constexpr
+    strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+    {
+      return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+    }
+
+    template < typename CharT >
+    unsigned long constexpr
+    strlen_c(const CharT *const s) noexcept
+    {
+      return strlen_c_r(s, 0UL);
+    }
+
+    static_assert(strlen_c("") == 0UL, "");
+    static_assert(strlen_c("1") == 1UL, "");
+    static_assert(strlen_c("example") == 7UL, "");
+    static_assert(strlen_c("another\0example") == 7UL, "");
+
+  }
+
+  namespace test_rvalue_references
+  {
+
+    template < int N >
+    struct answer
+    {
+      static constexpr int value = N;
+    };
+
+    answer<1> f(int&)       { return answer<1>(); }
+    answer<2> f(const int&) { return answer<2>(); }
+    answer<3> f(int&&)      { return answer<3>(); }
+
+    void
+    test()
+    {
+      int i = 0;
+      const int c = 0;
+      static_assert(decltype(f(i))::value == 1, "");
+      static_assert(decltype(f(c))::value == 2, "");
+      static_assert(decltype(f(0))::value == 3, "");
+    }
+
+  }
+
+  namespace test_uniform_initialization
+  {
+
+    struct test
+    {
+      static const int zero {};
+      static const int one {1};
+    };
+
+    static_assert(test::zero == 0, "");
+    static_assert(test::one == 1, "");
+
+  }
+
+  namespace test_lambdas
+  {
+
+    void
+    test1()
+    {
+      auto lambda1 = [](){};
+      auto lambda2 = lambda1;
+      lambda1();
+      lambda2();
+    }
+
+    int
+    test2()
+    {
+      auto a = [](int i, int j){ return i + j; }(1, 2);
+      auto b = []() -> int { return '0'; }();
+      auto c = [=](){ return a + b; }();
+      auto d = [&](){ return c; }();
+      auto e = [a, &b](int x) mutable {
+        const auto identity = [](int y){ return y; };
+        for (auto i = 0; i < a; ++i)
+          a += b--;
+        return x + identity(a + b);
+      }(0);
+      return a + b + c + d + e;
+    }
+
+    int
+    test3()
+    {
+      const auto nullary = [](){ return 0; };
+      const auto unary = [](int x){ return x; };
+      using nullary_t = decltype(nullary);
+      using unary_t = decltype(unary);
+      const auto higher1st = [](nullary_t f){ return f(); };
+      const auto higher2nd = [unary](nullary_t f1){
+        return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+      };
+      return higher1st(nullary) + higher2nd(nullary)(unary);
+    }
+
+  }
+
+  namespace test_variadic_templates
+  {
+
+    template <int...>
+    struct sum;
+
+    template <int N0, int... N1toN>
+    struct sum<N0, N1toN...>
+    {
+      static constexpr auto value = N0 + sum<N1toN...>::value;
+    };
+
+    template <>
+    struct sum<>
+    {
+      static constexpr auto value = 0;
+    };
+
+    static_assert(sum<>::value == 0, "");
+    static_assert(sum<1>::value == 1, "");
+    static_assert(sum<23>::value == 23, "");
+    static_assert(sum<1, 2>::value == 3, "");
+    static_assert(sum<5, 5, 11>::value == 21, "");
+    static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+  }
+
+  // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+  // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+  // because of this.
+  namespace test_template_alias_sfinae
+  {
+
+    struct foo {};
+
+    template<typename T>
+    using member = typename T::member_type;
+
+    template<typename T>
+    void func(...) {}
+
+    template<typename T>
+    void func(member<T>*) {}
+
+    void test();
+
+    void test() { func<foo>(0); }
+
+  }
+
+}  // namespace cxx11
+
+#endif  // __cplusplus >= 201103L
+
+]])
+
+
+dnl  Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+  namespace test_polymorphic_lambdas
+  {
+
+    int
+    test()
+    {
+      const auto lambda = [](auto&&... args){
+        const auto istiny = [](auto x){
+          return (sizeof(x) == 1UL) ? 1 : 0;
+        };
+        const int aretiny[] = { istiny(args)... };
+        return aretiny[0];
+      };
+      return lambda(1, 1L, 1.0f, '1');
+    }
+
+  }
+
+  namespace test_binary_literals
+  {
+
+    constexpr auto ivii = 0b0000000000101010;
+    static_assert(ivii == 42, "wrong value");
+
+  }
+
+  namespace test_generalized_constexpr
+  {
+
+    template < typename CharT >
+    constexpr unsigned long
+    strlen_c(const CharT *const s) noexcept
+    {
+      auto length = 0UL;
+      for (auto p = s; *p; ++p)
+        ++length;
+      return length;
+    }
+
+    static_assert(strlen_c("") == 0UL, "");
+    static_assert(strlen_c("x") == 1UL, "");
+    static_assert(strlen_c("test") == 4UL, "");
+    static_assert(strlen_c("another\0test") == 7UL, "");
+
+  }
+
+  namespace test_lambda_init_capture
+  {
+
+    int
+    test()
+    {
+      auto x = 0;
+      const auto lambda1 = [a = x](int b){ return a + b; };
+      const auto lambda2 = [a = lambda1(x)](){ return a; };
+      return lambda2();
+    }
+
+  }
+
+  namespace test_digit_separators
+  {
+
+    constexpr auto ten_million = 100'000'000;
+    static_assert(ten_million == 100000000, "");
+
+  }
+
+  namespace test_return_type_deduction
+  {
+
+    auto f(int& x) { return x; }
+    decltype(auto) g(int& x) { return x; }
+
+    template < typename T1, typename T2 >
+    struct is_same
+    {
+      static constexpr auto value = false;
+    };
+
+    template < typename T >
+    struct is_same<T, T>
+    {
+      static constexpr auto value = true;
+    };
+
+    int
+    test()
+    {
+      auto x = 0;
+      static_assert(is_same<int, decltype(f(x))>::value, "");
+      static_assert(is_same<int&, decltype(g(x))>::value, "");
+      return x;
+    }
+
+  }
+
+}  // namespace cxx14
+
+#endif  // __cplusplus >= 201402L
+
+]])
+
+
+dnl  Tests for new features in C++17
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[
+
+// If the compiler admits that it is not ready for C++17, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201703L
+
+#error "This is not a C++17 compiler"
+
+#else
+
+#include <initializer_list>
+#include <utility>
+#include <type_traits>
+
+namespace cxx17
+{
+
+  namespace test_constexpr_lambdas
+  {
+
+    constexpr int foo = [](){return 42;}();
+
+  }
+
+  namespace test::nested_namespace::definitions
+  {
+
+  }
+
+  namespace test_fold_expression
+  {
+
+    template<typename... Args>
+    int multiply(Args... args)
+    {
+      return (args * ... * 1);
+    }
+
+    template<typename... Args>
+    bool all(Args... args)
+    {
+      return (args && ...);
+    }
+
+  }
+
+  namespace test_extended_static_assert
+  {
+
+    static_assert (true);
+
+  }
+
+  namespace test_auto_brace_init_list
+  {
+
+    auto foo = {5};
+    auto bar {5};
+
+    static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value);
+    static_assert(std::is_same<int, decltype(bar)>::value);
+  }
+
+  namespace test_typename_in_template_template_parameter
+  {
+
+    template<template<typename> typename X> struct D;
+
+  }
+
+  namespace test_fallthrough_nodiscard_maybe_unused_attributes
+  {
+
+    int f1()
+    {
+      return 42;
+    }
+
+    [[nodiscard]] int f2()
+    {
+      [[maybe_unused]] auto unused = f1();
+
+      switch (f1())
+      {
+      case 17:
+        f1();
+        [[fallthrough]];
+      case 42:
+        f1();
+      }
+      return f1();
+    }
+
+  }
+
+  namespace test_extended_aggregate_initialization
+  {
+
+    struct base1
+    {
+      int b1, b2 = 42;
+    };
+
+    struct base2
+    {
+      base2() {
+        b3 = 42;
+      }
+      int b3;
+    };
+
+    struct derived : base1, base2
+    {
+        int d;
+    };
+
+    derived d1 {{1, 2}, {}, 4};  // full initialization
+    derived d2 {{}, {}, 4};      // value-initialized bases
+
+  }
+
+  namespace test_general_range_based_for_loop
+  {
+
+    struct iter
+    {
+      int i;
+
+      int& operator* ()
+      {
+        return i;
+      }
+
+      const int& operator* () const
+      {
+        return i;
+      }
+
+      iter& operator++()
+      {
+        ++i;
+        return *this;
+      }
+    };
+
+    struct sentinel
+    {
+      int i;
+    };
+
+    bool operator== (const iter& i, const sentinel& s)
+    {
+      return i.i == s.i;
+    }
+
+    bool operator!= (const iter& i, const sentinel& s)
+    {
+      return !(i == s);
+    }
+
+    struct range
+    {
+      iter begin() const
+      {
+        return {0};
+      }
+
+      sentinel end() const
+      {
+        return {5};
+      }
+    };
+
+    void f()
+    {
+      range r {};
+
+      for (auto i : r)
+      {
+        [[maybe_unused]] auto v = i;
+      }
+    }
+
+  }
+
+  namespace test_lambda_capture_asterisk_this_by_value
+  {
+
+    struct t
+    {
+      int i;
+      int foo()
+      {
+        return [*this]()
+        {
+          return i;
+        }();
+      }
+    };
+
+  }
+
+  namespace test_enum_class_construction
+  {
+
+    enum class byte : unsigned char
+    {};
+
+    byte foo {42};
+
+  }
+
+  namespace test_constexpr_if
+  {
+
+    template <bool cond>
+    int f ()
+    {
+      if constexpr(cond)
+      {
+        return 13;
+      }
+      else
+      {
+        return 42;
+      }
+    }
+
+  }
+
+  namespace test_selection_statement_with_initializer
+  {
+
+    int f()
+    {
+      return 13;
+    }
+
+    int f2()
+    {
+      if (auto i = f(); i > 0)
+      {
+        return 3;
+      }
+
+      switch (auto i = f(); i + 4)
+      {
+      case 17:
+        return 2;
+
+      default:
+        return 1;
+      }
+    }
+
+  }
+
+  namespace test_template_argument_deduction_for_class_templates
+  {
+
+    template <typename T1, typename T2>
+    struct pair
+    {
+      pair (T1 p1, T2 p2)
+        : m1 {p1},
+          m2 {p2}
+      {}
+
+      T1 m1;
+      T2 m2;
+    };
+
+    void f()
+    {
+      [[maybe_unused]] auto p = pair{13, 42u};
+    }
+
+  }
+
+  namespace test_non_type_auto_template_parameters
+  {
+
+    template <auto n>
+    struct B
+    {};
+
+    B<5> b1;
+    B<'a'> b2;
+
+  }
+
+  namespace test_structured_bindings
+  {
+
+    int arr[2] = { 1, 2 };
+    std::pair<int, int> pr = { 1, 2 };
+
+    auto f1() -> int(&)[2]
+    {
+      return arr;
+    }
+
+    auto f2() -> std::pair<int, int>&
+    {
+      return pr;
+    }
+
+    struct S
+    {
+      int x1 : 2;
+      volatile double y1;
+    };
+
+    S f3()
+    {
+      return {};
+    }
+
+    auto [ x1, y1 ] = f1();
+    auto& [ xr1, yr1 ] = f1();
+    auto [ x2, y2 ] = f2();
+    auto& [ xr2, yr2 ] = f2();
+    const auto [ x3, y3 ] = f3();
+
+  }
+
+  namespace test_exception_spec_type_system
+  {
+
+    struct Good {};
+    struct Bad {};
+
+    void g1() noexcept;
+    void g2();
+
+    template<typename T>
+    Bad
+    f(T*, T*);
+
+    template<typename T1, typename T2>
+    Good
+    f(T1*, T2*);
+
+    static_assert (std::is_same_v<Good, decltype(f(g1, g2))>);
+
+  }
+
+  namespace test_inline_variables
+  {
+
+    template<class T> void f(T)
+    {}
+
+    template<class T> inline T g(T)
+    {
+      return T{};
+    }
+
+    template<> inline void f<>(int)
+    {}
+
+    template<> int g<>(int)
+    {
+      return 5;
+    }
+
+  }
+
+}  // namespace cxx17
+
+#endif  // __cplusplus < 201703L
+
+]])
diff --git a/m4/ax_ext.m4 b/m4/ax_ext.m4
new file mode 100644
index 00000000..b95d75a2
--- /dev/null
+++ b/m4/ax_ext.m4
@@ -0,0 +1,328 @@
+# ===========================================================================
+#          https://www.gnu.org/software/autoconf-archive/ax_ext.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_EXT
+#
+# DESCRIPTION
+#
+#   Find supported SIMD extensions by requesting cpuid. When a SIMD
+#   extension is found, the -m"simdextensionname" is added to SIMD_FLAGS if
+#   compiler supports it. For example, if "sse2" is available then "-msse2"
+#   is added to SIMD_FLAGS.
+#
+#   Find other supported CPU extensions by requesting cpuid. When a
+#   processor extension is found, the -m"extensionname" is added to
+#   CPUEXT_FLAGS if compiler supports it. For example, if "bmi2" is
+#   available then "-mbmi2" is added to CPUEXT_FLAGS.
+#
+#   This macro calls:
+#
+#     AC_SUBST(SIMD_FLAGS)
+#     AC_SUBST(CPUEXT_FLAGS)
+#
+#   And defines:
+#
+#     HAVE_RDRND / HAVE_BMI1 / HAVE_BMI2 / HAVE_ADX / HAVE_MPX
+#     HAVE_PREFETCHWT1 / HAVE_ABM / HAVE_MMX / HAVE_SSE / HAVE_SSE2
+#     HAVE_SSE3 / HAVE_SSSE3 / HAVE_SSE4_1 / HAVE_SSE4_2 / HAVE_SSE4a
+#     HAVE_SHA / HAVE_AES / HAVE_AVX / HAVE_FMA3 / HAVE_FMA4 / HAVE_XOP
+#     HAVE_AVX2 / HAVE_AVX512_F / HAVE_AVX512_CD / HAVE_AVX512_PF
+#     HAVE_AVX512_ER / HAVE_AVX512_VL / HAVE_AVX512_BW / HAVE_AVX512_DQ
+#     HAVE_AVX512_IFMA / HAVE_AVX512_VBMI / HAVE_ALTIVEC / HAVE_VSX
+#
+# LICENSE
+#
+#   Copyright (c) 2007 Christophe Tournayre <turn3r@users.sourceforge.net>
+#   Copyright (c) 2013,2015 Michael Petch <mpetch@capp-sysware.com>
+#   Copyright (c) 2017 Rafael de Lucena Valle <rafaeldelucena@gmail.com>
+#
+#   Copying and distribution of this file, with or without modification, are
+#   permitted in any medium without royalty provided the copyright notice
+#   and this notice are preserved. This file is offered as-is, without any
+#   warranty.
+
+#serial 18
+
+AC_DEFUN([AX_EXT],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_PROG_CC])
+
+  CPUEXT_FLAGS=""
+  SIMD_FLAGS=""
+
+  case $host_cpu in
+    powerpc*)
+      AC_CACHE_CHECK([whether altivec is supported for old distros], [ax_cv_have_altivec_old_ext],
+          [
+            if test `/usr/sbin/sysctl -a 2>/dev/null| grep -c hw.optional.altivec` != 0; then
+                if test `/usr/sbin/sysctl -n hw.optional.altivec` = 1; then
+                  ax_cv_have_altivec_old_ext=yes
+                fi
+            fi
+          ])
+
+          if test "$ax_cv_have_altivec_old_ext" = yes; then
+            AC_DEFINE(HAVE_ALTIVEC,,[Support Altivec instructions])
+            AX_CHECK_COMPILE_FLAG(-faltivec, SIMD_FLAGS="$SIMD_FLAGS -faltivec", [])
+          fi
+
+      AC_CACHE_CHECK([whether altivec is supported], [ax_cv_have_altivec_ext],
+          [
+            if test `LD_SHOW_AUXV=1 /bin/true 2>/dev/null|grep -c altivec` != 0; then
+              ax_cv_have_altivec_ext=yes
+            fi
+          ])
+
+          if test "$ax_cv_have_altivec_ext" = yes; then
+            AC_DEFINE(HAVE_ALTIVEC,,[Support Altivec instructions])
+            AX_CHECK_COMPILE_FLAG(-maltivec, SIMD_FLAGS="$SIMD_FLAGS -maltivec", [])
+          fi
+
+      AC_CACHE_CHECK([whether vsx is supported], [ax_cv_have_vsx_ext],
+          [
+            if test `LD_SHOW_AUXV=1 /bin/true 2>/dev/null|grep -c vsx` != 0; then
+                ax_cv_have_vsx_ext=yes
+            fi
+          ])
+
+          if test "$ax_cv_have_vsx_ext" = yes; then
+            AC_DEFINE(HAVE_VSX,,[Support VSX instructions])
+            AX_CHECK_COMPILE_FLAG(-mvsx, SIMD_FLAGS="$SIMD_FLAGS -mvsx", [])
+          fi
+    ;;
+
+    i[[3456]]86*|x86_64*|amd64*)
+
+      AC_REQUIRE([AX_GCC_X86_CPUID])
+      AC_REQUIRE([AX_GCC_X86_CPUID_COUNT])
+      AC_REQUIRE([AX_GCC_X86_AVX_XGETBV])
+
+      eax_cpuid0=0
+      AX_GCC_X86_CPUID(0x00000000)
+      if test "$ax_cv_gcc_x86_cpuid_0x00000000" != "unknown";
+      then
+        eax_cpuid0=`echo $ax_cv_gcc_x86_cpuid_0x00000000 | cut -d ":" -f 1`
+      fi
+
+      eax_cpuid80000000=0
+      AX_GCC_X86_CPUID(0x80000000)
+      if test "$ax_cv_gcc_x86_cpuid_0x80000000" != "unknown";
+      then
+        eax_cpuid80000000=`echo $ax_cv_gcc_x86_cpuid_0x80000000 | cut -d ":" -f 1`
+      fi
+
+      ecx_cpuid1=0
+      edx_cpuid1=0
+      if test "$((0x$eax_cpuid0))" -ge 1 ; then
+        AX_GCC_X86_CPUID(0x00000001)
+        if test "$ax_cv_gcc_x86_cpuid_0x00000001" != "unknown";
+        then
+          ecx_cpuid1=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 3`
+          edx_cpuid1=`echo $ax_cv_gcc_x86_cpuid_0x00000001 | cut -d ":" -f 4`
+        fi
+      fi
+
+      ebx_cpuid7=0
+      ecx_cpuid7=0
+      if test "$((0x$eax_cpuid0))" -ge 7 ; then
+        AX_GCC_X86_CPUID_COUNT(0x00000007, 0x00)
+        if test "$ax_cv_gcc_x86_cpuid_0x00000007" != "unknown";
+        then
+          ebx_cpuid7=`echo $ax_cv_gcc_x86_cpuid_0x00000007 | cut -d ":" -f 2`
+          ecx_cpuid7=`echo $ax_cv_gcc_x86_cpuid_0x00000007 | cut -d ":" -f 3`
+        fi
+      fi
+
+      ecx_cpuid80000001=0
+      edx_cpuid80000001=0
+      if test "$((0x$eax_cpuid80000000))" -ge "$((0x80000001))" ; then
+        AX_GCC_X86_CPUID(0x80000001)
+        if test "$ax_cv_gcc_x86_cpuid_0x80000001" != "unknown";
+        then
+          ecx_cpuid80000001=`echo $ax_cv_gcc_x86_cpuid_0x80000001 | cut -d ":" -f 3`
+          edx_cpuid80000001=`echo $ax_cv_gcc_x86_cpuid_0x80000001 | cut -d ":" -f 4`
+        fi
+      fi
+
+      AC_CACHE_VAL([ax_cv_have_mmx_os_support_ext],
+      [
+        ax_cv_have_mmx_os_support_ext=yes
+      ])
+
+      ax_cv_have_none_os_support_ext=yes
+
+      AC_CACHE_VAL([ax_cv_have_sse_os_support_ext],
+      [
+        ax_cv_have_sse_os_support_ext=no,
+        if test "$((0x$edx_cpuid1>>25&0x01))" = 1; then
+          AC_LANG_PUSH([C])
+          AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <signal.h>
+#include <stdlib.h>
+            /* No way at ring1 to ring3 in protected mode to check the CR0 and CR4
+               control registers directly. Execute an SSE instruction.
+               If it raises SIGILL then OS doesn't support SSE based instructions */
+            void sig_handler(int signum){ exit(1); }
+            int main(){
+              signal(SIGILL, sig_handler);
+              /* SSE instruction xorps  %xmm0,%xmm0 */
+              __asm__ __volatile__ (".byte 0x0f, 0x57, 0xc0");
+              return 0;
+            }]])],
+            [ax_cv_have_sse_os_support_ext=yes],
+            [ax_cv_have_sse_os_support_ext=no],
+            [ax_cv_have_sse_os_support_ext=no])
+          AC_LANG_POP([C])
+        fi
+      ])
+
+      xgetbv_eax=0
+      if test "$((0x$ecx_cpuid1>>28&0x01))" = 1; then
+        AX_GCC_X86_AVX_XGETBV(0x00000000)
+
+        if test x"$ax_cv_gcc_x86_avx_xgetbv_0x00000000" != x"unknown"; then
+          xgetbv_eax=`echo $ax_cv_gcc_x86_avx_xgetbv_0x00000000 | cut -d ":" -f 1`
+        fi
+
+        AC_CACHE_VAL([ax_cv_have_avx_os_support_ext],
+        [
+          ax_cv_have_avx_os_support_ext=no
+          if test "$((0x$ecx_cpuid1>>27&0x01))" = 1; then
+            if test "$((0x$xgetbv_eax&0x6))" = 6; then
+              ax_cv_have_avx_os_support_ext=yes
+            fi
+          fi
+        ])
+      fi
+
+      AC_CACHE_VAL([ax_cv_have_avx512_os_support_ext],
+      [
+        ax_cv_have_avx512_os_support_ext=no
+        if test "$ax_cv_have_avx_os_support_ext" = yes; then
+          if test "$((0x$xgetbv_eax&0xe6))" = "$((0xe6))"; then
+            ax_cv_have_avx512_os_support_ext=yes
+          fi
+        fi
+      ])
+
+      for ac_instr_info dnl
+      in "none;rdrnd;RDRND;ecx_cpuid1,30;-mrdrnd;HAVE_RDRND;CPUEXT_FLAGS" dnl
+         "none;bmi1;BMI1;ebx_cpuid7,3;-mbmi;HAVE_BMI1;CPUEXT_FLAGS" dnl
+         "none;bmi2;BMI2;ebx_cpuid7,8;-mbmi2;HAVE_BMI2;CPUEXT_FLAGS" dnl
+         "none;adx;ADX;ebx_cpuid7,19;-madx;HAVE_ADX;CPUEXT_FLAGS" dnl
+         "none;mpx;MPX;ebx_cpuid7,14;-mmpx;HAVE_MPX;CPUEXT_FLAGS" dnl
+         "none;prefetchwt1;PREFETCHWT1;ecx_cpuid7,0;-mprefetchwt1;HAVE_PREFETCHWT1;CPUEXT_FLAGS" dnl
+         "none;abm;ABM;ecx_cpuid80000001,5;-mabm;HAVE_ABM;CPUEXT_FLAGS" dnl
+         "mmx;mmx;MMX;edx_cpuid1,23;-mmmx;HAVE_MMX;SIMD_FLAGS" dnl
+         "sse;sse;SSE;edx_cpuid1,25;-msse;HAVE_SSE;SIMD_FLAGS" dnl
+         "sse;sse2;SSE2;edx_cpuid1,26;-msse2;HAVE_SSE2;SIMD_FLAGS" dnl
+         "sse;sse3;SSE3;ecx_cpuid1,1;-msse3;HAVE_SSE3;SIMD_FLAGS" dnl
+         "sse;ssse3;SSSE3;ecx_cpuid1,9;-mssse3;HAVE_SSSE3;SIMD_FLAGS" dnl
+         "sse;sse41;SSE4.1;ecx_cpuid1,19;-msse4.1;HAVE_SSE4_1;SIMD_FLAGS" dnl
+         "sse;sse42;SSE4.2;ecx_cpuid1,20;-msse4.2;HAVE_SSE4_2;SIMD_FLAGS" dnl
+         "sse;sse4a;SSE4a;ecx_cpuid80000001,6;-msse4a;HAVE_SSE4a;SIMD_FLAGS" dnl
+         "sse;sha;SHA;ebx_cpuid7,29;-msha;HAVE_SHA;SIMD_FLAGS" dnl
+         "sse;aes;AES;ecx_cpuid1,25;-maes;HAVE_AES;SIMD_FLAGS" dnl
+         "avx;avx;AVX;ecx_cpuid1,28;-mavx;HAVE_AVX;SIMD_FLAGS" dnl
+         "avx;fma3;FMA3;ecx_cpuid1,12;-mfma;HAVE_FMA3;SIMD_FLAGS" dnl
+         "avx;fma4;FMA4;ecx_cpuid80000001,16;-mfma4;HAVE_FMA4;SIMD_FLAGS" dnl
+         "avx;xop;XOP;ecx_cpuid80000001,11;-mxop;HAVE_XOP;SIMD_FLAGS" dnl
+         "avx;avx2;AVX2;ebx_cpuid7,5;-mavx2;HAVE_AVX2;SIMD_FLAGS" dnl
+         "avx512;avx512f;AVX512-F;ebx_cpuid7,16;-mavx512f;HAVE_AVX512_F;SIMD_FLAGS" dnl
+         "avx512;avx512cd;AVX512-CD;ebx_cpuid7,28;-mavx512cd;HAVE_AVX512_CD;SIMD_FLAGS" dnl
+         "avx512;avx512pf;AVX512-PF;ebx_cpuid7,26;-mavx512pf;HAVE_AVX512_PF;SIMD_FLAGS" dnl
+         "avx512;avx512er;AVX512-ER;ebx_cpuid7,27;-mavx512er;HAVE_AVX512_ER;SIMD_FLAGS" dnl
+         "avx512;avx512vl;AVX512-VL;ebx_cpuid7,31;-mavx512vl;HAVE_AVX512_VL;SIMD_FLAGS" dnl
+         "avx512;avx512bw;AVX512-BW;ebx_cpuid7,30;-mavx512bw;HAVE_AVX512_BW;SIMD_FLAGS" dnl
+         "avx512;avx512dq;AVX512-DQ;ebx_cpuid7,17;-mavx512dq;HAVE_AVX512_DQ;SIMD_FLAGS" dnl
+         "avx512;avx512ifma;AVX512-IFMA;ebx_cpuid7,21;-mavx512ifma;HAVE_AVX512_IFMA;SIMD_FLAGS" dnl
+         "avx512;avx512vbmi;AVX512-VBMI;ecx_cpuid7,1;-mavx512vbmi;HAVE_AVX512_VBMI;SIMD_FLAGS" dnl
+         #
+      do ac_instr_os_support=$(eval echo \$ax_cv_have_$(echo $ac_instr_info | cut -d ";" -f 1)_os_support_ext)
+         ac_instr_acvar=$(echo $ac_instr_info | cut -d ";" -f 2)
+         ac_instr_shortname=$(echo $ac_instr_info | cut -d ";" -f 3)
+         ac_instr_chk_loc=$(echo $ac_instr_info | cut -d ";" -f 4)
+         ac_instr_chk_reg=0x$(eval echo \$$(echo $ac_instr_chk_loc | cut -d "," -f 1))
+         ac_instr_chk_bit=$(echo $ac_instr_chk_loc | cut -d "," -f 2)
+         ac_instr_compiler_flags=$(echo $ac_instr_info | cut -d ";" -f 5)
+         ac_instr_have_define=$(echo $ac_instr_info | cut -d ";" -f 6)
+         ac_instr_flag_type=$(echo $ac_instr_info | cut -d ";" -f 7)
+
+         AC_CACHE_CHECK([whether ${ac_instr_shortname} is supported by the processor], [ax_cv_have_${ac_instr_acvar}_cpu_ext],
+         [
+           eval ax_cv_have_${ac_instr_acvar}_cpu_ext=no
+           if test "$((${ac_instr_chk_reg}>>${ac_instr_chk_bit}&0x01))" = 1 ; then
+             eval ax_cv_have_${ac_instr_acvar}_cpu_ext=yes
+           fi
+         ])
+
+         if test x"$(eval echo \$ax_cv_have_${ac_instr_acvar}_cpu_ext)" = x"yes"; then
+           AC_CACHE_CHECK([whether ${ac_instr_shortname} is supported by the processor and OS], [ax_cv_have_${ac_instr_acvar}_ext],
+           [
+             eval ax_cv_have_${ac_instr_acvar}_ext=no
+             if test x"${ac_instr_os_support}" = x"yes"; then
+               eval ax_cv_have_${ac_instr_acvar}_ext=yes
+             fi
+           ])
+
+           if test "$(eval echo \$ax_cv_have_${ac_instr_acvar}_ext)" = yes; then
+             AX_CHECK_COMPILE_FLAG(${ac_instr_compiler_flags}, eval ax_cv_support_${ac_instr_acvar}_ext=yes,
+                                                               eval ax_cv_support_${ac_instr_acvar}_ext=no)
+             if test x"$(eval echo \$ax_cv_support_${ac_instr_acvar}_ext)" = x"yes"; then
+               eval ${ac_instr_flag_type}=\"\$${ac_instr_flag_type} ${ac_instr_compiler_flags}\"
+               AC_DEFINE_UNQUOTED([${ac_instr_have_define}])
+             else
+               AC_MSG_WARN([Your processor and OS supports ${ac_instr_shortname} instructions but not your compiler, can you try another compiler?])
+             fi
+           else
+             if test x"${ac_instr_os_support}" = x"no"; then
+               AC_CACHE_VAL(ax_cv_support_${ac_instr_acvar}_ext, eval ax_cv_support_${ac_instr_acvar}_ext=no)
+               AC_MSG_WARN([Your processor supports ${ac_instr_shortname}, but your OS doesn't])
+             fi
+           fi
+         else
+           AC_CACHE_VAL(ax_cv_have_${ac_instr_acvar}_ext, eval ax_cv_have_${ac_instr_acvar}_ext=no)
+           AC_CACHE_VAL(ax_cv_support_${ac_instr_acvar}_ext, eval ax_cv_support_${ac_instr_acvar}_ext=no)
+         fi
+      done
+  ;;
+  esac
+
+  AH_TEMPLATE([HAVE_RDRND],[Define to 1 to support Digital Random Number Generator])
+  AH_TEMPLATE([HAVE_BMI1],[Define to 1 to support Bit Manipulation Instruction Set 1])
+  AH_TEMPLATE([HAVE_BMI2],[Define to 1 to support Bit Manipulation Instruction Set 2])
+  AH_TEMPLATE([HAVE_ADX],[Define to 1 to support Multi-Precision Add-Carry Instruction Extensions])
+  AH_TEMPLATE([HAVE_MPX],[Define to 1 to support Memory Protection Extensions])
+  AH_TEMPLATE([HAVE_PREFETCHWT1],[Define to 1 to support Prefetch Vector Data Into Caches WT1])
+  AH_TEMPLATE([HAVE_ABM],[Define to 1 to support Advanced Bit Manipulation])
+  AH_TEMPLATE([HAVE_MMX],[Define to 1 to support Multimedia Extensions])
+  AH_TEMPLATE([HAVE_SSE],[Define to 1 to support Streaming SIMD Extensions])
+  AH_TEMPLATE([HAVE_SSE2],[Define to 1 to support Streaming SIMD Extensions])
+  AH_TEMPLATE([HAVE_SSE3],[Define to 1 to support Streaming SIMD Extensions 3])
+  AH_TEMPLATE([HAVE_SSSE3],[Define to 1 to support Supplemental Streaming SIMD Extensions 3])
+  AH_TEMPLATE([HAVE_SSE4_1],[Define to 1 to support Streaming SIMD Extensions 4.1])
+  AH_TEMPLATE([HAVE_SSE4_2],[Define to 1 to support Streaming SIMD Extensions 4.2])
+  AH_TEMPLATE([HAVE_SSE4a],[Define to 1 to support AMD Streaming SIMD Extensions 4a])
+  AH_TEMPLATE([HAVE_SHA],[Define to 1 to support Secure Hash Algorithm Extension])
+  AH_TEMPLATE([HAVE_AES],[Define to 1 to support Advanced Encryption Standard New Instruction Set (AES-NI)])
+  AH_TEMPLATE([HAVE_AVX],[Define to 1 to support Advanced Vector Extensions])
+  AH_TEMPLATE([HAVE_FMA3],[Define to 1 to support  Fused Multiply-Add Extensions 3])
+  AH_TEMPLATE([HAVE_FMA4],[Define to 1 to support Fused Multiply-Add Extensions 4])
+  AH_TEMPLATE([HAVE_XOP],[Define to 1 to support eXtended Operations Extensions])
+  AH_TEMPLATE([HAVE_AVX2],[Define to 1 to support Advanced Vector Extensions 2])
+  AH_TEMPLATE([HAVE_AVX512_F],[Define to 1 to support AVX-512 Foundation Extensions])
+  AH_TEMPLATE([HAVE_AVX512_CD],[Define to 1 to support AVX-512 Conflict Detection Instructions])
+  AH_TEMPLATE([HAVE_AVX512_PF],[Define to 1 to support AVX-512 Conflict Prefetch Instructions])
+  AH_TEMPLATE([HAVE_AVX512_ER],[Define to 1 to support AVX-512 Exponential & Reciprocal Instructions])
+  AH_TEMPLATE([HAVE_AVX512_VL],[Define to 1 to support AVX-512 Vector Length Extensions])
+  AH_TEMPLATE([HAVE_AVX512_BW],[Define to 1 to support AVX-512 Byte and Word Instructions])
+  AH_TEMPLATE([HAVE_AVX512_DQ],[Define to 1 to support AVX-512 Doubleword and Quadword Instructions])
+  AH_TEMPLATE([HAVE_AVX512_IFMA],[Define to 1 to support AVX-512 Integer Fused Multiply Add Instructions])
+  AH_TEMPLATE([HAVE_AVX512_VBMI],[Define to 1 to support AVX-512 Vector Byte Manipulation Instructions])
+  AC_SUBST(SIMD_FLAGS)
+  AC_SUBST(CPUEXT_FLAGS)
+])
diff --git a/m4/ax_gcc_x86_avx_xgetbv.m4 b/m4/ax_gcc_x86_avx_xgetbv.m4
new file mode 100644
index 00000000..a57fc5ee
--- /dev/null
+++ b/m4/ax_gcc_x86_avx_xgetbv.m4
@@ -0,0 +1,79 @@
+# ===========================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_avx_xgetbv.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_GCC_X86_AVX_XGETBV
+#
+# DESCRIPTION
+#
+#   On later x86 processors with AVX SIMD support, with gcc or a compiler
+#   that has a compatible syntax for inline assembly instructions, run a
+#   small program that executes the xgetbv instruction with input OP. This
+#   can be used to detect if the OS supports AVX instruction usage.
+#
+#   On output, the values of the eax and edx registers are stored as
+#   hexadecimal strings as "eax:edx" in the cache variable
+#   ax_cv_gcc_x86_avx_xgetbv.
+#
+#   If the xgetbv instruction fails (because you are running a
+#   cross-compiler, or because you are not using gcc, or because you are on
+#   a processor that doesn't have this instruction),
+#   ax_cv_gcc_x86_avx_xgetbv_OP is set to the string "unknown".
+#
+#   This macro mainly exists to be used in AX_EXT.
+#
+# LICENSE
+#
+#   Copyright (c) 2013 Michael Petch <mpetch@capp-sysware.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 3
+
+AC_DEFUN([AX_GCC_X86_AVX_XGETBV],
+[AC_REQUIRE([AC_PROG_CC])
+AC_LANG_PUSH([C])
+AC_CACHE_CHECK(for x86-AVX xgetbv $1 output, ax_cv_gcc_x86_avx_xgetbv_$1,
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
+     int op = $1, eax, edx;
+     FILE *f;
+      /* Opcodes for xgetbv */
+      __asm__ __volatile__ (".byte 0x0f, 0x01, 0xd0"
+        : "=a" (eax), "=d" (edx)
+        : "c" (op));
+     f = fopen("conftest_xgetbv", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x\n", eax, edx);
+     fclose(f);
+     return 0;
+])],
+     [ax_cv_gcc_x86_avx_xgetbv_$1=`cat conftest_xgetbv`; rm -f conftest_xgetbv],
+     [ax_cv_gcc_x86_avx_xgetbv_$1=unknown; rm -f conftest_xgetbv],
+     [ax_cv_gcc_x86_avx_xgetbv_$1=unknown])])
+AC_LANG_POP([C])
+])
diff --git a/m4/ax_gcc_x86_cpuid.m4 b/m4/ax_gcc_x86_cpuid.m4
new file mode 100644
index 00000000..df954658
--- /dev/null
+++ b/m4/ax_gcc_x86_cpuid.m4
@@ -0,0 +1,89 @@
+# ===========================================================================
+#     https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_GCC_X86_CPUID(OP)
+#   AX_GCC_X86_CPUID_COUNT(OP, COUNT)
+#
+# DESCRIPTION
+#
+#   On Pentium and later x86 processors, with gcc or a compiler that has a
+#   compatible syntax for inline assembly instructions, run a small program
+#   that executes the cpuid instruction with input OP. This can be used to
+#   detect the CPU type. AX_GCC_X86_CPUID_COUNT takes an additional COUNT
+#   parameter that gets passed into register ECX before calling cpuid.
+#
+#   On output, the values of the eax, ebx, ecx, and edx registers are stored
+#   as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable
+#   ax_cv_gcc_x86_cpuid_OP.
+#
+#   If the cpuid instruction fails (because you are running a
+#   cross-compiler, or because you are not using gcc, or because you are on
+#   a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP
+#   is set to the string "unknown".
+#
+#   This macro mainly exists to be used in AX_GCC_ARCHFLAG.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2008 Matteo Frigo
+#   Copyright (c) 2015 Michael Petch <mpetch@capp-sysware.com>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 10
+
+AC_DEFUN([AX_GCC_X86_CPUID],
+[AX_GCC_X86_CPUID_COUNT($1, 0)
+])
+
+AC_DEFUN([AX_GCC_X86_CPUID_COUNT],
+[AC_REQUIRE([AC_PROG_CC])
+AC_LANG_PUSH([C])
+AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
+     int op = $1, level = $2, eax, ebx, ecx, edx;
+     FILE *f;
+      __asm__ __volatile__ ("xchg %%ebx, %1\n"
+        "cpuid\n"
+        "xchg %%ebx, %1\n"
+        : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)
+        : "a" (op), "2" (level));
+
+     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
+     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
+     fclose(f);
+     return 0;
+])],
+     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
+     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
+     [ax_cv_gcc_x86_cpuid_$1=unknown])])
+AC_LANG_POP([C])
+])
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
new file mode 100644
index 00000000..1598d077
--- /dev/null
+++ b/m4/ax_pthread.m4
@@ -0,0 +1,507 @@
+# ===========================================================================
+#        https://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+#   This macro figures out how to build C programs using POSIX threads. It
+#   sets the PTHREAD_LIBS output variable to the threads library and linker
+#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+#   flags that are needed. (The user can also force certain compiler
+#   flags/libs to be tested by setting these environment variables.)
+#
+#   Also sets PTHREAD_CC to any special C compiler that is needed for
+#   multi-threaded programs (defaults to the value of CC otherwise). (This
+#   is necessary on AIX to use the special cc_r compiler alias.)
+#
+#   NOTE: You are assumed to not only compile your program with these flags,
+#   but also to link with them as well. For example, you might link with
+#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+#   If you are only building threaded programs, you may wish to use these
+#   variables in your default LIBS, CFLAGS, and CC:
+#
+#     LIBS="$PTHREAD_LIBS $LIBS"
+#     CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+#     CC="$PTHREAD_CC"
+#
+#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+#   has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
+#   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+#   PTHREAD_CFLAGS.
+#
+#   ACTION-IF-FOUND is a list of shell commands to run if a threads library
+#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+#   is not found. If ACTION-IF-FOUND is not specified, the default action
+#   will define HAVE_PTHREAD.
+#
+#   Please let the authors know if this macro fails on any platform, or if
+#   you have any other suggestions or comments. This macro was based on work
+#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+#   Alejandro Forero Cuervo to the autoconf macro repository. We are also
+#   grateful for the helpful feedback of numerous users.
+#
+#   Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#   Copyright (c) 2019 Marc Stevens <marc.stevens@cwi.nl>
+#
+#   This program is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation, either version 3 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 27
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_SED])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+        ax_pthread_save_CC="$CC"
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
+        AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
+        AC_MSG_RESULT([$ax_pthread_ok])
+        if test "x$ax_pthread_ok" = "xno"; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        CC="$ax_pthread_save_CC"
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+#           (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads and
+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
+#      is present but should not be used directly; and before -mthreads,
+#      because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $host_os in
+
+        freebsd*)
+
+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+        ;;
+
+        hpux*)
+
+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+        # multi-threading and also sets -lpthread."
+
+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+        ;;
+
+        openedition*)
+
+        # IBM z/OS requires a feature-test macro to be defined in order to
+        # enable POSIX threads at all, so give the user a hint if this is
+        # not set. (We don't define these ourselves, as they can affect
+        # other portions of the system API in unpredictable ways.)
+
+        AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
+            [
+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+             AX_PTHREAD_ZOS_MISSING
+#            endif
+            ],
+            [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
+        ;;
+
+        solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed. (N.B.: The stubs are missing
+        # pthread_cleanup_push, or rather a function called by this macro,
+        # so we could check for that, but who knows whether they'll stub
+        # that too in a future libc.)  So we'll check first for the
+        # standard Solaris way of linking pthreads (-mt -lpthread).
+
+        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+        ;;
+esac
+
+# Are we compiling with Clang?
+
+AC_CACHE_CHECK([whether $CC is Clang],
+    [ax_cv_PTHREAD_CLANG],
+    [ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
+            [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+            ],
+            [ax_cv_PTHREAD_CLANG=yes])
+     fi
+    ])
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+AS_IF([test "x$GCC" = "xyes"],
+      [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"])
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+AS_IF([test "x$ax_pthread_clang" = "xyes"],
+      [ax_pthread_flags="-pthread,-lpthread -pthread"])
+
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+        darwin* | hpux* | linux* | osf* | solaris*)
+        ax_pthread_check_macro="_REENTRANT"
+        ;;
+
+        aix*)
+        ax_pthread_check_macro="_THREAD_SAFE"
+        ;;
+
+        *)
+        ax_pthread_check_macro="--"
+        ;;
+esac
+AS_IF([test "x$ax_pthread_check_macro" = "x--"],
+      [ax_pthread_check_cond=0],
+      [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
+
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                *,*)
+                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+                AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
+                AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void *some_global = NULL;
+                        static void routine(void *a)
+                          {
+                             /* To avoid any unused-parameter or
+                                unused-but-set-parameter warning.  */
+                             some_global = a;
+                          }
+                        static void *start_routine(void *a) { return a; }],
+                       [pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */])],
+            [ax_pthread_ok=yes],
+            [])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        AC_MSG_RESULT([$ax_pthread_ok])
+        AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+        # Clang takes -pthread; it has never supported any other flag
+
+        # (Note 1: This will need to be revisited if a system that Clang
+        # supports has POSIX threads in a separate library.  This tends not
+        # to be the way of modern systems, but it's conceivable.)
+
+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
+        # to get POSIX threads support; the API is always present and
+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
+        # -pthread does define _REENTRANT, and while the Darwin headers
+        # ignore this macro, third-party headers might not.)
+
+        # However, older versions of Clang make a point of warning the user
+        # that, in an invocation where only linking and no compilation is
+        # taking place, the -pthread option has no effect ("argument unused
+        # during compilation").  They expect -pthread to be passed in only
+        # when source code is being compiled.
+        #
+        # Problem is, this is at odds with the way Automake and most other
+        # C build frameworks function, which is that the same flags used in
+        # compilation (CFLAGS) are also used in linking.  Many systems
+        # supported by AX_PTHREAD require exactly this for POSIX threads
+        # support, and in fact it is often not straightforward to specify a
+        # flag that is used only in the compilation phase and not in
+        # linking.  Such a scenario is extremely rare in practice.
+        #
+        # Even though use of the -pthread flag in linking would only print
+        # a warning, this can be a nuisance for well-run software projects
+        # that build with -Werror.  So if the active version of Clang has
+        # this misfeature, we search for an option to squash it.
+
+        AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
+            [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+             # Create an alternate version of $ac_link that compiles and
+             # links in two steps (.c -> .o, .o -> exe) instead of one
+             # (.c -> exe), because the warning occurs only in the second
+             # step
+             ax_pthread_save_ac_link="$ac_link"
+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+             ax_pthread_save_CFLAGS="$CFLAGS"
+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+                AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+                ac_link="$ax_pthread_save_ac_link"
+                AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                    [ac_link="$ax_pthread_2step_ac_link"
+                     AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
+                         [break])
+                    ])
+             done
+             ac_link="$ax_pthread_save_ac_link"
+             CFLAGS="$ax_pthread_save_CFLAGS"
+             AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+            ])
+
+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+                no | unknown) ;;
+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+        esac
+
+fi # $ax_pthread_clang = yes
+
+
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+        AC_CACHE_CHECK([for joinable pthread attribute],
+            [ax_cv_PTHREAD_JOINABLE_ATTR],
+            [ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+                 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+                                                 [int attr = $ax_pthread_attr; return attr /* ; */])],
+                                [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
+                                [])
+             done
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+               test "x$ax_pthread_joinable_attr_defined" != "xyes"],
+              [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
+                                  [$ax_cv_PTHREAD_JOINABLE_ATTR],
+                                  [Define to necessary symbol if this constant
+                                   uses a non-standard name on your system.])
+               ax_pthread_joinable_attr_defined=yes
+              ])
+
+        AC_CACHE_CHECK([whether more special flags are required for pthreads],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS],
+            [ax_cv_PTHREAD_SPECIAL_FLAGS=no
+             case $host_os in
+             solaris*)
+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+             ;;
+             esac
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+               test "x$ax_pthread_special_flags_added" != "xyes"],
+              [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+               ax_pthread_special_flags_added=yes])
+
+        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+            [ax_cv_PTHREAD_PRIO_INHERIT],
+            [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
+                                             [[int i = PTHREAD_PRIO_INHERIT;
+                                               return i;]])],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+                            [ax_cv_PTHREAD_PRIO_INHERIT=no])
+            ])
+        AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+               test "x$ax_pthread_prio_inherit_defined" != "xyes"],
+              [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
+               ax_pthread_prio_inherit_defined=yes
+              ])
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        # More AIX lossage: compile with *_r variant
+        if test "x$GCC" != "xyes"; then
+            case $host_os in
+                aix*)
+                AS_CASE(["x/$CC"],
+                    [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
+                    [#handle absolute path differently from PATH based program lookup
+                     AS_CASE(["x$CC"],
+                         [x/*],
+                         [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
+                         [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
+                ;;
+            esac
+        fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+AC_SUBST([PTHREAD_LIBS])
+AC_SUBST([PTHREAD_CFLAGS])
+AC_SUBST([PTHREAD_CC])
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
+        :
+else
+        ax_pthread_ok=no
+        $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/rebuild.sh b/rebuild.sh
index 1df3624f..da593d81 100755
--- a/rebuild.sh
+++ b/rebuild.sh
@@ -88,4 +88,4 @@ make -C kernel -j ${jobs} || exit 1
 
 rm -r build g6k/*.so `find g6k -name "*.pyc"`
 python setup.py clean
-python setup.py build_ext -j ${jobs} --inplace || python setup.py build_ext --inplace
+python setup.py build -j ${jobs} --inplace || python setup.py build --inplace
diff --git a/setup.py b/setup.py
index 912c058f..22018a15 100755
--- a/setup.py
+++ b/setup.py
@@ -19,79 +19,118 @@
 #
 ####
 
-
-
-from __future__ import absolute_import
 try:
     from setuptools import setup
     from setuptools.extension import Extension
+    from setuptools.command import build_ext as build_module
 except ImportError:
     from distutils.core import setup
     from distutils.extension import Extension
+    from distutils.command import build_ext as build_module
 from Cython.Build import cythonize
 
 import subprocess
+import numpy
+import sys
 import os
-subprocess.check_call("make")
+from ast import parse
 
-import numpy
+#
+# `setup,py` consumes files output by `configure` so we insist on running it first.
+#
+
+if not os.path.exists("configure"):
+    subprocess.check_call(["autoreconf", "-i"])
+
+if not os.path.exists("Makefile"):
+    subprocess.check_call("./configure")
 
 
-def read_from_makefile(field):
-    data = [line for line in open("kernel/Makefile").readlines() if line.startswith(field)][0]
-    data = "=" .join(data.split("=")[1:])
+#
+# But we only run `make` as part of `build_ext`
+#
+
+
+class build_ext(build_module.build_ext):
+    def run(self):
+
+        for arg in sys.argv:
+            if arg.startswith("-j"):
+                subprocess.check_call(["make", arg])
+                break
+        else:
+            subprocess.check_call("make")
+
+        build_module.build_ext.run(self)
+
+
+def read_from(filename, field, sep):
+    data = [line for line in open(filename).readlines() if line.startswith(field)][0]
+    data = "=".join(data.split(sep)[1:])
     data = data.strip()
-    data = data.split(" ")
+    data = [d for d in data.split(" ") if d]
     return data
 
 
-objects  = ["kernel/"+obj for obj in read_from_makefile("OBJ")]
-extra_compile_args = read_from_makefile("CXXFLAGS")
+# Version
 
-# replace $(EXTRAFLAGS) in extra_compile_args with environment variable
-try:
-    del extra_compile_args[extra_compile_args.index("$(EXTRAFLAGS)")]
-except ValueError:
-    pass
-extra_compile_args += os.environ.get('EXTRAFLAGS', "").split()
+with open(os.path.join("g6k", "__init__.py")) as f:
+    __version__ = (
+        parse(next(filter(lambda line: line.startswith("__version__"), f))).body[0].value.s
+    )
+
+extra_compile_args = ["-std=c++11"]
 # extra_compile_args += ["-DCYTHON_TRACE=1"]
+# there's so many warnings generated here, we need to filter out -Werror
+extra_compile_args += [opt for opt in read_from("g6k.pc", "Cflags", ": ") if opt != "-Werror"]
 
 kwds = {
     "language": "c++",
     "extra_compile_args": extra_compile_args,
-    "extra_link_args": objects,
+    # TODO: we should just install the shared lib and link against that
+    "extra_link_args": [
+        ("kernel/.libs/%s" % fn).replace(".cpp", ".o")
+        for fn in read_from("kernel/Makefile.am", "libg6k_la_SOURCES", "=")
+    ],
     "libraries": ["gmp", "pthread"],
     "include_dirs": [numpy.get_include()],
 }
 
 extensions = [
     Extension("g6k.siever", ["g6k/siever.pyx"], **kwds),
-    Extension("g6k.siever_params", ["g6k/siever_params.pyx"], **kwds)
+    Extension("g6k.siever_params", ["g6k/siever_params.pyx"], **kwds),
 ]
 
-
 setup(
     name="G6K",
     description="General Sieve Kernel",
-    version="0.1.0",
+    version=__version__,
     url="https://github.com/fplll/g6k",
-    ext_modules=cythonize(extensions, compiler_directives={'binding': True,
-                                                           'embedsignature': True,
-                                                           'language_level': 2}),
+    ext_modules=cythonize(
+        extensions,
+        compiler_directives={"binding": True, "embedsignature": True, "language_level": 2},
+    ),
     packages=["g6k", "g6k.algorithms", "g6k.utils"],
     package_data={"": ["spherical_coding/*.def"]},
-    scripts=["bkz.py",
-             "full_sieve.py",
-             "hkz.py",
-             "hkz_maybe.py",
-             "lwe_challenge.py",
-             "plain_sieve.py",
-             "svp_challenge.py",
-             "svp_exact.py",
-             "svp_exact_find_norm.py"],
+    cmdclass={
+        "build_ext": build_ext,
+    },
+    author="G6K team",
+    author_email="fplll-devel@googlegroups.com",
+    scripts=[
+        "bkz.py",
+        "full_sieve.py",
+        "hkz.py",
+        "hkz_maybe.py",
+        "lwe_challenge.py",
+        "plain_sieve.py",
+        "svp_challenge.py",
+        "svp_exact.py",
+        "svp_exact_find_norm.py",
+    ],
     classifiers=[
         "Programming Language :: C++",
         "Programming Language :: Python :: 2.7",
-        "Programming Language :: Python :: 3"
-    ]
+        "Programming Language :: Python :: 3",
+    ],
 )


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 02b8c60e..797b4c5e 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -52,7 +52,10 @@ jobs:
           pip install -r requirements.txt
           
       - name: Compile Kernel
-        run: CXXFLAGS="-Werror" make -j $JOBS
+        run: |
+          autoreconf -i
+          CXXFLAGS="-Werror" ./configure
+          make -j $JOBS
 
       - name: Compile Python
         run: python setup.py build_ext -j $JOBS --inplace