summaryrefslogtreecommitdiff
path: root/lang/icon/patches/patch-ac
diff options
context:
space:
mode:
Diffstat (limited to 'lang/icon/patches/patch-ac')
-rw-r--r--lang/icon/patches/patch-ac52
1 files changed, 52 insertions, 0 deletions
diff --git a/lang/icon/patches/patch-ac b/lang/icon/patches/patch-ac
new file mode 100644
index 00000000000..a160a3e8d75
--- /dev/null
+++ b/lang/icon/patches/patch-ac
@@ -0,0 +1,52 @@
+$NetBSD: patch-ac,v 1.5 2003/03/24 12:12:10 jtb Exp $
+
+--- /dev/null Mon Mar 24 11:07:29 2003
++++ config/unix/netbsd/powerpc.s Mon Mar 24 11:40:22 2003
+@@ -0,0 +1,47 @@
++# Adapted from ppc_macos/rswitch.s
++#
++
++ .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