aboutsummaryrefslogtreecommitdiff
path: root/unix/as.macosx/zsvjmp.s.OLD
diff options
context:
space:
mode:
Diffstat (limited to 'unix/as.macosx/zsvjmp.s.OLD')
-rw-r--r--unix/as.macosx/zsvjmp.s.OLD124
1 files changed, 124 insertions, 0 deletions
diff --git a/unix/as.macosx/zsvjmp.s.OLD b/unix/as.macosx/zsvjmp.s.OLD
new file mode 100644
index 00000000..7d631357
--- /dev/null
+++ b/unix/as.macosx/zsvjmp.s.OLD
@@ -0,0 +1,124 @@
+# ZSVJMP.S -- LinuxPPC version, September 2001.
+
+.file "zsvjmp.s"
+
+ # ZSVJMP -- SPP callable SETJMP.
+.text
+ .align 2
+ .globl _zsvjmp_
+_zsvjmp_:
+ # R3 = buf, R4 = &status
+ li r11,0 ; r11 = 0
+ stw r11,0(r4) ; set *status to zero
+ stw r4,0(r3) ; store &status in buf[0]
+ addi r3,r3,4 ; reference buf[1] for setjmp
+ b L_setjmp$stub
+L2:
+ lwz r1,0(r1)
+ lwz r0,8(r1)
+ mtlr r0
+ lmw r30,-8(r1)
+ blr
+
+ # The setjmp code is only available in a dynamic library on 10.1.
+.picsymbol_stub
+L_setjmp$stub:
+ .indirect_symbol _setjmp
+ mflr r0
+ bcl 20,31,L1$pb
+L1$pb:
+ mflr r11
+ addis r11,r11,ha16(L1$lz-L1$pb)
+ mtlr r0
+ lwz r12,lo16(L1$lz-L1$pb)(r11)
+ mtctr r12
+ addi r11,r11,lo16(L1$lz-L1$pb)
+ bctr
+.lazy_symbol_pointer
+L1$lz:
+ .indirect_symbol _setjmp
+ .long dyld_stub_binding_helper
+.text
+.Lfe1:
+
+ # Set the address of the MEM common to zero.
+ .globl mem_
+ mem_ = 0
+
+
+ # GFPUCW -- Get the FPU control register.
+ .globl _gfpucw_
+_gfpucw_:
+ stwu r1, -32(r1)
+ stw r31, 28(r1)
+ mr r31, r1
+ stw r3, 8(r31)
+ mffs f0
+ stfd f0, 16(r31)
+ lwz r0, 20(r31)
+ mr r9, r0
+ lwz r9, 8(r31)
+ stw r0, 0(r9)
+.L3:
+ lwz r11, 0(r1)
+ lwz r31, -4(r11)
+ mr r1, r11
+ blr
+.Lfe2:
+
+
+ # SFPUCW -- Set the FPU control register.
+
+ .globl _sfpucw_
+_sfpucw_:
+ stwu r1, -32(r1)
+ stw r31, 28(r1)
+ mr r31, r1
+ stw r3, 8(r31)
+ lis r0, 0xfff8
+ stw r0, 16(r31)
+ lwz r9, 8(r31)
+ lwz r0, 0(r9)
+ stw r0, 20(r31)
+ lfd f0, 16(r31)
+ mtfsf 255, f0
+.L4:
+ lwz r11, 0(r1)
+ lwz r31, -4(r11)
+ mr r1, r11
+ blr
+.Lfe3:
+
+
+ # CFPUCW -- Clear the exception flags in the FPU control register.
+ # So far I have not been able to find a way to make this work, at
+ # least with the current version of LinuxPPC. All of the instructions
+ # below fail, raising another SIGFPE if an exception condition is
+ # already present. ANY instruction involving the FPU will raise
+ # SIGFPE once the exception condition exists. Also, LinuxPPC
+ # sigaction does not block SIGFPE in the called exception handler,
+ # contrary to the manpage. It appears that the exception handling
+ # in the kernel needs to clear the exception condition but is not
+ # doing so. Supervisor level instructions appear to be required to
+ # clear the exception condition, so this has to be done in the kernel
+ # before the user level signal handler is called.
+
+ .globl _cfpucw_
+_cfpucw_:
+ stwu r1, -32(r1)
+ stw r31, 28(r1)
+ mr r31, r1
+ #mcrfs r0, 0
+ #mtfsfi r0, 0
+ #mtfsfi r3, 0
+ #mtfsfi r3, 0
+ #mtfsfi r5, 0
+ #mtfsfb0 r3
+ #mtfsfb0 r5
+ #mtfsfb0 r7
+.L5:
+ lwz r11, 0(r1)
+ lwz r31, -4(r11)
+ mr r1, r11
+ blr
+.Lfe4: