summaryrefslogtreecommitdiff
path: root/emu/NetBSD/asm-arm.S
blob: afaa5479ef2f19fa0e8cb37380c52c56659c1b70 (plain)
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
74
75
76
77
78
#include <machine/asm.h>

/*
 * ulong _tas(ulong*);
 */
#if __ARM_ARCH >= 6

#if __ARM_ARCH >= 7
#define	DMB	dmb
#else
#define	DMB	mcr	p15, 0, r0, c7, c10, 5
#endif

ENTRY(_tas)
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	@ lr needed for prologue
	DMB
	mov	r1, r0
	mov	r2, #0xaa
.Loop:
	ldrex	r0, [r1]
	cmp	r0, #0
	bne	.Lockbusy
	strex	r3, r2, [r1]
	cmp	r3, #0
	bne	.Loop
	DMB
	bx	lr
.Lockbusy:
	clrex
	bx	lr
	END(_tas)

#else	/* __ARM_ARCH <= 5*/

ENTRY(_tas)
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	@ lr needed for prologue
	mov	r3, #1
	mov	r1, r0
	swp	r0, r3, [r1]
	bx	lr
	END(_tas)

#endif	/* __ARM_ARCH <= 5*/


/*
 * void FPsave(void *);
 */
ENTRY(FPsave)
	@ args = 0, pretend = 0, frame = 4
	@ frame_needed = 1, uses_anonymous_args = 0
	mov	ip, sp
	stmfd	sp!, {fp, ip, lr, pc}
	sub	fp, ip, #4
	sub	sp, sp, #4
	str	r0, [fp, #-16]
	ldmea	fp, {fp, sp, pc}
	END(FPsave)

/*
 * void FPrestore(void *);
 */
ENTRY(FPrestore)
	@ args = 0, pretend = 0, frame = 4
	@ frame_needed = 1, uses_anonymous_args = 0
	mov	ip, sp
	stmfd	sp!, {fp, ip, lr, pc}
	sub	fp, ip, #4
	sub	sp, sp, #4
	str	r0, [fp, #-16]
	ldmea	fp, {fp, sp, pc}
	END(FPrestore)