浏览代码

+ added 32x32 to 64-bit multiplication helper for i8086 by Max Nazhalov

git-svn-id: trunk@26403 -
nickysn 11 年之前
父节点
当前提交
a71debb762
共有 1 个文件被更改,包括 33 次插入0 次删除
  1. 33 0
      rtl/i8086/int64p.inc

+ 33 - 0
rtl/i8086/int64p.inc

@@ -192,3 +192,36 @@ begin
   if checkoverflow then
     HandleErrorAddrFrameInd(215,get_pc_addr,get_frame);
 end;
+
+
+{$define FPC_SYSTEM_HAS_MUL_DWORD_TO_QWORD}
+function fpc_mul_dword_to_qword(f1,f2 : dword) : qword;[public,alias: 'FPC_MUL_DWORD_TO_QWORD']; compilerproc; assembler; nostackframe;
+asm
+  push    bp
+  mov     bp, sp
+  mov     di,word[bp +  8 + extra_param_offset]  // word[f1]
+  mov     bx,word[bp + 10 + extra_param_offset]  // word[f1+2]
+  mov     si,word[bp +  4 + extra_param_offset]  // word[f2]
+  mov     ax,word[bp +  6 + extra_param_offset]  // word[f2+2]
+  mov     cx,ax
+  mul     bx
+  xchg    ax,bx
+  mov     bp,dx
+  mul     si
+  xchg    ax,cx
+  add     bx,dx
+  adc     bp,0
+  mul     di
+  add     cx,ax
+  adc     bx,dx
+  adc     bp,0
+  mov     ax,di
+  mul     si
+  add     cx,dx
+  adc     bx,0
+  adc     bp,0
+  mov     dx,ax
+  mov     ax,bp
+  pop     bp
+end;
+