mirror of
https://github.com/jwinterm/aeon.git
synced 2026-10-17 05:01:26 +02:00
Merge pull request #13 from iamsmooth/master
portable mul128 clean up, small memory optimization
This commit is contained in:
@@ -68,6 +68,17 @@ static inline uint64_t lo_dword(uint64_t val) {
|
||||
return val & 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
#if defined(__GNUC__) && defined(__x86_64__)
|
||||
|
||||
static inline uint64_t mul128(uint64_t a, uint64_t b, uint64_t *high) {
|
||||
typedef unsigned __int128 uint128_t;
|
||||
uint128_t res = (uint128_t) a * (uint128_t) b;
|
||||
*high = (uint64_t) (res >> 64);
|
||||
return (uint64_t) res;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline uint64_t mul128(uint64_t multiplier, uint64_t multiplicand, uint64_t* product_hi) {
|
||||
// multiplier = ab = a * 2^32 + b
|
||||
// multiplicand = cd = c * 2^32 + d
|
||||
@@ -93,6 +104,7 @@ static inline uint64_t mul128(uint64_t multiplier, uint64_t multiplicand, uint64
|
||||
|
||||
return product_lo;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline uint64_t div_with_reminder(uint64_t dividend, uint32_t divisor, uint32_t* remainder) {
|
||||
dividend |= ((uint64_t)*remainder) << 32;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <boost/multi_index/member.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <atomic>
|
||||
#include <cstddef>
|
||||
|
||||
#include "syncobj.h"
|
||||
#include "string_tools.h"
|
||||
@@ -65,7 +66,6 @@ namespace cryptonote
|
||||
{
|
||||
transaction tx;
|
||||
uint64_t m_keeper_block_height;
|
||||
size_t m_blob_size;
|
||||
std::vector<uint64_t> m_global_output_indexes;
|
||||
};
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
|
||||
|
||||
#pragma once
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@@ -41,7 +42,8 @@ namespace boost
|
||||
{
|
||||
ar & te.tx;
|
||||
ar & te.m_keeper_block_height;
|
||||
ar & te.m_blob_size;
|
||||
size_t dummy;
|
||||
ar & dummy; // formerly te.m_blob_size;
|
||||
ar & te.m_global_output_indexes;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,25 +45,10 @@ namespace cryptonote {
|
||||
using std::uint64_t;
|
||||
using std::vector;
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#include <windows.h>
|
||||
#include <winnt.h>
|
||||
|
||||
static inline void mul(uint64_t a, uint64_t b, uint64_t &low, uint64_t &high) {
|
||||
low = mul128(a, b, &high);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void mul(uint64_t a, uint64_t b, uint64_t &low, uint64_t &high) {
|
||||
typedef unsigned __int128 uint128_t;
|
||||
uint128_t res = (uint128_t) a * (uint128_t) b;
|
||||
low = (uint64_t) res;
|
||||
high = (uint64_t) (res >> 64);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline bool cadd(uint64_t a, uint64_t b) {
|
||||
return a + b < a;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user