1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-05 21:32:55 +00:00

Tweak per empirical results.

This commit is contained in:
Thomas Harte 2022-05-27 15:37:40 -04:00
parent e11990e453
commit e8dd8215ba

View File

@ -2576,22 +2576,26 @@ template <bool did_overflow> void ProcessorBase::did_divs(int32_t dividend, int3
return; return;
} }
// It's either five or six microcycles to get into the main loop, depending // It's either six or seven microcycles to get into the main loop, depending
// on dividend sign. // on dividend sign.
dynamic_instruction_length_ = 5 + (dividend < 0); dynamic_instruction_length_ = 6 + (dividend < 0);
if(did_overflow) { if(did_overflow) {
return; return;
} }
// There's always a cost of four microcycles per bit, plus an additional // There's a fixed cost per bit, plus an additional one for each that is zero.
// one for each that is non-zero.
// //
// The sign bit does not count here; it's the low fifteen bits that matter // The sign bit does not count here; it's the high fifteen bits that matter
// only, in the unsigned version of the result. // only, in the unsigned version of the result.
dynamic_instruction_length_ += 60; //
// Disclaimer: per the flowchart it looks to me like this constant should be 60
// rather than 49 — four microcycles per bit. But the number 49 makes this
// algorithm exactly fit the stated minimum and maximum costs. Possibly the
// undefined difference between a nop cycle an an idle wait is relevant here?
dynamic_instruction_length_ += 49;
int result_bits = abs(dividend / divisor) & 0x7fff; int result_bits = ~abs(dividend / divisor) & 0xfffe;
convert_to_bit_count_16(result_bits); convert_to_bit_count_16(result_bits);
dynamic_instruction_length_ += result_bits; dynamic_instruction_length_ += result_bits;