summaryrefslogtreecommitdiff
path: root/lang/icon/patches/patch-ac
blob: fe4fe1abe0e5cc7268bdac31e19cc322cdd6e862 (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
$NetBSD: patch-ac,v 1.7 2003/06/06 08:58:42 jtb Exp $

--- /dev/null
+++ config/netbsd/powerpc.s
@@ -0,0 +1,48 @@
+#
+#	coswitch for the PowerPC
+#
+
+	.file   "rswitch.s"
+
+	.set	RSIZE, 80		# room for regs 13-31, rounded up mod16
+
+	.text
+	.align  2
+	.globl  coswitch
+	.type	coswitch,@function
+
+coswitch:
+	stwu	%r1, -RSIZE(%r1)	# allocate stack frame
+
+					# Save Old Context:
+	stw	%r1, 0(%r3)		# SP
+	stw	%r2, 4(%r3)		# TOC
+	mflr	%r0
+	stw	%r0, 8(%r3)		# LR (return address)
+	mfcr	%r0
+	stw	%r0, 12(%r3)		# CR
+	stmw	%r13, -RSIZE(%r1)	# GPRs 13-31 (save on stack)
+
+	cmpi	0, %r5, 0
+	beq	first			# if first time
+
+					# Restore new context:
+	lwz	%r1, 0(%r4)		# SP
+	lwz	%r2, 4(%r4)		# TOC
+	lwz	%r0, 8(%r4)		# LR
+	mtlr	%r0
+	lwz	%r0, 12(%r4)		# CR
+	mtcr	%r0
+	lmw	%r13, -RSIZE(%r1)	# GPRs 13-31 (from stack)
+
+	addic	%r1, %r1, RSIZE		# deallocate stack frame
+	blr				# return into new context
+
+first:					# First-time call:
+	lwz	%r1, 0(%r4)		# SP as figured by Icon
+	addic	%r1, %r1, -64		# save area for callee
+	addi	%r3, 0, 0		# arg1
+	addi	%r4, 0, 0		# arg2
+	bl	new_context		# new_context(0,0)
+	addi	%r3, 0, 0
+	bl	syserr