File: CheckCall64.asm64

package info (click to toggle)
storm-lang 0.7.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 51,836 kB
  • sloc: ansic: 261,420; cpp: 138,870; sh: 14,877; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (73 lines) | stat: -rw-r--r-- 1,075 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
checkCall PROTO

.code

checkCall proc frame
	;; 'fn' is in ecx
	;; 'param' is in edx
	;; 'regs' is in r8

	;; Save 'regs' in home space.
	mov [rsp+08h], r8

	;; Push all volatile registers, so that unwinding works properly.
	push rbx
	.pushreg rbx
	push rdi
	.pushreg rdi
	push rsi
	.pushreg rsi
	push r12
	.pushreg r12
	push r13
	.pushreg r13
	push r14
	.pushreg r14
	push r15
	.pushreg r15
	;; Note: stack is now 16-byte aligned!
	;; We need shadow space also:
	sub rsp, 20h
	.allocstack 20h
	.endprolog
	

	;; Apply values in volatile registers.
	mov rbx, [r8+00h]
	mov rdi, [r8+08h]
	mov rsi, [r8+10h]
	mov r12, [r8+18h]
	mov r13, [r8+20h]
	mov r14, [r8+28h]
	mov r15, [r8+30h]

	;; Call!
	mov r8, rcx
	mov rcx, rdx
	call r8

	;; Save values after call.
	mov r8, [rsp+60h]
	mov [r8+00h], rbx
	mov [r8+08h], rdi
	mov [r8+10h], rsi
	mov [r8+18h], r12
	mov [r8+20h], r13
	mov [r8+28h], r14
	mov [r8+30h], r15

	;; Restore in epilog. Note: don't do anything fancy here.
	add rsp, 20h
	pop r15
	pop r14
	pop r13
	pop r12
	pop rsi
	pop rdi
	pop rbx

	ret

checkCall endp

end