author | Rich Felker <dalias@aerifal.cx> | 2016年03月06日 17:41:56 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2016年03月06日 17:41:56 +0000 |
commit | 83933573aff71a5d178ab71912f177d2d844e63e (patch) | |
tree | 3c7057d0c83c0030b8a6c0405f1b2797fbbcf450 /src | |
parent | 71392a91c333d47b6b3c8f99c897e3b5a7eb6d58 (diff) | |
download | musl-83933573aff71a5d178ab71912f177d2d844e63e.tar.gz |
-rw-r--r-- | src/fenv/mips64/fenv-sf.c | 3 | ||||
-rw-r--r-- | src/fenv/mips64/fenv.S | 71 | ||||
-rw-r--r-- | src/internal/mips64/syscall.s | 19 | ||||
-rw-r--r-- | src/ldso/mips64/dlsym.s | 17 | ||||
-rw-r--r-- | src/setjmp/mips64/longjmp.S | 37 | ||||
-rw-r--r-- | src/setjmp/mips64/setjmp.S | 34 | ||||
-rw-r--r-- | src/signal/mips64/restore.s | 9 | ||||
-rw-r--r-- | src/signal/mips64/sigsetjmp.s | 38 | ||||
-rw-r--r-- | src/thread/mips64/__unmapself.s | 9 | ||||
-rw-r--r-- | src/thread/mips64/clone.s | 30 | ||||
-rw-r--r-- | src/thread/mips64/syscall_cp.s | 52 | ||||
-rw-r--r-- | src/unistd/mips64/pipe.s | 19 |
diff --git a/src/fenv/mips64/fenv-sf.c b/src/fenv/mips64/fenv-sf.c new file mode 100644 index 00000000..4aa3dbf1 --- /dev/null +++ b/src/fenv/mips64/fenv-sf.c @@ -0,0 +1,3 @@ +#ifdef __mips_soft_float +#include "../fenv.c" +#endif diff --git a/src/fenv/mips64/fenv.S b/src/fenv/mips64/fenv.S new file mode 100644 index 00000000..3cba3f0f --- /dev/null +++ b/src/fenv/mips64/fenv.S @@ -0,0 +1,71 @@ +#ifndef __mips_soft_float + +.set noreorder + +.global feclearexcept +.type feclearexcept,@function +feclearexcept: + and 4,ドル 4,ドル 0x7c + cfc1 5,ドル 31ドル + or 5,ドル 5,ドル 4ドル + xor 5,ドル 5,ドル 4ドル + ctc1 5,ドル 31ドル + jr $ra + li 2,ドル 0 + +.global feraiseexcept +.type feraiseexcept,@function +feraiseexcept: + and 4,ドル 4,ドル 0x7c + cfc1 5,ドル 31ドル + or 5,ドル 5,ドル 4ドル + ctc1 5,ドル 31ドル + jr $ra + li 2,ドル 0 + +.global fetestexcept +.type fetestexcept,@function +fetestexcept: + and 4,ドル 4,ドル 0x7c + cfc1 2,ドル 31ドル + jr $ra + and 2,ドル 2,ドル 4ドル + +.global fegetround +.type fegetround,@function +fegetround: + cfc1 2,ドル 31ドル + jr $ra + andi 2,ドル 2,ドル 3 + +.global __fesetround +.type __fesetround,@function +__fesetround: + cfc1 5,ドル 31ドル + li 6,ドル -4 + and 5,ドル 5,ドル 6ドル + or 5,ドル 5,ドル 4ドル + ctc1 5,ドル 31ドル + jr $ra + li 2,ドル 0 + +.global fegetenv +.type fegetenv,@function +fegetenv: + cfc1 5,ドル 31ドル + sw 5,ドル 0(4ドル) + jr $ra + li 2,ドル 0 + +.global fesetenv +.type fesetenv,@function +fesetenv: + daddiu 5,ドル 4,ドル 1 + beq 5,ドル 0,ドル 1f + nop + lw 5,ドル 0(4ドル) +1: ctc1 5,ドル 31ドル + jr $ra + li 2,ドル 0 + +#endif diff --git a/src/internal/mips64/syscall.s b/src/internal/mips64/syscall.s new file mode 100644 index 00000000..98448667 --- /dev/null +++ b/src/internal/mips64/syscall.s @@ -0,0 +1,19 @@ +.set noreorder +.global __syscall +.hidden __syscall +.type __syscall,@function +__syscall: + move 2,ドル 4ドル + move 4,ドル 5ドル + move 5,ドル 6ドル + move 6,ドル 7ドル + move 7,ドル 8ドル + move 8,ドル 9ドル + move 9,ドル 10ドル + move 10,ドル 11ドル + syscall + beq 7,ドル 0,ドル 1f + nop + dsubu 2,ドル 0,ドル 2ドル +1: jr $ra + nop diff --git a/src/ldso/mips64/dlsym.s b/src/ldso/mips64/dlsym.s new file mode 100644 index 00000000..32e0dddc --- /dev/null +++ b/src/ldso/mips64/dlsym.s @@ -0,0 +1,17 @@ +.set noreorder +.global dlsym +.hidden __dlsym +.type dlsym,@function +dlsym: + lui 3,ドル %hi(%neg(%gp_rel(dlsym))) + daddiu 3,ドル 3,ドル %lo(%neg(%gp_rel(dlsym))) + daddu 3,ドル 3,ドル 25ドル + move 6,ドル $ra + ld 25,ドル %got_disp(__dlsym)(3ドル) + daddiu $sp, $sp, -32 + sd $ra, 24($sp) + jalr 25ドル + nop + ld $ra, 24($sp) + jr $ra + daddiu $sp, $sp, 32 diff --git a/src/setjmp/mips64/longjmp.S b/src/setjmp/mips64/longjmp.S new file mode 100644 index 00000000..3db8a883 --- /dev/null +++ b/src/setjmp/mips64/longjmp.S @@ -0,0 +1,37 @@ +.set noreorder +.global _longjmp +.global longjmp +.type _longjmp,@function +.type longjmp,@function +_longjmp: +longjmp: + move 2,ドル 5ドル + + bne 2,ドル 0,ドル 1f + nop + daddu 2,ドル 2,ドル 1 +1: +#ifndef __mips_soft_float + ldc1 24,ドル 96(4ドル) + ldc1 25,ドル 104(4ドル) + ldc1 26,ドル 112(4ドル) + ldc1 27,ドル 120(4ドル) + ldc1 28,ドル 128(4ドル) + ldc1 29,ドル 136(4ドル) + ldc1 30,ドル 144(4ドル) + ldc1 31,ドル 152(4ドル) +#endif + ld $ra, 0(4ドル) + ld $sp, 8(4ドル) + ld $gp, 16(4ドル) + ld 16,ドル 24(4ドル) + ld 17,ドル 32(4ドル) + ld 18,ドル 40(4ドル) + ld 19,ドル 48(4ドル) + ld 20,ドル 56(4ドル) + ld 21,ドル 64(4ドル) + ld 22,ドル 72(4ドル) + ld 23,ドル 80(4ドル) + ld 30,ドル 88(4ドル) + jr $ra + nop diff --git a/src/setjmp/mips64/setjmp.S b/src/setjmp/mips64/setjmp.S new file mode 100644 index 00000000..b9646c2a --- /dev/null +++ b/src/setjmp/mips64/setjmp.S @@ -0,0 +1,34 @@ +.set noreorder +.global __setjmp +.global _setjmp +.global setjmp +.type __setjmp,@function +.type _setjmp,@function +.type setjmp,@function +__setjmp: +_setjmp: +setjmp: + sd $ra, 0(4ドル) + sd $sp, 8(4ドル) + sd $gp, 16(4ドル) + sd 16,ドル 24(4ドル) + sd 17,ドル 32(4ドル) + sd 18,ドル 40(4ドル) + sd 19,ドル 48(4ドル) + sd 20,ドル 56(4ドル) + sd 21,ドル 64(4ドル) + sd 22,ドル 72(4ドル) + sd 23,ドル 80(4ドル) + sd 30,ドル 88(4ドル) +#ifndef __mips_soft_float + sdc1 24,ドル 96(4ドル) + sdc1 25,ドル 104(4ドル) + sdc1 26,ドル 112(4ドル) + sdc1 27,ドル 120(4ドル) + sdc1 28,ドル 128(4ドル) + sdc1 29,ドル 136(4ドル) + sdc1 30,ドル 144(4ドル) + sdc1 31,ドル 152(4ドル) +#endif + jr $ra + li 2,ドル 0 diff --git a/src/signal/mips64/restore.s b/src/signal/mips64/restore.s new file mode 100644 index 00000000..e8988369 --- /dev/null +++ b/src/signal/mips64/restore.s @@ -0,0 +1,9 @@ +.set noreorder +.global __restore_rt +.global __restore +.type __restore_rt,@function +.type __restore,@function +__restore_rt: +__restore: + li 2,5211ドル + syscall diff --git a/src/signal/mips64/sigsetjmp.s b/src/signal/mips64/sigsetjmp.s new file mode 100644 index 00000000..156e70bd --- /dev/null +++ b/src/signal/mips64/sigsetjmp.s @@ -0,0 +1,38 @@ +.set noreorder +.global sigsetjmp +.global __sigsetjmp +.type sigsetjmp,@function +.type __sigsetjmp,@function +sigsetjmp: +__sigsetjmp: + lui 3,ドル %hi(%neg(%gp_rel(sigsetjmp))) + daddiu 3,ドル 3,ドル %lo(%neg(%gp_rel(sigsetjmp))) + + # comparing save mask with 0, if equals to 0 then + # sigsetjmp is equal to setjmp. + beq 5,ドル 0,ドル 1f + daddu 3,ドル 3,ドル 25ドル + sd $ra, 160(4ドル) + sd 16,ドル 168(4ドル) + + # save base of got so that we can use it later + # once we return from 'longjmp' + sd 3,ドル 176(4ドル) + ld 25,ドル %got_disp(setjmp)(3ドル) + jalr 25ドル + move 16,ドル 4ドル + + move 5,ドル 2ドル # Return from 'setjmp' or 'longjmp' + move 4,ドル 16ドル # Restore the pointer-to-sigjmp_buf + ld $ra, 160(4ドル) # Restore ra of sigsetjmp + ld 16,ドル 168(4ドル) # Restore 16ドル of sigsetjmp + ld 3,ドル 176(4ドル) # Restore base of got + +.hidden __sigsetjmp_tail + ld 25,ドル %got_disp(__sigsetjmp_tail)(3ドル) + jr 25ドル + nop +1: + ld 25,ドル %got_disp(setjmp)(3ドル) + jr 25ドル + nop diff --git a/src/thread/mips64/__unmapself.s b/src/thread/mips64/__unmapself.s new file mode 100644 index 00000000..f6795cda --- /dev/null +++ b/src/thread/mips64/__unmapself.s @@ -0,0 +1,9 @@ +.set noreorder +.global __unmapself +.type __unmapself, @function +__unmapself: + li 2,ドル 5011 + syscall + li 4,ドル 0 + li 2,ドル 5058 + syscall diff --git a/src/thread/mips64/clone.s b/src/thread/mips64/clone.s new file mode 100644 index 00000000..229d2677 --- /dev/null +++ b/src/thread/mips64/clone.s @@ -0,0 +1,30 @@ +.set noreorder +.global __clone +.type __clone,@function +__clone: + # Save function pointer and argument pointer on new thread stack + and 5,ドル 5,ドル -16 # aligning stack to double word + dsubu 5,ドル 5,ドル 16 + sd 4,ドル 0(5ドル) # save function pointer + sd 7,ドル 8(5ドル) # save argument pointer + + # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid) + # sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls) + move 4,ドル 6ドル + move 6,ドル 8ドル + move 7,ドル 9ドル + move 8,ドル 10ドル + li 2,ドル 5055 + syscall + beq 7,ドル 0,ドル 1f + nop + jr $ra + dsubu 2,ドル 0,ドル 2ドル +1: beq 2,ドル 0,ドル 1f + nop + jr $ra + nop +1: ld 25,ドル 0($sp) # function pointer + ld 4,ドル 8($sp) # argument pointer + jr 25ドル # call the user's function + nop diff --git a/src/thread/mips64/syscall_cp.s b/src/thread/mips64/syscall_cp.s new file mode 100644 index 00000000..0d4ede76 --- /dev/null +++ b/src/thread/mips64/syscall_cp.s @@ -0,0 +1,52 @@ +.set noreorder +.global __cp_begin +.hidden __cp_begin +.type __cp_begin,@function +.global __cp_end +.hidden __cp_end +.type __cp_end,@function +.global __cp_cancel +.hidden __cp_cancel +.type __cp_cancel,@function +.global __cp_cancel_data +.hidden __cp_cancel_data +.type __cp_cancel_data,@function +.hidden __cancel +.global __syscall_cp_asm +.hidden __syscall_cp_asm +.type __syscall_cp_asm,@function +__syscall_cp_asm: +__cp_begin: + lw 4,ドル 0(4ドル) + bne 4,ドル 0,ドル __cp_cancel + move 2,ドル 5ドル + move 4,ドル 6ドル + move 5,ドル 7ドル + move 6,ドル 8ドル + move 7,ドル 9ドル + move 8,ドル 10ドル + move 9,ドル 11ドル + ld 10,ドル 0($sp) + syscall +__cp_end: + beq 7,ドル 0,ドル 1f + nop + dsubu 2,ドル 0,ドル 2ドル +1: jr $ra + nop + + # if cancellation flag is 1 then call __cancel +__cp_cancel: + move 2,ドル $ra +.align 8 + bal 1f + nop +__cp_cancel_data: + .gpdword __cp_cancel_data + .gpdword __cancel +1: ld 3,ドル ($ra) + dsubu 3,ドル $ra, 3ドル + ld 25,ドル 8($ra) + daddu 25,ドル 25,ドル 3ドル + jr 25ドル + move $ra, 2ドル diff --git a/src/unistd/mips64/pipe.s b/src/unistd/mips64/pipe.s new file mode 100644 index 00000000..f8a27dcc --- /dev/null +++ b/src/unistd/mips64/pipe.s @@ -0,0 +1,19 @@ +.set noreorder +.global pipe +.type pipe,@function +pipe: + lui 3,ドル %hi(%neg(%gp_rel(pipe))) + daddiu 3,ドル 3,ドル %lo(%neg(%gp_rel(pipe))) + daddu 3,ドル 3,ドル 25ドル + li 2,ドル 5021 + syscall + beq 7,ドル 0,ドル 1f + nop + ld 25,ドル %got_disp(__syscall_ret)(3ドル) + jr 25ドル + dsubu 4,ドル 0,ドル 2ドル +1: sw 2,ドル 0(4ドル) + sw 3,ドル 4(4ドル) + move 2,ドル 0ドル + jr $ra + nop |