diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2020-01-04 01:19:18 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2020-01-04 01:19:18 +0300 |
commit | 60db2cd84b5fcf1cca8fcc8bb56e93813329ca38 (patch) | |
tree | 47833363075fbe2d08c26ba4e41ed6bfbe1fb668 | |
parent | 6b9d92b3797207551547a7a95a0ba28642bf4dd0 (diff) | |
download | atracdenc-60db2cd84b5fcf1cca8fcc8bb56e93813329ca38.tar.gz |
Fast float to nearest int round under 32bit MSVS build
-rw-r--r-- | src/atrac/atrac3_bitstream.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/src/atrac/atrac3_bitstream.cpp b/src/atrac/atrac3_bitstream.cpp index 8b7ede9..1889061 100644 --- a/src/atrac/atrac3_bitstream.cpp +++ b/src/atrac/atrac3_bitstream.cpp @@ -95,6 +95,25 @@ uint32_t TAtrac3BitStreamWriter::VLCEnc(const uint32_t selector, const int manti return bitsUsed; } +static inline int ToInt(double x) { +#if defined(_MSC_VER) && defined(_WIN32) + int n; + __asm { + fld x + fistp n + } + return n; +#else + return lrint(x); +#endif +} + +static inline void CalcMantisas(const TFloat* values, const uint32_t first, const uint32_t last, const TFloat mul, int* mantisas) { + for (uint32_t j = 0, f = first; f < last; f++, j++) { + mantisas[f] = ToInt(values[j] * mul); + } +} + std::pair<uint8_t, uint32_t> TAtrac3BitStreamWriter::CalcSpecsBitsConsumption(const TSingleChannelElement& sce, const vector<uint32_t>& precisionPerEachBlocks, int* mantisas) { @@ -114,9 +133,8 @@ std::pair<uint8_t, uint32_t> TAtrac3BitStreamWriter::CalcSpecsBitsConsumption(co const uint32_t blockSize = last - first; const TFloat mul = MaxQuant[std::min(precisionPerEachBlocks[i], (uint32_t)7)]; if (calcMant) { - for (uint32_t j = 0, f = first; f < last; f++, j++) { - mantisas[f] = lrint(scaledBlocks[i].Values[j] * mul); - } + const TFloat* values = scaledBlocks[i].Values.data(); + CalcMantisas(values, first, last, mul, mantisas); } bits += clcMode ? CLCEnc(precisionPerEachBlocks[i], mantisas + first, blockSize, nullptr) : VLCEnc(precisionPerEachBlocks[i], mantisas + first, blockSize, nullptr); |