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 RobotCALLFN(·call32, 32) 46767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call64, 64) 46867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call128, 128) 46967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call256, 256) 47067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call512, 512) 47167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call1024, 1024) 47267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call2048, 2048) 47367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call4096, 4096) 47467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call8192, 8192) 47567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call16384, 16384) 47667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call32768, 32768) 47767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call65536, 65536) 47867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call131072, 131072) 47967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call262144, 262144) 48067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call524288, 524288) 48167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call1048576, 1048576) 48267845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call2097152, 2097152) 48367845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call4194304, 4194304) 48467845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call8388608, 8388608) 48567845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call16777216, 16777216) 48667845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call33554432, 33554432) 48767845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call67108864, 67108864) 48867845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call134217728, 134217728) 48967845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call268435456, 268435456) 49067845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call536870912, 536870912) 49167845c40aa5be5001fb20ef6f6b8d52e3fe6bb1android-build-team RobotCALLFN(·call1073741824, 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