1 	.global __cp_begin
2 	.hidden __cp_begin
3 	.global __cp_end
4 	.hidden __cp_end
5 	.global __cp_cancel
6 	.hidden __cp_cancel
7 	.hidden __cancel
8 	.global __syscall_cp_asm
9 	.hidden __syscall_cp_asm
10 	.text
11 	.type   __syscall_cp_asm,%function
12 __syscall_cp_asm:
13 	# at enter: r3 = pointer to self->cancel, r4: syscall no, r5: first arg, r6: 2nd, r7: 3rd, r8: 4th, r9: 5th, r10: 6th
14 __cp_begin:
15 	# if (self->cancel) goto __cp_cancel
16 	lwz   0, 0(3)
17 	cmpwi cr7, 0, 0
18 	bne-  cr7, __cp_cancel
19 
20 	# make syscall
21 	mr    0,  4
22 	mr    3,  5
23 	mr    4,  6
24 	mr    5,  7
25 	mr    6,  8
26 	mr    7,  9
27 	mr    8, 10
28 	sc
29 
30 __cp_end:
31 	# return error ? -r3 : r3
32 	bnslr+
33 	neg 3, 3
34 	blr
35 
36 __cp_cancel:
37 	mflr 0
38 	bl 1f
39 	.long .TOC.-.
40 1:	mflr 3
41 	lwa 2, 0(3)
42 	add 2, 2, 3
43 	mtlr 0
44 	b __cancel
45