我想使用一个DivMod专门在32位操作数上运行的函数.RTL中的实现返回16位变量中的值.它的声明是:
procedure DivMod(Dividend: Cardinal; Divisor: Word; var Result, Remainder: Word);
Run Code Online (Sandbox Code Playgroud)
所以,我不能使用它,因为我的输入可能溢出返回值.
朴素的Pascal实现如下所示:
procedure DivMod(Dividend, Divisor: Cardinal; out Quotient, Remainder: Cardinal);
begin
Quotient := Dividend div Divisor;
Remainder := Dividend mod Divisor;
end;
Run Code Online (Sandbox Code Playgroud)
这很好地工作,但执行两次分裂.由于该函数是由我的代码中的一部分性能瓶颈调用的,所以我只想执行一次除法.为此我从这个问题使用Serg的32位DivMod:是否有一个DivMod*不限于Word(<= 65535)?
procedure DivMod(Dividend, Divisor: Cardinal; out Quotient, Remainder: Cardinal);
asm
PUSH EBX
MOV EBX,EDX
XOR EDX,EDX
DIV EBX
MOV [ECX],EAX
MOV EBX,Remainder
MOV [EBX],EDX
POP EBX
end;
Run Code Online (Sandbox Code Playgroud)
这非常有效.
但现在我想要一个64位代码的函数版本.请注意,我仍然希望对32位操作数进行操作,并返回32位值.
我应该使用64位汇编程序重新编写函数,还是使用DivMod运行的RTL 的重载并返回64位值就足够了?
具体来说,我想知道在编写执行32位操作的64位代码时是否有性能优势.这甚至可能吗?或者我会简单地DivMod用UInt64参数重新实现重载?如果值得实现一个定制的64位asm版本,我将如何去做,注意操作数和操作是32位. …