{ %CPU=i386 }
{$R-}
program test_register_pushing;

var
  before, after : longint;
  wpush,lpush : longint;
const
  haserror : boolean = false;

begin
{$ifdef CPUI386}
{$asmmode att}
  asm
    movl   %esp,before
    pushw  %es
    movl   %esp,after
    popw   %es
  end;
  wpush:=before-after;
  if wpush<>2 then
    begin
      Writeln('Compiler does not push "pushw %es" into 2 bytes');
      haserror:=true;
    end;
  asm
    movl   %esp,before
    pushl  %es
    movl   %esp,after
    popl   %es
  end;
  lpush:=before-after;

  if lpush<>4 then
    begin
      Writeln('Compiler does not push "pushl %es" into 4 bytes');
      haserror:=true;
    end;

  asm
    movl   %esp,before
    pushw  %gs
    movl   %esp,after
    popw   %gs
  end;
  wpush:=before-after;
  if wpush<>2 then
    begin
      Writeln('Compiler does not push "pushw %gs" into 2 bytes');
      haserror:=true;
    end;
  asm
    movl   %esp,before
    pushl  %gs
    movl   %esp,after
    popl   %gs
  end;
  lpush:=before-after;

  if lpush<>4 then
    begin
      Writeln('Compiler does not push "pushl %gs" into 4 bytes');
      haserror:=true;
    end;
{$asmmode intel}
  asm
    mov    before,esp
    push   es
    mov    after,esp
    pop    es
  end;
  Writeln('Intel "push es" uses ',before-after,' bytes');
{$endif CPUI386}
  if haserror then
    Halt(1);
end.