1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
10 TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0
11 // X2 = stack; A0 = argc; A1 = argv
14 MOV A1, 16(X2) // argv
16 // create istack out of the given (operating system) stack.
17 // _cgo_init may update stackguard.
18 MOV $runtime·g0(SB), g
21 MOV T1, g_stackguard0(g)
22 MOV T1, g_stackguard1(g)
23 MOV T1, (g_stack+stack_lo)(g)
24 MOV X2, (g_stack+stack_hi)(g)
26 // if there is a _cgo_init, call it using the gcc ABI.
30 MOV ZERO, A3 // arg 3: not used
31 MOV ZERO, A2 // arg 2: not used
32 MOV $setg_gcc<>(SB), A1 // arg 1: setg
37 // update stackguard after _cgo_init
38 MOV (g_stack+stack_lo)(g), T0
39 ADD $const_stackGuard, T0
40 MOV T0, g_stackguard0(g)
41 MOV T0, g_stackguard1(g)
43 // set the per-goroutine and per-mach "registers"
44 MOV $runtime·m0(SB), T0
51 CALL runtime·check(SB)
53 // args are already prepared
55 CALL runtime·osinit(SB)
56 CALL runtime·schedinit(SB)
58 // create a new goroutine to start program
59 MOV $runtime·mainPC(SB), T0 // entry
63 CALL runtime·newproc(SB)
67 CALL runtime·mstart(SB)
69 WORD $0 // crash if reached
72 TEXT runtime·mstart(SB),NOSPLIT|TOPFRAME,$0
73 CALL runtime·mstart0(SB)
76 // void setg_gcc(G*); set g called from gcc with g in A0
77 TEXT setg_gcc<>(SB),NOSPLIT,$0-0
79 CALL runtime·save_g(SB)
82 // func cputicks() int64
83 TEXT runtime·cputicks(SB),NOSPLIT,$0-8
84 // RDTIME to emulate cpu ticks
85 // RDCYCLE reads counter that is per HART(core) based
86 // according to the riscv manual, see issue 46737
91 // systemstack_switch is a dummy routine that systemstack leaves at the bottom
92 // of the G stack. We need to distinguish the routine that
93 // lives at the bottom of the G stack from the one that lives
94 // at the top of the system stack because the one at the top of
95 // the system stack terminates the stack walk (see topofstack()).
96 TEXT runtime·systemstack_switch(SB), NOSPLIT, $0-0
98 JALR RA, ZERO // make sure this function is not leaf
101 // func systemstack(fn func())
102 TEXT runtime·systemstack(SB), NOSPLIT, $0-8
103 MOV fn+0(FP), CTXT // CTXT = fn
104 MOV g_m(g), T0 // T0 = m
106 MOV m_gsignal(T0), T1 // T1 = gsignal
109 MOV m_g0(T0), T1 // T1 = g0
115 // Bad: g is not gsignal, not g0, not curg. What is it?
116 // Hide call from linker nosplit analysis.
117 MOV $runtime·badsystemstack(SB), T1
121 // save our state in g->sched. Pretend to
122 // be systemstack_switch if the G stack is scanned.
123 CALL gosave_systemstack_switch<>(SB)
127 CALL runtime·save_g(SB)
128 MOV (g_sched+gobuf_sp)(g), T0
131 // call target function
132 MOV 0(CTXT), T1 // code pointer
138 CALL runtime·save_g(SB)
139 MOV (g_sched+gobuf_sp)(g), X2
140 MOV ZERO, (g_sched+gobuf_sp)(g)
144 // already on m stack, just call directly
145 // Using a tail call here cleans up tracebacks since we won't stop
146 // at an intermediate systemstack.
147 MOV 0(CTXT), T1 // code pointer
151 TEXT runtime·getcallerpc(SB),NOSPLIT|NOFRAME,$0-8
152 MOV 0(X2), T0 // LR saved by caller
157 * support for morestack
160 // Called during function prolog when more stack is needed.
161 // Called with return address (i.e. caller's PC) in X5 (aka T0),
162 // and the LR register contains the caller's LR.
164 // The traceback routines see morestack on a g0 as being
165 // the top of a stack (for example, morestack calling newstack
166 // calling the scheduler calling newm calling gc), so we must
167 // record an argument size. For that purpose, it has no arguments.
170 TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
171 // Cannot grow scheduler stack (m->g0).
175 CALL runtime·badmorestackg0(SB)
176 CALL runtime·abort(SB)
178 // Cannot grow signal stack (m->gsignal).
179 MOV m_gsignal(A0), A1
181 CALL runtime·badmorestackgsignal(SB)
182 CALL runtime·abort(SB)
185 // Set g->sched to context in f.
186 MOV X2, (g_sched+gobuf_sp)(g)
187 MOV T0, (g_sched+gobuf_pc)(g)
188 MOV RA, (g_sched+gobuf_lr)(g)
189 MOV CTXT, (g_sched+gobuf_ctxt)(g)
192 // Set m->morebuf to f's caller.
193 MOV RA, (m_morebuf+gobuf_pc)(A0) // f's caller's PC
194 MOV X2, (m_morebuf+gobuf_sp)(A0) // f's caller's SP
195 MOV g, (m_morebuf+gobuf_g)(A0)
197 // Call newstack on m->g0's stack.
199 CALL runtime·save_g(SB)
200 MOV (g_sched+gobuf_sp)(g), X2
201 // Create a stack frame on g0 to call newstack.
202 MOV ZERO, -8(X2) // Zero saved LR in frame
204 CALL runtime·newstack(SB)
206 // Not reached, but make sure the return PC from the call to newstack
207 // is still in this function, and not the beginning of the next.
210 // func morestack_noctxt()
211 TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
212 // Force SPWRITE. This function doesn't actually write SP,
213 // but it is called with a special calling convention where
214 // the caller doesn't save LR on stack but passes it as a
215 // register, and the unwinder currently doesn't understand.
216 // Make it SPWRITE to stop unwinding. (See issue 54332)
220 JMP runtime·morestack(SB)
222 // AES hashing not implemented for riscv64
223 TEXT runtime·memhash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32
224 JMP runtime·memhashFallback<ABIInternal>(SB)
225 TEXT runtime·strhash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
226 JMP runtime·strhashFallback<ABIInternal>(SB)
227 TEXT runtime·memhash32<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
228 JMP runtime·memhash32Fallback<ABIInternal>(SB)
229 TEXT runtime·memhash64<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
230 JMP runtime·memhash64Fallback<ABIInternal>(SB)
233 TEXT runtime·return0(SB), NOSPLIT, $0
237 // restore state from Gobuf; longjmp
239 // func gogo(buf *gobuf)
240 TEXT runtime·gogo(SB), NOSPLIT|NOFRAME, $0-8
243 MOV 0(T1), ZERO // make sure g != nil
246 TEXT gogo<>(SB), NOSPLIT|NOFRAME, $0
248 CALL runtime·save_g(SB)
252 MOV gobuf_ret(T0), A0
253 MOV gobuf_ctxt(T0), CTXT
254 MOV ZERO, gobuf_sp(T0)
255 MOV ZERO, gobuf_ret(T0)
256 MOV ZERO, gobuf_lr(T0)
257 MOV ZERO, gobuf_ctxt(T0)
261 // func procyield(cycles uint32)
262 TEXT runtime·procyield(SB),NOSPLIT,$0-0
265 // Switch to m->g0's stack, call fn(g).
266 // Fn must never return. It should gogo(&g->sched)
267 // to keep running g.
269 // func mcall(fn func(*g))
270 TEXT runtime·mcall<ABIInternal>(SB), NOSPLIT|NOFRAME, $0-8
273 // Save caller state in g->sched
274 MOV X2, (g_sched+gobuf_sp)(g)
275 MOV RA, (g_sched+gobuf_pc)(g)
276 MOV ZERO, (g_sched+gobuf_lr)(g)
278 // Switch to m->g0 & its stack, call fn.
282 CALL runtime·save_g(SB)
284 JMP runtime·badmcall(SB)
285 MOV 0(CTXT), T1 // code pointer
286 MOV (g_sched+gobuf_sp)(g), X2 // sp = m->g0->sched.sp
287 // we don't need special macro for regabi since arg0(X10) = g
289 MOV X10, 8(X2) // setup g
290 MOV ZERO, 0(X2) // clear return address
292 JMP runtime·badmcall2(SB)
294 // Save state of caller into g->sched,
295 // but using fake PC from systemstack_switch.
296 // Must only be called from functions with no locals ($0)
297 // or else unwinding from systemstack_switch is incorrect.
299 TEXT gosave_systemstack_switch<>(SB),NOSPLIT|NOFRAME,$0
300 MOV $runtime·systemstack_switch(SB), X31
301 ADD $8, X31 // get past prologue
302 MOV X31, (g_sched+gobuf_pc)(g)
303 MOV X2, (g_sched+gobuf_sp)(g)
304 MOV ZERO, (g_sched+gobuf_lr)(g)
305 MOV ZERO, (g_sched+gobuf_ret)(g)
306 // Assert ctxt is zero. See func save.
307 MOV (g_sched+gobuf_ctxt)(g), X31
309 CALL runtime·abort(SB)
312 // func asmcgocall(fn, arg unsafe.Pointer) int32
313 // Call fn(arg) on the scheduler stack,
314 // aligned appropriately for the gcc ABI.
315 // See cgocall.go for more details.
316 TEXT ·asmcgocall(SB),NOSPLIT,$0-20
320 MOV X2, X8 // save original stack pointer
323 // Figure out if we need to switch to m->g0 stack.
324 // We get called to create new OS threads too, and those
325 // come in on the m->g0 stack already. Or we might already
326 // be on the m->gsignal stack.
328 MOV m_gsignal(X6), X7
333 CALL gosave_systemstack_switch<>(SB)
335 CALL runtime·save_g(SB)
336 MOV (g_sched+gobuf_sp)(g), X2
338 // Now on a scheduling stack (a pthread-created stack).
340 // Save room for two of our pointers.
342 MOV X9, 0(X2) // save old g on stack
343 MOV (g_stack+stack_hi)(X9), X9
345 MOV X8, 8(X2) // save depth in old g stack (can't just save SP, as stack might be copied during a callback)
349 // Restore g, stack pointer. X10 is return value.
351 CALL runtime·save_g(SB)
352 MOV (g_stack+stack_hi)(g), X5
361 TEXT runtime·asminit(SB),NOSPLIT|NOFRAME,$0-0
364 // reflectcall: call a function with the given argument list
365 // func call(stackArgsType *_type, f *FuncVal, stackArgs *byte, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs).
366 // we don't have variable-sized frames, so we use a small number
367 // of constant-sized-frame functions to encode a few bits of size in the pc.
368 // Caution: ugly multiline assembly macros in your future!
370 #define DISPATCH(NAME,MAXSIZE) \
375 // Note: can't just "BR NAME(SB)" - bad inlining results.
377 // func call(stackArgsType *rtype, fn, stackArgs unsafe.Pointer, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs).
378 TEXT reflect·call(SB), NOSPLIT, $0-0
381 // func call(stackArgsType *_type, fn, stackArgs unsafe.Pointer, stackArgsSize, stackRetOffset, frameSize uint32, regArgs *abi.RegArgs).
382 TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-48
383 MOVWU frameSize+32(FP), T0
384 DISPATCH(runtime·call16, 16)
385 DISPATCH(runtime·call32, 32)
386 DISPATCH(runtime·call64, 64)
387 DISPATCH(runtime·call128, 128)
388 DISPATCH(runtime·call256, 256)
389 DISPATCH(runtime·call512, 512)
390 DISPATCH(runtime·call1024, 1024)
391 DISPATCH(runtime·call2048, 2048)
392 DISPATCH(runtime·call4096, 4096)
393 DISPATCH(runtime·call8192, 8192)
394 DISPATCH(runtime·call16384, 16384)
395 DISPATCH(runtime·call32768, 32768)
396 DISPATCH(runtime·call65536, 65536)
397 DISPATCH(runtime·call131072, 131072)
398 DISPATCH(runtime·call262144, 262144)
399 DISPATCH(runtime·call524288, 524288)
400 DISPATCH(runtime·call1048576, 1048576)
401 DISPATCH(runtime·call2097152, 2097152)
402 DISPATCH(runtime·call4194304, 4194304)
403 DISPATCH(runtime·call8388608, 8388608)
404 DISPATCH(runtime·call16777216, 16777216)
405 DISPATCH(runtime·call33554432, 33554432)
406 DISPATCH(runtime·call67108864, 67108864)
407 DISPATCH(runtime·call134217728, 134217728)
408 DISPATCH(runtime·call268435456, 268435456)
409 DISPATCH(runtime·call536870912, 536870912)
410 DISPATCH(runtime·call1073741824, 1073741824)
411 MOV $runtime·badreflectcall(SB), T2
414 #define CALLFN(NAME,MAXSIZE) \
415 TEXT NAME(SB), WRAPPER, $MAXSIZE-48; \
417 /* copy arguments to stack */ \
418 MOV stackArgs+16(FP), A1; \
419 MOVWU stackArgsSize+24(FP), A2; \
429 /* set up argument registers */ \
430 MOV regArgs+40(FP), X25; \
431 CALL ·unspillArgs(SB); \
432 /* call function */ \
435 PCDATA $PCDATA_StackMapIndex, $0; \
437 /* copy return values back */ \
438 MOV regArgs+40(FP), X25; \
439 CALL ·spillArgs(SB); \
440 MOV stackArgsType+0(FP), A5; \
441 MOV stackArgs+16(FP), A1; \
442 MOVWU stackArgsSize+24(FP), A2; \
443 MOVWU stackRetOffset+28(FP), A4; \
448 CALL callRet<>(SB); \
451 // callRet copies return values back at the end of call*. This is a
452 // separate function so it can allocate stack space for the arguments
453 // to reflectcallmove. It does not follow the Go ABI; it expects its
454 // arguments in registers.
455 TEXT callRet<>(SB), NOSPLIT, $40-0
462 CALL runtime·reflectcallmove(SB)
468 CALLFN(·call128, 128)
469 CALLFN(·call256, 256)
470 CALLFN(·call512, 512)
471 CALLFN(·call1024, 1024)
472 CALLFN(·call2048, 2048)
473 CALLFN(·call4096, 4096)
474 CALLFN(·call8192, 8192)
475 CALLFN(·call16384, 16384)
476 CALLFN(·call32768, 32768)
477 CALLFN(·call65536, 65536)
478 CALLFN(·call131072, 131072)
479 CALLFN(·call262144, 262144)
480 CALLFN(·call524288, 524288)
481 CALLFN(·call1048576, 1048576)
482 CALLFN(·call2097152, 2097152)
483 CALLFN(·call4194304, 4194304)
484 CALLFN(·call8388608, 8388608)
485 CALLFN(·call16777216, 16777216)
486 CALLFN(·call33554432, 33554432)
487 CALLFN(·call67108864, 67108864)
488 CALLFN(·call134217728, 134217728)
489 CALLFN(·call268435456, 268435456)
490 CALLFN(·call536870912, 536870912)
491 CALLFN(·call1073741824, 1073741824)
493 // Called from cgo wrappers, this function returns g->m->curg.stack.hi.
494 // Must obey the gcc calling convention.
495 TEXT _cgo_topofstack(SB),NOSPLIT,$8
496 // g (X27) and REG_TMP (X31) might be clobbered by load_g.
497 // X27 is callee-save in the gcc calling convention, so save it.
498 MOV g, savedX27-8(SP)
500 CALL runtime·load_g(SB)
503 MOV (g_stack+stack_hi)(X5), X10 // return value in X10
505 MOV savedX27-8(SP), g
508 // func goexit(neverCallThisFunction)
509 // The top-most function running on a goroutine
510 // returns to goexit+PCQuantum.
511 TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0
512 MOV ZERO, ZERO // NOP
513 JMP runtime·goexit1(SB) // does not return
514 // traceback from goexit1 must hit code range of goexit
515 MOV ZERO, ZERO // NOP
517 // func cgocallback(fn, frame unsafe.Pointer, ctxt uintptr)
518 // See cgocall.go for more details.
519 TEXT ·cgocallback(SB),NOSPLIT,$24-24
522 // Skip cgocallbackg, just dropm when fn is nil, and frame is the saved g.
523 // It is used to dropm while thread is exiting.
526 // Restore the g from frame.
531 // Load m and g from thread-local storage.
532 MOVBU runtime·iscgo(SB), X5
534 CALL runtime·load_g(SB)
537 // If g is nil, Go did not create the current thread,
538 // or if this thread never called into Go on pthread platforms.
539 // Call needm to obtain one for temporary use.
540 // In this case, we're running on the thread stack, so there's
541 // lots of space, but the linker doesn't know. Hide the call from
542 // the linker analysis by using an indirect call.
550 MOV g, savedm-8(SP) // g is zero, so is m.
551 MOV $runtime·needAndBindM(SB), X6
554 // Set m->sched.sp = SP, so that if a panic happens
555 // during the function we are about to execute, it will
556 // have a valid SP to run on the g0 stack.
557 // The next few lines (after the havem label)
558 // will save this SP onto the stack and then write
559 // the same SP back to m->sched.sp. That seems redundant,
560 // but if an unrecovered panic happens, unwindm will
561 // restore the g->sched.sp from the stack location
562 // and then systemstack will try to use it. If we don't set it here,
563 // that restored SP will be uninitialized (typically 0) and
564 // will not be usable.
567 MOV X2, (g_sched+gobuf_sp)(X6)
570 // Now there's a valid m, and we're running on its m->g0.
571 // Save current m->g0->sched.sp on stack and then set it to SP.
572 // Save current sp in m->g0->sched.sp in preparation for
573 // switch back to m->curg stack.
574 // NOTE: unwindm knows that the saved g->sched.sp is at 8(X2) aka savedsp-24(SP).
576 MOV (g_sched+gobuf_sp)(X6), X7
577 MOV X7, savedsp-24(SP) // must match frame size
578 MOV X2, (g_sched+gobuf_sp)(X6)
580 // Switch to m->curg stack and call runtime.cgocallbackg.
581 // Because we are taking over the execution of m->curg
582 // but *not* resuming what had been running, we need to
583 // save that information (m->curg->sched) so we can restore it.
584 // We can restore m->curg->sched.sp easily, because calling
585 // runtime.cgocallbackg leaves SP unchanged upon return.
586 // To save m->curg->sched.pc, we push it onto the curg stack and
587 // open a frame the same size as cgocallback's g0 frame.
588 // Once we switch to the curg stack, the pushed PC will appear
589 // to be the return PC of cgocallback, so that the traceback
590 // will seamlessly trace back into the earlier calls.
592 CALL runtime·save_g(SB)
593 MOV (g_sched+gobuf_sp)(g), X6 // prepare stack as X6
594 MOV (g_sched+gobuf_pc)(g), X7
595 MOV X7, -(24+8)(X6) // "saved LR"; must match frame size
596 // Gather our arguments into registers.
600 MOV $-(24+8)(X6), X2 // switch stack; must match frame size
604 CALL runtime·cgocallbackg(SB)
606 // Restore g->sched (== m->curg->sched) from saved values.
608 MOV X7, (g_sched+gobuf_pc)(g)
609 MOV $(24+8)(X2), X6 // must match frame size
610 MOV X6, (g_sched+gobuf_sp)(g)
612 // Switch back to m->g0's stack and restore m->g0->sched.sp.
613 // (Unlike m->curg, the g0 goroutine never uses sched.pc,
614 // so we do not have to restore it.)
617 CALL runtime·save_g(SB)
618 MOV (g_sched+gobuf_sp)(g), X2
619 MOV savedsp-24(SP), X6 // must match frame size
620 MOV X6, (g_sched+gobuf_sp)(g)
622 // If the m on entry was nil, we called needm above to borrow an m,
623 // 1. for the duration of the call on non-pthread platforms,
624 // 2. or the duration of the C thread alive on pthread platforms.
625 // If the m on entry wasn't nil,
626 // 1. the thread might be a Go thread,
627 // 2. or it's wasn't the first call from a C thread on pthread platforms,
628 // since the we skip dropm to resue the m in the first call.
630 BNE ZERO, X5, droppedm
632 // Skip dropm to reuse it in the next call, when a pthread key has been created.
633 MOV _cgo_pthread_key_created(SB), X5
634 // It means cgo is disabled when _cgo_pthread_key_created is a nil pointer, need dropm.
637 BNE ZERO, X5, droppedm
640 MOV $runtime·dropm(SB), X6
647 TEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0
651 TEXT runtime·abort(SB),NOSPLIT|NOFRAME,$0-0
655 // void setg(G*); set g. for use by needm.
656 TEXT runtime·setg(SB), NOSPLIT, $0-8
658 // This only happens if iscgo, so jump straight to save_g
659 CALL runtime·save_g(SB)
662 TEXT ·checkASM(SB),NOSPLIT,$0-1
667 // spillArgs stores return values from registers to a *internal/abi.RegArgs in X25.
668 TEXT ·spillArgs(SB),NOSPLIT,$0-0
685 MOVD F10, (16*8)(X25)
686 MOVD F11, (17*8)(X25)
687 MOVD F12, (18*8)(X25)
688 MOVD F13, (19*8)(X25)
689 MOVD F14, (20*8)(X25)
690 MOVD F15, (21*8)(X25)
691 MOVD F16, (22*8)(X25)
692 MOVD F17, (23*8)(X25)
695 MOVD F18, (26*8)(X25)
696 MOVD F19, (27*8)(X25)
697 MOVD F20, (28*8)(X25)
698 MOVD F21, (29*8)(X25)
699 MOVD F22, (30*8)(X25)
700 MOVD F23, (31*8)(X25)
703 // unspillArgs loads args into registers from a *internal/abi.RegArgs in X25.
704 TEXT ·unspillArgs(SB),NOSPLIT,$0-0
721 MOVD (16*8)(X25), F10
722 MOVD (17*8)(X25), F11
723 MOVD (18*8)(X25), F12
724 MOVD (19*8)(X25), F13
725 MOVD (20*8)(X25), F14
726 MOVD (21*8)(X25), F15
727 MOVD (22*8)(X25), F16
728 MOVD (23*8)(X25), F17
731 MOVD (26*8)(X25), F18
732 MOVD (27*8)(X25), F19
733 MOVD (28*8)(X25), F20
734 MOVD (29*8)(X25), F21
735 MOVD (30*8)(X25), F22
736 MOVD (31*8)(X25), F23
739 // gcWriteBarrier informs the GC about heap pointer writes.
741 // gcWriteBarrier does NOT follow the Go ABI. It accepts the
742 // number of bytes of buffer needed in X24, and returns a pointer
743 // to the buffer spcae in X24.
744 // It clobbers X31 aka T6 (the linker temp register - REG_TMP).
745 // The act of CALLing gcWriteBarrier will clobber RA (LR).
746 // It does not clobber any other general-purpose registers,
747 // but may clobber others (e.g., floating point registers).
748 TEXT gcWriteBarrier<>(SB),NOSPLIT,$208
749 // Save the registers clobbered by the fast path.
755 MOV (p_wbBuf+wbBuf_next)(A0), A1
756 MOV (p_wbBuf+wbBuf_end)(A0), T6 // T6 is linker temp register (REG_TMP)
757 // Increment wbBuf.next position.
759 // Is the buffer full?
761 // Commit to the larger buffer.
762 MOV A1, (p_wbBuf+wbBuf_next)(A0)
763 // Make the return value (the original next position)
765 // Restore registers.
771 // Save all general purpose registers since these could be
772 // clobbered by wbBufFlush and were not saved by the caller.
775 // X0 is zero register
776 // X1 is LR, saved by prologue
783 // X10 already saved (A0)
784 // X11 already saved (A1)
804 // X31 is tmp register.
806 CALL runtime·wbBufFlush(SB)
834 TEXT runtime·gcWriteBarrier1<ABIInternal>(SB),NOSPLIT,$0
836 JMP gcWriteBarrier<>(SB)
837 TEXT runtime·gcWriteBarrier2<ABIInternal>(SB),NOSPLIT,$0
839 JMP gcWriteBarrier<>(SB)
840 TEXT runtime·gcWriteBarrier3<ABIInternal>(SB),NOSPLIT,$0
842 JMP gcWriteBarrier<>(SB)
843 TEXT runtime·gcWriteBarrier4<ABIInternal>(SB),NOSPLIT,$0
845 JMP gcWriteBarrier<>(SB)
846 TEXT runtime·gcWriteBarrier5<ABIInternal>(SB),NOSPLIT,$0
848 JMP gcWriteBarrier<>(SB)
849 TEXT runtime·gcWriteBarrier6<ABIInternal>(SB),NOSPLIT,$0
851 JMP gcWriteBarrier<>(SB)
852 TEXT runtime·gcWriteBarrier7<ABIInternal>(SB),NOSPLIT,$0
854 JMP gcWriteBarrier<>(SB)
855 TEXT runtime·gcWriteBarrier8<ABIInternal>(SB),NOSPLIT,$0
857 JMP gcWriteBarrier<>(SB)
859 // Note: these functions use a special calling convention to save generated code space.
860 // Arguments are passed in registers (ssa/gen/RISCV64Ops.go), but the space for those
861 // arguments are allocated in the caller's stack frame.
862 // These stubs write the args into that stack space and then tail call to the
863 // corresponding runtime handler.
864 // The tail call makes these stubs disappear in backtraces.
865 TEXT runtime·panicIndex<ABIInternal>(SB),NOSPLIT,$0-16
868 JMP runtime·goPanicIndex<ABIInternal>(SB)
869 TEXT runtime·panicIndexU<ABIInternal>(SB),NOSPLIT,$0-16
872 JMP runtime·goPanicIndexU<ABIInternal>(SB)
873 TEXT runtime·panicSliceAlen<ABIInternal>(SB),NOSPLIT,$0-16
876 JMP runtime·goPanicSliceAlen<ABIInternal>(SB)
877 TEXT runtime·panicSliceAlenU<ABIInternal>(SB),NOSPLIT,$0-16
880 JMP runtime·goPanicSliceAlenU<ABIInternal>(SB)
881 TEXT runtime·panicSliceAcap<ABIInternal>(SB),NOSPLIT,$0-16
884 JMP runtime·goPanicSliceAcap<ABIInternal>(SB)
885 TEXT runtime·panicSliceAcapU<ABIInternal>(SB),NOSPLIT,$0-16
888 JMP runtime·goPanicSliceAcapU<ABIInternal>(SB)
889 TEXT runtime·panicSliceB<ABIInternal>(SB),NOSPLIT,$0-16
892 JMP runtime·goPanicSliceB<ABIInternal>(SB)
893 TEXT runtime·panicSliceBU<ABIInternal>(SB),NOSPLIT,$0-16
896 JMP runtime·goPanicSliceBU<ABIInternal>(SB)
897 TEXT runtime·panicSlice3Alen<ABIInternal>(SB),NOSPLIT,$0-16
900 JMP runtime·goPanicSlice3Alen<ABIInternal>(SB)
901 TEXT runtime·panicSlice3AlenU<ABIInternal>(SB),NOSPLIT,$0-16
904 JMP runtime·goPanicSlice3AlenU<ABIInternal>(SB)
905 TEXT runtime·panicSlice3Acap<ABIInternal>(SB),NOSPLIT,$0-16
908 JMP runtime·goPanicSlice3Acap<ABIInternal>(SB)
909 TEXT runtime·panicSlice3AcapU<ABIInternal>(SB),NOSPLIT,$0-16
912 JMP runtime·goPanicSlice3AcapU<ABIInternal>(SB)
913 TEXT runtime·panicSlice3B<ABIInternal>(SB),NOSPLIT,$0-16
916 JMP runtime·goPanicSlice3B<ABIInternal>(SB)
917 TEXT runtime·panicSlice3BU<ABIInternal>(SB),NOSPLIT,$0-16
920 JMP runtime·goPanicSlice3BU<ABIInternal>(SB)
921 TEXT runtime·panicSlice3C<ABIInternal>(SB),NOSPLIT,$0-16
924 JMP runtime·goPanicSlice3C<ABIInternal>(SB)
925 TEXT runtime·panicSlice3CU<ABIInternal>(SB),NOSPLIT,$0-16
928 JMP runtime·goPanicSlice3CU<ABIInternal>(SB)
929 TEXT runtime·panicSliceConvert<ABIInternal>(SB),NOSPLIT,$0-16
932 JMP runtime·goPanicSliceConvert<ABIInternal>(SB)
934 DATA runtime·mainPC+0(SB)/8,$runtime·main<ABIInternal>(SB)
935 GLOBL runtime·mainPC(SB),RODATA,$8