mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-09 19:08:15 +02:00

retfq x86 instructions. These are variants of the ret instruction with the return offset size set explicitly, e.g. retfw is a 16-bit far ret (i.e. pops a 16-bit offset and a 16-bit segment), retfd is a 32-bit far ret (pops a 32-bit offset, followed by a 16-bit segment), etc. git-svn-id: trunk@37571 -
90 lines
1.4 KiB
ObjectPascal
90 lines
1.4 KiB
ObjectPascal
{ %CPU=x86_64 }
|
|
|
|
const
|
|
expect: array [0..47] of byte = (
|
|
$C3, // ret
|
|
$C2,$05,$00, // ret 5
|
|
$C3, // retn
|
|
$C2,$05,$00, // retn 5
|
|
$CB, // retf
|
|
$CA,$05,$00, // retf 5
|
|
$66,$C3, // retw
|
|
$66,$C2,$05,$00, // retw 5
|
|
$66,$C3, // retnw
|
|
$66,$C2,$05,$00, // retnw 5
|
|
$66,$CB, // retfw
|
|
$66,$CA,$05,$00, // retfw 5
|
|
$CB, // retfd
|
|
$CA,$05,$00, // retfd 5
|
|
$C3, // retq
|
|
$C2,$05,$00, // retq 5
|
|
$C3, // retnq
|
|
$C2,$05,$00, // retnq 5
|
|
$48,$CB, // retfq
|
|
$48,$CA,$05,$00 // retfq 5
|
|
);
|
|
|
|
{$asmmode intel}
|
|
procedure test; assembler; nostackframe;
|
|
asm
|
|
ret
|
|
ret 5
|
|
retn
|
|
retn 5
|
|
retf
|
|
retf 5
|
|
retw
|
|
retw 5
|
|
retnw
|
|
retnw 5
|
|
retfw
|
|
retfw 5
|
|
retfd
|
|
retfd 5
|
|
retq
|
|
retq 5
|
|
retnq
|
|
retnq 5
|
|
retfq
|
|
retfq 5
|
|
end;
|
|
|
|
{$asmmode att}
|
|
procedure test2; assembler; nostackframe;
|
|
asm
|
|
ret
|
|
ret $5
|
|
ret
|
|
ret $5
|
|
lret
|
|
lret $5
|
|
retw
|
|
retw $5
|
|
retw
|
|
retw $5
|
|
lretw
|
|
lretw $5
|
|
lret
|
|
lret $5
|
|
retq
|
|
retq $5
|
|
retq
|
|
retq $5
|
|
lretq
|
|
lretq $5
|
|
end;
|
|
|
|
procedure Error;
|
|
begin
|
|
Writeln('Error!');
|
|
Halt(1);
|
|
end;
|
|
|
|
begin
|
|
if CompareByte(Pointer(@test)^, expect, SizeOf(expect)) <> 0 then
|
|
Error;
|
|
if CompareByte(Pointer(@test2)^, expect, SizeOf(expect)) <> 0 then
|
|
Error;
|
|
Writeln('Ok!')
|
|
end.
|