diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2015-02-27 21:32:22 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2015-02-27 21:35:34 +0300 |
commit | 5e756d4d8df2949cb3b6e51532d3016cbb276fd7 (patch) | |
tree | f290ff341e9fda39549ee5b1b678b0be66fec1fb /sparc_mach_dep.S | |
parent | b399b13b9e4be18c6a38d315bdb957303f0226d4 (diff) | |
download | bdwgc-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.S | 61 |
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 |