{ %skiptarget=win32,win64,android }
{ %OPT=-Cg- }
{ Old file: tbs0227.pp }
{ external var does strange things when declared in localsymtable OK 0.99.11 (PFV) }

var
  stacksize : ptrint;external name '__stklen';

function getstacksize:ptrint;assembler;
asm
{$ifdef CPUI386}
        movl    stacksize,%eax
end ['EAX'];
{$define implemented}
{$endif CPUI386}
{$ifdef CPUX86_64}
        movq    stacksize@GOTPCREL(%rip),%rax
        movq    (%rax),%rax
end ['EAX'];
{$define implemented}
{$endif CPUX86_64}
{$ifdef CPU68K}
        move.l    stacksize,d0
end ['D0'];
{$define implemented}
{$endif CPU68K}
{$ifdef cpupowerpc}
{$if not defined(macos) and not defined(aix)}
       lis r3, stacksize@ha
       lwz r3, stacksize@l(r3)
{$else macos}
       lwz r3, stacksize(r2)
       lwz r3, 0(r3)
{$endif macos}
end;
{$define implemented}
{$endif cpupowerpc}
{$ifdef cpusparc}
       sethi   %hi(stacksize),%i0
       or      %i0,%lo(stacksize),%i0
end;
{$define implemented}
{$endif cpusparc}
{$ifdef cpuarm}
       ldr r0,.Lpstacksize
       ldr r0,[r0]
       b .Lend
.Lpstacksize:
       .long stacksize
.Lend:
end;
{$define implemented}
{$endif cpuarm}
{$ifdef cpumips}
  la $v0,stacksize
  lw $v0,($v0)
 end;
{$define implemented}
{$endif cpumips}
{$ifdef cpuaarch64}
  adrp x0,stacksize@PAGE
  ldr  x0,[x0,stacksize@PAGEOFF]
end;
{$define implemented}   
{$endif cpuaarch64}
{$ifdef cpuriscv64}
.L1:
  auipc a0,%pcrel_hi(stacksize)
  ld a0, %pcrel_lo(.L1)(a0)
end;
{$define implemented}
{$endif cpuriscv64}
{$ifdef cpuloongarch64}
  pcalau12i $a0, %got_pc_hi20(stacksize)
  ld.d $a0, $a0, %got_pc_lo12(stacksize)
end;
{$define implemented}
{$endif cpuloongarch64}
{$ifndef implemented}
 {$error This test does not supported this CPU}
end;
{$endif}

begin
  writeln(getstacksize);
end.
