Quellcode durchsuchen

+ added x86_64 asm implementation of math.DivMod

git-svn-id: trunk@36306 -
nickysn vor 8 Jahren
Ursprung
Commit
30b5a4dd3e
1 geänderte Dateien mit 84 neuen und 0 gelöschten Zeilen
  1. 84 0
      rtl/x86_64/mathu.inc

+ 84 - 0
rtl/x86_64/mathu.inc

@@ -100,6 +100,90 @@ procedure sincos(theta : single;out sinus,cosinus : single);assembler;
   end;
 
 
+{$define FPC_MATH_HAS_DIVMOD}
+{$asmmode intel}
+procedure DivMod(Dividend: Integer; Divisor: Word; var Result, Remainder: Word);assembler;
+asm
+{$ifdef WIN64}
+  mov eax, ecx
+  movzx ecx, dx
+  cdq
+  idiv ecx
+  mov [r8], ax
+  mov [r9], dx
+{$else WIN64}
+  mov eax, edi
+  movzx esi, si
+  mov rdi, rdx
+  cdq
+  idiv esi
+  mov [rdi], ax
+  mov [rcx], dx
+{$endif WIN64}
+end;
+
+
+procedure DivMod(Dividend: Integer; Divisor: Word; var Result, Remainder: SmallInt);assembler;
+asm
+{$ifdef WIN64}
+  mov eax, ecx
+  movzx ecx, dx
+  cdq
+  idiv ecx
+  mov [r8], ax
+  mov [r9], dx
+{$else WIN64}
+  mov eax, edi
+  movzx esi, si
+  mov rdi, rdx
+  cdq
+  idiv esi
+  mov [rdi], ax
+  mov [rcx], dx
+{$endif WIN64}
+end;
+
+
+procedure DivMod(Dividend: DWord; Divisor: DWord; var Result, Remainder: DWord);assembler;
+asm
+{$ifdef WIN64}
+  mov eax, ecx
+  mov ecx, edx
+  xor edx, edx
+  div ecx
+  mov [r8], eax
+  mov [r9], edx
+{$else WIN64}
+  mov eax, edi
+  mov rdi, rdx
+  xor edx, edx
+  div esi
+  mov [rdi], eax
+  mov [rcx], edx
+{$endif WIN64}
+end;
+
+
+procedure DivMod(Dividend: Integer; Divisor: Integer; var Result, Remainder: Integer);assembler;
+asm
+{$ifdef WIN64}
+  mov eax, ecx
+  mov ecx, edx
+  cdq
+  idiv ecx
+  mov [r8], eax
+  mov [r9], edx
+{$else WIN64}
+  mov eax, edi
+  mov rdi, rdx
+  cdq
+  idiv esi
+  mov [rdi], eax
+  mov [rcx], edx
+{$endif WIN64}
+end;
+
+
 {$asmmode gas}
 function GetRoundMode: TFPURoundingMode;
 begin