aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2020-01-04 01:19:18 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2020-01-04 01:19:18 +0300
commit60db2cd84b5fcf1cca8fcc8bb56e93813329ca38 (patch)
tree47833363075fbe2d08c26ba4e41ed6bfbe1fb668
parent6b9d92b3797207551547a7a95a0ba28642bf4dd0 (diff)
downloadatracdenc-60db2cd84b5fcf1cca8fcc8bb56e93813329ca38.tar.gz
Fast float to nearest int round under 32bit MSVS build
-rw-r--r--src/atrac/atrac3_bitstream.cpp24
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);