wrapped rdtsc and added x64 support
authorbeware <beware@bircd.org>
Thu, 13 Mar 2014 07:04:57 +0000 (07:04 +0000)
committerbeware <beware@bircd.org>
Thu, 13 Mar 2014 07:04:57 +0000 (07:04 +0000)
git-svn-id: file:///svnroot/lcore/trunk@132 b1de8a11-f9be-4011-bde0-cc7ace90066a

lcorernd.pas
pgtypes.inc

index 648c87aa67cbb357ab4cd7d19c479dda6caa6d7d..3a8ea0c993b280d0cefc63024a5367a31c317922 100644 (file)
@@ -130,6 +130,8 @@ var
 \r
 implementation\r
 \r
 \r
 implementation\r
 \r
+{$include pgtypes.inc}\r
+\r
 {$ifndef nolcorernd}\r
 uses\r
   {$ifdef mswindows}windows,activex,{$endif}\r
 {$ifndef nolcorernd}\r
 uses\r
   {$ifdef mswindows}windows,activex,{$endif}\r
@@ -144,6 +146,23 @@ uses
 \r
 {$ifdef unix}{$include unixstuff.inc}{$endif}\r
 \r
 \r
 {$ifdef unix}{$include unixstuff.inc}{$endif}\r
 \r
+procedure rdtsc(buf: pointer);\r
+asm\r
+  {$ifdef cpux86}\r
+  mov ecx, buf\r
+  db $0f; db $31 {rdtsc}\r
+  mov [ecx], edx\r
+  mov [ecx+4], eax\r
+  {$endif}\r
+\r
+  {$ifdef cpux64}\r
+  mov rcx, buf\r
+  rdtsc\r
+  mov [rcx], edx\r
+  mov [rcx+4], eax\r
+  {$endif}\r
+end;\r
+\r
 type\r
   {hashtype must be array of bytes}\r
   hashtype=tmd5;\r
 type\r
   {hashtype must be array of bytes}\r
   hashtype=tmd5;\r
@@ -178,7 +197,6 @@ var
     cursor:tpoint;\r
     hs:theapstatus;\r
   end absolute output;\r
     cursor:tpoint;\r
     hs:theapstatus;\r
   end absolute output;\r
-  rdtsc_0,rdtsc_1:integer;\r
 begin\r
   result := 0;\r
   if (bufsize < sizeof(l)) then exit;\r
 begin\r
   result := 0;\r
   if (bufsize < sizeof(l)) then exit;\r
@@ -194,15 +212,8 @@ begin
   queryperformancecounter(tlargeinteger(l.qpcbuf));\r
 \r
   {RDTSC}\r
   queryperformancecounter(tlargeinteger(l.qpcbuf));\r
 \r
   {RDTSC}\r
-  {$ifdef cpu386}\r
-  asm\r
-    db $0F; db $31\r
-    mov rdtsc_0,eax\r
-    mov rdtsc_1,edx\r
-  end;\r
-  l.rdtscbuf[0] := rdtsc_0;\r
-  l.rdtscbuf[1] := rdtsc_1;\r
-  {$endif}\r
+  rdtsc(@l.rdtscbuf);\r
+\r
   {GETSYSTEMTIME}\r
   getsystemtime(tsystemtime(l.systemtimebuf));\r
 \r
   {GETSYSTEMTIME}\r
   getsystemtime(tsystemtime(l.systemtimebuf));\r
 \r
@@ -253,7 +264,6 @@ var
     tv:ttimeval;\r
     pid:integer;\r
   end absolute output;\r
     tv:ttimeval;\r
     pid:integer;\r
   end absolute output;\r
-  rdtsc_0,rdtsc_1:integer;\r
 \r
 begin\r
   result := 0;\r
 \r
 begin\r
   result := 0;\r
@@ -280,15 +290,7 @@ begin
     move(wtmpcached,l.devrnd,sizeof(l.devrnd));\r
   end;\r
   {get more randomness in case there's no /dev/random}\r
     move(wtmpcached,l.devrnd,sizeof(l.devrnd));\r
   end;\r
   {get more randomness in case there's no /dev/random}\r
-  {$ifdef cpu386}{$ASMMODE intel}\r
-  asm\r
-    db $0F; db $31\r
-    mov rdtsc_0,eax\r
-    mov rdtsc_1,edx\r
-  end;\r
-  l.rdtscbuf[0] := rdtsc_0;\r
-  l.rdtscbuf[1] := rdtsc_1;\r
-  {$endif}\r
+  rdtsc(@l.rdtscbuf);\r
 \r
   gettimeofday(l.tv);\r
   l.pid := getpid;\r
 \r
   gettimeofday(l.tv);\r
   l.pid := getpid;\r
index 99fc6c0bee045dd13b744f7e5bcc1e938c8f1f82..4f8d2a8e57fdd6efff54e556aa35198477527cd4 100644 (file)
@@ -8,6 +8,6 @@
 {$endif}
  
 
 {$endif}
  
 
-{$ifdef i386}{$define ENDIAN_LITTLE}{$endif}
-{$ifdef cpux64}{$define ENDIAN_LITTLE}{$endif}
+{$ifdef i386}{$define ENDIAN_LITTLE}{$asmmode intel}{$endif}
+{$ifdef cpux64}{$define ENDIAN_LITTLE}{$asmmode intel}{$endif}