add or1k (OpenRISC 1000) architecture port
[musl] / src / thread / or1k / clone.s
1 /* int clone(fn, stack, flags, arg, ptid, tls, ctid)
2  *           r3  r4     r5     r6   sp+0  sp+4 sp+8
3  * sys_clone(flags, stack, ptid, ctid, tls)
4  */
5 .global __clone
6 .type   __clone,@function
7 __clone:
8         l.addi  r4, r4, -8
9         l.sw    0(r4), r3
10         l.sw    4(r4), r6
11         /* (fn, st, fl, ar, pt, tl, ct) => (fl, st, pt, ct, tl) */
12         l.ori   r3, r5, 0
13         l.lwz   r5, 0(r1)
14         l.lwz   r6, 8(r1)
15         l.lwz   r7, 4(r1)
16         l.ori   r11, r0, 220 /* __NR_clone */
17         l.sys   1
18
19         l.sfeqi r11, 0
20         l.bf    1f
21          l.nop
22         l.jr    r9
23          l.nop
24
25 1:      l.lwz   r11, 0(r1)
26         l.jalr  r11
27          l.lwz  r3, 4(r1)
28
29         l.ori   r11, r0, 93 /* __NR_exit */
30         l.sys   1