JFConversionFixedPoint: Minor performance improvement

This commit is contained in:
2023-06-03 22:49:30 +02:00
parent 5513b46833
commit 1930bd2c6e
+11 -14
View File
@@ -69,38 +69,35 @@ void JFConversionFixedPoint::ConvertLine(int16_t *dest, const uint16_t *source,
for (int i = 0; i < RAW_MODULE_COLS; i++) {
uint16_t gainbits = source[i] & 0xc000;
int32_t adc = source[i] & 0x3fff;
int32_t val = 0;
bool overflow = false;
bool wrong = false;
if ((source[i] == 0x4000) || (source[i] == 0xffff)) wrong = true;
else if (source[i] == 0xc000) overflow = true;
int32_t val = INT32_MIN;
switch (gainbits) {
case 0:
[[likely]]
val = jf_round((adc - pedestal_g0_aligned[i + line * RAW_MODULE_COLS]) * gain_g0_aligned[i + line * RAW_MODULE_COLS]);
val = (adc - pedestal_g0_aligned[i + line * RAW_MODULE_COLS]) * gain_g0_aligned[i + line * RAW_MODULE_COLS];
break;
case 0x4000:
val = jf_round((adc - pedestal_g1_aligned[i + line * RAW_MODULE_COLS]) * gain_g1_aligned[i + line * RAW_MODULE_COLS]);
if (source[i] != 0x4000)
val = (adc - pedestal_g1_aligned[i + line * RAW_MODULE_COLS]) * gain_g1_aligned[i + line * RAW_MODULE_COLS];
break;
case 0xc000:
val = jf_round((adc - pedestal_g2_aligned[i + line * RAW_MODULE_COLS]) * gain_g2_aligned[i + line * RAW_MODULE_COLS]);
if (source[i] == 0xc000)
val = INT32_MAX;
else if (source[i] != 0xffff)
val = (adc - pedestal_g2_aligned[i + line * RAW_MODULE_COLS]) * gain_g2_aligned[i + line * RAW_MODULE_COLS];
break;
default:
wrong = true;
break;
}
if (wrong || (val <= INT16_MIN * (1L << FIXED_PRECISION)))
if (val <= INT16_MIN * (1L << FIXED_PRECISION))
[[unlikely]]
dest[i] = INT16_MIN;
else if (overflow || (val >= INT16_MAX * (1L << FIXED_PRECISION)))
else if (val >= INT16_MAX * (1L << FIXED_PRECISION))
[[unlikely]]
dest[i] = INT16_MAX;
else
dest[i] = static_cast<int16_t>(val / (1L << FIXED_PRECISION));
dest[i] = static_cast<int16_t>(jf_round(val)/ (1L << FIXED_PRECISION));
}
}