167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Copyright 2016 The Go Authors. All rights reserved.
267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Use of this source code is governed by a BSD-style
367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// license that can be found in the LICENSE file.
467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#include "go_asm.h"
667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#include "go_tls.h"
767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#include "funcdata.h"
867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#include "textflag.h"
967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
1067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// _rt0_s390x_lib is common startup code for s390x systems when
1167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// using -buildmode=c-archive or -buildmode=c-shared. The linker will
1267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// arrange to invoke this function as a global constructor (for
1367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// c-archive) or when the shared library is loaded (for c-shared).
1467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// We expect argc and argv to be passed in the usual C ABI registers
1567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R2 and R3.
1667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT _rt0_s390x_lib(SB), NOSPLIT|NOFRAME, $0
1767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	STMG	R6, R15, 48(R15)
1867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, _rt0_s390x_lib_argc<>(SB)
1967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, _rt0_s390x_lib_argv<>(SB)
2067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
2167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save R6-R15 in the register save area of the calling function.
2267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	STMG	R6, R15, 48(R15)
2367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
2467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Allocate 80 bytes on the stack.
2567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-80(R15), R15
2667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
2767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save F8-F15 in our stack frame.
2867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F8, 16(R15)
2967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F9, 24(R15)
3067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F10, 32(R15)
3167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F11, 40(R15)
3267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F12, 48(R15)
3367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F13, 56(R15)
3467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F14, 64(R15)
3567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	F15, 72(R15)
3667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
3767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Synchronous initialization.
3867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·libpreinit(SB), R1
3967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	R1
4067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
4167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Create a new thread to finish Go runtime initialization.
4267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	_cgo_sys_thread_create(SB), R1
4367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R1, $0
4467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	nocgo
4567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$_rt0_s390x_lib_go(SB), R2
4667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, R3
4767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	R1
4867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	restore
4967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
5067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnocgo:
5167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0x800000, R1              // stacksize
5267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R1, 0(R15)
5367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$_rt0_s390x_lib_go(SB), R1
5467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R1, 8(R15)                 // fn
5567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·newosproc(SB), R1
5667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	R1
5767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
5867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotrestore:
5967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Restore F8-F15 from our stack frame.
6067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	16(R15), F8
6167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	24(R15), F9
6267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	32(R15), F10
6367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	40(R15), F11
6467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	48(R15), F12
6567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	56(R15), F13
6667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	64(R15), F14
6767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	FMOVD	72(R15), F15
6867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$80(R15), R15
6967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
7067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Restore R6-R15.
7167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	48(R15), R6, R15
7267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
7367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
7467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// _rt0_s390x_lib_go initializes the Go runtime.
7567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// This is started in a separate thread by _rt0_s390x_lib.
7667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT _rt0_s390x_lib_go(SB), NOSPLIT|NOFRAME, $0
7767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	_rt0_s390x_lib_argc<>(SB), R2
7867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	_rt0_s390x_lib_argv<>(SB), R3
7967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·rt0_go(SB), R1
8067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	R1
8167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
8267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotDATA _rt0_s390x_lib_argc<>(SB)/8, $0
8367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotGLOBL _rt0_s390x_lib_argc<>(SB), NOPTR, $8
8467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotDATA _rt0_s90x_lib_argv<>(SB)/8, $0
8567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotGLOBL _rt0_s390x_lib_argv<>(SB), NOPTR, $8
8667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
8767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·rt0_go(SB),NOSPLIT,$0
8867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// R2 = argc; R3 = argv; R11 = temp; R13 = g; R15 = stack pointer
8967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// C TLS base pointer in AR0:AR1
9067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
9167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// initialize essential registers
9267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	XOR	R0, R0
9367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
9467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$24, R15
9567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	R2, 8(R15) // argc
9667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 16(R15) // argv
9767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
9867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// create istack out of the given (operating system) stack.
9967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// _cgo_init may update stackguard.
10067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·g0(SB), g
10167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, R11
10267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$(64*1024), R11
10367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R11, g_stackguard0(g)
10467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R11, g_stackguard1(g)
10567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R11, (g_stack+stack_lo)(g)
10667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_stack+stack_hi)(g)
10767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
10867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// if there is a _cgo_init, call it using the gcc ABI.
10967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	_cgo_init(SB), R11
11067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R11, $0, nocgo
11167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	AR0, R4			// (AR0 << 32 | AR1) is the TLS base pointer; MOVD is translated to EAR
11267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SLD	$32, R4, R4
11367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	AR1, R4			// arg 2: TLS base pointer
11467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$setg_gcc<>(SB), R3 	// arg 1: setg
11567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, R2			// arg 0: G
11667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// C functions expect 160 bytes of space on caller stack frame
11767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// and an 8-byte aligned stack pointer
11867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, R9			// save current stack (R9 is preserved in the Linux ABI)
11967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$160, R15		// reserve 160 bytes
12067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD    $~7, R6
12167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	AND 	R6, R15			// 8-byte align
12267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	R11			// this call clobbers volatile registers according to Linux ABI (R0-R5, R14)
12367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R9, R15			// restore stack
12467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	XOR	R0, R0			// zero R0
12567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
12667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnocgo:
12767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// update stackguard after _cgo_init
12867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_stack+stack_lo)(g), R2
12967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$const__StackGuard, R2
13067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, g_stackguard0(g)
13167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, g_stackguard1(g)
13267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
13367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// set the per-goroutine and per-mach "registers"
13467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·m0(SB), R2
13567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
13667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// save m->g0 = g0
13767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, m_g0(R2)
13867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// save m0 to g0->m
13967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, g_m(g)
14067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
14167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·check(SB)
14267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
14367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// argc/argv are already prepared on stack
14467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·args(SB)
14567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·osinit(SB)
14667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·schedinit(SB)
14767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
14867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// create a new goroutine to start program
14967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·mainPC(SB), R2		// entry
15067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB     $24, R15
15167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD 	R2, 16(R15)
15267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD 	$0, 8(R15)
15367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD 	$0, 0(R15)
15467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·newproc(SB)
15567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$24, R15
15667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
15767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// start this M
15867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·mstart(SB)
15967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
16067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, 1(R0)
16167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
16267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
16367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotDATA	runtime·mainPC+0(SB)/8,$runtime·main(SB)
16467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotGLOBL	runtime·mainPC(SB),RODATA,$8
16567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
16667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0
16767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, 2(R0)
16867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
16967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
17067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·asminit(SB),NOSPLIT|NOFRAME,$0-0
17167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
17267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
17367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot/*
17467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot *  go-routine
17567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot */
17667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
17767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void gosave(Gobuf*)
17867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// save state in Gobuf; setjmp
17967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·gosave(SB), NOSPLIT, $-8-8
18067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	buf+0(FP), R3
18167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, gobuf_sp(R3)
18267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, gobuf_pc(R3)
18367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, gobuf_g(R3)
18467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_lr(R3)
18567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_ret(R3)
18667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Assert ctxt is zero. See func save.
18767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_ctxt(R3), R3
18867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, $0, 2(PC)
18967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·badctxt(SB)
19067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
19167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
19267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void gogo(Gobuf*)
19367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// restore state from Gobuf; longjmp
19467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·gogo(SB), NOSPLIT, $16-8
19567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	buf+0(FP), R5
19667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_g(R5), g	// make sure g is not nil
19767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
19867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
19967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(g), R4
20067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_sp(R5), R15
20167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_lr(R5), LR
20267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_ret(R5), R3
20367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_ctxt(R5), R12
20467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_sp(R5)
20567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_ret(R5)
20667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_lr(R5)
20767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, gobuf_ctxt(R5)
20867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R0, R0 // set condition codes for == test, needed by stack split
20967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gobuf_pc(R5), R6
21067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	(R6)
21167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
21267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void mcall(fn func(*g))
21367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Switch to m->g0's stack, call fn(g).
21467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Fn must never return.  It should gogo(&g->sched)
21567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// to keep running g.
21667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·mcall(SB), NOSPLIT, $-8-8
21767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save caller state in g->sched
21867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(g)
21967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, (g_sched+gobuf_pc)(g)
22067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (g_sched+gobuf_lr)(g)
22167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, (g_sched+gobuf_g)(g)
22267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
22367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Switch to m->g0 & its stack, call fn.
22467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, R3
22567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R8
22667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R8), g
22767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
22867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	g, R3
22967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BNE	2(PC)
23067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·badmcall(SB)
23167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	fn+0(FP), R12			// context
23267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R12), R4			// code pointer
23367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R15	// sp = m->g0->sched.sp
23467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$16, R15
23567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 8(R15)
23667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, 0(R15)
23767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R4)
23867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·badmcall2(SB)
23967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
24067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// systemstack_switch is a dummy routine that systemstack leaves at the bottom
24167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// of the G stack.  We need to distinguish the routine that
24267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// lives at the bottom of the G stack from the one that lives
24367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// at the top of the system stack because the one at the top of
24467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// the system stack terminates the stack walk (see topofstack()).
24567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·systemstack_switch(SB), NOSPLIT, $0-0
24667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	UNDEF
24767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(LR)	// make sure this function is not leaf
24867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
24967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
25067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func systemstack(fn func())
25167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·systemstack(SB), NOSPLIT, $0-8
25267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	fn+0(FP), R3	// R3 = fn
25367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R12		// context
25467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R4	// R4 = m
25567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
25667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_gsignal(R4), R5	// R5 = gsignal
25767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	g, R5, noswitch
25867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
25967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R4), R5	// R5 = g0
26067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	g, R5, noswitch
26167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
26267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_curg(R4), R6
26367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	g, R6, switch
26467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
26567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Bad: g is not gsignal, not g0, not curg. What is it?
26667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Hide call from linker nosplit analysis.
26767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·badsystemstack(SB), R3
26867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R3)
26967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
27067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotswitch:
27167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// save our state in g->sched.  Pretend to
27267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// be systemstack_switch if the G stack is scanned.
27367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·systemstack_switch(SB), R6
27467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$16, R6	// get past prologue
27567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R6, (g_sched+gobuf_pc)(g)
27667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(g)
27767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (g_sched+gobuf_lr)(g)
27867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, (g_sched+gobuf_g)(g)
27967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
28067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// switch to g0
28167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, g
28267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
28367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R3
28467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// make it look like mstart called systemstack on g0, to stop traceback
28567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$8, R3
28667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·mstart(SB), R4
28767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, 0(R3)
28867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R15
28967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
29067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// call target function
29167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R12), R3	// code pointer
29267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R3)
29367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
29467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// switch back to g
29567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R3
29667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_curg(R3), g
29767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
29867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R15
29967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (g_sched+gobuf_sp)(g)
30067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
30167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
30267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnoswitch:
30367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// already on m stack, just call directly
30467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Using a tail call here cleans up tracebacks since we won't stop
30567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// at an intermediate systemstack.
30667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R12), R3	// code pointer
30767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R15), LR	// restore LR
30867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$8, R15
30967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	(R3)
31067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
31167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot/*
31267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot * support for morestack
31367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot */
31467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
31567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Called during function prolog when more stack is needed.
31667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Caller has already loaded:
31767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R3: framesize, R4: argsize, R5: LR
31867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//
31967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// The traceback routines see morestack on a g0 as being
32067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// the top of a stack (for example, morestack calling newstack
32167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// calling the scheduler calling newm calling gc), so we must
32267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// record an argument size. For that purpose, it has no arguments.
32367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
32467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Cannot grow scheduler stack (m->g0).
32567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R7
32667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R7), R8
32767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	g, R8, 3(PC)
32867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·badmorestackg0(SB)
32967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·abort(SB)
33067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
33167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Cannot grow signal stack (m->gsignal).
33267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_gsignal(R7), R8
33367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	g, R8
33467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BNE	3(PC)
33567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·badmorestackgsignal(SB)
33667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·abort(SB)
33767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
33867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Called from f.
33967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Set g->sched to context in f.
34067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(g)
34167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, R8
34267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R8, (g_sched+gobuf_pc)(g)
34367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, (g_sched+gobuf_lr)(g)
34467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R12, (g_sched+gobuf_ctxt)(g)
34567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
34667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Called from f.
34767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Set m->morebuf to f's caller.
34867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, (m_morebuf+gobuf_pc)(R7)	// f's caller's PC
34967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (m_morebuf+gobuf_sp)(R7)	// f's caller's SP
35067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, (m_morebuf+gobuf_g)(R7)
35167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
35267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Call newstack on m->g0's stack.
35367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R7), g
35467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
35567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R15
35667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Create a stack frame on g0 to call newstack.
35767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, -8(R15)	// Zero saved LR in frame
35867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$8, R15
35967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·newstack(SB)
36067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
36167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Not reached, but make sure the return PC from the call to newstack
36267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// is still in this function, and not the beginning of the next.
36367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	UNDEF
36467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
36567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
36667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, R12
36767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·morestack(SB)
36867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
36967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// reflectcall: call a function with the given argument list
37067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func call(argtype *_type, f *FuncVal, arg *byte, argsize, retoffset uint32).
37167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// we don't have variable-sized frames, so we use a small number
37267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// of constant-sized-frame functions to encode a few bits of size in the pc.
37367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Caution: ugly multiline assembly macros in your future!
37467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
37567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#define DISPATCH(NAME,MAXSIZE)		\
37667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$MAXSIZE, R4;		\
37767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R3, R4;		\
37867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BGT	3(PC);			\
37967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$NAME(SB), R5;	\
38067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	(R5)
38167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Note: can't just "BR NAME(SB)" - bad inlining results.
38267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
38367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT reflect·call(SB), NOSPLIT, $0-0
38467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	·reflectcall(SB)
38567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
38667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT ·reflectcall(SB), NOSPLIT, $-8-32
38767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ argsize+24(FP), R3
38867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call32, 32)
38967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call64, 64)
39067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call128, 128)
39167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call256, 256)
39267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call512, 512)
39367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call1024, 1024)
39467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call2048, 2048)
39567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call4096, 4096)
39667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call8192, 8192)
39767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call16384, 16384)
39867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call32768, 32768)
39967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call65536, 65536)
40067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call131072, 131072)
40167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call262144, 262144)
40267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call524288, 524288)
40367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call1048576, 1048576)
40467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call2097152, 2097152)
40567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call4194304, 4194304)
40667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call8388608, 8388608)
40767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call16777216, 16777216)
40867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call33554432, 33554432)
40967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call67108864, 67108864)
41067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call134217728, 134217728)
41167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call268435456, 268435456)
41267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call536870912, 536870912)
41367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	DISPATCH(runtime·call1073741824, 1073741824)
41467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·badreflectcall(SB), R5
41567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	(R5)
41667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
41767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#define CALLFN(NAME,MAXSIZE)			\
41867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT NAME(SB), WRAPPER, $MAXSIZE-24;		\
41967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	NO_LOCAL_POINTERS;			\
42067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	/* copy arguments to stack */		\
42167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	arg+16(FP), R4;			\
42267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ	argsize+24(FP), R5;		\
42367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$stack-MAXSIZE(SP), R6;		\
42467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotloopArgs: /* copy 256 bytes at a time */	\
42567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R5, $256;			\
42667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	tailArgs;			\
42767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$256, R5;			\
42867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MVC	$256, 0(R4), 0(R6);		\
42967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$256(R4), R4;			\
43067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$256(R6), R6;			\
43167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	loopArgs;			\
43267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobottailArgs: /* copy remaining bytes */		\
43367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R5, $0;				\
43467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	callFunction;			\
43567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$1, R5;				\
43667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	EXRL	$callfnMVC<>(SB), R5;		\
43767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotcallFunction:					\
43867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	f+8(FP), R12;			\
43967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(R12), R8;			\
44067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	PCDATA  $PCDATA_StackMapIndex, $0;	\
44167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R8);				\
44267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	/* copy return values back */		\
44367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	argtype+0(FP), R7;		\
44467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	arg+16(FP), R6;			\
44567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ	n+24(FP), R5;			\
44667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$stack-MAXSIZE(SP), R4;		\
44767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ	retoffset+28(FP), R1;		\
44867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R1, R4;				\
44967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R1, R6;				\
45067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R1, R5;				\
45167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	callRet<>(SB);			\
45267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
45367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
45467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// callRet copies return values back at the end of call*. This is a
45567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// separate function so it can allocate stack space for the arguments
45667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// to reflectcallmove. It does not follow the Go ABI; it expects its
45767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// arguments in registers.
45867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT callRet<>(SB), NOSPLIT, $32-0
45967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R7, 8(R15)
46067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R6, 16(R15)
46167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, 24(R15)
46267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, 32(R15)
46367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·reflectcallmove(SB)
46467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
46567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
46667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall32, 32)
46767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall64, 64)
46867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall128, 128)
46967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall256, 256)
47067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall512, 512)
47167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall1024, 1024)
47267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall2048, 2048)
47367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall4096, 4096)
47467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall8192, 8192)
47567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall16384, 16384)
47667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall32768, 32768)
47767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall65536, 65536)
47867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall131072, 131072)
47967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall262144, 262144)
48067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall524288, 524288)
48167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall1048576, 1048576)
48267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall2097152, 2097152)
48367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall4194304, 4194304)
48467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall8388608, 8388608)
48567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall16777216, 16777216)
48667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall33554432, 33554432)
48767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall67108864, 67108864)
48867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall134217728, 134217728)
48967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall268435456, 268435456)
49067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall536870912, 536870912)
49167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFNcall1073741824, 1073741824)
49267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
49367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Not a function: target for EXRL (execute relative long) instruction.
49467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT callfnMVC<>(SB),NOSPLIT|NOFRAME,$0-0
49567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MVC	$1, 0(R4), 0(R6)
49667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
49767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·procyield(SB),NOSPLIT,$0-0
49867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
49967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
50067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void jmpdefer(fv, sp);
50167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// called from deferreturn.
50267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// 1. grab stored LR for caller
50367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// 2. sub 6 bytes to get back to BL deferreturn (size of BRASL instruction)
50467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// 3. BR to fn
50567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·jmpdefer(SB),NOSPLIT|NOFRAME,$0-16
50667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R15), R1
50767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$6, R1, LR
50867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
50967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	fv+0(FP), R12
51067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	argp+8(FP), R15
51167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$8, R15
51267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R12), R3
51367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	(R3)
51467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
51567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Save state of caller into g->sched. Smashes R1.
51667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT gosave<>(SB),NOSPLIT|NOFRAME,$0
51767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, (g_sched+gobuf_pc)(g)
51867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(g)
51967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (g_sched+gobuf_lr)(g)
52067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (g_sched+gobuf_ret)(g)
52167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Assert ctxt is zero. See func save.
52267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_ctxt)(g), R1
52367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R1, $0, 2(PC)
52467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·badctxt(SB)
52567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
52667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
52767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func asmcgocall(fn, arg unsafe.Pointer) int32
52867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Call fn(arg) on the scheduler stack,
52967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// aligned appropriately for the gcc ABI.
53067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// See cgocall.go for more details.
53167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT ·asmcgocall(SB),NOSPLIT,$0-20
53267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// R2 = argc; R3 = argv; R11 = temp; R13 = g; R15 = stack pointer
53367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// C TLS base pointer in AR0:AR1
53467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	fn+0(FP), R3
53567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	arg+8(FP), R4
53667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
53767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, R2		// save original stack pointer
53867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, R5
53967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
54067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Figure out if we need to switch to m->g0 stack.
54167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// We get called to create new OS threads too, and those
54267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// come in on the m->g0 stack already.
54367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R6
54467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R6), R6
54567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R6, g, g0
54667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	gosave<>(SB)
54767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R6, g
54867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
54967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R15
55067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
55167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Now on a scheduling stack (a pthread-created stack).
55267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotg0:
55367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save room for two of our pointers, plus 160 bytes of callee
55467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// save area that lives on the caller stack.
55567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$176, R15
55667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$~7, R6
55767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	AND	R6, R15                 // 8-byte alignment for gcc ABI
55867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, 168(R15)             // save old g on stack
55967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_stack+stack_hi)(R5), R5
56067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R2, R5
56167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, 160(R15)             // save depth in old g stack (can't just save SP, as stack might be copied during a callback)
56267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, 0(R15)              // clear back chain pointer (TODO can we give it real back trace information?)
56367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, R2                  // arg in R2
56467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	R3                      // can clobber: R0-R5, R14, F0-F3, F5, F7-F15
56567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
56667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	XOR	R0, R0                  // set R0 back to 0.
56767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Restore g, stack pointer.
56867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	168(R15), g
56967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
57067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_stack+stack_hi)(g), R5
57167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	160(R15), R6
57267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R6, R5
57367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, R15
57467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
57567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	R2, ret+16(FP)
57667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
57767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
57867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// cgocallback(void (*fn)(void*), void *frame, uintptr framesize, uintptr ctxt)
57967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Turn the fn into a Go func (by taking its address) and call
58067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// cgocallback_gofunc.
58167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·cgocallback(SB),NOSPLIT,$32-32
58267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$fn+0(FP), R3
58367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 8(R15)
58467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	frame+8(FP), R3
58567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 16(R15)
58667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	framesize+16(FP), R3
58767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 24(R15)
58867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	ctxt+24(FP), R3
58967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 32(R15)
59067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·cgocallback_gofunc(SB), R3
59167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R3)
59267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
59367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
59467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// cgocallback_gofunc(FuncVal*, void *frame, uintptr framesize, uintptr ctxt)
59567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// See cgocall.go for more details.
59667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT ·cgocallback_gofunc(SB),NOSPLIT,$16-32
59767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	NO_LOCAL_POINTERS
59867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
59967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Load m and g from thread-local storage.
60067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	runtime·iscgo(SB), R3
60167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, $0, nocgo
60267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·load_g(SB)
60367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
60467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnocgo:
60567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// If g is nil, Go did not create the current thread.
60667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Call needm to obtain one for temporary use.
60767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// In this case, we're running on the thread stack, so there's
60867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// lots of space, but the linker doesn't know. Hide the call from
60967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// the linker analysis by using an indirect call.
61067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	g, $0, needm
61167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
61267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R8
61367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R8, savedm-8(SP)
61467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	havem
61567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
61667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotneedm:
61767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, savedm-8(SP) // g is zero, so is m.
61867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·needm(SB), R3
61967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R3)
62067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
62167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Set m->sched.sp = SP, so that if a panic happens
62267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// during the function we are about to execute, it will
62367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// have a valid SP to run on the g0 stack.
62467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// The next few lines (after the havem label)
62567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// will save this SP onto the stack and then write
62667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// the same SP back to m->sched.sp. That seems redundant,
62767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// but if an unrecovered panic happens, unwindm will
62867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// restore the g->sched.sp from the stack location
62967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// and then systemstack will try to use it. If we don't set it here,
63067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// that restored SP will be uninitialized (typically 0) and
63167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// will not be usable.
63267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R8
63367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R8), R3
63467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(R3)
63567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
63667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robothavem:
63767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Now there's a valid m, and we're running on its m->g0.
63867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save current m->g0->sched.sp on stack and then set it to SP.
63967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save current sp in m->g0->sched.sp in preparation for
64067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// switch back to m->curg stack.
64167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// NOTE: unwindm knows that the saved g->sched.sp is at 8(R1) aka savedsp-16(SP).
64267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R8), R3
64367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(R3), R4
64467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, savedsp-16(SP)
64567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R15, (g_sched+gobuf_sp)(R3)
64667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
64767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Switch to m->curg stack and call runtime.cgocallbackg.
64867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Because we are taking over the execution of m->curg
64967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// but *not* resuming what had been running, we need to
65067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// save that information (m->curg->sched) so we can restore it.
65167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// We can restore m->curg->sched.sp easily, because calling
65267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// runtime.cgocallbackg leaves SP unchanged upon return.
65367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// To save m->curg->sched.pc, we push it onto the stack.
65467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// This has the added benefit that it looks to the traceback
65567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// routine like cgocallbackg is going to return to that
65667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// PC (because the frame we allocate below has the same
65767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// size as cgocallback_gofunc's frame declared above)
65867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// so that the traceback will seamlessly trace back into
65967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// the earlier calls.
66067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	//
66167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// In the new goroutine, -8(SP) is unused (where SP refers to
66267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// m->curg's SP while we're setting it up, before we've adjusted it).
66367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_curg(R8), g
66467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
66567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R4 // prepare stack as R4
66667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_pc)(g), R5
66767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, -24(R4)
66867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	ctxt+24(FP), R5
66967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, -16(R4)
67067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-24(R4), R15
67167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·cgocallbackg(SB)
67267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
67367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Restore g->sched (== m->curg->sched) from saved values.
67467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R15), R5
67567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, (g_sched+gobuf_pc)(g)
67667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$24(R15), R4
67767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, (g_sched+gobuf_sp)(g)
67867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
67967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Switch back to m->g0's stack and restore m->g0->sched.sp.
68067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// (Unlike m->curg, the g0 goroutine never uses sched.pc,
68167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// so we do not have to restore it.)
68267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R8
68367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_g0(R8), g
68467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
68567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_sched+gobuf_sp)(g), R15
68667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	savedsp-16(SP), R4
68767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, (g_sched+gobuf_sp)(g)
68867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
68967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// If the m on entry was nil, we called needm above to borrow an m
69067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// for the duration of the call. Since the call is over, return it with dropm.
69167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	savedm-8(SP), R6
69267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R6, $0, droppedm
69367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$runtime·dropm(SB), R3
69467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	(R3)
69567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotdroppedm:
69667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
69767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Done!
69867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
69967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
70067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void setg(G*); set g. for use by needm.
70167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·setg(SB), NOSPLIT, $0-8
70267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	gg+0(FP), g
70367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// This only happens if iscgo, so jump straight to save_g
70467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
70567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
70667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
70767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// void setg_gcc(G*); set g in C TLS.
70867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Must obey the gcc calling convention.
70967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
71067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// The standard prologue clobbers LR (R14), which is callee-save in
71167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// the C ABI, so we have to use NOFRAME and save LR ourselves.
71267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, R1
71367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Also save g, R10, and R11 since they're callee-save in C ABI
71467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R10, R3
71567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, R4
71667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R11, R5
71767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
71867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, g
71967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·save_g(SB)
72067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
72167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, R11
72267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, g
72367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R10
72467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R1, LR
72567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
72667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
72767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·getcallerpc(SB),NOSPLIT|NOFRAME,$0-8
72867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R15), R3		// LR saved by caller
72967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, ret+0(FP)
73067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
73167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
73267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·abort(SB),NOSPLIT|NOFRAME,$0-0
73367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	(R0), R0
73467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	UNDEF
73567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
73667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// int64 runtime·cputicks(void)
73767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·cputicks(SB),NOSPLIT,$0-8
73867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// The TOD clock on s390 counts from the year 1900 in ~250ps intervals.
73967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// This means that since about 1972 the msb has been set, making the
74067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// result of a call to STORE CLOCK (stck) a negative number.
74167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// We clear the msb to make it positive.
74267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	STCK	ret+0(FP)      // serialises before and after call
74367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	ret+0(FP), R3  // R3 will wrap to 0 in the year 2043
74467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SLD	$1, R3
74567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SRD	$1, R3
74667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, ret+0(FP)
74767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
74867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
74967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// AES hashing not implemented for s390x
75067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·aeshash(SB),NOSPLIT|NOFRAME,$0-0
75167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	(R0), R15
75267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·aeshash32(SB),NOSPLIT|NOFRAME,$0-0
75367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	(R0), R15
75467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·aeshash64(SB),NOSPLIT|NOFRAME,$0-0
75567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	(R0), R15
75667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·aeshashstr(SB),NOSPLIT|NOFRAME,$0-0
75767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	(R0), R15
75867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
75967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// memequal(a, b unsafe.Pointer, size uintptr) bool
76067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-25
76167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	a+0(FP), R3
76267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	b+8(FP), R5
76367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	size+16(FP), R6
76467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	ret+24(FP), R7
76567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·memeqbody(SB)
76667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
76767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// memequal_varlen(a, b unsafe.Pointer) bool
76867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-17
76967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	a+0(FP), R3
77067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	b+8(FP), R5
77167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	8(R12), R6    // compiler stores size at offset 8 in the closure
77267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	ret+16(FP), R7
77367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·memeqbody(SB)
77467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
77567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT bytes·Equal(SB),NOSPLIT|NOFRAME,$0-49
77667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	a_len+8(FP), R2
77767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	b_len+32(FP), R6
77867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	a+0(FP), R3
77967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	b+24(FP), R5
78067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	ret+48(FP), R7
78167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R2, R6, notequal
78267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·memeqbody(SB)
78367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotequal:
78467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	$0, ret+48(FP)
78567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
78667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
78767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// input:
78867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R3 = a
78967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R5 = b
79067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R6 = len
79167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R7 = address of output byte (stores 0 or 1 here)
79267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   a and b have the same length
79367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·memeqbody(SB),NOSPLIT|NOFRAME,$0-0
79467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, R5, equal
79567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotloop:
79667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R6, $0, equal
79767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLT	R6, $32, tiny
79867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R6, $256
79967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	tail
80067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CLC	$256, 0(R3), 0(R5)
80167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BNE	notequal
80267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$256, R6
80367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	256(R3), R3
80467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	256(R5), R5
80567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	loop
80667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robottail:
80767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$1, R6, R8
80867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	EXRL	$runtime·memeqbodyclc(SB), R8
80967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	equal
81067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotequal:
81167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	$0, 0(R7)
81267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
81367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotequal:
81467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	$1, 0(R7)
81567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
81667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robottiny:
81767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, R2
81867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLT	R6, $16, lt16
81967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R3), R8
82067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R5), R9
82167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R8, R9, notequal
82267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	8(R3), R8
82367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	8(R5), R9
82467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R8, R9, notequal
82567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	16(R2), R2
82667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$16, R6
82767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotlt16:
82867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLT	R6, $8, lt8
82967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R3)(R2*1), R8
83067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	0(R5)(R2*1), R9
83167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R8, R9, notequal
83267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	8(R2), R2
83367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$8, R6
83467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotlt8:
83567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLT	R6, $4, lt4
83667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ	0(R3)(R2*1), R8
83767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVWZ	0(R5)(R2*1), R9
83867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R8, R9, notequal
83967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	4(R2), R2
84067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$4, R6
84167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotlt4:
84267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot#define CHECK(n) \
84367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R6, $n, equal \
84467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	n(R3)(R2*1), R8 \
84567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	n(R5)(R2*1), R9 \
84667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R8, R9, notequal
84767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CHECK(0)
84867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CHECK(1)
84967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CHECK(2)
85067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CHECK(3)
85167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	equal
85267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
85367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·memeqbodyclc(SB),NOSPLIT|NOFRAME,$0-0
85467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CLC	$1, 0(R3), 0(R5)
85567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
85667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
85767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
85867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s+0(FP), R3     // s => R3
85967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s_len+8(FP), R4 // s_len => R4
86067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	c+24(FP), R5    // c => R5
86167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$ret+32(FP), R2 // &ret => R9
86267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·indexbytebody(SB)
86367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
86467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
86567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s+0(FP), R3     // s => R3
86667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s_len+8(FP), R4 // s_len => R4
86767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	c+16(FP), R5    // c => R5
86867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$ret+24(FP), R2 // &ret => R9
86967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·indexbytebody(SB)
87067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
87167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// input:
87267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R3: s
87367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R4: s_len
87467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R5: c -- byte sought
87567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R2: &ret -- address to put index into
87667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·indexbytebody(SB),NOSPLIT|NOFRAME,$0
87767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R4, $0, notfound
87867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R6          // store base for later
87967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R3, R4, R8      // the address after the end of the string
88067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	//if the length is small, use loop; otherwise, use vector or srst search
88167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R4, $16, large
88267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
88367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotresidual:
88467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, R8, notfound
88567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	0(R3), R7
88667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	1(R3), R3
88767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R7, R5, residual
88867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
88967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotfound:
89067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R6, R3
89167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$1, R3
89267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, 0(R2)
89367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
89467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
89567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotfound:
89667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-1, 0(R2)
89767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
89867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
89967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotlarge:
90067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	·cpu+facilities_hasVX(SB), R1
90167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R1, $0, vectorimpl
90267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
90367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotsrstimpl:                       // no vector facility
90467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	R5, R0          // c needs to be in R0, leave until last minute as currently R0 is expected to be 0
90567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotsrstloop:
90667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	WORD	$0xB25E0083     // srst %r8, %r3 (search the range [R3, R8))
90767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BVS	srstloop        // interrupted - continue
90867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BGT	notfoundr0
90967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotfoundr0:
91067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	XOR	R0, R0          // reset R0
91167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R6, R8          // remove base
91267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R8, 0(R2)
91367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
91467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotfoundr0:
91567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	XOR	R0, R0          // reset R0
91667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-1, 0(R2)
91767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
91867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
91967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotvectorimpl:
92067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	//if the address is not 16byte aligned, use loop for the header
92167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R8
92267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	AND	$15, R8
92367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R8, $0, notaligned
92467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
92567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotaligned:
92667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R6, R4, R8
92767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R8, R7
92867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	AND	$-16, R7
92967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// replicate c across V17
93067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLVGB	$0, R5, V19
93167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VREPB	$0, V19, V17
93267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
93367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotvectorloop:
93467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R3, R7, residual
93567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	0(R3), V16    // load string to be searched into V16
93667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$16, R3
93767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VFEEBS	V16, V17, V18 // search V17 in V16 and set conditional code accordingly
93867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BVS	vectorloop
93967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
94067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// when vector search found c in the string
94167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLGVB	$7, V18, R7   // load 7th element of V18 containing index into R7
94267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$16, R3
94367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R6, R3
94467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R3, R7
94567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R7, 0(R2)
94667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
94767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
94867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotaligned:
94967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R8
95067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	AND	$-16, R8
95167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD     $16, R8
95267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotalignedloop:
95367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, R8, aligned
95467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	0(R3), R7
95567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	1(R3), R3
95667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R7, R5, notalignedloop
95767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	found
95867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
95967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·return0(SB), NOSPLIT, $0
96067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVW	$0, R3
96167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
96267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
96367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Called from cgo wrappers, this function returns g->m->curg.stack.hi.
96467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Must obey the gcc calling convention.
96567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0
96667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// g (R13), R10, R11 and LR (R14) are callee-save in the C ABI, so save them
96767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g, R1
96867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R10, R3
96967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	LR, R4
97067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R11, R5
97167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
97267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·load_g(SB)	// clobbers g (R13), R10, R11
97367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	g_m(g), R2
97467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	m_curg(R2), R2
97567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	(g_stack+stack_hi)(R2), R2
97667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
97767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R1, g
97867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R3, R10
97967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, LR
98067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R5, R11
98167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
98267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
98367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// The top-most function running on a goroutine
98467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// returns to goexit+PCQuantum.
98567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0
98667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BYTE $0x07; BYTE $0x00; // 2-byte nop
98767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BL	runtime·goexit1(SB)	// does not return
98867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// traceback from goexit1 must hit code range of goexit
98967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BYTE $0x07; BYTE $0x00; // 2-byte nop
99067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
99167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·sigreturn(SB),NOSPLIT,$0-0
99267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
99367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
99467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0
99567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot        // Stores are already ordered on s390x, so this is just a
99667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot        // compile barrier.
99767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
99867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
99967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-40
100067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s1_base+0(FP), R3
100167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s1_len+8(FP), R4
100267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s2_base+16(FP), R5
100367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s2_len+24(FP), R6
100467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	ret+32(FP), R7
100567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·cmpbody(SB)
100667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
100767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
100867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s1+0(FP), R3
100967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s1+8(FP), R4
101067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s2+24(FP), R5
101167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	s2+32(FP), R6
101267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LA	res+48(FP), R7
101367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·cmpbody(SB)
101467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
101567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// input:
101667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R3 = a
101767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R4 = alen
101867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R5 = b
101967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R6 = blen
102067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot//   R7 = address of output word (stores -1/0/1 here)
102167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·cmpbody(SB),NOSPLIT|NOFRAME,$0-0
102267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R3, R5, cmplengths
102367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R4, R8
102467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R4, R6, amin
102567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R6, R8
102667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotamin:
102767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R8, $0, cmplengths
102867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R8, $256
102967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLE	tail
103067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotloop:
103167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CLC	$256, 0(R3), 0(R5)
103267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BGT	gt
103367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	lt
103467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$256, R8
103567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R8, $256
103667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BGT	loop
103767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robottail:
103867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$1, R8
103967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	EXRL	$runtime·cmpbodyclc(SB), R8
104067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BGT	gt
104167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	lt
104267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotcmplengths:
104367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMP	R4, R6
104467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	eq
104567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	lt
104667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotgt:
104767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1, 0(R7)
104867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
104967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotlt:
105067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-1, 0(R7)
105167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
105267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Roboteq:
105367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, 0(R7)
105467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
105567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
105667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·cmpbodyclc(SB),NOSPLIT|NOFRAME,$0-0
105767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CLC	$1, 0(R3), 0(R5)
105867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
105967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
106067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func supportsVX() bool
106167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT strings·supportsVX(SB),NOSPLIT,$0-1
106267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	runtime·cpu+facilities_hasVX(SB), R0
106367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	R0, ret+0(FP)
106467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
106567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
106667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func supportsVX() bool
106767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT bytes·supportsVX(SB),NOSPLIT,$0-1
106867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVBZ	runtime·cpu+facilities_hasVX(SB), R0
106967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	R0, ret+0(FP)
107067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
107167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
107267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func indexShortStr(s, sep string) int
107367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Caller must confirm availability of vx facility before calling.
107467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT strings·indexShortStr(SB),NOSPLIT|NOFRAME,$0-40
107567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	s+0(FP), R1, R2   // R1=&s[0],   R2=len(s)
107667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	sep+16(FP), R3, R4 // R3=&sep[0], R4=len(sep)
107767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$ret+32(FP), R5
107867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·indexShortStr(SB)
107967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
108067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// func indexShortStr(s, sep []byte) int
108167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Caller must confirm availability of vx facility before calling.
108267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT bytes·indexShortStr(SB),NOSPLIT|NOFRAME,$0-56
108367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	s+0(FP), R1, R2    // R1=&s[0],   R2=len(s)
108467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	sep+24(FP), R3, R4 // R3=&sep[0], R4=len(sep)
108567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$ret+48(FP), R5
108667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	runtime·indexShortStr(SB)
108767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
108867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// s: string we are searching
108967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// sep: string to search for
109067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R1=&s[0], R2=len(s)
109167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R3=&sep[0], R4=len(sep)
109267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// R5=&ret (int)
109367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// Caller must confirm availability of vx facility before calling.
109467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·indexShortStr(SB),NOSPLIT|NOFRAME,$0
109567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R4, R2, notfound
109667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R1, R2
109767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R4, R2 // R2=&s[len(s)-len(sep)] (last valid index)
109867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBEQ	R4, $0, notfound
109967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$1, R4 // R4=len(sep)-1 for use as VLL index
110067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R4, (R3), V0 // contains first 16 bytes of sep
110167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R1, R7
110267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex2plus:
110367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R4, $1, index3plus
110467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$15(R7), R9
110567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R9, R2, index2to16
110667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VGBM	$0xaaaa, V31       // 0xff00ff00ff00ff00...
110767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V16
110867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VREPH	$0, V0, V1
110967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R9, R2, index2to16
111067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex2loop:
111167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	0(R7), V2          // 16 bytes, even indices
111267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	1(R7), V4          // 16 bytes, odd indices
111367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQH	V1, V2, V5         // compare even indices
111467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQH	V1, V4, V6         // compare odd indices
111567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSEL	V5, V6, V31, V7    // merge even and odd indices
111667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VFEEBS	V16, V7, V17       // find leftmost index, set condition to 1 if found
111767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	foundV17
111867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$16(R7), R7        // R7+=16
111967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$15, R7, R9
112067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R9, R2, index2loop // continue if (R7+15) <= R2 (last index to search)
112167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R7, R2, index2to16
112267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
112367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
112467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex3plus:
112567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R4, $2, index4plus
112667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$15, R7, R9
112767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R9, R2, index2to16
112867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1, R0
112967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VGBM	$0xaaaa, V31       // 0xff00ff00ff00ff00...
113067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V16
113167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VREPH	$0, V0, V1
113267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VREPB	$2, V0, V8
113367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex3loop:
113467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	(R7), V2           // load 16-bytes into V2
113567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 16(R7), V3     // load 2-bytes into V3
113667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSLDB	$1, V2, V3, V4     // V4=(V2:V3)<<1
113767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSLDB	$2, V2, V3, V9     // V9=(V2:V3)<<2
113867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQH	V1, V2, V5         // compare 2-byte even indices
113967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQH	V1, V4, V6         // compare 2-byte odd indices
114067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQB	V8, V9, V10        // compare last bytes
114167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSEL	V5, V6, V31, V7    // merge even and odd indices
114267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V7, V10, V7        // AND indices with last byte
114367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VFEEBS	V16, V7, V17       // find leftmost index, set condition to 1 if found
114467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	foundV17
114567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$16(R7), R7        // R7+=16
114667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$15, R7, R9
114767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R9, R2, index3loop // continue if (R7+15) <= R2 (last index to search)
114867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R7, R2, index2to16
114967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
115067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
115167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex4plus:
115267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBNE	R4, $3, index5plus
115367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$15, R7, R9
115467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGE	R9, R2, index2to16
115567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$2, R0
115667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VGBM	$0x8888, V29       // 0xff000000ff000000...
115767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VGBM	$0x2222, V30       // 0x0000ff000000ff00...
115867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VGBM	$0xcccc, V31       // 0xffff0000ffff0000...
115967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V16
116067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VREPF	$0, V0, V1
116167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex4loop:
116267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	(R7), V2           // load 16-bytes into V2
116367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 16(R7), V3     // load 3-bytes into V3
116467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSLDB	$1, V2, V3, V4     // V4=(V2:V3)<<1
116567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSLDB	$2, V2, V3, V9     // V9=(V2:V3)<<1
116667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSLDB	$3, V2, V3, V10    // V10=(V2:V3)<<1
116767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQF	V1, V2, V5         // compare index 0, 4, ...
116867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQF	V1, V4, V6         // compare index 1, 5, ...
116967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQF	V1, V9, V11        // compare index 2, 6, ...
117067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQF	V1, V10, V12       // compare index 3, 7, ...
117167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSEL	V5, V6, V29, V13   // merge index 0, 1, 4, 5, ...
117267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSEL	V11, V12, V30, V14 // merge index 2, 3, 6, 7, ...
117367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VSEL	V13, V14, V31, V7  // final merge
117467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VFEEBS	V16, V7, V17       // find leftmost index, set condition to 1 if found
117567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BLT	foundV17
117667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$16(R7), R7        // R7+=16
117767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	$15, R7, R9
117867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R9, R2, index4loop // continue if (R7+15) <= R2 (last index to search)
117967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE	R7, R2, index2to16
118067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
118167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
118267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex5plus:
118367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R4, $15, index17plus
118467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex2to16:
118567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R7, R2, notfound
118667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R8
118767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R8, R2, index2to16tail
118867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex2to16loop:
118967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// unrolled 2x
119067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R4, (R7), V1
119167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R4, 1(R7), V2
119267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V0, V1, V3
119367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
119467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R7
119567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V0, V2, V4
119667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
119767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R7
119867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLT	R7, R2, index2to16loop
119967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R7, R2, notfound
120067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex2to16tail:
120167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R4, (R7), V1
120267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V0, V1, V2
120367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
120467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
120567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
120667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex17plus:
120767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R4, $31, index33plus
120867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$16, R4, R0
120967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 16(R3), V1
121067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V7
121167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex17to32loop:
121267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	(R7), V2
121367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 16(R7), V3
121467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V0, V2, V4
121567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V1, V3, V5
121667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V4, V5, V6
121767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V6, V7, V8
121867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
121967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R7
122067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE  R7, R2, index17to32loop
122167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
122267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
122367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex33plus:
122467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R4, $47, index49plus
122567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$32, R4, R0
122667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	16(R3), V1
122767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 32(R3), V2
122867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V11
122967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex33to48loop:
123067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	(R7), V3
123167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	16(R7), V4
123267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 32(R7), V5
123367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V0, V3, V6
123467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V1, V4, V7
123567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V2, V5, V8
123667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V6, V7, V9
123767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V8, V9, V10
123867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V10, V11, V12
123967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
124067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R7
124167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE  R7, R2, index33to48loop
124267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BR	notfound
124367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
124467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex49plus:
124567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBGT	R4, $63, index65plus
124667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	$48, R4, R0
124767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	16(R3), V1
124867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	32(R3), V2
124967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 48(R3), V3
125067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VONE	V15
125167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex49to64loop:
125267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	(R7), V4
125367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	16(R7), V5
125467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VL	32(R7), V6
125567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLL	R0, 48(R7), V7
125667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V0, V4, V8
125767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V1, V5, V9
125867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V2, V6, V10
125967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQG	V3, V7, V11
126067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V8, V9, V12
126167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V10, V11, V13
126267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VN	V12, V13, V14
126367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VCEQGS	V14, V15, V16
126467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	BEQ	found
126567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$1(R7), R7
126667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	CMPBLE  R7, R2, index49to64loop
126767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotnotfound:
126867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$-1, (R5)
126967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
127067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
127167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotindex65plus:
127267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// not implemented
127367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	$0, (R0)
127467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
127567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
127667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotfoundV17: // index is in doubleword V17[0]
127767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	VLGVG	$0, V17, R8
127867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	ADD	R8, R7
127967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robotfound:
128067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	SUB	R1, R7
128167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R7, (R5)
128267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
128367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
128467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// This is called from .init_array and follows the platform, not Go, ABI.
128567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// We are overly conservative. We could only save the registers we use.
128667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// However, since this function is only called once per loaded module
128767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot// performance is unimportant.
128867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT runtime·addmoduledata(SB),NOSPLIT|NOFRAME,$0-0
128967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Save R6-R15 in the register save area of the calling function.
129067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Don't bother saving F8-F15 as we aren't doing any calls.
129167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	STMG	R6, R15, 48(R15)
129267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
129367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// append the argument (passed in R2, as per the ELF ABI) to the
129467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// moduledata linked list.
129567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	runtime·lastmoduledatap(SB), R1
129667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, moduledata_next(R1)
129767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVD	R2, runtime·lastmoduledatap(SB)
129867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
129967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	// Restore R6-R15.
130067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	LMG	48(R15), R6, R15
130167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
130267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot
130367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotTEXT ·checkASM(SB),NOSPLIT,$0-1
130467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	MOVB	$1, ret+0(FP)
130567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team Robot	RET
1306