| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | |
| | |
| | TEXT _rt0_386(SB),NOSPLIT,$8 |
| | MOVL 8(SP), AX |
| | LEAL 12(SP), BX |
| | MOVL AX, 0(SP) |
| | MOVL BX, 4(SP) |
| | JMP runtime路rt0_go(SB) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | TEXT _rt0_386_lib(SB),NOSPLIT,$0 |
| | PUSHL BP |
| | MOVL SP, BP |
| | PUSHL BX |
| | PUSHL SI |
| | PUSHL DI |
| |
|
| | MOVL 8(BP), AX |
| | MOVL AX, _rt0_386_lib_argc<>(SB) |
| | MOVL 12(BP), AX |
| | MOVL AX, _rt0_386_lib_argv<>(SB) |
| |
|
| | |
| | CALL runtime路libpreinit(SB) |
| |
|
| | SUBL $8, SP |
| |
|
| | |
| | MOVL _cgo_sys_thread_create(SB), AX |
| | TESTL AX, AX |
| | JZ nocgo |
| |
|
| | |
| | |
| | MOVL SP, BP |
| | ANDL $~15, SP |
| |
|
| | MOVL $_rt0_386_lib_go(SB), BX |
| | MOVL BX, 0(SP) |
| | MOVL $0, 4(SP) |
| |
|
| | CALL AX |
| |
|
| | MOVL BP, SP |
| |
|
| | JMP restore |
| |
|
| | nocgo: |
| | MOVL $0x800000, 0(SP) |
| | MOVL $_rt0_386_lib_go(SB), AX |
| | MOVL AX, 4(SP) |
| | CALL runtime路newosproc0(SB) |
| |
|
| | restore: |
| | ADDL $8, SP |
| | POPL DI |
| | POPL SI |
| | POPL BX |
| | POPL BP |
| | RET |
| |
|
| | |
| | |
| | TEXT _rt0_386_lib_go(SB),NOSPLIT,$8 |
| | MOVL _rt0_386_lib_argc<>(SB), AX |
| | MOVL AX, 0(SP) |
| | MOVL _rt0_386_lib_argv<>(SB), AX |
| | MOVL AX, 4(SP) |
| | JMP runtime路rt0_go(SB) |
| |
|
| | DATA _rt0_386_lib_argc<>(SB)/4, $0 |
| | GLOBL _rt0_386_lib_argc<>(SB),NOPTR, $4 |
| | DATA _rt0_386_lib_argv<>(SB)/4, $0 |
| | GLOBL _rt0_386_lib_argv<>(SB),NOPTR, $4 |
| |
|
| | TEXT runtime路rt0_go(SB),NOSPLIT|NOFRAME|TOPFRAME,$0 |
| | |
| | |
| | MOVL 0(SP), AX |
| | MOVL 4(SP), BX |
| | SUBL $128, SP |
| | ANDL $~15, SP |
| | MOVL AX, 120(SP) |
| | MOVL BX, 124(SP) |
| |
|
| | |
| | |
| | MOVL $runtime路g0(SB), BP |
| | LEAL (-64*1024+104)(SP), BX |
| | MOVL BX, g_stackguard0(BP) |
| | MOVL BX, g_stackguard1(BP) |
| | MOVL BX, (g_stack+stack_lo)(BP) |
| | MOVL SP, (g_stack+stack_hi)(BP) |
| |
|
| | |
| | |
| | PUSHFL |
| | PUSHFL |
| | XORL $(1<<21), 0(SP) |
| | POPFL |
| | PUSHFL |
| | POPL AX |
| | XORL 0(SP), AX |
| | POPFL |
| | TESTL $(1<<21), AX |
| | JNE has_cpuid |
| |
|
| | bad_proc: |
| | MOVL $2, 0(SP) |
| | MOVL $bad_proc_msg<>(SB), 4(SP) |
| | MOVL $0x3d, 8(SP) |
| | CALL runtime路write(SB) |
| | MOVL $1, 0(SP) |
| | CALL runtime路exit(SB) |
| | CALL runtime路abort(SB) |
| |
|
| | has_cpuid: |
| | MOVL $0, AX |
| | CPUID |
| | MOVL AX, SI |
| | CMPL AX, $0 |
| | JE nocpuinfo |
| |
|
| | CMPL BX, $0x756E6547 |
| | JNE notintel |
| | CMPL DX, $0x49656E69 |
| | JNE notintel |
| | CMPL CX, $0x6C65746E |
| | JNE notintel |
| | MOVB $1, runtime路isIntel(SB) |
| | notintel: |
| |
|
| | |
| | MOVL $1, AX |
| | CPUID |
| | MOVL CX, DI |
| | MOVL AX, runtime路processorVersionInfo(SB) |
| |
|
| | |
| | TESTL $(1<<23), DX |
| | JZ bad_proc |
| |
|
| | nocpuinfo: |
| | |
| | |
| | |
| | MOVL _cgo_init(SB), AX |
| | TESTL AX, AX |
| | JZ needtls |
| | |
| | |
| | |
| | MOVL -8(TLS), BX |
| | MOVL BX, 12(SP) |
| | MOVL $runtime路tls_g(SB), 8(SP) |
| | |
| | MOVL $0, BX |
| | MOVL BX, 12(SP) |
| | |
| | MOVL $runtime路tls_g(SB), 8(SP) |
| | |
| | MOVL BX, 8(SP) |
| | |
| | |
| | MOVL $setg_gcc<>(SB), BX |
| | MOVL BX, 4(SP) |
| | MOVL BP, 0(SP) |
| | CALL AX |
| |
|
| | |
| | MOVL $runtime路g0(SB), CX |
| | MOVL (g_stack+stack_lo)(CX), AX |
| | ADDL $const_stackGuard, AX |
| | MOVL AX, g_stackguard0(CX) |
| | MOVL AX, g_stackguard1(CX) |
| |
|
| | |
| | |
| | JMP ok |
| | |
| | needtls: |
| | |
| | |
| | JMP ok |
| | |
| | |
| | |
| | JMP ok |
| | |
| |
|
| | |
| | CALL ldt0setup<>(SB) |
| |
|
| | |
| | get_tls(BX) |
| | MOVL $0x123, g(BX) |
| | MOVL runtime路m0+m_tls(SB), AX |
| | CMPL AX, $0x123 |
| | JEQ ok |
| | MOVL AX, 0 |
| | ok: |
| | |
| | get_tls(BX) |
| | LEAL runtime路g0(SB), DX |
| | MOVL DX, g(BX) |
| | LEAL runtime路m0(SB), AX |
| |
|
| | |
| | MOVL DX, m_g0(AX) |
| | |
| | MOVL AX, g_m(DX) |
| |
|
| | CALL runtime路emptyfunc(SB) |
| |
|
| | |
| | CLD |
| |
|
| | CALL runtime路check(SB) |
| |
|
| | |
| | MOVL 120(SP), AX |
| | MOVL AX, 0(SP) |
| | MOVL 124(SP), AX |
| | MOVL AX, 4(SP) |
| | CALL runtime路args(SB) |
| | CALL runtime路osinit(SB) |
| | CALL runtime路schedinit(SB) |
| |
|
| | |
| | PUSHL $runtime路mainPC(SB) |
| | CALL runtime路newproc(SB) |
| | POPL AX |
| |
|
| | |
| | CALL runtime路mstart(SB) |
| |
|
| | CALL runtime路abort(SB) |
| | RET |
| |
|
| | DATA bad_proc_msg<>+0x00(SB)/61, $"This program can only be run on processors with MMX support.\n" |
| | GLOBL bad_proc_msg<>(SB), RODATA, $61 |
| |
|
| | DATA runtime路mainPC+0(SB)/4,$runtime路main(SB) |
| | GLOBL runtime路mainPC(SB),RODATA,$4 |
| |
|
| | TEXT runtime路breakpoint(SB),NOSPLIT,$0-0 |
| | INT $3 |
| | RET |
| |
|
| | TEXT runtime路asminit(SB),NOSPLIT,$0-0 |
| | |
| | |
| | |
| | |
| | FLDCW runtime路controlWord64(SB) |
| | RET |
| |
|
| | TEXT runtime路mstart(SB),NOSPLIT|TOPFRAME,$0 |
| | CALL runtime路mstart0(SB) |
| | RET // not reached |
| | |
| | /* |
| | * go-routine |
| | */ |
| | |
| | // void gogo(Gobuf*) |
| | // restore state from Gobuf; longjmp |
| | TEXT runtime路gogo(SB), NOSPLIT, $0-4 |
| | MOVL buf+0(FP), BX // gobuf |
| | MOVL gobuf_g(BX), DX |
| | MOVL 0(DX), CX // make sure g != nil |
| | JMP gogo<>(SB) |
| | |
| | TEXT gogo<>(SB), NOSPLIT, $0 |
| | get_tls(CX) |
| | MOVL DX, g(CX) |
| | MOVL gobuf_sp(BX), SP // restore SP |
| | MOVL gobuf_ctxt(BX), DX |
| | MOVL $0, gobuf_sp(BX) // clear to help garbage collector |
| | MOVL $0, gobuf_ctxt(BX) |
| | MOVL gobuf_pc(BX), BX |
| | JMP BX |
| | |
| | // func mcall(fn func(*g)) |
| | // Switch to m->g0's stack, call fn(g). |
| | // Fn must never return. It should gogo(&g->sched) |
| | // to keep running g. |
| | TEXT runtime路mcall(SB), NOSPLIT, $0-4 |
| | MOVL fn+0(FP), DI |
| | |
| | get_tls(DX) |
| | MOVL g(DX), AX // save state in g->sched |
| | MOVL 0(SP), BX // caller's PC |
| | MOVL BX, (g_sched+gobuf_pc)(AX) |
| | LEAL fn+0(FP), BX // caller's SP |
| | MOVL BX, (g_sched+gobuf_sp)(AX) |
| | |
| | // switch to m->g0 & its stack, call fn |
| | MOVL g(DX), BX |
| | MOVL g_m(BX), BX |
| | MOVL m_g0(BX), SI |
| | CMPL SI, AX // if g == m->g0 call badmcall |
| | JNE 3(PC) |
| | MOVL $runtime路badmcall(SB), AX |
| | JMP AX |
| | MOVL SI, g(DX) // g = m->g0 |
| | MOVL (g_sched+gobuf_sp)(SI), SP // sp = m->g0->sched.sp |
| | PUSHL AX |
| | MOVL DI, DX |
| | MOVL 0(DI), DI |
| | CALL DI |
| | POPL AX |
| | MOVL $runtime路badmcall2(SB), AX |
| | JMP AX |
| | RET |
| | |
| | // systemstack_switch is a dummy routine that systemstack leaves at the bottom |
| | // of the G stack. We need to distinguish the routine that |
| | // lives at the bottom of the G stack from the one that lives |
| | // at the top of the system stack because the one at the top of |
| | // the system stack terminates the stack walk (see topofstack()). |
| | TEXT runtime路systemstack_switch(SB), NOSPLIT, $0-0 |
| | RET |
| | |
| | // func systemstack(fn func()) |
| | TEXT runtime路systemstack(SB), NOSPLIT, $0-4 |
| | MOVL fn+0(FP), DI // DI = fn |
| | get_tls(CX) |
| | MOVL g(CX), AX // AX = g |
| | MOVL g_m(AX), BX // BX = m |
| | |
| | CMPL AX, m_gsignal(BX) |
| | JEQ noswitch |
| | |
| | MOVL m_g0(BX), DX // DX = g0 |
| | CMPL AX, DX |
| | JEQ noswitch |
| | |
| | CMPL AX, m_curg(BX) |
| | JNE bad |
| | |
| | // switch stacks |
| | // save our state in g->sched. Pretend to |
| | // be systemstack_switch if the G stack is scanned. |
| | CALL gosave_systemstack_switch<>(SB) |
| | |
| | // switch to g0 |
| | get_tls(CX) |
| | MOVL DX, g(CX) |
| | MOVL (g_sched+gobuf_sp)(DX), BX |
| | MOVL BX, SP |
| | |
| | // call target function |
| | MOVL DI, DX |
| | MOVL 0(DI), DI |
| | CALL DI |
| | |
| | // switch back to g |
| | get_tls(CX) |
| | MOVL g(CX), AX |
| | MOVL g_m(AX), BX |
| | MOVL m_curg(BX), AX |
| | MOVL AX, g(CX) |
| | MOVL (g_sched+gobuf_sp)(AX), SP |
| | MOVL $0, (g_sched+gobuf_sp)(AX) |
| | RET |
| | |
| | noswitch: |
| | // already on system stack; tail call the function |
| | // Using a tail call here cleans up tracebacks since we won't stop |
| | // at an intermediate systemstack. |
| | MOVL DI, DX |
| | MOVL 0(DI), DI |
| | JMP DI |
| | |
| | bad: |
| | // Bad: g is not gsignal, not g0, not curg. What is it? |
| | // Hide call from linker nosplit analysis. |
| | MOVL $runtime路badsystemstack(SB), AX |
| | CALL AX |
| | INT $3 |
| | |
| | // func switchToCrashStack0(fn func()) |
| | TEXT runtime路switchToCrashStack0(SB), NOSPLIT, $0-4 |
| | MOVL fn+0(FP), AX |
| | |
| | get_tls(CX) |
| | MOVL g(CX), BX // BX = g |
| | MOVL g_m(BX), DX // DX = curm |
| | |
| | // set g to gcrash |
| | LEAL runtime路gcrash(SB), BX // g = &gcrash |
| | MOVL DX, g_m(BX) // g.m = curm |
| | MOVL BX, m_g0(DX) // curm.g0 = g |
| | get_tls(CX) |
| | MOVL BX, g(CX) |
| | |
| | // switch to crashstack |
| | MOVL (g_stack+stack_hi)(BX), DX |
| | SUBL $(4*8), DX |
| | MOVL DX, SP |
| | |
| | // call target function |
| | MOVL AX, DX |
| | MOVL 0(AX), AX |
| | CALL AX |
| | |
| | // should never return |
| | CALL runtime路abort(SB) |
| | UNDEF |
| | |
| | /* |
| | * support for morestack |
| | */ |
| | |
| | // Called during function prolog when more stack is needed. |
| | // |
| | // The traceback routines see morestack on a g0 as being |
| | // the top of a stack (for example, morestack calling newstack |
| | // calling the scheduler calling newm calling gc), so we must |
| | // record an argument size. For that purpose, it has no arguments. |
| | TEXT runtime路morestack(SB),NOSPLIT|NOFRAME,$0-0 |
| | |
| | get_tls(CX) |
| | MOVL g(CX), DI |
| | MOVL g_m(DI), BX |
| |
|
| | |
| | MOVL 0(SP), AX |
| | MOVL AX, (g_sched+gobuf_pc)(DI) |
| | LEAL 4(SP), AX |
| | MOVL AX, (g_sched+gobuf_sp)(DI) |
| | MOVL DX, (g_sched+gobuf_ctxt)(DI) |
| |
|
| | MOVL m_g0(BX), SI |
| | CMPL g(CX), SI |
| | JNE 3(PC) |
| | CALL runtime路badmorestackg0(SB) |
| | CALL runtime路abort(SB) |
| |
|
| | |
| | MOVL m_gsignal(BX), SI |
| | CMPL g(CX), SI |
| | JNE 3(PC) |
| | CALL runtime路badmorestackgsignal(SB) |
| | CALL runtime路abort(SB) |
| |
|
| | |
| | |
| | NOP SP |
| | MOVL 4(SP), DI |
| | MOVL DI, (m_morebuf+gobuf_pc)(BX) |
| | LEAL 8(SP), CX |
| | MOVL CX, (m_morebuf+gobuf_sp)(BX) |
| | get_tls(CX) |
| | MOVL g(CX), SI |
| | MOVL SI, (m_morebuf+gobuf_g)(BX) |
| |
|
| | |
| | MOVL m_g0(BX), BP |
| | MOVL BP, g(CX) |
| | MOVL (g_sched+gobuf_sp)(BP), AX |
| | MOVL -4(AX), BX |
| | MOVL AX, SP |
| | CALL runtime路newstack(SB) |
| | CALL runtime路abort(SB) |
| | RET |
| |
|
| | TEXT runtime路morestack_noctxt(SB),NOSPLIT,$0-0 |
| | MOVL $0, DX |
| | JMP runtime路morestack(SB) |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | CMPL CX, $MAXSIZE |
| | JA 3(PC) |
| | MOVL $NAME(SB), AX |
| | JMP AX |
| | |
| |
|
| | TEXT 路reflectcall(SB), NOSPLIT, $0-28 |
| | MOVL frameSize+20(FP), CX |
| | DISPATCH(runtime路call16, 16) |
| | DISPATCH(runtime路call32, 32) |
| | DISPATCH(runtime路call64, 64) |
| | DISPATCH(runtime路call128, 128) |
| | DISPATCH(runtime路call256, 256) |
| | DISPATCH(runtime路call512, 512) |
| | DISPATCH(runtime路call1024, 1024) |
| | DISPATCH(runtime路call2048, 2048) |
| | DISPATCH(runtime路call4096, 4096) |
| | DISPATCH(runtime路call8192, 8192) |
| | DISPATCH(runtime路call16384, 16384) |
| | DISPATCH(runtime路call32768, 32768) |
| | DISPATCH(runtime路call65536, 65536) |
| | DISPATCH(runtime路call131072, 131072) |
| | DISPATCH(runtime路call262144, 262144) |
| | DISPATCH(runtime路call524288, 524288) |
| | DISPATCH(runtime路call1048576, 1048576) |
| | DISPATCH(runtime路call2097152, 2097152) |
| | DISPATCH(runtime路call4194304, 4194304) |
| | DISPATCH(runtime路call8388608, 8388608) |
| | DISPATCH(runtime路call16777216, 16777216) |
| | DISPATCH(runtime路call33554432, 33554432) |
| | DISPATCH(runtime路call67108864, 67108864) |
| | DISPATCH(runtime路call134217728, 134217728) |
| | DISPATCH(runtime路call268435456, 268435456) |
| | DISPATCH(runtime路call536870912, 536870912) |
| | DISPATCH(runtime路call1073741824, 1073741824) |
| | MOVL $runtime路badreflectcall(SB), AX |
| | JMP AX |
| |
|
| | |
| | TEXT NAME(SB), WRAPPER, $MAXSIZE-28 |
| | NO_LOCAL_POINTERS |
| | \ |
| | MOVL stackArgs+8(FP), SI |
| | MOVL stackArgsSize+12(FP), CX |
| | MOVL SP, DI |
| | REP |
| | \ |
| | MOVL f+4(FP), DX |
| | MOVL (DX), AX |
| | PCDATA $PCDATA_StackMapIndex, $0 |
| | CALL AX |
| | \ |
| | MOVL stackArgsType+0(FP), DX |
| | MOVL stackArgs+8(FP), DI |
| | MOVL stackArgsSize+12(FP), CX |
| | MOVL stackRetOffset+16(FP), BX |
| | MOVL SP, SI |
| | ADDL BX, DI |
| | ADDL BX, SI |
| | SUBL BX, CX |
| | CALL callRet<>(SB) |
| | RET |
| |
|
| | |
| | |
| | |
| | |
| | TEXT callRet<>(SB), NOSPLIT, $20-0 |
| | MOVL DX, 0(SP) |
| | MOVL DI, 4(SP) |
| | MOVL SI, 8(SP) |
| | MOVL CX, 12(SP) |
| | MOVL $0, 16(SP) |
| | CALL runtime路reflectcallmove(SB) |
| | RET |
| |
|
| | CALLFN(路call16, 16) |
| | CALLFN(路call32, 32) |
| | CALLFN(路call64, 64) |
| | CALLFN(路call128, 128) |
| | CALLFN(路call256, 256) |
| | CALLFN(路call512, 512) |
| | CALLFN(路call1024, 1024) |
| | CALLFN(路call2048, 2048) |
| | CALLFN(路call4096, 4096) |
| | CALLFN(路call8192, 8192) |
| | CALLFN(路call16384, 16384) |
| | CALLFN(路call32768, 32768) |
| | CALLFN(路call65536, 65536) |
| | CALLFN(路call131072, 131072) |
| | CALLFN(路call262144, 262144) |
| | CALLFN(路call524288, 524288) |
| | CALLFN(路call1048576, 1048576) |
| | CALLFN(路call2097152, 2097152) |
| | CALLFN(路call4194304, 4194304) |
| | CALLFN(路call8388608, 8388608) |
| | CALLFN(路call16777216, 16777216) |
| | CALLFN(路call33554432, 33554432) |
| | CALLFN(路call67108864, 67108864) |
| | CALLFN(路call134217728, 134217728) |
| | CALLFN(路call268435456, 268435456) |
| | CALLFN(路call536870912, 536870912) |
| | CALLFN(路call1073741824, 1073741824) |
| |
|
| | TEXT runtime路procyieldAsm(SB),NOSPLIT,$0-0 |
| | MOVL cycles+0(FP), AX |
| | TESTL AX, AX |
| | JZ done |
| | again: |
| | PAUSE |
| | SUBL $1, AX |
| | JNZ again |
| | done: |
| | RET |
| |
|
| | TEXT 路publicationBarrier(SB),NOSPLIT,$0-0 |
| | |
| | |
| | RET |
| |
|
| | |
| | |
| | |
| | |
| | TEXT gosave_systemstack_switch<>(SB),NOSPLIT,$0 |
| | PUSHL AX |
| | PUSHL BX |
| | get_tls(BX) |
| | MOVL g(BX), BX |
| | LEAL arg+0(FP), AX |
| | MOVL AX, (g_sched+gobuf_sp)(BX) |
| | MOVL $runtime路systemstack_switch(SB), AX |
| | MOVL AX, (g_sched+gobuf_pc)(BX) |
| | |
| | MOVL (g_sched+gobuf_ctxt)(BX), AX |
| | TESTL AX, AX |
| | JZ 2(PC) |
| | CALL runtime路abort(SB) |
| | POPL BX |
| | POPL AX |
| | RET |
| |
|
| | |
| | |
| | |
| | TEXT 路asmcgocall_no_g(SB),NOSPLIT,$0-8 |
| | MOVL fn+0(FP), AX |
| | MOVL arg+4(FP), BX |
| | MOVL SP, DX |
| | SUBL $32, SP |
| | ANDL $~15, SP |
| | MOVL DX, 8(SP) |
| | MOVL BX, 0(SP) |
| | CALL AX |
| | MOVL 8(SP), DX |
| | MOVL DX, SP |
| | RET |
| |
|
| | |
| | |
| | |
| | |
| | TEXT 路asmcgocall(SB),NOSPLIT,$0-12 |
| | MOVL fn+0(FP), AX |
| | MOVL arg+4(FP), BX |
| |
|
| | MOVL SP, DX |
| |
|
| | |
| | |
| | |
| | |
| | get_tls(CX) |
| | MOVL g(CX), DI |
| | CMPL DI, $0 |
| | JEQ nosave |
| | MOVL g_m(DI), BP |
| | CMPL DI, m_gsignal(BP) |
| | JEQ noswitch |
| | MOVL m_g0(BP), SI |
| | CMPL DI, SI |
| | JEQ noswitch |
| | CALL gosave_systemstack_switch<>(SB) |
| | get_tls(CX) |
| | MOVL SI, g(CX) |
| | MOVL (g_sched+gobuf_sp)(SI), SP |
| |
|
| | noswitch: |
| | |
| | SUBL $32, SP |
| | ANDL $~15, SP |
| | MOVL DI, 8(SP) |
| | MOVL (g_stack+stack_hi)(DI), DI |
| | SUBL DX, DI |
| | MOVL DI, 4(SP) |
| | MOVL BX, 0(SP) |
| | CALL AX |
| |
|
| | |
| | get_tls(CX) |
| | MOVL 8(SP), DI |
| | MOVL (g_stack+stack_hi)(DI), SI |
| | SUBL 4(SP), SI |
| | MOVL DI, g(CX) |
| | MOVL SI, SP |
| |
|
| | MOVL AX, ret+8(FP) |
| | RET |
| | nosave: |
| | |
| | SUBL $32, SP |
| | ANDL $~15, SP |
| | MOVL DX, 4(SP) |
| | MOVL BX, 0(SP) |
| | CALL AX |
| |
|
| | MOVL 4(SP), CX |
| | MOVL CX, SP |
| | MOVL AX, ret+8(FP) |
| | RET |
| |
|
| | |
| | |
| | TEXT 路cgocallback(SB),NOSPLIT,$12-12 |
| | NO_LOCAL_POINTERS |
| |
|
| | |
| | |
| | MOVL fn+0(FP), AX |
| | CMPL AX, $0 |
| | JNE loadg |
| | |
| | get_tls(CX) |
| | MOVL frame+4(FP), BX |
| | MOVL BX, g(CX) |
| | JMP dropm |
| |
|
| | loadg: |
| | |
| | |
| | |
| | |
| | |
| | |
| | get_tls(CX) |
| | |
| | MOVL $0, BP |
| | CMPL CX, $0 |
| | JEQ 2(PC) |
| | |
| | MOVL g(CX), BP |
| | CMPL BP, $0 |
| | JEQ needm |
| | MOVL g_m(BP), BP |
| | MOVL BP, savedm-4(SP) |
| | JMP havem |
| | needm: |
| | MOVL $runtime路needAndBindM(SB), AX |
| | CALL AX |
| | MOVL $0, savedm-4(SP) |
| | get_tls(CX) |
| | MOVL g(CX), BP |
| | MOVL g_m(BP), BP |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | MOVL m_g0(BP), SI |
| | MOVL SP, (g_sched+gobuf_sp)(SI) |
| |
|
| | havem: |
| | |
| | |
| | |
| | |
| | |
| | MOVL m_g0(BP), SI |
| | MOVL (g_sched+gobuf_sp)(SI), AX |
| | MOVL AX, 0(SP) |
| | MOVL SP, (g_sched+gobuf_sp)(SI) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | MOVL m_curg(BP), SI |
| | MOVL SI, g(CX) |
| | MOVL (g_sched+gobuf_sp)(SI), DI |
| | MOVL (g_sched+gobuf_pc)(SI), BP |
| | MOVL BP, -4(DI) |
| | |
| | MOVL fn+0(FP), AX |
| | MOVL frame+4(FP), BX |
| | MOVL ctxt+8(FP), CX |
| | LEAL -(4+12)(DI), SP |
| | MOVL AX, 0(SP) |
| | MOVL BX, 4(SP) |
| | MOVL CX, 8(SP) |
| | CALL runtime路cgocallbackg(SB) |
| |
|
| | |
| | get_tls(CX) |
| | MOVL g(CX), SI |
| | MOVL 12(SP), BP |
| | MOVL BP, (g_sched+gobuf_pc)(SI) |
| | LEAL (12+4)(SP), DI |
| | MOVL DI, (g_sched+gobuf_sp)(SI) |
| |
|
| | |
| | |
| | |
| | MOVL g(CX), BP |
| | MOVL g_m(BP), BP |
| | MOVL m_g0(BP), SI |
| | MOVL SI, g(CX) |
| | MOVL (g_sched+gobuf_sp)(SI), SP |
| | MOVL 0(SP), AX |
| | MOVL AX, (g_sched+gobuf_sp)(SI) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | MOVL savedm-4(SP), DX |
| | CMPL DX, $0 |
| | JNE droppedm |
| |
|
| | |
| | MOVL _cgo_pthread_key_created(SB), DX |
| | |
| | CMPL DX, $0 |
| | JEQ dropm |
| | CMPL (DX), $0 |
| | JNE droppedm |
| |
|
| | dropm: |
| | MOVL $runtime路dropm(SB), AX |
| | CALL AX |
| | droppedm: |
| |
|
| | |
| | RET |
| |
|
| | |
| | TEXT runtime路setg(SB), NOSPLIT, $0-4 |
| | MOVL gg+0(FP), BX |
| | |
| | MOVL runtime路tls_g(SB), CX |
| | CMPL BX, $0 |
| | JNE settls |
| | MOVL $0, 0(CX)(FS) |
| | RET |
| | settls: |
| | MOVL g_m(BX), AX |
| | LEAL m_tls(AX), AX |
| | MOVL AX, 0(CX)(FS) |
| | |
| | get_tls(CX) |
| | MOVL BX, g(CX) |
| | RET |
| |
|
| | |
| | TEXT setg_gcc<>(SB), NOSPLIT, $0 |
| | get_tls(AX) |
| | MOVL gg+0(FP), DX |
| | MOVL DX, g(AX) |
| | RET |
| |
|
| | TEXT runtime路abort(SB),NOSPLIT,$0-0 |
| | INT $3 |
| | loop: |
| | JMP loop |
| |
|
| | |
| | TEXT runtime路stackcheck(SB), NOSPLIT, $0-0 |
| | get_tls(CX) |
| | MOVL g(CX), AX |
| | CMPL (g_stack+stack_hi)(AX), SP |
| | JHI 2(PC) |
| | CALL runtime路abort(SB) |
| | CMPL SP, (g_stack+stack_lo)(AX) |
| | JHI 2(PC) |
| | CALL runtime路abort(SB) |
| | RET |
| |
|
| | |
| | TEXT runtime路cputicks(SB),NOSPLIT,$0-8 |
| | |
| | |
| | |
| | |
| | |
| | JMP rdtsc |
| | |
| | CMPB internal鈭昪pu路X86+const_offsetX86HasRDTSCP(SB), $1 |
| | JNE fences |
| | |
| | |
| | |
| | RDTSCP |
| | done: |
| | MOVL AX, ret_lo+0(FP) |
| | MOVL DX, ret_hi+4(FP) |
| | RET |
| | fences: |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | MFENCE |
| | LFENCE |
| | rdtsc: |
| | RDTSC |
| | JMP done |
| |
|
| | TEXT ldt0setup<>(SB),NOSPLIT,$16-0 |
| | |
| | CALL runtime路wintls(SB) |
| | |
| | |
| | |
| | |
| | MOVL $7, 0(SP) |
| | LEAL runtime路m0+m_tls(SB), AX |
| | MOVL AX, 4(SP) |
| | MOVL $32, 8(SP) |
| | CALL runtime路setldt(SB) |
| | RET |
| |
|
| | TEXT runtime路emptyfunc(SB),0,$0-0 |
| | RET |
| |
|
| | |
| | TEXT runtime路memhash(SB),NOSPLIT,$0-16 |
| | CMPB runtime路useAeshash(SB), $0 |
| | JEQ noaes |
| | MOVL p+0(FP), AX |
| | MOVL s+8(FP), BX |
| | LEAL ret+12(FP), DX |
| | JMP aeshashbody<>(SB) |
| | noaes: |
| | JMP runtime路memhashFallback(SB) |
| |
|
| | TEXT runtime路strhash(SB),NOSPLIT,$0-12 |
| | CMPB runtime路useAeshash(SB), $0 |
| | JEQ noaes |
| | MOVL p+0(FP), AX |
| | MOVL 4(AX), BX |
| | MOVL (AX), AX |
| | LEAL ret+8(FP), DX |
| | JMP aeshashbody<>(SB) |
| | noaes: |
| | JMP runtime路strhashFallback(SB) |
| |
|
| | |
| | |
| | |
| | TEXT aeshashbody<>(SB),NOSPLIT,$0-0 |
| | MOVL h+4(FP), X0 |
| | PINSRW $4, BX, X0 |
| | PSHUFHW $0, X0, X0 |
| | MOVO X0, X1 |
| | PXOR runtime路aeskeysched(SB), X0 |
| | AESENC X0, X0 |
| |
|
| | CMPL BX, $16 |
| | JB aes0to15 |
| | JE aes16 |
| | CMPL BX, $32 |
| | JBE aes17to32 |
| | CMPL BX, $64 |
| | JBE aes33to64 |
| | JMP aes65plus |
| |
|
| | aes0to15: |
| | TESTL BX, BX |
| | JE aes0 |
| |
|
| | ADDL $16, AX |
| | TESTW $0xff0, AX |
| | JE endofpage |
| |
|
| | |
| | |
| | MOVOU -16(AX), X1 |
| | ADDL BX, BX |
| | PAND masks<>(SB)(BX*8), X1 |
| |
|
| | final1: |
| | PXOR X0, X1 |
| | AESENC X1, X1 |
| | AESENC X1, X1 |
| | AESENC X1, X1 |
| | MOVL X1, (DX) |
| | RET |
| |
|
| | endofpage: |
| | |
| | |
| | |
| | MOVOU -32(AX)(BX*1), X1 |
| | ADDL BX, BX |
| | PSHUFB shifts<>(SB)(BX*8), X1 |
| | JMP final1 |
| |
|
| | aes0: |
| | |
| | AESENC X0, X0 |
| | MOVL X0, (DX) |
| | RET |
| |
|
| | aes16: |
| | MOVOU (AX), X1 |
| | JMP final1 |
| |
|
| | aes17to32: |
| | |
| | PXOR runtime路aeskeysched+16(SB), X1 |
| | AESENC X1, X1 |
| |
|
| | |
| | MOVOU (AX), X2 |
| | MOVOU -16(AX)(BX*1), X3 |
| |
|
| | |
| | PXOR X0, X2 |
| | PXOR X1, X3 |
| |
|
| | |
| | AESENC X2, X2 |
| | AESENC X3, X3 |
| | AESENC X2, X2 |
| | AESENC X3, X3 |
| | AESENC X2, X2 |
| | AESENC X3, X3 |
| |
|
| | |
| | PXOR X3, X2 |
| | MOVL X2, (DX) |
| | RET |
| |
|
| | aes33to64: |
| | |
| | MOVO X1, X2 |
| | MOVO X1, X3 |
| | PXOR runtime路aeskeysched+16(SB), X1 |
| | PXOR runtime路aeskeysched+32(SB), X2 |
| | PXOR runtime路aeskeysched+48(SB), X3 |
| | AESENC X1, X1 |
| | AESENC X2, X2 |
| | AESENC X3, X3 |
| |
|
| | MOVOU (AX), X4 |
| | MOVOU 16(AX), X5 |
| | MOVOU -32(AX)(BX*1), X6 |
| | MOVOU -16(AX)(BX*1), X7 |
| |
|
| | PXOR X0, X4 |
| | PXOR X1, X5 |
| | PXOR X2, X6 |
| | PXOR X3, X7 |
| |
|
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | PXOR X6, X4 |
| | PXOR X7, X5 |
| | PXOR X5, X4 |
| | MOVL X4, (DX) |
| | RET |
| |
|
| | aes65plus: |
| | |
| | MOVO X1, X2 |
| | MOVO X1, X3 |
| | PXOR runtime路aeskeysched+16(SB), X1 |
| | PXOR runtime路aeskeysched+32(SB), X2 |
| | PXOR runtime路aeskeysched+48(SB), X3 |
| | AESENC X1, X1 |
| | AESENC X2, X2 |
| | AESENC X3, X3 |
| |
|
| | |
| | MOVOU -64(AX)(BX*1), X4 |
| | MOVOU -48(AX)(BX*1), X5 |
| | MOVOU -32(AX)(BX*1), X6 |
| | MOVOU -16(AX)(BX*1), X7 |
| |
|
| | |
| | AESENC X0, X4 |
| | AESENC X1, X5 |
| | AESENC X2, X6 |
| | AESENC X3, X7 |
| |
|
| | |
| | DECL BX |
| | SHRL $6, BX |
| |
|
| | aesloop: |
| | |
| | MOVOU (AX), X0 |
| | MOVOU 16(AX), X1 |
| | MOVOU 32(AX), X2 |
| | MOVOU 48(AX), X3 |
| | AESENC X0, X4 |
| | AESENC X1, X5 |
| | AESENC X2, X6 |
| | AESENC X3, X7 |
| |
|
| | |
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | ADDL $64, AX |
| | DECL BX |
| | JNE aesloop |
| |
|
| | |
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | AESENC X4, X4 |
| | AESENC X5, X5 |
| | AESENC X6, X6 |
| | AESENC X7, X7 |
| |
|
| | PXOR X6, X4 |
| | PXOR X7, X5 |
| | PXOR X5, X4 |
| | MOVL X4, (DX) |
| | RET |
| |
|
| | TEXT runtime路memhash32(SB),NOSPLIT,$0-12 |
| | CMPB runtime路useAeshash(SB), $0 |
| | JEQ noaes |
| | MOVL p+0(FP), AX |
| | MOVL h+4(FP), X0 |
| | PINSRD $1, (AX), X0 |
| | AESENC runtime路aeskeysched+0(SB), X0 |
| | AESENC runtime路aeskeysched+16(SB), X0 |
| | AESENC runtime路aeskeysched+32(SB), X0 |
| | MOVL X0, ret+8(FP) |
| | RET |
| | noaes: |
| | JMP runtime路memhash32Fallback(SB) |
| |
|
| | TEXT runtime路memhash64(SB),NOSPLIT,$0-12 |
| | CMPB runtime路useAeshash(SB), $0 |
| | JEQ noaes |
| | MOVL p+0(FP), AX |
| | MOVQ (AX), X0 |
| | PINSRD $2, h+4(FP), X0 |
| | AESENC runtime路aeskeysched+0(SB), X0 |
| | AESENC runtime路aeskeysched+16(SB), X0 |
| | AESENC runtime路aeskeysched+32(SB), X0 |
| | MOVL X0, ret+8(FP) |
| | RET |
| | noaes: |
| | JMP runtime路memhash64Fallback(SB) |
| |
|
| | |
| | DATA masks<>+0x00(SB)/4, $0x00000000 |
| | DATA masks<>+0x04(SB)/4, $0x00000000 |
| | DATA masks<>+0x08(SB)/4, $0x00000000 |
| | DATA masks<>+0x0c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x10(SB)/4, $0x000000ff |
| | DATA masks<>+0x14(SB)/4, $0x00000000 |
| | DATA masks<>+0x18(SB)/4, $0x00000000 |
| | DATA masks<>+0x1c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x20(SB)/4, $0x0000ffff |
| | DATA masks<>+0x24(SB)/4, $0x00000000 |
| | DATA masks<>+0x28(SB)/4, $0x00000000 |
| | DATA masks<>+0x2c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x30(SB)/4, $0x00ffffff |
| | DATA masks<>+0x34(SB)/4, $0x00000000 |
| | DATA masks<>+0x38(SB)/4, $0x00000000 |
| | DATA masks<>+0x3c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x40(SB)/4, $0xffffffff |
| | DATA masks<>+0x44(SB)/4, $0x00000000 |
| | DATA masks<>+0x48(SB)/4, $0x00000000 |
| | DATA masks<>+0x4c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x50(SB)/4, $0xffffffff |
| | DATA masks<>+0x54(SB)/4, $0x000000ff |
| | DATA masks<>+0x58(SB)/4, $0x00000000 |
| | DATA masks<>+0x5c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x60(SB)/4, $0xffffffff |
| | DATA masks<>+0x64(SB)/4, $0x0000ffff |
| | DATA masks<>+0x68(SB)/4, $0x00000000 |
| | DATA masks<>+0x6c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x70(SB)/4, $0xffffffff |
| | DATA masks<>+0x74(SB)/4, $0x00ffffff |
| | DATA masks<>+0x78(SB)/4, $0x00000000 |
| | DATA masks<>+0x7c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x80(SB)/4, $0xffffffff |
| | DATA masks<>+0x84(SB)/4, $0xffffffff |
| | DATA masks<>+0x88(SB)/4, $0x00000000 |
| | DATA masks<>+0x8c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0x90(SB)/4, $0xffffffff |
| | DATA masks<>+0x94(SB)/4, $0xffffffff |
| | DATA masks<>+0x98(SB)/4, $0x000000ff |
| | DATA masks<>+0x9c(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0xa0(SB)/4, $0xffffffff |
| | DATA masks<>+0xa4(SB)/4, $0xffffffff |
| | DATA masks<>+0xa8(SB)/4, $0x0000ffff |
| | DATA masks<>+0xac(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0xb0(SB)/4, $0xffffffff |
| | DATA masks<>+0xb4(SB)/4, $0xffffffff |
| | DATA masks<>+0xb8(SB)/4, $0x00ffffff |
| | DATA masks<>+0xbc(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0xc0(SB)/4, $0xffffffff |
| | DATA masks<>+0xc4(SB)/4, $0xffffffff |
| | DATA masks<>+0xc8(SB)/4, $0xffffffff |
| | DATA masks<>+0xcc(SB)/4, $0x00000000 |
| |
|
| | DATA masks<>+0xd0(SB)/4, $0xffffffff |
| | DATA masks<>+0xd4(SB)/4, $0xffffffff |
| | DATA masks<>+0xd8(SB)/4, $0xffffffff |
| | DATA masks<>+0xdc(SB)/4, $0x000000ff |
| |
|
| | DATA masks<>+0xe0(SB)/4, $0xffffffff |
| | DATA masks<>+0xe4(SB)/4, $0xffffffff |
| | DATA masks<>+0xe8(SB)/4, $0xffffffff |
| | DATA masks<>+0xec(SB)/4, $0x0000ffff |
| |
|
| | DATA masks<>+0xf0(SB)/4, $0xffffffff |
| | DATA masks<>+0xf4(SB)/4, $0xffffffff |
| | DATA masks<>+0xf8(SB)/4, $0xffffffff |
| | DATA masks<>+0xfc(SB)/4, $0x00ffffff |
| |
|
| | GLOBL masks<>(SB),RODATA,$256 |
| |
|
| | |
| | |
| | |
| | DATA shifts<>+0x00(SB)/4, $0x00000000 |
| | DATA shifts<>+0x04(SB)/4, $0x00000000 |
| | DATA shifts<>+0x08(SB)/4, $0x00000000 |
| | DATA shifts<>+0x0c(SB)/4, $0x00000000 |
| |
|
| | DATA shifts<>+0x10(SB)/4, $0xffffff0f |
| | DATA shifts<>+0x14(SB)/4, $0xffffffff |
| | DATA shifts<>+0x18(SB)/4, $0xffffffff |
| | DATA shifts<>+0x1c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x20(SB)/4, $0xffff0f0e |
| | DATA shifts<>+0x24(SB)/4, $0xffffffff |
| | DATA shifts<>+0x28(SB)/4, $0xffffffff |
| | DATA shifts<>+0x2c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x30(SB)/4, $0xff0f0e0d |
| | DATA shifts<>+0x34(SB)/4, $0xffffffff |
| | DATA shifts<>+0x38(SB)/4, $0xffffffff |
| | DATA shifts<>+0x3c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x40(SB)/4, $0x0f0e0d0c |
| | DATA shifts<>+0x44(SB)/4, $0xffffffff |
| | DATA shifts<>+0x48(SB)/4, $0xffffffff |
| | DATA shifts<>+0x4c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x50(SB)/4, $0x0e0d0c0b |
| | DATA shifts<>+0x54(SB)/4, $0xffffff0f |
| | DATA shifts<>+0x58(SB)/4, $0xffffffff |
| | DATA shifts<>+0x5c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x60(SB)/4, $0x0d0c0b0a |
| | DATA shifts<>+0x64(SB)/4, $0xffff0f0e |
| | DATA shifts<>+0x68(SB)/4, $0xffffffff |
| | DATA shifts<>+0x6c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x70(SB)/4, $0x0c0b0a09 |
| | DATA shifts<>+0x74(SB)/4, $0xff0f0e0d |
| | DATA shifts<>+0x78(SB)/4, $0xffffffff |
| | DATA shifts<>+0x7c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x80(SB)/4, $0x0b0a0908 |
| | DATA shifts<>+0x84(SB)/4, $0x0f0e0d0c |
| | DATA shifts<>+0x88(SB)/4, $0xffffffff |
| | DATA shifts<>+0x8c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0x90(SB)/4, $0x0a090807 |
| | DATA shifts<>+0x94(SB)/4, $0x0e0d0c0b |
| | DATA shifts<>+0x98(SB)/4, $0xffffff0f |
| | DATA shifts<>+0x9c(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0xa0(SB)/4, $0x09080706 |
| | DATA shifts<>+0xa4(SB)/4, $0x0d0c0b0a |
| | DATA shifts<>+0xa8(SB)/4, $0xffff0f0e |
| | DATA shifts<>+0xac(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0xb0(SB)/4, $0x08070605 |
| | DATA shifts<>+0xb4(SB)/4, $0x0c0b0a09 |
| | DATA shifts<>+0xb8(SB)/4, $0xff0f0e0d |
| | DATA shifts<>+0xbc(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0xc0(SB)/4, $0x07060504 |
| | DATA shifts<>+0xc4(SB)/4, $0x0b0a0908 |
| | DATA shifts<>+0xc8(SB)/4, $0x0f0e0d0c |
| | DATA shifts<>+0xcc(SB)/4, $0xffffffff |
| |
|
| | DATA shifts<>+0xd0(SB)/4, $0x06050403 |
| | DATA shifts<>+0xd4(SB)/4, $0x0a090807 |
| | DATA shifts<>+0xd8(SB)/4, $0x0e0d0c0b |
| | DATA shifts<>+0xdc(SB)/4, $0xffffff0f |
| |
|
| | DATA shifts<>+0xe0(SB)/4, $0x05040302 |
| | DATA shifts<>+0xe4(SB)/4, $0x09080706 |
| | DATA shifts<>+0xe8(SB)/4, $0x0d0c0b0a |
| | DATA shifts<>+0xec(SB)/4, $0xffff0f0e |
| |
|
| | DATA shifts<>+0xf0(SB)/4, $0x04030201 |
| | DATA shifts<>+0xf4(SB)/4, $0x08070605 |
| | DATA shifts<>+0xf8(SB)/4, $0x0c0b0a09 |
| | DATA shifts<>+0xfc(SB)/4, $0xff0f0e0d |
| |
|
| | GLOBL shifts<>(SB),RODATA,$256 |
| |
|
| | TEXT 路checkASM(SB),NOSPLIT,$0-1 |
| | |
| | MOVL $masks<>(SB), AX |
| | MOVL $shifts<>(SB), BX |
| | ORL BX, AX |
| | TESTL $15, AX |
| | SETEQ ret+0(FP) |
| | RET |
| |
|
| | |
| | |
| | TEXT _cgo_topofstack(SB),NOSPLIT,$0 |
| | get_tls(CX) |
| | MOVL g(CX), AX |
| | MOVL g_m(AX), AX |
| | MOVL m_curg(AX), AX |
| | MOVL (g_stack+stack_hi)(AX), AX |
| | RET |
| |
|
| | |
| | |
| | TEXT runtime路goexit(SB),NOSPLIT|TOPFRAME,$0-0 |
| | BYTE $0x90 // NOP |
| | CALL runtime路goexit1(SB) // does not return |
| | // traceback from goexit1 must hit code range of goexit |
| | BYTE $0x90 // NOP |
| | |
| | // Add a module's moduledata to the linked list of moduledata objects. This |
| | // is called from .init_array by a function generated in the linker and so |
| | // follows the platform ABI wrt register preservation -- it only touches AX, |
| | // CX (implicitly) and DX, but it does not follow the ABI wrt arguments: |
| | // instead the pointer to the moduledata is passed in AX. |
| | TEXT runtime路addmoduledata(SB),NOSPLIT,$0-0 |
| | MOVL runtime路lastmoduledatap(SB), DX |
| | MOVL AX, moduledata_next(DX) |
| | MOVL AX, runtime路lastmoduledatap(SB) |
| | RET |
| | |
| | TEXT runtime路uint32tofloat64(SB),NOSPLIT,$8-12 |
| | MOVL a+0(FP), AX |
| | MOVL AX, 0(SP) |
| | MOVL $0, 4(SP) |
| | FMOVV 0(SP), F0 |
| | FMOVDP F0, ret+4(FP) |
| | RET |
| | |
| | TEXT runtime路float64touint32(SB),NOSPLIT,$12-12 |
| | FMOVD a+0(FP), F0 |
| | FSTCW 0(SP) |
| | FLDCW runtime路controlWord64trunc(SB) |
| | FMOVVP F0, 4(SP) |
| | FLDCW 0(SP) |
| | MOVL 4(SP), AX |
| | MOVL AX, ret+8(FP) |
| | RET |
| | |
| | // gcWriteBarrier informs the GC about heap pointer writes. |
| | // |
| | // gcWriteBarrier returns space in a write barrier buffer which |
| | // should be filled in by the caller. |
| | // gcWriteBarrier does NOT follow the Go ABI. It accepts the |
| | // number of bytes of buffer needed in DI, and returns a pointer |
| | // to the buffer space in DI. |
| | // It clobbers FLAGS. It does not clobber any general-purpose registers, |
| | // but may clobber others (e.g., SSE registers). |
| | // Typical use would be, when doing *(CX+88) = AX |
| | // CMPL $0, runtime.writeBarrier(SB) |
| | // JEQ dowrite |
| | // CALL runtime.gcBatchBarrier2(SB) |
| | // MOVL AX, (DI) |
| | // MOVL 88(CX), DX |
| | // MOVL DX, 4(DI) |
| | // dowrite: |
| | // MOVL AX, 88(CX) |
| | TEXT gcWriteBarrier<>(SB),NOSPLIT,$28 |
| | // Save the registers clobbered by the fast path. This is slightly |
| | // faster than having the caller spill these. |
| | MOVL CX, 20(SP) |
| | MOVL BX, 24(SP) |
| | retry: |
| | // TODO: Consider passing g.m.p in as an argument so they can be shared |
| | // across a sequence of write barriers. |
| | get_tls(BX) |
| | MOVL g(BX), BX |
| | MOVL g_m(BX), BX |
| | MOVL m_p(BX), BX |
| | // Get current buffer write position. |
| | MOVL (p_wbBuf+wbBuf_next)(BX), CX // original next position |
| | ADDL DI, CX // new next position |
| | // Is the buffer full? |
| | CMPL CX, (p_wbBuf+wbBuf_end)(BX) |
| | JA flush |
| | // Commit to the larger buffer. |
| | MOVL CX, (p_wbBuf+wbBuf_next)(BX) |
| | // Make return value (the original next position) |
| | SUBL DI, CX |
| | MOVL CX, DI |
| | // Restore registers. |
| | MOVL 20(SP), CX |
| | MOVL 24(SP), BX |
| | RET |
| | |
| | flush: |
| | // Save all general purpose registers since these could be |
| | // clobbered by wbBufFlush and were not saved by the caller. |
| | MOVL DI, 0(SP) |
| | MOVL AX, 4(SP) |
| | // BX already saved |
| | // CX already saved |
| | MOVL DX, 8(SP) |
| | MOVL BP, 12(SP) |
| | MOVL SI, 16(SP) |
| | // DI already saved |
| | |
| | CALL runtime路wbBufFlush(SB) |
| | |
| | MOVL 0(SP), DI |
| | MOVL 4(SP), AX |
| | MOVL 8(SP), DX |
| | MOVL 12(SP), BP |
| | MOVL 16(SP), SI |
| | JMP retry |
| | |
| | TEXT runtime路gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $4, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $8, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $12, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $16, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $20, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $24, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $28, DI |
| | JMP gcWriteBarrier<>(SB) |
| | TEXT runtime路gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0 |
| | MOVL $32, DI |
| | JMP gcWriteBarrier<>(SB) |
| | |
| | TEXT runtime路panicBounds<ABIInternal>(SB),NOSPLIT,$40-0 |
| | NO_LOCAL_POINTERS |
| | // Save all int registers that could have an index in them. |
| | // They may be pointers, but if they are they are dead. |
| | MOVL AX, 8(SP) |
| | MOVL CX, 12(SP) |
| | MOVL DX, 16(SP) |
| | MOVL BX, 20(SP) |
| | // skip SP @ 24(SP) |
| | MOVL BP, 28(SP) |
| | MOVL SI, 32(SP) |
| | MOVL DI, 36(SP) |
| | |
| | MOVL SP, AX // hide SP read from vet |
| | MOVL 40(AX), AX // PC immediately after call to panicBounds |
| | MOVL AX, 0(SP) |
| | LEAL 8(SP), AX |
| | MOVL AX, 4(SP) |
| | CALL runtime路panicBounds32<ABIInternal>(SB) |
| | RET |
| | |
| | TEXT runtime路panicExtend<ABIInternal>(SB),NOSPLIT,$40-0 |
| | NO_LOCAL_POINTERS |
| | // Save all int registers that could have an index in them. |
| | // They may be pointers, but if they are they are dead. |
| | MOVL AX, 8(SP) |
| | MOVL CX, 12(SP) |
| | MOVL DX, 16(SP) |
| | MOVL BX, 20(SP) |
| | // skip SP @ 24(SP) |
| | MOVL BP, 28(SP) |
| | MOVL SI, 32(SP) |
| | MOVL DI, 36(SP) |
| | |
| | MOVL SP, AX // hide SP read from vet |
| | MOVL 40(AX), AX // PC immediately after call to panicExtend |
| | MOVL AX, 0(SP) |
| | LEAL 8(SP), AX |
| | MOVL AX, 4(SP) |
| | CALL runtime路panicBounds32X<ABIInternal>(SB) |
| | RET |
| | |
| | #ifdef GOOS_android |
| | // Use the free TLS_SLOT_APP slot #2 on Android Q. |
| | // Earlier androids are set up in gcc_android.c. |
| | DATA runtime路tls_g+0(SB)/4, $8 |
| | GLOBL runtime路tls_g+0(SB), NOPTR, $4 |
| | #endif |
| | #ifdef GOOS_windows |
| | GLOBL runtime路tls_g+0(SB), NOPTR, $4 |
| | #endif |
| | |