fpc/tests/test/tasm15a.pp
nickysn ae92973196 + added support for the retw, retnw, retfw, retd, retnd, retfd, retq, retnq and
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 -
2017-11-10 16:53:29 +00:00

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.