An elliptic curve is made up of the following:
- A field, F_p.
- What this means is all arithmetic on scalars is modulo p.
- Modern ECC have p as some large prime.
- For curve25519, p = 2^255 - 19, a prime.
- An equation and it's parameters:
#include <type_traits> | |
/// Internal implementation of this header. | |
namespace mp_impl { | |
template<class... Ls> | |
struct mp_append_impl; | |
template<> struct mp_append_impl<> { | |
using type = mp_list<>; |
// As with usual x64 ABI, rdi contains pointer to string | |
strlen: | |
xor eax, eax | |
test dil, 7 | |
je .skip_align | |
// rax contains our return value, as per usual x64 ABI | |
xor eax, eax | |
// Line up to 8-byte alignment | |
.align_loop: |
BbAa contains BBBBbbbbAAAAaaaa | |
DdCc contains DDDDddddCCCCcccc | |
we want: DDDDCCCCBBBBAAAA | |
we want: ddddccccbbbbaaaa | |
const auto process_pair = [](const __m256i BbAa, const __m256i DdCc) { | |
const __m256i DbCa = _mm256_blend_epi32(BbAa, DdCc, 0b11001100); | |
const __m256i dBcA = _mm256_blend_epi32(BbAa, DdCc, 0b00110011); | |
const __m256i DCba = _mm256_permute4x64_epi64(DbCa, 0b11011000); |
Was writing a tuple class for fun. | |
template <typename... Ts> | |
class tuple { | |
template <typename T> | |
T& get(); | |
template <typename T> | |
T const& get() const; | |
}; |
#include <array> | |
#include <functional> | |
template <typename T, size_t N, size_t M, size_t... iota_N, size_t... iota_M> | |
auto append_impl( | |
std::index_sequence<iota_N...>, | |
std::index_sequence<iota_M...>, | |
const std::array<T, N>& a, | |
const std::array<T, M>& b | |
) -> std::array<T, N+M> { |
#include <array> | |
#include <cstddef> | |
#include <type_traits> | |
template <typename T, std::size_t N, std::size_t... Ns> | |
struct multi_array | |
{ | |
using type = std::array<typename multi_array<T, Ns...>::type, N>; | |
}; |
template <typename T> | |
constexpr T pext(T x, T mask) { | |
T ret = 0; | |
for (T bb = 1; mask != 0; bb += bb) { | |
if (x & mask & -mask) { | |
ret |= bb; | |
} | |
mask &= (mask - 1); | |
} | |
return ret; |
// Note that our hearing is logarithmic. | |
// 0 dB = 1.0 | |
// For the below equations, ratio refers to the amplitude ratio. | |
// 0 dB = same power = same amplitude = same psycho-acoustic volume | |
// -3 dB = half power | |
// -6 dB = half amplitude | |
// -10 dB = half psycho-acoustic volume = 32% amplitude | |
double dB_to_ratio(double dB) { |
When you're running out of registers while writing a JIT, you might resort to more unconventional methods for memory access. You might choose to resort to segment registers if you need a fixed register for memory offsets.
Instructions such as:
lea rax,gs:[rcx+rdx*8]
mov rax,gs:[rcx+rdx*8]
would then be available for your use.