swtch.s
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:4k
- #if alpha
- .globl _swtch
- .ent _swtch
- _swtch: lda $sp,-112($sp) # allocate _swtch's frame
- .frame $sp,112,$26
- .fmask 0x3f0000,-112
- stt $f21,0($sp) # save from's registers
- stt $f20,8($sp)
- stt $f19,16($sp)
- stt $f18,24($sp)
- stt $f17,32($sp)
- stt $f16,40($sp)
- .mask 0x400fe00,-64
- stq $26,48+0($sp)
- stq $15,48+8($sp)
- stq $14,48+16($sp)
- stq $13,48+24($sp)
- stq $12,48+32($sp)
- stq $11,48+40($sp)
- stq $10,48+48($sp)
- stq $9,48+56($sp)
- .prologue 0
- stq $sp,0($16) # save from's stack pointer
- ldq $sp,0($17) # restore to's stack pointer
- ldt $f21,0($sp) # restore to's registers
- ldt $f20,8($sp)
- ldt $f19,16($sp)
- ldt $f18,24($sp)
- ldt $f17,32($sp)
- ldt $f16,40($sp)
- ldq $26,48+0($sp)
- ldq $15,48+8($sp)
- ldq $14,48+16($sp)
- ldq $13,48+24($sp)
- ldq $12,48+32($sp)
- ldq $11,48+40($sp)
- ldq $10,48+48($sp)
- ldq $9,48+56($sp)
- lda $sp,112($sp) # deallocate frame
- ret $31,($26)
- .end _swtch
- .globl _start
- .ent _start
- _start: .frame $sp,0,$26
- .mask 0x0,0
- .prologue 0
- mov $14,$16 # register 14 holds args
- mov $15,$27 # register 15 holds apply
- jsr $26,($27) # call apply
- ldgp $26,0($26) # reload the global pointer
- mov $0,$16 # Thread_exit(apply(args))
- mov $13,$27 # register 13 has Thread_exit
- jsr $26,($27)
- call_pal 0
- .end _start
- .globl _ENDMONITOR
- _ENDMONITOR:
- #elif sparc
- .global __swtch
- .align 4
- .proc 4
- __swtch: save %sp,-(8+64),%sp
- st %fp,[%sp+64+0] ! save from's frame pointer
- st %i7,[%sp+64+4] ! save from's return address
- ta 3 ! flush from's registers
- st %sp,[%i0] ! save from's stack pointer
- ld [%i1],%sp ! load to's stack pointer
- ld [%sp+64+0],%fp ! restore to's frame pointer
- ld [%sp+64+4],%i7 ! restore to's return address
- ret ! continue execution of to
- restore
- .global __start
- .align 4
- .proc 4
- __start: ld [%sp+64+4],%o0
- ld [%sp+64],%o1
- call %o1; nop
- call _Thread_exit; nop
- unimp 0
- .global __ENDMONITOR
- __ENDMONITOR:
- #elif mips
- .text
- .globl _swtch
- .align 2
- .ent _swtch
- .set reorder
- _swtch: .frame $sp,88,$31
- subu $sp,88
- .fmask 0xfff00000,-48
- s.d $f20,0($sp)
- s.d $f22,8($sp)
- s.d $f24,16($sp)
- s.d $f26,24($sp)
- s.d $f28,32($sp)
- s.d $f30,40($sp)
- .mask 0xc0ff0000,-4
- sw $16,48+0($sp)
- sw $17,48+4($sp)
- sw $18,48+8($sp)
- sw $19,48+12($sp)
- sw $20,48+16($sp)
- sw $21,48+20($sp)
- sw $22,48+24($sp)
- sw $23,48+28($sp)
- sw $30,48+32($sp)
- sw $31,48+36($sp)
- sw $sp,0($4)
- lw $sp,0($5)
- l.d $f20,0($sp)
- l.d $f22,8($sp)
- l.d $f24,16($sp)
- l.d $f26,24($sp)
- l.d $f28,32($sp)
- l.d $f30,40($sp)
- lw $16,48+0($sp)
- lw $17,48+4($sp)
- lw $18,48+8($sp)
- lw $19,48+12($sp)
- lw $20,48+16($sp)
- lw $21,48+20($sp)
- lw $22,48+24($sp)
- lw $23,48+28($sp)
- lw $30,48+32($sp)
- lw $31,48+36($sp)
- addu $sp,88
- j $31
- .globl _start
- _start: move $4,$23 # register 23 holds args
- move $25,$30 # register 30 holds apply
- jal $25
- move $4,$2 # Thread_exit(apply(p))
- move $25,$21 # register 21 holds Thread_exit
- jal $25
- syscall
- .end _swtch
- .globl _ENDMONITOR
- _ENDMONITOR:
- #elif linux && i386
- .align 4
- .globl __swtch
- .globl _swtch
- __swtch:
- _swtch:
- subl $16,%esp
- movl %ebx,0(%esp)
- movl %esi,4(%esp)
- movl %edi,8(%esp)
- movl %ebp,12(%esp)
- movl 20(%esp),%eax
- movl %esp,0(%eax)
- movl 24(%esp),%eax
- movl 0(%eax),%esp
- movl 0(%esp),%ebx
- movl 4(%esp),%esi
- movl 8(%esp),%edi
- movl 12(%esp),%ebp
- addl $16, %esp
- ret
- .align 4
- .globl __thrstart
- .globl _thrstart
- __thrstart:
- _thrstart:
- pushl %edi
- call *%esi
- pushl %eax
- call Thread_exit
- .globl __ENDMONITOR
- .globl _ENDMONITOR
- __ENDMONITOR:
- _ENDMONITOR:
- #else
- Unsupported platform
- #endif