我对主要针对x64上的Visual C ++(2012及更高版本)的C ++大整数库进行了一些改进,我真的希望通过使用更广泛的单词来提高我的除法例程的速度。
现在,该操作每次迭代产生16位商,原始操作基本上看起来像这样:
uint16_t U[], V[];
uint32_t u = (uint32_t(U[i+1]) << 16) | U[i];
uint16_t v = V[j];
uint16_t q = uint16_t(u/v);
产生具有32位操作数(和EDX归零)的IDIV指令,这很好,但由于大量的迭代而变慢。我非常想使用IDIV对64/32甚至128/64分区的支持,但我不能说服Visual C ++让我使用它们。将64位数字除以32位数会导致调用内部64/64 div例程,这不是特别快,而且总是过度杀伤(因为我的代码确保商永远不会溢出)。我甚至无法触及128/64分区,因为它不支持128位数字。
通常这就是内在函数会出现的地方,但VC ++似乎并没有提供在分区中使用高操作数的内在函数(就像通过__umulh
进行乘法一样)。如果不支持x64中的内联汇编,它看起来唯一的解决方案是完全在ASM中重新实现例程,如果可能的话我想避免这样做。
如何在VC ++长除法例程中使用IDIV的全部功能?