Hello everyone,
I am trying to compile the following code:
procedure XORBuff(I1, I2: Pointer; Size: Integer; Dest: Pointer); {$IFDEF FPC}
{$ASMMODE INTEL}{$ENDIF}
asm
AND ECX,ECX
JZ @@5
PUSH ESI
PUSH EDI
MOV ESI,EAX
MOV EDI,Dest
@@1: TEST ECX,3
JNZ @@3
@@2: SUB ECX,4
JL @@4
MOV EAX,[ESI + ECX]
XOR EAX,[EDX + ECX]
MOV [EDI + ECX],EAX
JMP @@2
@@3: DEC ECX
MOV AL,[ESI + ECX]
XOR AL,[EDX + ECX]
MOV [EDI + ECX],AL
JMP @@1
@@4:
POP EDI
POP ESI
@@5:
end;
in FPC for Win64 and I get an error (invalid opcode/operand combination) in the lines that PUSH and POP registers. If I replace the 32-bit regs with their 64-bit "R" equivalents (PUSH RSI instead of PUSH ESI) it compiles but I suppose it will not compile for Win32.
So apart from the apparent solution of {$ifdef cpu64}'ing is there any other way to make this compile for 64bit (and Delphi XE if possible, which is 32bit) without conditional compilation? By searching through the FPC source directory I have noticed that units with Intel assembly code that contains PUSH/POP instructions use the "E" regs without ifdef'ing. How do these compile?
Thank you in advance and bare with me, I am by no means an assembly expert.
