kolibrios/programs/system/os/fpo.inc

87 lines
1.9 KiB
PHP
Raw Permalink Normal View History

; Magic for proc32.inc: prologue/epilogue for esp-based addressing
; fpo stands from Frame Pointer Omission
macro fpo_prologue procname,flag,parmbytes,localbytes,reglist
{
local loc,regcount
loc = (localbytes+3) and (not 3)
regcount = 0
irps reg, reglist
\{
regcount = regcount+1
push reg
\}
if loc
sub esp, loc
end if
parmbase@proc equ esp+4+loc+regcount*4
localbase@proc equ esp
fpo_localsize = loc
fpo_delta = 0
}
macro fpo_epilogue procname,flag,parmbytes,localbytes,reglist
{
if fpo_localsize
add esp, fpo_localsize
end if
irps reg, reglist \{ reverse pop reg \}
if flag and 10000b
retn
else
retn parmbytes
end if
}
macro deflocal@proc name,def,[val]
{
common
deflocal@proc name#_unique_suffix,def,val
all@vars equ all@vars,name
name equ name#_unique_suffix+fpo_delta
}
macro defargs@proc [arg]
{
common
rawargs equ
srcargs equ arg
forward
rawargs equ rawargs,arg#_unique_suffix
common
match =,tmp,rawargs \{
defargs@proc tmp
uniqargs equ args@proc
restore args@proc
args@proc equ uniqargs,srcargs
\}
forward
arg equ arg#_unique_suffix+fpo_delta
}
macro stdcall proc,[arg] ; directly call STDCALL procedure
{ common
fpo_delta_base = fpo_delta
if ~ arg eq
reverse
pushd arg
fpo_delta = fpo_delta + 4
common
end if
call proc
fpo_delta = fpo_delta_base
}
macro ccall proc,[arg] ; directly call CDECL procedure
{ common
fpo_delta_base = fpo_delta
size@ccall = 0
if ~ arg eq
reverse
pushd arg
fpo_delta = fpo_delta + 4
size@ccall = size@ccall+4
common
end if
call proc
if size@ccall
add esp, size@ccall
end if
fpo_delta = fpo_delta_base
}
fpo_delta = 0