diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2011-08-25 12:11:42 +0400 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-08-25 12:11:42 +0400 |
commit | 30db5005d67bdcd8bfacd07201b21f20ef6f8b2d (patch) | |
tree | d42db85806be5c8e1dee5e1e26fa705ea625159c /src | |
parent | f73c7687a129ac0cb3918b4bd0186d9cb48aa0f3 (diff) | |
download | bdwgc-30db5005d67bdcd8bfacd07201b21f20ef6f8b2d.tar.gz |
Move asm machine-dependent files to "src" folder.
* .gitignore: Add entries from "src" folder; add auto-generated files
by CMake; allow a suffix for "libatomic_ops" folder.
* Makefile.direct (SRCS, mach_dep.o): Move sparc_mach_dep.S,
sparc_sunos4_mach_dep.s, sparc_netbsd_mach_dep.s,
ia64_save_regs_in_stack.s to "src" directory.
* Makefile.dj (SRCS): Ditto.
* configure.ac (machdep): Move sparc_mach_dep.lo,
sparc_netbsd_mach_dep.lo, ia64_save_regs_in_stack.lo to "src" folder.
* PCR-Makefile (mach_dep.o): Remove "if_mach" statement for MIPS.
* PCR-Makefile (if_mach, if_not_there): Remove rules.
* gc.mak (CPP_PROJ): Prefix libatomic_ops folder with "./".
Diffstat (limited to 'src')
-rw-r--r-- | src/ia64_save_regs_in_stack.s | 12 | ||||
-rw-r--r-- | src/sparc_mach_dep.S | 61 | ||||
-rw-r--r-- | src/sparc_netbsd_mach_dep.s | 34 | ||||
-rw-r--r-- | src/sparc_sunos4_mach_dep.s | 38 |
4 files changed, 145 insertions, 0 deletions
diff --git a/src/ia64_save_regs_in_stack.s b/src/ia64_save_regs_in_stack.s new file mode 100644 index 00000000..3b18c084 --- /dev/null +++ b/src/ia64_save_regs_in_stack.s @@ -0,0 +1,12 @@ + .text + .align 16 + .global GC_save_regs_in_stack + .proc GC_save_regs_in_stack +GC_save_regs_in_stack: + .body + flushrs + ;; + mov r8=ar.bsp + br.ret.sptk.few rp + .endp GC_save_regs_in_stack + diff --git a/src/sparc_mach_dep.S b/src/sparc_mach_dep.S new file mode 100644 index 00000000..d204dc43 --- /dev/null +++ b/src/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 diff --git a/src/sparc_netbsd_mach_dep.s b/src/sparc_netbsd_mach_dep.s new file mode 100644 index 00000000..bc3f1603 --- /dev/null +++ b/src/sparc_netbsd_mach_dep.s @@ -0,0 +1,34 @@ +! 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 4. +! Assumes this is called before the stack contents are +! examined. + +#include "machine/asm.h" + + .seg "text" + .globl _C_LABEL(GC_save_regs_in_stack) + .globl _C_LABEL(GC_push_regs) +_C_LABEL(GC_save_regs_in_stack): +_C_LABEL(GC_push_regs): + ta 0x3 ! ST_FLUSH_WINDOWS + mov %sp,%o0 + retl + nop + + .globl _C_LABEL(GC_clear_stack_inner) +_C_LABEL(GC_clear_stack_inner): + 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 diff --git a/src/sparc_sunos4_mach_dep.s b/src/sparc_sunos4_mach_dep.s new file mode 100644 index 00000000..41858073 --- /dev/null +++ b/src/sparc_sunos4_mach_dep.s @@ -0,0 +1,38 @@ +! 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 4. +! Assumes this is called before the stack contents are +! examined. + + .seg "text" + .globl _GC_save_regs_in_stack + .globl _GC_push_regs +_GC_save_regs_in_stack: +_GC_push_regs: + ta 0x3 ! ST_FLUSH_WINDOWS + mov %sp,%o0 + retl + nop + + .globl _GC_clear_stack_inner +_GC_clear_stack_inner: + 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 + + + + + + |