+ respect the nostackframe directive in WebAssembly inline asm routines

This commit is contained in:
Nikolay Nikolov 2024-07-16 15:25:12 +03:00
parent 83a8d584e0
commit 4adac78f85

View File

@ -2051,31 +2051,35 @@ implementation
pd:=tcpuprocdef(current_procinfo.procdef); pd:=tcpuprocdef(current_procinfo.procdef);
g_procdef(list,pd); g_procdef(list,pd);
ttgwasm(tg).allocframepointer(list,pd.frame_pointer_ref); if not nostackframe then
if pd.base_pointer_ref.base<>NR_LOCAL_STACK_POINTER_REG then begin
ttgwasm(tg).allocbasepointer(list,pd.base_pointer_ref);
g_fingerprint(list); ttgwasm(tg).allocframepointer(list,pd.frame_pointer_ref);
if pd.base_pointer_ref.base<>NR_LOCAL_STACK_POINTER_REG then
ttgwasm(tg).allocbasepointer(list,pd.base_pointer_ref);
list.Concat(taicpu.op_sym(a_global_get,RefStackPointerSym)); g_fingerprint(list);
incstack(list,1);
list.Concat(taicpu.op_ref(a_local_set,pd.base_pointer_ref));
decstack(list,1);
if (localsize>0) then begin list.Concat(taicpu.op_sym(a_global_get,RefStackPointerSym));
list.Concat(taicpu.op_ref(a_local_get,pd.base_pointer_ref)); incstack(list,1);
incstack(list,1); list.Concat(taicpu.op_ref(a_local_set,pd.base_pointer_ref));
list.concat(taicpu.op_const(a_i32_const, localsize )); decstack(list,1);
incstack(list,1);
list.concat(taicpu.op_none(a_i32_sub)); if (localsize>0) then begin
decstack(list,1); list.Concat(taicpu.op_ref(a_local_get,pd.base_pointer_ref));
list.Concat(taicpu.op_ref(a_local_set,pd.frame_pointer_ref)); incstack(list,1);
decstack(list,1); list.concat(taicpu.op_const(a_i32_const, localsize ));
list.Concat(taicpu.op_ref(a_local_get,pd.frame_pointer_ref)); incstack(list,1);
incstack(list,1); list.concat(taicpu.op_none(a_i32_sub));
list.Concat(taicpu.op_sym(a_global_set,RefStackPointerSym)); decstack(list,1);
decstack(list,1); list.Concat(taicpu.op_ref(a_local_set,pd.frame_pointer_ref));
end; decstack(list,1);
list.Concat(taicpu.op_ref(a_local_get,pd.frame_pointer_ref));
incstack(list,1);
list.Concat(taicpu.op_sym(a_global_set,RefStackPointerSym));
decstack(list,1);
end;
end;
end; end;
procedure thlcgwasm.g_proc_exit(list: TAsmList; parasize: longint; nostackframe: boolean); procedure thlcgwasm.g_proc_exit(list: TAsmList; parasize: longint; nostackframe: boolean);
@ -2083,12 +2087,15 @@ implementation
pd: tcpuprocdef; pd: tcpuprocdef;
begin begin
pd:=tcpuprocdef(current_procinfo.procdef); pd:=tcpuprocdef(current_procinfo.procdef);
list.Concat(taicpu.op_ref(a_local_get,pd.base_pointer_ref)); if not nostackframe then
incstack(list,1); begin
list.Concat(taicpu.op_sym(a_global_set,RefStackPointerSym)); list.Concat(taicpu.op_ref(a_local_get,pd.base_pointer_ref));
decstack(list,1); incstack(list,1);
list.Concat(taicpu.op_sym(a_global_set,RefStackPointerSym));
decstack(list,1);
list.concat(taicpu.op_none(a_return)); list.concat(taicpu.op_none(a_return));
end;
list.concat(taicpu.op_none(a_end_function)); list.concat(taicpu.op_none(a_end_function));
end; end;