Differences From
Artifact [856b7532d5]:
31 31 ; locals: rbx = s64* result
32 32 ; r12 = u64* errno
33 33 ; arg 0 = s64* result
34 34 ; arg 1 = errno ptr
35 35 ; arg 2 = syscall num
36 36 ; arg 3 = valency
37 37 ; arg 4 = args ptr
38 +
39 + ; we use two registers that are supposed
40 + ; to be callee-saved, so we need to
41 + ; push them to the stack and then pop
42 + ; them back off just before the fn rets.
43 + push rbx
44 + push r12
38 45
39 46 ; store the locals in registers that
40 47 ; are guaranteed not to be clobbered,
41 48 ; saving us some cycles pushing to
42 49 ; and popping back from the stack
43 50 mov rbx, ccall.reg.0
44 51 mov r12, ccall.reg.1
................................................................................
82 89 js .error ; jump if sign flag set
83 90
84 91 ; move our return values into place and
85 92 ; return to the caller (which should
86 93 ; always be k_platform_syscall, btw)
87 94 mov [rbx], sys.reg.ret
88 95 mov qword [r12], 0 ; no error
89 - ret
96 + jmp .return
90 97
91 98 ; an error was returned - we need to set
92 99 ; the errno to its positive equivalent,
93 100 ; and store -1 in the return variable
94 101 .error: neg sys.reg.ret
95 102 mov qword [rbx], -1
96 103 mov [r12], sys.reg.ret
97 - ret
104 + jmp .return
105 +
106 + .return: pop r12
107 + pop rbx
108 + ret