summaryrefslogtreecommitdiff
path: root/sparc_mach_dep.S
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2015-02-27 21:32:22 +0300
committerIvan Maidanski <ivmai@mail.ru>2015-02-27 21:35:34 +0300
commit5e756d4d8df2949cb3b6e51532d3016cbb276fd7 (patch)
treef290ff341e9fda39549ee5b1b678b0be66fec1fb /sparc_mach_dep.S
parentb399b13b9e4be18c6a38d315bdb957303f0226d4 (diff)
downloadbdwgc-5e756d4d8df2949cb3b6e51532d3016cbb276fd7.tar.gz
Revert "Move asm machine-dependent files to 'src' folder" (partly)
Asm files moved back to base folder to avoid build issues (reported for NetBSD and Solaris on Sparc). Alternative way is to adjust configure.ac and Makefile.am properly but it requires more efforts (including testing). * .gitignore: Remove "src" from comment. * Makefile.am (EXTRA_libgc_la_SOURCES): Remove "src/" prefix. * Makefile.direct (SRCS, mach_dep.o): Likewise. * src/ia64_save_regs_in_stack.s: Move to base folder. * src/sparc_mach_dep.S: Likewise. * src/sparc_netbsd_mach_dep.s: Likewise. * src/sparc_sunos4_mach_dep.s: Likewise.
Diffstat (limited to 'sparc_mach_dep.S')
-rw-r--r--sparc_mach_dep.S61
1 files changed, 61 insertions, 0 deletions
diff --git a/sparc_mach_dep.S b/sparc_mach_dep.S
new file mode 100644
index 00000000..d204dc43
--- /dev/null
+++ b/sparc_mach_dep.S
@@ -0,0 +1,61 @@
+! SPARCompiler 3.0 and later apparently no longer handles
+! asm outside functions. So we need a separate .s file
+! This is only set up for SunOS 5, not SunOS 4.
+! Assumes this is called before the stack contents are
+! examined.
+
+ .seg "text"
+ .globl GC_save_regs_in_stack
+GC_save_regs_in_stack:
+#if defined(__arch64__) || defined(__sparcv9)
+ save %sp,-128,%sp
+ flushw
+ ret
+ restore %sp,2047+128,%o0
+#else /* 32 bit SPARC */
+ ta 0x3 ! ST_FLUSH_WINDOWS
+ mov %sp,%o0
+ retl
+ nop
+#endif /* 32 bit SPARC */
+.GC_save_regs_in_stack_end:
+ .size GC_save_regs_in_stack,.GC_save_regs_in_stack_end-GC_save_regs_in_stack
+
+! GC_clear_stack_inner(arg, limit) clears stack area up to limit and
+! returns arg. Stack clearing is crucial on SPARC, so we supply
+! an assembly version that s more careful. Assumes limit is hotter
+! than sp, and limit is 8 byte aligned.
+ .globl GC_clear_stack_inner
+GC_clear_stack_inner:
+#if defined(__arch64__) || defined(__sparcv9)
+ mov %sp,%o2 ! Save sp
+ add %sp,2047-8,%o3 ! p = sp+bias-8
+ add %o1,-2047-192,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ stx %g0,[%o3] ! *(long *)p = 0
+ cmp %o3,%o1
+ bgu,pt %xcc, loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+#else /* 32 bit SPARC */
+ mov %sp,%o2 ! Save sp
+ add %sp,-8,%o3 ! p = sp-8
+ clr %g1 ! [g0,g1] = 0
+ add %o1,-0x60,%sp ! Move sp out of the way,
+ ! so that traps still work.
+ ! Includes some extra words
+ ! so we can be sloppy below.
+loop:
+ std %g0,[%o3] ! *(long long *)p = 0
+ cmp %o3,%o1
+ bgu loop ! if (p > limit) goto loop
+ add %o3,-8,%o3 ! p -= 8 (delay slot)
+ retl
+ mov %o2,%sp ! Restore sp., delay slot
+#endif /* 32 bit SPARC */
+.GC_clear_stack_inner_end:
+ .size GC_clear_stack_inner,.GC_clear_stack_inner_end-GC_clear_stack_inner