Hallo,
ich habe gestern die Tokyo Community Edition installiert
und dann (natürlich) ziemlich bald den Quellcode der Math-
Unit angeschaut, und denke da ist ein Bug drin:
Delphi-Quellcode:
function GetSSEType: Cardinal;
...
{$ELSEIF Defined(CPUX86)}
asm
PUSH EBX
MOV EAX, 1
CPUID
XOR EAX, EAX
TEST EDX, $02000000
// EDX 25 bits - SSE bit
JZ @@CheckSSE2
OR EAX, seSSE
...
@@CheckSSE42:
TEST ECX, $00100000
// ECX 20 bits - SSSE4.2 bit
JZ @@CheckPOPCNT
OR EAX, seSSE42
@@CheckPOPCNT:
TEST ECX, $00800000
// ECX 23 bits - POPCNT bit
JZ @@CheckAESNI
OR EAX, sePOPCNT
@@CheckAESNI:
TEST ECX, $02000000
// ECX 25 bits - AESNI bit
JZ @@CheckPCLMULQDQ
OR EAX, sePOPCNT
@@CheckPCLMULQDQ:
TEST ECX, $00000002
// ECX 1 bits - PCLMULQDQ bit
JZ @@Exit
OR EAX, sePCLMULQDQ
@@Exit:
POP EBX
end;
Und ähnlich für CPUX64. Ich glaube, da hat jemand einen Copy/Paste-Fehler gemacht und es sollte so aussehen:
Delphi-Quellcode:
@@CheckAESNI:
TEST ECX, $02000000 // ECX 25 bits - AESNI bit
JZ @@CheckPCLMULQDQ
OR EAX, seAESNI
Leider hat mein I3 laut CPU-Z keine Advanced Encryption Standard Instructions (AES-NI), so das ich natürlich auch von Delphi kein AES-NI (seAESNI = $0080) sehen kann. Das folgende Program
Delphi-Quellcode:
{$apptype console}
uses
system.sysutils, system.math;
begin
writeln(IntToHex(TestSSE,16));
end.
gibt
000000000000017F aus sowohl für 32- als auch 64-Bit und es fehlt das $80-Bit. Kann jemand mit AES-NI-Processor-Feature das als Bug bestätigen (d.h. fehlt auch bei ihm das $80-Bit)?