32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
..
99
100
101
102
103
104
105
106
107
108
|
; r12 = u64* errno
; arg 0 = s64* result
; arg 1 = errno ptr
; arg 2 = syscall num
; arg 3 = valency
; arg 4 = args ptr
; we use two registers that are supposed
; to be callee-saved, so we need to
; push them to the stack and then pop
; them back off just before the fn rets.
push rbx
push r12
; store the locals in registers that
; are guaranteed not to be clobbered,
; saving us some cycles pushing to
; and popping back from the stack
mov rbx, ccall.reg.0
mov r12, ccall.reg.1
................................................................................
; the errno to its positive equivalent,
; and store -1 in the return variable
.error: neg sys.reg.ret
mov qword [rbx], -1
mov [r12], sys.reg.ret
jmp .return
.return: pop r12
pop rbx
ret
|
|
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
...
100
101
102
103
104
105
106
107
108
109
110
|
; r12 = u64* errno
; arg 0 = s64* result
; arg 1 = errno ptr
; arg 2 = syscall num
; arg 3 = valency
; arg 4 = args ptr
; we use three registers that are supposed
; to be callee-saved, so we need to
; push them to the stack and then pop
; them back off just before the fn rets.
push rbx
push r12
push r15
; store the locals in registers that
; are guaranteed not to be clobbered,
; saving us some cycles pushing to
; and popping back from the stack
mov rbx, ccall.reg.0
mov r12, ccall.reg.1
................................................................................
; the errno to its positive equivalent,
; and store -1 in the return variable
.error: neg sys.reg.ret
mov qword [rbx], -1
mov [r12], sys.reg.ret
jmp .return
.return: pop r15
pop r12
pop rbx
ret
|