From ff6dbfe92f83ef1bb569e30d1de4463ee3eb60d0 Mon Sep 17 00:00:00 2001 From: tannevaled Date: Thu, 24 Sep 2026 10:29:09 +0200 Subject: [PATCH 1/2] Add OpenBSD support, measured on OpenBSD 7.9/arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes ebitengine/purego#454, which has been open since May with the error every consumer hits: purego does not merely lack OpenBSD, it FAILS TO COMPILE there, so any program importing it at all is blocked. Navidrome hit it through gen2brain/webp; go-doom hits it through Ebitengine's GL loader. Everything below was read from a real OpenBSD 7.9/arm64 machine rather than adapted from NetBSD, because "the BSDs agree" is a guess: - RTLD_* from /usr/include/dlfcn.h. They DO agree with NetBSD's; checking was cheaper than finding out they had stopped. - stack_t and SS_DISABLE (0x004) from /usr/include/sys/signal.h. - PTHREAD_MUTEX_INITIALIZER and PTHREAD_COND_INITIALIZER are both NULL (pthread.h:157-158), so uintptr(0) is right. - dlopen/dlsym/dlerror/dlclose are weak symbols in libc; there is no libdl, so `#cgo !netbsd LDFLAGS: -ldl` becomes `!netbsd,!openbsd`. Without that the cgo build fails with "unable to find library -ldl". - pthread is NOT in libc: pthread_create is absent from libc.so.103.0 and lives in libpthread.so.28.1, so the generator names libpthread.so for it. - libc exports environ and __progname, and does NOT export __ps_strings, which NetBSD's equivalent file supplies. The soname deserves its own note, because it is the thing that looks like a blocker and is not. OpenBSD ships no unversioned libc.so FILE -- /usr/lib holds libc.so.103.0 and nothing else. "libc.so" is still what belongs in cgo_import_dynamic: the Go runtime itself writes exactly that in runtime/sys_openbsd.go. Verified at runtime too, which is the part that could have gone either way: Dlopen("libc.so") and Dlopen("libc.so.103.0") return the SAME handle, because ld.so resolves the soname. What passes, natively, CGO_ENABLED=0, on openbsd/arm64: Dlopen, Dlsym, nested Dlopen, SyscallN, SyscallN's errno handling, RegisterFunc including the concurrent pointer-return case, floats, and qsort -- which matters because qsort takes a CALLBACK, so NewCallback works. RegisterLibFunc binds and calls strlen and puts for real. ⚠ ONE TEST STILL FAILS and this is not ready to merge because of it. TestRegisterLibFunc_Bool dies with SIGILL. It is the one case that calls a callback DIRECTLY from Go rather than letting C call it. This CPU reports BT (Branch Target Identification) and PAC in its feature line, and SIGILL is what BTI raises on an indirect branch to an instruction that is not a landing pad -- but that is a hypothesis with a plausible mechanism, not a diagnosis, and it is recorded as such. Co-Authored-By: Claude Opus 5 --- cgo.go | 2 +- dlerror.go | 2 +- dlfcn.go | 2 +- dlfcn_nocgo_openbsd.go | 18 ++++++ dlfcn_openbsd.go | 18 ++++++ dlfcn_stubs.s | 2 +- dlfcn_test.go | 2 +- examples/libc/main.go | 2 +- examples/libc/main_unix.go | 2 +- export_test.go | 2 +- func.go | 2 +- func_test.go | 5 +- go_runtime.go | 2 +- internal/cgo/dlfcn_cgo_unix.go | 4 +- internal/cgo/syscall_cgo_unix.go | 4 +- internal/fakecgo/callbacks.go | 2 +- internal/fakecgo/doc.go | 2 +- internal/fakecgo/fakecgo.go | 2 +- internal/fakecgo/gen.go | 11 ++-- internal/fakecgo/go_libinit.go | 2 +- internal/fakecgo/go_openbsd.go | 83 +++++++++++++++++++++++++ internal/fakecgo/go_setenv.go | 2 +- internal/fakecgo/go_util.go | 2 +- internal/fakecgo/iscgo.go | 2 +- internal/fakecgo/libcgo.go | 2 +- internal/fakecgo/libcgo_openbsd.go | 39 ++++++++++++ internal/fakecgo/openbsd.go | 24 +++++++ internal/fakecgo/setenv.go | 2 +- internal/fakecgo/threadentry_amd64.go | 2 +- internal/fakecgo/threadentry_noasm.go | 2 +- internal/fakecgo/threadentry_test.go | 2 +- internal/fakecgo/trampolines_amd64.s | 2 +- internal/fakecgo/trampolines_arm64.s | 2 +- internal/fakecgo/zsymbols.go | 2 +- internal/fakecgo/zsymbols_openbsd.go | 59 ++++++++++++++++++ internal/fakecgo/ztrampolines_openbsd.s | 19 ++++++ internal/fakecgo/ztrampolines_stubs.s | 2 +- internal/load/load_unix.go | 2 +- nocgo.go | 2 +- sys_amd64.s | 2 +- sys_arm64.s | 2 +- sys_unix_arm64.s | 2 +- syscall.go | 2 +- syscall_32bit.go | 2 +- syscall_unix.go | 2 +- wincallback.go | 8 +-- zcallback_amd64.s | 2 +- zcallback_arm64.s | 2 +- zcallback_loong64.s | 2 +- zcallback_riscv64.s | 2 +- 50 files changed, 317 insertions(+), 51 deletions(-) create mode 100644 dlfcn_nocgo_openbsd.go create mode 100644 dlfcn_openbsd.go create mode 100644 internal/fakecgo/go_openbsd.go create mode 100644 internal/fakecgo/libcgo_openbsd.go create mode 100644 internal/fakecgo/openbsd.go create mode 100644 internal/fakecgo/zsymbols_openbsd.go create mode 100644 internal/fakecgo/ztrampolines_openbsd.s diff --git a/cgo.go b/cgo.go index b6def570..ecd08de8 100644 --- a/cgo.go +++ b/cgo.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build cgo && (darwin || freebsd || linux || netbsd) +//go:build cgo && (darwin || freebsd || linux || netbsd || openbsd) package purego diff --git a/dlerror.go b/dlerror.go index ad52b436..66cbb9d2 100644 --- a/dlerror.go +++ b/dlerror.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 The Ebitengine Authors -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd package purego diff --git a/dlfcn.go b/dlfcn.go index 2730d82c..3eb0c0f9 100644 --- a/dlfcn.go +++ b/dlfcn.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build (darwin || freebsd || linux || netbsd) && !android && !faketime +//go:build (darwin || freebsd || linux || netbsd || openbsd) && !android && !faketime package purego diff --git a/dlfcn_nocgo_openbsd.go b/dlfcn_nocgo_openbsd.go new file mode 100644 index 00000000..7e256c2b --- /dev/null +++ b/dlfcn_nocgo_openbsd.go @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2026 The Ebitengine Authors + +//go:build !cgo + +package purego + +// OpenBSD keeps dlopen and friends in libc -- there is no libdl -- and ships +// no unversioned libc.so FILE: /usr/lib holds libc.so.103.0 and nothing else. +// "libc.so" is still the right name to write here: the Go linker emits it as a +// DT_NEEDED and OpenBSD's ld.so resolves an unversioned soname to the highest +// version present. The Go runtime itself does exactly this in +// runtime/sys_openbsd.go, which is the proof that it works. + +//go:cgo_import_dynamic purego_dlopen dlopen "libc.so" +//go:cgo_import_dynamic purego_dlsym dlsym "libc.so" +//go:cgo_import_dynamic purego_dlerror dlerror "libc.so" +//go:cgo_import_dynamic purego_dlclose dlclose "libc.so" diff --git a/dlfcn_openbsd.go b/dlfcn_openbsd.go new file mode 100644 index 00000000..f46008bd --- /dev/null +++ b/dlfcn_openbsd.go @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2026 The Ebitengine Authors + +package purego + +// Source for constants: https://github.com/openbsd/src/blob/master/include/dlfcn.h +// +// Read from /usr/include/dlfcn.h on OpenBSD 7.9/arm64 rather than copied from +// another BSD: they happen to agree with NetBSD's, and checking is cheaper +// than finding out they had stopped agreeing. +const ( + intSize = 32 << (^uint(0) >> 63) // 32 or 64 + RTLD_DEFAULT = 1< #include diff --git a/internal/cgo/syscall_cgo_unix.go b/internal/cgo/syscall_cgo_unix.go index c71287e3..ba5132cf 100644 --- a/internal/cgo/syscall_cgo_unix.go +++ b/internal/cgo/syscall_cgo_unix.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build freebsd || (linux && !(386 || amd64 || arm || arm64 || loong64 || ppc64le || riscv64)) || netbsd +//go:build freebsd || (linux && !(386 || amd64 || arm || arm64 || loong64 || ppc64le || riscv64)) || netbsd || openbsd package cgo @@ -9,7 +9,7 @@ package cgo // because Cgo and assembly files can't be in the same package. /* -#cgo !netbsd LDFLAGS: -ldl +#cgo !netbsd,!openbsd LDFLAGS: -ldl #include #include diff --git a/internal/fakecgo/callbacks.go b/internal/fakecgo/callbacks.go index 27d4c98c..ab00158e 100644 --- a/internal/fakecgo/callbacks.go +++ b/internal/fakecgo/callbacks.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/doc.go b/internal/fakecgo/doc.go index e482c120..06e2e29c 100644 --- a/internal/fakecgo/doc.go +++ b/internal/fakecgo/doc.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) // Package fakecgo implements the Cgo runtime (runtime/cgo) entirely in Go. // This allows code that calls into C to function properly when CGO_ENABLED=0. diff --git a/internal/fakecgo/fakecgo.go b/internal/fakecgo/fakecgo.go index 384dab2a..df6ac561 100644 --- a/internal/fakecgo/fakecgo.go +++ b/internal/fakecgo/fakecgo.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2025 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/gen.go b/internal/fakecgo/gen.go index c085a3dd..c7ed0d62 100644 --- a/internal/fakecgo/gen.go +++ b/internal/fakecgo/gen.go @@ -120,7 +120,7 @@ var ( {"sigfillset", [5]Arg{{"set", "*sigset_t"}}, "int32", nil}, {"nanosleep", [5]Arg{{"ts", "*syscall.Timespec"}, {"rem", "*syscall.Timespec"}}, "int32", nil}, {"abort", [5]Arg{}, "", nil}, - {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", []string{"netbsd"}}, + {"sigaltstack", [5]Arg{{"ss", "*stack_t"}, {"old_ss", "*stack_t"}}, "int32", []string{"netbsd", "openbsd"}}, {"__errno_location", [5]Arg{}, "uintptr", []string{"linux"}}, {"setegid", [5]Arg{{"egid", "uint32"}}, "int32", []string{"linux"}}, {"seteuid", [5]Arg{{"euid", "uint32"}}, "int32", []string{"linux"}}, @@ -139,9 +139,9 @@ var ( {"pthread_sigmask", [5]Arg{{"how", "sighow"}, {"ign", "*sigset_t"}, {"oset", "*sigset_t"}}, "int32", nil}, {"pthread_self", [5]Arg{}, "pthread_t", []string{"darwin"}}, {"pthread_get_stacksize_np", [5]Arg{{"thread", "pthread_t"}}, "size_t", []string{"darwin"}}, - {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32", []string{"linux", "freebsd", "netbsd"}}, + {"pthread_attr_getstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"stacksize", "*size_t"}}, "int32", []string{"linux", "freebsd", "netbsd", "openbsd"}}, {"pthread_attr_setstacksize", [5]Arg{{"attr", "*pthread_attr_t"}, {"size", "size_t"}}, "int32", []string{"darwin"}}, - {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32", []string{"linux", "freebsd", "netbsd"}}, + {"pthread_attr_destroy", [5]Arg{{"attr", "*pthread_attr_t"}}, "int32", []string{"linux", "freebsd", "netbsd", "openbsd"}}, {"pthread_mutex_lock", [5]Arg{{"mutex", "*pthread_mutex_t"}}, "int32", nil}, {"pthread_mutex_unlock", [5]Arg{{"mutex", "*pthread_mutex_t"}}, "int32", nil}, {"pthread_cond_broadcast", [5]Arg{{"cond", "*pthread_cond_t"}}, "int32", nil}, @@ -154,7 +154,7 @@ var funcs = map[string]any{ "imports": imports, } -var GOOSes = []string{"darwin", "freebsd", "linux", "netbsd"} +var GOOSes = []string{"darwin", "freebsd", "linux", "netbsd", "openbsd"} func imports(symbols []Symbol) string { if len(symbols) == 0 { @@ -275,6 +275,9 @@ func run() error { case "netbsd": libcSO = "libc.so" pthreadSO = "libpthread.so" + case "openbsd": + libcSO = "libc.so" + pthreadSO = "libpthread.so" default: return fmt.Errorf("unsupported OS: %s", goos) } diff --git a/internal/fakecgo/go_libinit.go b/internal/fakecgo/go_libinit.go index 590a6507..da72440e 100644 --- a/internal/fakecgo/go_libinit.go +++ b/internal/fakecgo/go_libinit.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/go_openbsd.go b/internal/fakecgo/go_openbsd.go new file mode 100644 index 00000000..a59c7343 --- /dev/null +++ b/internal/fakecgo/go_openbsd.go @@ -0,0 +1,83 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !cgo && (amd64 || arm64) + +package fakecgo + +import "unsafe" + +//go:nosplit +func _cgo_sys_thread_start(ts *ThreadStart) { + var attr pthread_attr_t + var ign, oset sigset_t + var p pthread_t + var size size_t + var err int + + // fprintf(stderr, "runtime/cgo: _cgo_sys_thread_start: fn=%p, g=%p\n", ts->fn, ts->g); // debug + sigfillset(&ign) + pthread_sigmask(SIG_SETMASK, &ign, &oset) + + pthread_attr_init(&attr) + pthread_attr_getstacksize(&attr, &size) + // Leave stacklo=0 and set stackhi=size; mstart will do the rest. + ts.g.stackhi = uintptr(size) + + err = _cgo_try_pthread_create(&p, &attr, unsafe.Pointer(threadentry_trampolineABI0), ts) + + pthread_sigmask(SIG_SETMASK, &oset, nil) + + if err != 0 { + print("fakecgo: pthread_create failed: ") + println(err) + abort() + } +} + +// threadentry_trampolineABI0 maps the C ABI to Go ABI then calls the Go function +// +//go:linkname x_threadentry_trampoline threadentry_trampoline +var x_threadentry_trampoline byte +var threadentry_trampolineABI0 = &x_threadentry_trampoline + +//go:nosplit +func threadentry(v unsafe.Pointer) unsafe.Pointer { + var ss stack_t + ts := *(*ThreadStart)(v) + free(v) + + // On OpenBSD, a new thread inherits the signal stack of the + // creating thread. That confuses minit, so we remove that + // signal stack here before calling the regular mstart. It's + // a bit baroque to remove a signal stack here only to add one + // in minit, but it's a simple change that keeps OpenBSD + // working like other OS's. At this point all signals are + // blocked, so there is no race. + ss.ss_flags = SS_DISABLE + sigaltstack(&ss, nil) + + setg_trampoline(setg_func, uintptr(unsafe.Pointer(ts.g))) + + callThreadEntryFn(ts.fn) + + return nil +} + +// here we will store a pointer to the provided setg func +var setg_func uintptr + +//go:nosplit +func x_cgo_init(g *G, setg uintptr) { + var size size_t + var attr pthread_attr_t + + setg_func = setg + pthread_attr_init(&attr) + pthread_attr_getstacksize(&attr, &size) + // runtime/cgo uses __builtin_frame_address(0) instead of `uintptr(unsafe.Pointer(&size))` + // but this should be OK since we are taking the address of the first variable in this function. + g.stacklo = uintptr(unsafe.Pointer(&size)) - uintptr(size) + 4096 + pthread_attr_destroy(&attr) +} diff --git a/internal/fakecgo/go_setenv.go b/internal/fakecgo/go_setenv.go index dfc6629e..6dd1918c 100644 --- a/internal/fakecgo/go_setenv.go +++ b/internal/fakecgo/go_setenv.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/go_util.go b/internal/fakecgo/go_util.go index ee993baa..9ca3831b 100644 --- a/internal/fakecgo/go_util.go +++ b/internal/fakecgo/go_util.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/iscgo.go b/internal/fakecgo/iscgo.go index 12e52147..25f25437 100644 --- a/internal/fakecgo/iscgo.go +++ b/internal/fakecgo/iscgo.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) // The runtime package contains an uninitialized definition // for runtime·iscgo. Override it to tell the runtime we're here. diff --git a/internal/fakecgo/libcgo.go b/internal/fakecgo/libcgo.go index d1c842e6..1c075e07 100644 --- a/internal/fakecgo/libcgo.go +++ b/internal/fakecgo/libcgo.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/libcgo_openbsd.go b/internal/fakecgo/libcgo_openbsd.go new file mode 100644 index 00000000..2c79d276 --- /dev/null +++ b/internal/fakecgo/libcgo_openbsd.go @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2026 The Ebitengine Authors + +//go:build !cgo + +package fakecgo + +import "structs" + +// OpenBSD's pthread_mutex_t and pthread_cond_t are opaque POINTERS, and both +// PTHREAD_MUTEX_INITIALIZER and PTHREAD_COND_INITIALIZER are NULL -- +// /usr/include/pthread.h:157-158 on 7.9. So uintptr(0) is the initialiser, +// which is the same shape NetBSD happens to have and not a copy of it. +type ( + pthread_cond_t uintptr + pthread_mutex_t uintptr +) + +var ( + PTHREAD_COND_INITIALIZER = pthread_cond_t(0) + PTHREAD_MUTEX_INITIALIZER = pthread_mutex_t(0) +) + +// Source: /usr/include/sys/signal.h on OpenBSD 7.9 +// +// typedef struct sigaltstack { +// void *ss_sp; +// size_t ss_size; +// int ss_flags; +// } stack_t; +type stack_t struct { + _ structs.HostLayout + ss_sp uintptr + ss_size uintptr + ss_flags int32 +} + +// Source: /usr/include/sys/signal.h -- SS_DISABLE 0x0004 +const SS_DISABLE = 0x004 diff --git a/internal/fakecgo/openbsd.go b/internal/fakecgo/openbsd.go new file mode 100644 index 00000000..a8529b55 --- /dev/null +++ b/internal/fakecgo/openbsd.go @@ -0,0 +1,24 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !cgo && openbsd + +package fakecgo + +import _ "unsafe" // for go:linkname + +// Supply environ and __progname, because we don't link against the standard +// OpenBSD crt0.o and the libc dynamic library needs them. Both are weak +// symbols in /usr/lib/libc.so.103.0. +// +// NetBSD's equivalent also supplies __ps_strings; OpenBSD's libc does not +// reference it, and libc here exports no such symbol. + +//go:linkname _environ environ +//go:linkname _progname __progname + +var ( + _environ uintptr + _progname uintptr +) diff --git a/internal/fakecgo/setenv.go b/internal/fakecgo/setenv.go index 82308b8c..aba65f47 100644 --- a/internal/fakecgo/setenv.go +++ b/internal/fakecgo/setenv.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/threadentry_amd64.go b/internal/fakecgo/threadentry_amd64.go index 7f78dd57..5c22d9bb 100644 --- a/internal/fakecgo/threadentry_amd64.go +++ b/internal/fakecgo/threadentry_amd64.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2026 The Ebitengine Authors -//go:build !cgo && amd64 && (darwin || freebsd || linux || netbsd) +//go:build !cgo && amd64 && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/threadentry_noasm.go b/internal/fakecgo/threadentry_noasm.go index 8771852d..31e361ca 100644 --- a/internal/fakecgo/threadentry_noasm.go +++ b/internal/fakecgo/threadentry_noasm.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2026 The Ebitengine Authors -//go:build !cgo && !amd64 && (darwin || freebsd || linux || netbsd) +//go:build !cgo && !amd64 && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/threadentry_test.go b/internal/fakecgo/threadentry_test.go index b6b27c5f..077568c0 100644 --- a/internal/fakecgo/threadentry_test.go +++ b/internal/fakecgo/threadentry_test.go @@ -3,7 +3,7 @@ // 386/arm are excluded: the standalone fakecgo test binary resolves pthread // from libpthread.so.0, which fails the dynamic symbol lookup on 32-bit linux. -//go:build !cgo && (linux || darwin || freebsd || netbsd) && !386 && !arm +//go:build !cgo && (linux || darwin || freebsd || netbsd || openbsd) && !386 && !arm package fakecgo diff --git a/internal/fakecgo/trampolines_amd64.s b/internal/fakecgo/trampolines_amd64.s index e8a152d8..b0f63944 100644 --- a/internal/fakecgo/trampolines_amd64.s +++ b/internal/fakecgo/trampolines_amd64.s @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) /* trampoline for emulating required C functions for cgo in go (see cgo.go) diff --git a/internal/fakecgo/trampolines_arm64.s b/internal/fakecgo/trampolines_arm64.s index d75b77e6..75aadfa8 100644 --- a/internal/fakecgo/trampolines_arm64.s +++ b/internal/fakecgo/trampolines_arm64.s @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) #include "textflag.h" #include "go_asm.h" diff --git a/internal/fakecgo/zsymbols.go b/internal/fakecgo/zsymbols.go index cc552e7d..45ffc7d3 100644 --- a/internal/fakecgo/zsymbols.go +++ b/internal/fakecgo/zsymbols.go @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package fakecgo diff --git a/internal/fakecgo/zsymbols_openbsd.go b/internal/fakecgo/zsymbols_openbsd.go new file mode 100644 index 00000000..774402cf --- /dev/null +++ b/internal/fakecgo/zsymbols_openbsd.go @@ -0,0 +1,59 @@ +// Code generated by 'go generate' with gen.go. DO NOT EDIT. + +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2022 The Ebitengine Authors + +//go:build !cgo + +package fakecgo + +import "unsafe" + +//go:cgo_import_dynamic purego_malloc malloc "libc.so" +//go:cgo_import_dynamic purego_free free "libc.so" +//go:cgo_import_dynamic purego_setenv setenv "libc.so" +//go:cgo_import_dynamic purego_unsetenv unsetenv "libc.so" +//go:cgo_import_dynamic purego_sigfillset sigfillset "libc.so" +//go:cgo_import_dynamic purego_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic purego_abort abort "libc.so" +//go:cgo_import_dynamic purego_sigaltstack sigaltstack "libc.so" +//go:cgo_import_dynamic purego_pthread_attr_init pthread_attr_init "libpthread.so" +//go:cgo_import_dynamic purego_pthread_create pthread_create "libpthread.so" +//go:cgo_import_dynamic purego_pthread_detach pthread_detach "libpthread.so" +//go:cgo_import_dynamic purego_pthread_sigmask pthread_sigmask "libpthread.so" +//go:cgo_import_dynamic purego_pthread_mutex_lock pthread_mutex_lock "libpthread.so" +//go:cgo_import_dynamic purego_pthread_mutex_unlock pthread_mutex_unlock "libpthread.so" +//go:cgo_import_dynamic purego_pthread_cond_broadcast pthread_cond_broadcast "libpthread.so" +//go:cgo_import_dynamic purego_pthread_setspecific pthread_setspecific "libpthread.so" +//go:cgo_import_dynamic purego_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" +//go:cgo_import_dynamic purego_pthread_attr_destroy pthread_attr_destroy "libpthread.so" + +//go:nosplit +//go:norace +func sigaltstack(ss *stack_t, old_ss *stack_t) int32 { + return int32(call5(sigaltstackABI0, uintptr(unsafe.Pointer(ss)), uintptr(unsafe.Pointer(old_ss)), 0, 0, 0)) +} + +//go:nosplit +//go:norace +func pthread_attr_getstacksize(attr *pthread_attr_t, stacksize *size_t) int32 { + return int32(call5(pthread_attr_getstacksizeABI0, uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(stacksize)), 0, 0, 0)) +} + +//go:nosplit +//go:norace +func pthread_attr_destroy(attr *pthread_attr_t) int32 { + return int32(call5(pthread_attr_destroyABI0, uintptr(unsafe.Pointer(attr)), 0, 0, 0, 0)) +} + +//go:linkname _sigaltstack _sigaltstack +var _sigaltstack uint8 +var sigaltstackABI0 = uintptr(unsafe.Pointer(&_sigaltstack)) + +//go:linkname _pthread_attr_getstacksize _pthread_attr_getstacksize +var _pthread_attr_getstacksize uint8 +var pthread_attr_getstacksizeABI0 = uintptr(unsafe.Pointer(&_pthread_attr_getstacksize)) + +//go:linkname _pthread_attr_destroy _pthread_attr_destroy +var _pthread_attr_destroy uint8 +var pthread_attr_destroyABI0 = uintptr(unsafe.Pointer(&_pthread_attr_destroy)) diff --git a/internal/fakecgo/ztrampolines_openbsd.s b/internal/fakecgo/ztrampolines_openbsd.s new file mode 100644 index 00000000..81ef76f5 --- /dev/null +++ b/internal/fakecgo/ztrampolines_openbsd.s @@ -0,0 +1,19 @@ +// Code generated by 'go generate' with gen.go. DO NOT EDIT. + +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2022 The Ebitengine Authors + +//go:build !cgo + +#include "textflag.h" + +// these stubs are here because it is not possible to go:linkname directly the C functions + +TEXT _sigaltstack(SB), NOSPLIT|NOFRAME, $0-0 + JMP purego_sigaltstack(SB) + +TEXT _pthread_attr_getstacksize(SB), NOSPLIT|NOFRAME, $0-0 + JMP purego_pthread_attr_getstacksize(SB) + +TEXT _pthread_attr_destroy(SB), NOSPLIT|NOFRAME, $0-0 + JMP purego_pthread_attr_destroy(SB) diff --git a/internal/fakecgo/ztrampolines_stubs.s b/internal/fakecgo/ztrampolines_stubs.s index 8e1afff7..47c2496a 100644 --- a/internal/fakecgo/ztrampolines_stubs.s +++ b/internal/fakecgo/ztrampolines_stubs.s @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) #include "textflag.h" diff --git a/internal/load/load_unix.go b/internal/load/load_unix.go index ec3f7e56..2f1642d2 100644 --- a/internal/load/load_unix.go +++ b/internal/load/load_unix.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2024 The Ebitengine Authors -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd package load diff --git a/nocgo.go b/nocgo.go index b91b9796..62cddd6b 100644 --- a/nocgo.go +++ b/nocgo.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !cgo && (darwin || freebsd || linux || netbsd) +//go:build !cgo && (darwin || freebsd || linux || netbsd || openbsd) package purego diff --git a/sys_amd64.s b/sys_amd64.s index 56cbc5fc..e73138c0 100644 --- a/sys_amd64.s +++ b/sys_amd64.s @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd #include "textflag.h" #include "abi_amd64.h" diff --git a/sys_arm64.s b/sys_arm64.s index c1adb399..84164e6c 100644 --- a/sys_arm64.s +++ b/sys_arm64.s @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build darwin || freebsd || linux || netbsd || windows +//go:build darwin || freebsd || linux || netbsd || openbsd || windows #include "textflag.h" #include "go_asm.h" diff --git a/sys_unix_arm64.s b/sys_unix_arm64.s index f9c33348..da17fc3e 100644 --- a/sys_unix_arm64.s +++ b/sys_unix_arm64.s @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 The Ebitengine Authors -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd #include "textflag.h" #include "go_asm.h" diff --git a/syscall.go b/syscall.go index 5891b7c4..f2096485 100644 --- a/syscall.go +++ b/syscall.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build !386 && !arm && !ppc64le && (darwin || freebsd || linux || netbsd || windows) +//go:build !386 && !arm && !ppc64le && (darwin || freebsd || linux || netbsd || openbsd || windows) package purego diff --git a/syscall_32bit.go b/syscall_32bit.go index 00eb0173..f6e5ced5 100644 --- a/syscall_32bit.go +++ b/syscall_32bit.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build (386 || arm) && (freebsd || linux || netbsd || windows) +//go:build (386 || arm) && (freebsd || linux || netbsd || openbsd || windows) package purego diff --git a/syscall_unix.go b/syscall_unix.go index d75366cb..f9e29755 100644 --- a/syscall_unix.go +++ b/syscall_unix.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build darwin || freebsd || (linux && (386 || amd64 || arm || arm64 || loong64 || ppc64le || riscv64 || (s390x && (cgo || go1.27)))) || netbsd +//go:build darwin || freebsd || (linux && (386 || amd64 || arm || arm64 || loong64 || ppc64le || riscv64 || (s390x && (cgo || go1.27)))) || netbsd || openbsd package purego diff --git a/wincallback.go b/wincallback.go index f6bc539e..db724f37 100644 --- a/wincallback.go +++ b/wincallback.go @@ -50,7 +50,7 @@ func genasmAmd64() { buf.WriteString(`// Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // runtime·callbackasm is called by external code to // execute Go implemented callback function. It is not @@ -105,7 +105,7 @@ func genasmArm64() { buf.WriteString(`// Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOV and B instructions. @@ -133,7 +133,7 @@ func genasmLoong64() { buf.WriteString(`// Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOVV and JMP instructions. @@ -189,7 +189,7 @@ func genasmRiscv64() { buf.WriteString(`// Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOV and JMP instructions. diff --git a/zcallback_amd64.s b/zcallback_amd64.s index b2da0225..eb022a47 100644 --- a/zcallback_amd64.s +++ b/zcallback_amd64.s @@ -1,6 +1,6 @@ // Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // runtime·callbackasm is called by external code to // execute Go implemented callback function. It is not diff --git a/zcallback_arm64.s b/zcallback_arm64.s index 3fea4af8..89b69a8d 100644 --- a/zcallback_arm64.s +++ b/zcallback_arm64.s @@ -1,6 +1,6 @@ // Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOV and B instructions. diff --git a/zcallback_loong64.s b/zcallback_loong64.s index c5dcd48e..ad409ca2 100644 --- a/zcallback_loong64.s +++ b/zcallback_loong64.s @@ -1,6 +1,6 @@ // Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOVV and JMP instructions. diff --git a/zcallback_riscv64.s b/zcallback_riscv64.s index f341a87e..39a45e4a 100644 --- a/zcallback_riscv64.s +++ b/zcallback_riscv64.s @@ -1,6 +1,6 @@ // Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd +//go:build darwin || freebsd || linux || netbsd || openbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOV and JMP instructions. From 4606f64a31e1998adf80bd0e1007582dbab0e07c Mon Sep 17 00:00:00 2001 From: tannevaled Date: Thu, 24 Sep 2026 10:41:39 +0200 Subject: [PATCH 2/2] all: Add support for OpenBSD Closes #454. purego does not merely lack OpenBSD: it FAILS TO COMPILE there, so any program that imports it at all is blocked even on a path it never takes. struct_.go and cdecl.go carry no OS constraint -- only the filename's GOARCH suffix -- while the symbols they use live in syscall.go behind (darwin||freebsd||linux||netbsd||windows). That is the error in #454, and the one Navidrome hit through gen2brain/webp. Everything here was read from a real OpenBSD 7.9/arm64 machine rather than adapted from NetBSD, because "the BSDs agree" is a guess: - RTLD_* from /usr/include/dlfcn.h. They DO agree with NetBSD's. - stack_t and SS_DISABLE (0x004) from sys/signal.h. - PTHREAD_MUTEX_INITIALIZER and PTHREAD_COND_INITIALIZER are NULL. - dlopen and friends are weak symbols in libc and there is no libdl, so `#cgo !netbsd LDFLAGS: -ldl` becomes `!netbsd,!openbsd`. Without it cgo fails with "unable to find library -ldl". - pthread_create is NOT in libc.so.103.0; it is in libpthread.so.28.1. - libc exports environ and __progname, and no __ps_strings, which the NetBSD file supplies. The soname looks like a blocker and is not. OpenBSD ships no unversioned libc.so FILE. "libc.so" is still right: the Go runtime writes exactly that in runtime/sys_openbsd.go, and at RUNTIME Dlopen("libc.so") and Dlopen("libc.so.103.0") return the same handle, because ld.so resolves the soname. BTI is the part that needed its own file. OpenBSD/arm64 enforces Branch Target Identification, and the shared zcallback_arm64.s cannot work under it. callbackasmAddr computes entry i as base+i*8; the assembler emits a `BTI c` at the TEXT symbol, so base IS a landing pad and entry 0 works by accident, while entry 1 lands on entry 0's B -- not a landing pad -- and raises SIGILL. Measured before fixing: callback 0 at 0xc3640 returned, callback 1 at 0xc3648 died, and objdump showed a JMP at that address. The same program on darwin/arm64 returns all four callbacks correctly, which is what says this is OpenBSD's enforcement rather than a general arm64 bug. So zcallback_openbsd_arm64.s gives every entry its own landing pad -- three instructions, entrySize 12 for openbsd/arm64 only. The first entry deliberately has none written for it: the assembler's own pad at the symbol serves as it. Writing a second made entry 0 sixteen bytes while the rest were twelve, which moved the fault rather than removing it; that intermediate state was measured too. Verified natively on openbsd/arm64, CGO_ENABLED=0: the whole test suite passes. darwin/arm64 still passes. linux 386/arm/amd64/arm64, netbsd, windows, darwin and openbsd/amd64 all still cross-compile. Two honest limits. openbsd/amd64 cross-compiles and is NOT tested -- it needs no BTI handling and takes the shared amd64 path, but nobody has run it. And freebsd/amd64 and freebsd/arm64 fail to build on this Go with "//go:cgo_export_dynamic environ only allowed in cgo-generated code"; that reproduces on main without this branch, so it is not from here, but it is worth someone's attention. Co-Authored-By: Claude Opus 5 --- README.md | 1 + syscall_unix.go | 6 + zcallback_arm64.s | 2 +- zcallback_openbsd_arm64.s | 6022 +++++++++++++++++++++++++++++++++++++ 4 files changed, 6030 insertions(+), 1 deletion(-) create mode 100644 zcallback_openbsd_arm64.s diff --git a/README.md b/README.md index 77b0a141..5b394f3f 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ Tier 2 platforms are supported by PureGo on a best-effort basis. Critical bugs o - **FreeBSD**: amd643,4, arm643,4 - **Linux**: 3863, arm3, loong642, ppc64le2, riscv643, s390x3, 5 - **NetBSD**: amd643,4, arm643,4 +- **OpenBSD**: amd643,4, arm643,4 - **Windows**: 3863,6, arm3,6,7 #### Support Notes diff --git a/syscall_unix.go b/syscall_unix.go index f9e29755..093dcd92 100644 --- a/syscall_unix.go +++ b/syscall_unix.go @@ -392,6 +392,12 @@ func callbackasmAddr(i int) uintptr { // On ARM, ARM64, Loong64, PPC64LE and RISCV64, each entry is a MOV instruction // followed by a branch instruction entrySize = 8 + if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm64" { + // OpenBSD/arm64 enforces BTI, so every entry begins with its own + // `BTI c` landing pad: three instructions rather than two. Without + // it an indirect branch to any entry but the first raises SIGILL. + entrySize = 12 + } case "s390x": // On S390X, each entry is LGHI (4 bytes) + JG (6 bytes) entrySize = 10 diff --git a/zcallback_arm64.s b/zcallback_arm64.s index 89b69a8d..3fea4af8 100644 --- a/zcallback_arm64.s +++ b/zcallback_arm64.s @@ -1,6 +1,6 @@ // Code generated by wincallback.go using 'go generate'. DO NOT EDIT. -//go:build darwin || freebsd || linux || netbsd || openbsd +//go:build darwin || freebsd || linux || netbsd // External code calls into callbackasm at an offset corresponding // to the callback index. Callbackasm is a table of MOV and B instructions. diff --git a/zcallback_openbsd_arm64.s b/zcallback_openbsd_arm64.s new file mode 100644 index 00000000..affc5a2a --- /dev/null +++ b/zcallback_openbsd_arm64.s @@ -0,0 +1,6022 @@ +// Code generated by wincallback.go using 'go generate'. DO NOT EDIT. + +//go:build openbsd + +// OpenBSD/arm64 enforces BTI (Branch Target Identification): an indirect +// branch to an instruction that is not a landing pad raises SIGILL. +// +// The shared zcallback_arm64.s is a table of MOV+B pairs, and callbackasmAddr +// computes entry i as base+i*8. That cannot work here. The assembler emits a +// `BTI c` of its own at the TEXT symbol, so base IS a landing pad and entry 0 +// works by accident; entry 1 lands on entry 0's B, which is not a landing pad, +// and dies. Measured: callback 0 at 0xc3640 returns, callback 1 at 0xc3648 +// raises SIGILL, and objdump shows a JMP at that address. +// +// So every entry gets a landing pad and is three instructions. The FIRST entry +// deliberately has none written for it: the assembler's own `BTI c` at the +// symbol serves as it, and writing a second would make entry 0 sixteen bytes +// while the rest are twelve -- which is what the first attempt at this file +// did, and it moved the fault from entry 1 to entry 1 four bytes along. +#include "textflag.h" + +TEXT callbackasm(SB), NOSPLIT|NOFRAME, $0 + // entry 0 -- the landing pad is the one the assembler puts at the symbol + MOVD $0, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1, R12 + B callbackasm1(SB) + HINT $38 + MOVD $2, R12 + B callbackasm1(SB) + HINT $38 + MOVD $3, R12 + B callbackasm1(SB) + HINT $38 + MOVD $4, R12 + B callbackasm1(SB) + HINT $38 + MOVD $5, R12 + B callbackasm1(SB) + HINT $38 + MOVD $6, R12 + B callbackasm1(SB) + HINT $38 + MOVD $7, R12 + B callbackasm1(SB) + HINT $38 + MOVD $8, R12 + B callbackasm1(SB) + HINT $38 + MOVD $9, R12 + B callbackasm1(SB) + HINT $38 + MOVD $10, R12 + B callbackasm1(SB) + HINT $38 + MOVD $11, R12 + B callbackasm1(SB) + HINT $38 + MOVD $12, R12 + B callbackasm1(SB) + HINT $38 + MOVD $13, R12 + B callbackasm1(SB) + HINT $38 + MOVD $14, R12 + B callbackasm1(SB) + HINT $38 + MOVD $15, R12 + B callbackasm1(SB) + HINT $38 + MOVD $16, R12 + B callbackasm1(SB) + HINT $38 + MOVD $17, R12 + B callbackasm1(SB) + HINT $38 + MOVD $18, R12 + B callbackasm1(SB) + HINT $38 + MOVD $19, R12 + B callbackasm1(SB) + HINT $38 + MOVD $20, R12 + B callbackasm1(SB) + HINT $38 + MOVD $21, R12 + B callbackasm1(SB) + HINT $38 + MOVD $22, R12 + B callbackasm1(SB) + HINT $38 + MOVD $23, R12 + B callbackasm1(SB) + HINT $38 + MOVD $24, R12 + B callbackasm1(SB) + HINT $38 + MOVD $25, R12 + B callbackasm1(SB) + HINT $38 + MOVD $26, R12 + B callbackasm1(SB) + HINT $38 + MOVD $27, R12 + B callbackasm1(SB) + HINT $38 + MOVD $28, R12 + B callbackasm1(SB) + HINT $38 + MOVD $29, R12 + B callbackasm1(SB) + HINT $38 + MOVD $30, R12 + B callbackasm1(SB) + HINT $38 + MOVD $31, R12 + B callbackasm1(SB) + HINT $38 + MOVD $32, R12 + B callbackasm1(SB) + HINT $38 + MOVD $33, R12 + B callbackasm1(SB) + HINT $38 + MOVD $34, R12 + B callbackasm1(SB) + HINT $38 + MOVD $35, R12 + B callbackasm1(SB) + HINT $38 + MOVD $36, R12 + B callbackasm1(SB) + HINT $38 + MOVD $37, R12 + B callbackasm1(SB) + HINT $38 + MOVD $38, R12 + B callbackasm1(SB) + HINT $38 + MOVD $39, R12 + B callbackasm1(SB) + HINT $38 + MOVD $40, R12 + B callbackasm1(SB) + HINT $38 + MOVD $41, R12 + B callbackasm1(SB) + HINT $38 + MOVD $42, R12 + B callbackasm1(SB) + HINT $38 + MOVD $43, R12 + B callbackasm1(SB) + HINT $38 + MOVD $44, R12 + B callbackasm1(SB) + HINT $38 + MOVD $45, R12 + B callbackasm1(SB) + HINT $38 + MOVD $46, R12 + B callbackasm1(SB) + HINT $38 + MOVD $47, R12 + B callbackasm1(SB) + HINT $38 + MOVD $48, R12 + B callbackasm1(SB) + HINT $38 + MOVD $49, R12 + B callbackasm1(SB) + HINT $38 + MOVD $50, R12 + B callbackasm1(SB) + HINT $38 + MOVD $51, R12 + B callbackasm1(SB) + HINT $38 + MOVD $52, R12 + B callbackasm1(SB) + HINT $38 + MOVD $53, R12 + B callbackasm1(SB) + HINT $38 + MOVD $54, R12 + B callbackasm1(SB) + HINT $38 + MOVD $55, R12 + B callbackasm1(SB) + HINT $38 + MOVD $56, R12 + B callbackasm1(SB) + HINT $38 + MOVD $57, R12 + B callbackasm1(SB) + HINT $38 + MOVD $58, R12 + B callbackasm1(SB) + HINT $38 + MOVD $59, R12 + B callbackasm1(SB) + HINT $38 + MOVD $60, R12 + B callbackasm1(SB) + HINT $38 + MOVD $61, R12 + B callbackasm1(SB) + HINT $38 + MOVD $62, R12 + B callbackasm1(SB) + HINT $38 + MOVD $63, R12 + B callbackasm1(SB) + HINT $38 + MOVD $64, R12 + B callbackasm1(SB) + HINT $38 + MOVD $65, R12 + B callbackasm1(SB) + HINT $38 + MOVD $66, R12 + B callbackasm1(SB) + HINT $38 + MOVD $67, R12 + B callbackasm1(SB) + HINT $38 + MOVD $68, R12 + B callbackasm1(SB) + HINT $38 + MOVD $69, R12 + B callbackasm1(SB) + HINT $38 + MOVD $70, R12 + B callbackasm1(SB) + HINT $38 + MOVD $71, R12 + B callbackasm1(SB) + HINT $38 + MOVD $72, R12 + B callbackasm1(SB) + HINT $38 + MOVD $73, R12 + B callbackasm1(SB) + HINT $38 + MOVD $74, R12 + B callbackasm1(SB) + HINT $38 + MOVD $75, R12 + B callbackasm1(SB) + HINT $38 + MOVD $76, R12 + B callbackasm1(SB) + HINT $38 + MOVD $77, R12 + B callbackasm1(SB) + HINT $38 + MOVD $78, R12 + B callbackasm1(SB) + HINT $38 + MOVD $79, R12 + B callbackasm1(SB) + HINT $38 + MOVD $80, R12 + B callbackasm1(SB) + HINT $38 + MOVD $81, R12 + B callbackasm1(SB) + HINT $38 + MOVD $82, R12 + B callbackasm1(SB) + HINT $38 + MOVD $83, R12 + B callbackasm1(SB) + HINT $38 + MOVD $84, R12 + B callbackasm1(SB) + HINT $38 + MOVD $85, R12 + B callbackasm1(SB) + HINT $38 + MOVD $86, R12 + B callbackasm1(SB) + HINT $38 + MOVD $87, R12 + B callbackasm1(SB) + HINT $38 + MOVD $88, R12 + B callbackasm1(SB) + HINT $38 + MOVD $89, R12 + B callbackasm1(SB) + HINT $38 + MOVD $90, R12 + B callbackasm1(SB) + HINT $38 + MOVD $91, R12 + B callbackasm1(SB) + HINT $38 + MOVD $92, R12 + B callbackasm1(SB) + HINT $38 + MOVD $93, R12 + B callbackasm1(SB) + HINT $38 + MOVD $94, R12 + B callbackasm1(SB) + HINT $38 + MOVD $95, R12 + B callbackasm1(SB) + HINT $38 + MOVD $96, R12 + B callbackasm1(SB) + HINT $38 + MOVD $97, R12 + B callbackasm1(SB) + HINT $38 + MOVD $98, R12 + B callbackasm1(SB) + HINT $38 + MOVD $99, R12 + B callbackasm1(SB) + HINT $38 + MOVD $100, R12 + B callbackasm1(SB) + HINT $38 + MOVD $101, R12 + B callbackasm1(SB) + HINT $38 + MOVD $102, R12 + B callbackasm1(SB) + HINT $38 + MOVD $103, R12 + B callbackasm1(SB) + HINT $38 + MOVD $104, R12 + B callbackasm1(SB) + HINT $38 + MOVD $105, R12 + B callbackasm1(SB) + HINT $38 + MOVD $106, R12 + B callbackasm1(SB) + HINT $38 + MOVD $107, R12 + B callbackasm1(SB) + HINT $38 + MOVD $108, R12 + B callbackasm1(SB) + HINT $38 + MOVD $109, R12 + B callbackasm1(SB) + HINT $38 + MOVD $110, R12 + B callbackasm1(SB) + HINT $38 + MOVD $111, R12 + B callbackasm1(SB) + HINT $38 + MOVD $112, R12 + B callbackasm1(SB) + HINT $38 + MOVD $113, R12 + B callbackasm1(SB) + HINT $38 + MOVD $114, R12 + B callbackasm1(SB) + HINT $38 + MOVD $115, R12 + B callbackasm1(SB) + HINT $38 + MOVD $116, R12 + B callbackasm1(SB) + HINT $38 + MOVD $117, R12 + B callbackasm1(SB) + HINT $38 + MOVD $118, R12 + B callbackasm1(SB) + HINT $38 + MOVD $119, R12 + B callbackasm1(SB) + HINT $38 + MOVD $120, R12 + B callbackasm1(SB) + HINT $38 + MOVD $121, R12 + B callbackasm1(SB) + HINT $38 + MOVD $122, R12 + B callbackasm1(SB) + HINT $38 + MOVD $123, R12 + B callbackasm1(SB) + HINT $38 + MOVD $124, R12 + B callbackasm1(SB) + HINT $38 + MOVD $125, R12 + B callbackasm1(SB) + HINT $38 + MOVD $126, R12 + B callbackasm1(SB) + HINT $38 + MOVD $127, R12 + B callbackasm1(SB) + HINT $38 + MOVD $128, R12 + B callbackasm1(SB) + HINT $38 + MOVD $129, R12 + B callbackasm1(SB) + HINT $38 + MOVD $130, R12 + B callbackasm1(SB) + HINT $38 + MOVD $131, R12 + B callbackasm1(SB) + HINT $38 + MOVD $132, R12 + B callbackasm1(SB) + HINT $38 + MOVD $133, R12 + B callbackasm1(SB) + HINT $38 + MOVD $134, R12 + B callbackasm1(SB) + HINT $38 + MOVD $135, R12 + B callbackasm1(SB) + HINT $38 + MOVD $136, R12 + B callbackasm1(SB) + HINT $38 + MOVD $137, R12 + B callbackasm1(SB) + HINT $38 + MOVD $138, R12 + B callbackasm1(SB) + HINT $38 + MOVD $139, R12 + B callbackasm1(SB) + HINT $38 + MOVD $140, R12 + B callbackasm1(SB) + HINT $38 + MOVD $141, R12 + B callbackasm1(SB) + HINT $38 + MOVD $142, R12 + B callbackasm1(SB) + HINT $38 + MOVD $143, R12 + B callbackasm1(SB) + HINT $38 + MOVD $144, R12 + B callbackasm1(SB) + HINT $38 + MOVD $145, R12 + B callbackasm1(SB) + HINT $38 + MOVD $146, R12 + B callbackasm1(SB) + HINT $38 + MOVD $147, R12 + B callbackasm1(SB) + HINT $38 + MOVD $148, R12 + B callbackasm1(SB) + HINT $38 + MOVD $149, R12 + B callbackasm1(SB) + HINT $38 + MOVD $150, R12 + B callbackasm1(SB) + HINT $38 + MOVD $151, R12 + B callbackasm1(SB) + HINT $38 + MOVD $152, R12 + B callbackasm1(SB) + HINT $38 + MOVD $153, R12 + B callbackasm1(SB) + HINT $38 + MOVD $154, R12 + B callbackasm1(SB) + HINT $38 + MOVD $155, R12 + B callbackasm1(SB) + HINT $38 + MOVD $156, R12 + B callbackasm1(SB) + HINT $38 + MOVD $157, R12 + B callbackasm1(SB) + HINT $38 + MOVD $158, R12 + B callbackasm1(SB) + HINT $38 + MOVD $159, R12 + B callbackasm1(SB) + HINT $38 + MOVD $160, R12 + B callbackasm1(SB) + HINT $38 + MOVD $161, R12 + B callbackasm1(SB) + HINT $38 + MOVD $162, R12 + B callbackasm1(SB) + HINT $38 + MOVD $163, R12 + B callbackasm1(SB) + HINT $38 + MOVD $164, R12 + B callbackasm1(SB) + HINT $38 + MOVD $165, R12 + B callbackasm1(SB) + HINT $38 + MOVD $166, R12 + B callbackasm1(SB) + HINT $38 + MOVD $167, R12 + B callbackasm1(SB) + HINT $38 + MOVD $168, R12 + B callbackasm1(SB) + HINT $38 + MOVD $169, R12 + B callbackasm1(SB) + HINT $38 + MOVD $170, R12 + B callbackasm1(SB) + HINT $38 + MOVD $171, R12 + B callbackasm1(SB) + HINT $38 + MOVD $172, R12 + B callbackasm1(SB) + HINT $38 + MOVD $173, R12 + B callbackasm1(SB) + HINT $38 + MOVD $174, R12 + B callbackasm1(SB) + HINT $38 + MOVD $175, R12 + B callbackasm1(SB) + HINT $38 + MOVD $176, R12 + B callbackasm1(SB) + HINT $38 + MOVD $177, R12 + B callbackasm1(SB) + HINT $38 + MOVD $178, R12 + B callbackasm1(SB) + HINT $38 + MOVD $179, R12 + B callbackasm1(SB) + HINT $38 + MOVD $180, R12 + B callbackasm1(SB) + HINT $38 + MOVD $181, R12 + B callbackasm1(SB) + HINT $38 + MOVD $182, R12 + B callbackasm1(SB) + HINT $38 + MOVD $183, R12 + B callbackasm1(SB) + HINT $38 + MOVD $184, R12 + B callbackasm1(SB) + HINT $38 + MOVD $185, R12 + B callbackasm1(SB) + HINT $38 + MOVD $186, R12 + B callbackasm1(SB) + HINT $38 + MOVD $187, R12 + B callbackasm1(SB) + HINT $38 + MOVD $188, R12 + B callbackasm1(SB) + HINT $38 + MOVD $189, R12 + B callbackasm1(SB) + HINT $38 + MOVD $190, R12 + B callbackasm1(SB) + HINT $38 + MOVD $191, R12 + B callbackasm1(SB) + HINT $38 + MOVD $192, R12 + B callbackasm1(SB) + HINT $38 + MOVD $193, R12 + B callbackasm1(SB) + HINT $38 + MOVD $194, R12 + B callbackasm1(SB) + HINT $38 + MOVD $195, R12 + B callbackasm1(SB) + HINT $38 + MOVD $196, R12 + B callbackasm1(SB) + HINT $38 + MOVD $197, R12 + B callbackasm1(SB) + HINT $38 + MOVD $198, R12 + B callbackasm1(SB) + HINT $38 + MOVD $199, R12 + B callbackasm1(SB) + HINT $38 + MOVD $200, R12 + B callbackasm1(SB) + HINT $38 + MOVD $201, R12 + B callbackasm1(SB) + HINT $38 + MOVD $202, R12 + B callbackasm1(SB) + HINT $38 + MOVD $203, R12 + B callbackasm1(SB) + HINT $38 + MOVD $204, R12 + B callbackasm1(SB) + HINT $38 + MOVD $205, R12 + B callbackasm1(SB) + HINT $38 + MOVD $206, R12 + B callbackasm1(SB) + HINT $38 + MOVD $207, R12 + B callbackasm1(SB) + HINT $38 + MOVD $208, R12 + B callbackasm1(SB) + HINT $38 + MOVD $209, R12 + B callbackasm1(SB) + HINT $38 + MOVD $210, R12 + B callbackasm1(SB) + HINT $38 + MOVD $211, R12 + B callbackasm1(SB) + HINT $38 + MOVD $212, R12 + B callbackasm1(SB) + HINT $38 + MOVD $213, R12 + B callbackasm1(SB) + HINT $38 + MOVD $214, R12 + B callbackasm1(SB) + HINT $38 + MOVD $215, R12 + B callbackasm1(SB) + HINT $38 + MOVD $216, R12 + B callbackasm1(SB) + HINT $38 + MOVD $217, R12 + B callbackasm1(SB) + HINT $38 + MOVD $218, R12 + B callbackasm1(SB) + HINT $38 + MOVD $219, R12 + B callbackasm1(SB) + HINT $38 + MOVD $220, R12 + B callbackasm1(SB) + HINT $38 + MOVD $221, R12 + B callbackasm1(SB) + HINT $38 + MOVD $222, R12 + B callbackasm1(SB) + HINT $38 + MOVD $223, R12 + B callbackasm1(SB) + HINT $38 + MOVD $224, R12 + B callbackasm1(SB) + HINT $38 + MOVD $225, R12 + B callbackasm1(SB) + HINT $38 + MOVD $226, R12 + B callbackasm1(SB) + HINT $38 + MOVD $227, R12 + B callbackasm1(SB) + HINT $38 + MOVD $228, R12 + B callbackasm1(SB) + HINT $38 + MOVD $229, R12 + B callbackasm1(SB) + HINT $38 + MOVD $230, R12 + B callbackasm1(SB) + HINT $38 + MOVD $231, R12 + B callbackasm1(SB) + HINT $38 + MOVD $232, R12 + B callbackasm1(SB) + HINT $38 + MOVD $233, R12 + B callbackasm1(SB) + HINT $38 + MOVD $234, R12 + B callbackasm1(SB) + HINT $38 + MOVD $235, R12 + B callbackasm1(SB) + HINT $38 + MOVD $236, R12 + B callbackasm1(SB) + HINT $38 + MOVD $237, R12 + B callbackasm1(SB) + HINT $38 + MOVD $238, R12 + B callbackasm1(SB) + HINT $38 + MOVD $239, R12 + B callbackasm1(SB) + HINT $38 + MOVD $240, R12 + B callbackasm1(SB) + HINT $38 + MOVD $241, R12 + B callbackasm1(SB) + HINT $38 + MOVD $242, R12 + B callbackasm1(SB) + HINT $38 + MOVD $243, R12 + B callbackasm1(SB) + HINT $38 + MOVD $244, R12 + B callbackasm1(SB) + HINT $38 + MOVD $245, R12 + B callbackasm1(SB) + HINT $38 + MOVD $246, R12 + B callbackasm1(SB) + HINT $38 + MOVD $247, R12 + B callbackasm1(SB) + HINT $38 + MOVD $248, R12 + B callbackasm1(SB) + HINT $38 + MOVD $249, R12 + B callbackasm1(SB) + HINT $38 + MOVD $250, R12 + B callbackasm1(SB) + HINT $38 + MOVD $251, R12 + B callbackasm1(SB) + HINT $38 + MOVD $252, R12 + B callbackasm1(SB) + HINT $38 + MOVD $253, R12 + B callbackasm1(SB) + HINT $38 + MOVD $254, R12 + B callbackasm1(SB) + HINT $38 + MOVD $255, R12 + B callbackasm1(SB) + HINT $38 + MOVD $256, R12 + B callbackasm1(SB) + HINT $38 + MOVD $257, R12 + B callbackasm1(SB) + HINT $38 + MOVD $258, R12 + B callbackasm1(SB) + HINT $38 + MOVD $259, R12 + B callbackasm1(SB) + HINT $38 + MOVD $260, R12 + B callbackasm1(SB) + HINT $38 + MOVD $261, R12 + B callbackasm1(SB) + HINT $38 + MOVD $262, R12 + B callbackasm1(SB) + HINT $38 + MOVD $263, R12 + B callbackasm1(SB) + HINT $38 + MOVD $264, R12 + B callbackasm1(SB) + HINT $38 + MOVD $265, R12 + B callbackasm1(SB) + HINT $38 + MOVD $266, R12 + B callbackasm1(SB) + HINT $38 + MOVD $267, R12 + B callbackasm1(SB) + HINT $38 + MOVD $268, R12 + B callbackasm1(SB) + HINT $38 + MOVD $269, R12 + B callbackasm1(SB) + HINT $38 + MOVD $270, R12 + B callbackasm1(SB) + HINT $38 + MOVD $271, R12 + B callbackasm1(SB) + HINT $38 + MOVD $272, R12 + B callbackasm1(SB) + HINT $38 + MOVD $273, R12 + B callbackasm1(SB) + HINT $38 + MOVD $274, R12 + B callbackasm1(SB) + HINT $38 + MOVD $275, R12 + B callbackasm1(SB) + HINT $38 + MOVD $276, R12 + B callbackasm1(SB) + HINT $38 + MOVD $277, R12 + B callbackasm1(SB) + HINT $38 + MOVD $278, R12 + B callbackasm1(SB) + HINT $38 + MOVD $279, R12 + B callbackasm1(SB) + HINT $38 + MOVD $280, R12 + B callbackasm1(SB) + HINT $38 + MOVD $281, R12 + B callbackasm1(SB) + HINT $38 + MOVD $282, R12 + B callbackasm1(SB) + HINT $38 + MOVD $283, R12 + B callbackasm1(SB) + HINT $38 + MOVD $284, R12 + B callbackasm1(SB) + HINT $38 + MOVD $285, R12 + B callbackasm1(SB) + HINT $38 + MOVD $286, R12 + B callbackasm1(SB) + HINT $38 + MOVD $287, R12 + B callbackasm1(SB) + HINT $38 + MOVD $288, R12 + B callbackasm1(SB) + HINT $38 + MOVD $289, R12 + B callbackasm1(SB) + HINT $38 + MOVD $290, R12 + B callbackasm1(SB) + HINT $38 + MOVD $291, R12 + B callbackasm1(SB) + HINT $38 + MOVD $292, R12 + B callbackasm1(SB) + HINT $38 + MOVD $293, R12 + B callbackasm1(SB) + HINT $38 + MOVD $294, R12 + B callbackasm1(SB) + HINT $38 + MOVD $295, R12 + B callbackasm1(SB) + HINT $38 + MOVD $296, R12 + B callbackasm1(SB) + HINT $38 + MOVD $297, R12 + B callbackasm1(SB) + HINT $38 + MOVD $298, R12 + B callbackasm1(SB) + HINT $38 + MOVD $299, R12 + B callbackasm1(SB) + HINT $38 + MOVD $300, R12 + B callbackasm1(SB) + HINT $38 + MOVD $301, R12 + B callbackasm1(SB) + HINT $38 + MOVD $302, R12 + B callbackasm1(SB) + HINT $38 + MOVD $303, R12 + B callbackasm1(SB) + HINT $38 + MOVD $304, R12 + B callbackasm1(SB) + HINT $38 + MOVD $305, R12 + B callbackasm1(SB) + HINT $38 + MOVD $306, R12 + B callbackasm1(SB) + HINT $38 + MOVD $307, R12 + B callbackasm1(SB) + HINT $38 + MOVD $308, R12 + B callbackasm1(SB) + HINT $38 + MOVD $309, R12 + B callbackasm1(SB) + HINT $38 + MOVD $310, R12 + B callbackasm1(SB) + HINT $38 + MOVD $311, R12 + B callbackasm1(SB) + HINT $38 + MOVD $312, R12 + B callbackasm1(SB) + HINT $38 + MOVD $313, R12 + B callbackasm1(SB) + HINT $38 + MOVD $314, R12 + B callbackasm1(SB) + HINT $38 + MOVD $315, R12 + B callbackasm1(SB) + HINT $38 + MOVD $316, R12 + B callbackasm1(SB) + HINT $38 + MOVD $317, R12 + B callbackasm1(SB) + HINT $38 + MOVD $318, R12 + B callbackasm1(SB) + HINT $38 + MOVD $319, R12 + B callbackasm1(SB) + HINT $38 + MOVD $320, R12 + B callbackasm1(SB) + HINT $38 + MOVD $321, R12 + B callbackasm1(SB) + HINT $38 + MOVD $322, R12 + B callbackasm1(SB) + HINT $38 + MOVD $323, R12 + B callbackasm1(SB) + HINT $38 + MOVD $324, R12 + B callbackasm1(SB) + HINT $38 + MOVD $325, R12 + B callbackasm1(SB) + HINT $38 + MOVD $326, R12 + B callbackasm1(SB) + HINT $38 + MOVD $327, R12 + B callbackasm1(SB) + HINT $38 + MOVD $328, R12 + B callbackasm1(SB) + HINT $38 + MOVD $329, R12 + B callbackasm1(SB) + HINT $38 + MOVD $330, R12 + B callbackasm1(SB) + HINT $38 + MOVD $331, R12 + B callbackasm1(SB) + HINT $38 + MOVD $332, R12 + B callbackasm1(SB) + HINT $38 + MOVD $333, R12 + B callbackasm1(SB) + HINT $38 + MOVD $334, R12 + B callbackasm1(SB) + HINT $38 + MOVD $335, R12 + B callbackasm1(SB) + HINT $38 + MOVD $336, R12 + B callbackasm1(SB) + HINT $38 + MOVD $337, R12 + B callbackasm1(SB) + HINT $38 + MOVD $338, R12 + B callbackasm1(SB) + HINT $38 + MOVD $339, R12 + B callbackasm1(SB) + HINT $38 + MOVD $340, R12 + B callbackasm1(SB) + HINT $38 + MOVD $341, R12 + B callbackasm1(SB) + HINT $38 + MOVD $342, R12 + B callbackasm1(SB) + HINT $38 + MOVD $343, R12 + B callbackasm1(SB) + HINT $38 + MOVD $344, R12 + B callbackasm1(SB) + HINT $38 + MOVD $345, R12 + B callbackasm1(SB) + HINT $38 + MOVD $346, R12 + B callbackasm1(SB) + HINT $38 + MOVD $347, R12 + B callbackasm1(SB) + HINT $38 + MOVD $348, R12 + B callbackasm1(SB) + HINT $38 + MOVD $349, R12 + B callbackasm1(SB) + HINT $38 + MOVD $350, R12 + B callbackasm1(SB) + HINT $38 + MOVD $351, R12 + B callbackasm1(SB) + HINT $38 + MOVD $352, R12 + B callbackasm1(SB) + HINT $38 + MOVD $353, R12 + B callbackasm1(SB) + HINT $38 + MOVD $354, R12 + B callbackasm1(SB) + HINT $38 + MOVD $355, R12 + B callbackasm1(SB) + HINT $38 + MOVD $356, R12 + B callbackasm1(SB) + HINT $38 + MOVD $357, R12 + B callbackasm1(SB) + HINT $38 + MOVD $358, R12 + B callbackasm1(SB) + HINT $38 + MOVD $359, R12 + B callbackasm1(SB) + HINT $38 + MOVD $360, R12 + B callbackasm1(SB) + HINT $38 + MOVD $361, R12 + B callbackasm1(SB) + HINT $38 + MOVD $362, R12 + B callbackasm1(SB) + HINT $38 + MOVD $363, R12 + B callbackasm1(SB) + HINT $38 + MOVD $364, R12 + B callbackasm1(SB) + HINT $38 + MOVD $365, R12 + B callbackasm1(SB) + HINT $38 + MOVD $366, R12 + B callbackasm1(SB) + HINT $38 + MOVD $367, R12 + B callbackasm1(SB) + HINT $38 + MOVD $368, R12 + B callbackasm1(SB) + HINT $38 + MOVD $369, R12 + B callbackasm1(SB) + HINT $38 + MOVD $370, R12 + B callbackasm1(SB) + HINT $38 + MOVD $371, R12 + B callbackasm1(SB) + HINT $38 + MOVD $372, R12 + B callbackasm1(SB) + HINT $38 + MOVD $373, R12 + B callbackasm1(SB) + HINT $38 + MOVD $374, R12 + B callbackasm1(SB) + HINT $38 + MOVD $375, R12 + B callbackasm1(SB) + HINT $38 + MOVD $376, R12 + B callbackasm1(SB) + HINT $38 + MOVD $377, R12 + B callbackasm1(SB) + HINT $38 + MOVD $378, R12 + B callbackasm1(SB) + HINT $38 + MOVD $379, R12 + B callbackasm1(SB) + HINT $38 + MOVD $380, R12 + B callbackasm1(SB) + HINT $38 + MOVD $381, R12 + B callbackasm1(SB) + HINT $38 + MOVD $382, R12 + B callbackasm1(SB) + HINT $38 + MOVD $383, R12 + B callbackasm1(SB) + HINT $38 + MOVD $384, R12 + B callbackasm1(SB) + HINT $38 + MOVD $385, R12 + B callbackasm1(SB) + HINT $38 + MOVD $386, R12 + B callbackasm1(SB) + HINT $38 + MOVD $387, R12 + B callbackasm1(SB) + HINT $38 + MOVD $388, R12 + B callbackasm1(SB) + HINT $38 + MOVD $389, R12 + B callbackasm1(SB) + HINT $38 + MOVD $390, R12 + B callbackasm1(SB) + HINT $38 + MOVD $391, R12 + B callbackasm1(SB) + HINT $38 + MOVD $392, R12 + B callbackasm1(SB) + HINT $38 + MOVD $393, R12 + B callbackasm1(SB) + HINT $38 + MOVD $394, R12 + B callbackasm1(SB) + HINT $38 + MOVD $395, R12 + B callbackasm1(SB) + HINT $38 + MOVD $396, R12 + B callbackasm1(SB) + HINT $38 + MOVD $397, R12 + B callbackasm1(SB) + HINT $38 + MOVD $398, R12 + B callbackasm1(SB) + HINT $38 + MOVD $399, R12 + B callbackasm1(SB) + HINT $38 + MOVD $400, R12 + B callbackasm1(SB) + HINT $38 + MOVD $401, R12 + B callbackasm1(SB) + HINT $38 + MOVD $402, R12 + B callbackasm1(SB) + HINT $38 + MOVD $403, R12 + B callbackasm1(SB) + HINT $38 + MOVD $404, R12 + B callbackasm1(SB) + HINT $38 + MOVD $405, R12 + B callbackasm1(SB) + HINT $38 + MOVD $406, R12 + B callbackasm1(SB) + HINT $38 + MOVD $407, R12 + B callbackasm1(SB) + HINT $38 + MOVD $408, R12 + B callbackasm1(SB) + HINT $38 + MOVD $409, R12 + B callbackasm1(SB) + HINT $38 + MOVD $410, R12 + B callbackasm1(SB) + HINT $38 + MOVD $411, R12 + B callbackasm1(SB) + HINT $38 + MOVD $412, R12 + B callbackasm1(SB) + HINT $38 + MOVD $413, R12 + B callbackasm1(SB) + HINT $38 + MOVD $414, R12 + B callbackasm1(SB) + HINT $38 + MOVD $415, R12 + B callbackasm1(SB) + HINT $38 + MOVD $416, R12 + B callbackasm1(SB) + HINT $38 + MOVD $417, R12 + B callbackasm1(SB) + HINT $38 + MOVD $418, R12 + B callbackasm1(SB) + HINT $38 + MOVD $419, R12 + B callbackasm1(SB) + HINT $38 + MOVD $420, R12 + B callbackasm1(SB) + HINT $38 + MOVD $421, R12 + B callbackasm1(SB) + HINT $38 + MOVD $422, R12 + B callbackasm1(SB) + HINT $38 + MOVD $423, R12 + B callbackasm1(SB) + HINT $38 + MOVD $424, R12 + B callbackasm1(SB) + HINT $38 + MOVD $425, R12 + B callbackasm1(SB) + HINT $38 + MOVD $426, R12 + B callbackasm1(SB) + HINT $38 + MOVD $427, R12 + B callbackasm1(SB) + HINT $38 + MOVD $428, R12 + B callbackasm1(SB) + HINT $38 + MOVD $429, R12 + B callbackasm1(SB) + HINT $38 + MOVD $430, R12 + B callbackasm1(SB) + HINT $38 + MOVD $431, R12 + B callbackasm1(SB) + HINT $38 + MOVD $432, R12 + B callbackasm1(SB) + HINT $38 + MOVD $433, R12 + B callbackasm1(SB) + HINT $38 + MOVD $434, R12 + B callbackasm1(SB) + HINT $38 + MOVD $435, R12 + B callbackasm1(SB) + HINT $38 + MOVD $436, R12 + B callbackasm1(SB) + HINT $38 + MOVD $437, R12 + B callbackasm1(SB) + HINT $38 + MOVD $438, R12 + B callbackasm1(SB) + HINT $38 + MOVD $439, R12 + B callbackasm1(SB) + HINT $38 + MOVD $440, R12 + B callbackasm1(SB) + HINT $38 + MOVD $441, R12 + B callbackasm1(SB) + HINT $38 + MOVD $442, R12 + B callbackasm1(SB) + HINT $38 + MOVD $443, R12 + B callbackasm1(SB) + HINT $38 + MOVD $444, R12 + B callbackasm1(SB) + HINT $38 + MOVD $445, R12 + B callbackasm1(SB) + HINT $38 + MOVD $446, R12 + B callbackasm1(SB) + HINT $38 + MOVD $447, R12 + B callbackasm1(SB) + HINT $38 + MOVD $448, R12 + B callbackasm1(SB) + HINT $38 + MOVD $449, R12 + B callbackasm1(SB) + HINT $38 + MOVD $450, R12 + B callbackasm1(SB) + HINT $38 + MOVD $451, R12 + B callbackasm1(SB) + HINT $38 + MOVD $452, R12 + B callbackasm1(SB) + HINT $38 + MOVD $453, R12 + B callbackasm1(SB) + HINT $38 + MOVD $454, R12 + B callbackasm1(SB) + HINT $38 + MOVD $455, R12 + B callbackasm1(SB) + HINT $38 + MOVD $456, R12 + B callbackasm1(SB) + HINT $38 + MOVD $457, R12 + B callbackasm1(SB) + HINT $38 + MOVD $458, R12 + B callbackasm1(SB) + HINT $38 + MOVD $459, R12 + B callbackasm1(SB) + HINT $38 + MOVD $460, R12 + B callbackasm1(SB) + HINT $38 + MOVD $461, R12 + B callbackasm1(SB) + HINT $38 + MOVD $462, R12 + B callbackasm1(SB) + HINT $38 + MOVD $463, R12 + B callbackasm1(SB) + HINT $38 + MOVD $464, R12 + B callbackasm1(SB) + HINT $38 + MOVD $465, R12 + B callbackasm1(SB) + HINT $38 + MOVD $466, R12 + B callbackasm1(SB) + HINT $38 + MOVD $467, R12 + B callbackasm1(SB) + HINT $38 + MOVD $468, R12 + B callbackasm1(SB) + HINT $38 + MOVD $469, R12 + B callbackasm1(SB) + HINT $38 + MOVD $470, R12 + B callbackasm1(SB) + HINT $38 + MOVD $471, R12 + B callbackasm1(SB) + HINT $38 + MOVD $472, R12 + B callbackasm1(SB) + HINT $38 + MOVD $473, R12 + B callbackasm1(SB) + HINT $38 + MOVD $474, R12 + B callbackasm1(SB) + HINT $38 + MOVD $475, R12 + B callbackasm1(SB) + HINT $38 + MOVD $476, R12 + B callbackasm1(SB) + HINT $38 + MOVD $477, R12 + B callbackasm1(SB) + HINT $38 + MOVD $478, R12 + B callbackasm1(SB) + HINT $38 + MOVD $479, R12 + B callbackasm1(SB) + HINT $38 + MOVD $480, R12 + B callbackasm1(SB) + HINT $38 + MOVD $481, R12 + B callbackasm1(SB) + HINT $38 + MOVD $482, R12 + B callbackasm1(SB) + HINT $38 + MOVD $483, R12 + B callbackasm1(SB) + HINT $38 + MOVD $484, R12 + B callbackasm1(SB) + HINT $38 + MOVD $485, R12 + B callbackasm1(SB) + HINT $38 + MOVD $486, R12 + B callbackasm1(SB) + HINT $38 + MOVD $487, R12 + B callbackasm1(SB) + HINT $38 + MOVD $488, R12 + B callbackasm1(SB) + HINT $38 + MOVD $489, R12 + B callbackasm1(SB) + HINT $38 + MOVD $490, R12 + B callbackasm1(SB) + HINT $38 + MOVD $491, R12 + B callbackasm1(SB) + HINT $38 + MOVD $492, R12 + B callbackasm1(SB) + HINT $38 + MOVD $493, R12 + B callbackasm1(SB) + HINT $38 + MOVD $494, R12 + B callbackasm1(SB) + HINT $38 + MOVD $495, R12 + B callbackasm1(SB) + HINT $38 + MOVD $496, R12 + B callbackasm1(SB) + HINT $38 + MOVD $497, R12 + B callbackasm1(SB) + HINT $38 + MOVD $498, R12 + B callbackasm1(SB) + HINT $38 + MOVD $499, R12 + B callbackasm1(SB) + HINT $38 + MOVD $500, R12 + B callbackasm1(SB) + HINT $38 + MOVD $501, R12 + B callbackasm1(SB) + HINT $38 + MOVD $502, R12 + B callbackasm1(SB) + HINT $38 + MOVD $503, R12 + B callbackasm1(SB) + HINT $38 + MOVD $504, R12 + B callbackasm1(SB) + HINT $38 + MOVD $505, R12 + B callbackasm1(SB) + HINT $38 + MOVD $506, R12 + B callbackasm1(SB) + HINT $38 + MOVD $507, R12 + B callbackasm1(SB) + HINT $38 + MOVD $508, R12 + B callbackasm1(SB) + HINT $38 + MOVD $509, R12 + B callbackasm1(SB) + HINT $38 + MOVD $510, R12 + B callbackasm1(SB) + HINT $38 + MOVD $511, R12 + B callbackasm1(SB) + HINT $38 + MOVD $512, R12 + B callbackasm1(SB) + HINT $38 + MOVD $513, R12 + B callbackasm1(SB) + HINT $38 + MOVD $514, R12 + B callbackasm1(SB) + HINT $38 + MOVD $515, R12 + B callbackasm1(SB) + HINT $38 + MOVD $516, R12 + B callbackasm1(SB) + HINT $38 + MOVD $517, R12 + B callbackasm1(SB) + HINT $38 + MOVD $518, R12 + B callbackasm1(SB) + HINT $38 + MOVD $519, R12 + B callbackasm1(SB) + HINT $38 + MOVD $520, R12 + B callbackasm1(SB) + HINT $38 + MOVD $521, R12 + B callbackasm1(SB) + HINT $38 + MOVD $522, R12 + B callbackasm1(SB) + HINT $38 + MOVD $523, R12 + B callbackasm1(SB) + HINT $38 + MOVD $524, R12 + B callbackasm1(SB) + HINT $38 + MOVD $525, R12 + B callbackasm1(SB) + HINT $38 + MOVD $526, R12 + B callbackasm1(SB) + HINT $38 + MOVD $527, R12 + B callbackasm1(SB) + HINT $38 + MOVD $528, R12 + B callbackasm1(SB) + HINT $38 + MOVD $529, R12 + B callbackasm1(SB) + HINT $38 + MOVD $530, R12 + B callbackasm1(SB) + HINT $38 + MOVD $531, R12 + B callbackasm1(SB) + HINT $38 + MOVD $532, R12 + B callbackasm1(SB) + HINT $38 + MOVD $533, R12 + B callbackasm1(SB) + HINT $38 + MOVD $534, R12 + B callbackasm1(SB) + HINT $38 + MOVD $535, R12 + B callbackasm1(SB) + HINT $38 + MOVD $536, R12 + B callbackasm1(SB) + HINT $38 + MOVD $537, R12 + B callbackasm1(SB) + HINT $38 + MOVD $538, R12 + B callbackasm1(SB) + HINT $38 + MOVD $539, R12 + B callbackasm1(SB) + HINT $38 + MOVD $540, R12 + B callbackasm1(SB) + HINT $38 + MOVD $541, R12 + B callbackasm1(SB) + HINT $38 + MOVD $542, R12 + B callbackasm1(SB) + HINT $38 + MOVD $543, R12 + B callbackasm1(SB) + HINT $38 + MOVD $544, R12 + B callbackasm1(SB) + HINT $38 + MOVD $545, R12 + B callbackasm1(SB) + HINT $38 + MOVD $546, R12 + B callbackasm1(SB) + HINT $38 + MOVD $547, R12 + B callbackasm1(SB) + HINT $38 + MOVD $548, R12 + B callbackasm1(SB) + HINT $38 + MOVD $549, R12 + B callbackasm1(SB) + HINT $38 + MOVD $550, R12 + B callbackasm1(SB) + HINT $38 + MOVD $551, R12 + B callbackasm1(SB) + HINT $38 + MOVD $552, R12 + B callbackasm1(SB) + HINT $38 + MOVD $553, R12 + B callbackasm1(SB) + HINT $38 + MOVD $554, R12 + B callbackasm1(SB) + HINT $38 + MOVD $555, R12 + B callbackasm1(SB) + HINT $38 + MOVD $556, R12 + B callbackasm1(SB) + HINT $38 + MOVD $557, R12 + B callbackasm1(SB) + HINT $38 + MOVD $558, R12 + B callbackasm1(SB) + HINT $38 + MOVD $559, R12 + B callbackasm1(SB) + HINT $38 + MOVD $560, R12 + B callbackasm1(SB) + HINT $38 + MOVD $561, R12 + B callbackasm1(SB) + HINT $38 + MOVD $562, R12 + B callbackasm1(SB) + HINT $38 + MOVD $563, R12 + B callbackasm1(SB) + HINT $38 + MOVD $564, R12 + B callbackasm1(SB) + HINT $38 + MOVD $565, R12 + B callbackasm1(SB) + HINT $38 + MOVD $566, R12 + B callbackasm1(SB) + HINT $38 + MOVD $567, R12 + B callbackasm1(SB) + HINT $38 + MOVD $568, R12 + B callbackasm1(SB) + HINT $38 + MOVD $569, R12 + B callbackasm1(SB) + HINT $38 + MOVD $570, R12 + B callbackasm1(SB) + HINT $38 + MOVD $571, R12 + B callbackasm1(SB) + HINT $38 + MOVD $572, R12 + B callbackasm1(SB) + HINT $38 + MOVD $573, R12 + B callbackasm1(SB) + HINT $38 + MOVD $574, R12 + B callbackasm1(SB) + HINT $38 + MOVD $575, R12 + B callbackasm1(SB) + HINT $38 + MOVD $576, R12 + B callbackasm1(SB) + HINT $38 + MOVD $577, R12 + B callbackasm1(SB) + HINT $38 + MOVD $578, R12 + B callbackasm1(SB) + HINT $38 + MOVD $579, R12 + B callbackasm1(SB) + HINT $38 + MOVD $580, R12 + B callbackasm1(SB) + HINT $38 + MOVD $581, R12 + B callbackasm1(SB) + HINT $38 + MOVD $582, R12 + B callbackasm1(SB) + HINT $38 + MOVD $583, R12 + B callbackasm1(SB) + HINT $38 + MOVD $584, R12 + B callbackasm1(SB) + HINT $38 + MOVD $585, R12 + B callbackasm1(SB) + HINT $38 + MOVD $586, R12 + B callbackasm1(SB) + HINT $38 + MOVD $587, R12 + B callbackasm1(SB) + HINT $38 + MOVD $588, R12 + B callbackasm1(SB) + HINT $38 + MOVD $589, R12 + B callbackasm1(SB) + HINT $38 + MOVD $590, R12 + B callbackasm1(SB) + HINT $38 + MOVD $591, R12 + B callbackasm1(SB) + HINT $38 + MOVD $592, R12 + B callbackasm1(SB) + HINT $38 + MOVD $593, R12 + B callbackasm1(SB) + HINT $38 + MOVD $594, R12 + B callbackasm1(SB) + HINT $38 + MOVD $595, R12 + B callbackasm1(SB) + HINT $38 + MOVD $596, R12 + B callbackasm1(SB) + HINT $38 + MOVD $597, R12 + B callbackasm1(SB) + HINT $38 + MOVD $598, R12 + B callbackasm1(SB) + HINT $38 + MOVD $599, R12 + B callbackasm1(SB) + HINT $38 + MOVD $600, R12 + B callbackasm1(SB) + HINT $38 + MOVD $601, R12 + B callbackasm1(SB) + HINT $38 + MOVD $602, R12 + B callbackasm1(SB) + HINT $38 + MOVD $603, R12 + B callbackasm1(SB) + HINT $38 + MOVD $604, R12 + B callbackasm1(SB) + HINT $38 + MOVD $605, R12 + B callbackasm1(SB) + HINT $38 + MOVD $606, R12 + B callbackasm1(SB) + HINT $38 + MOVD $607, R12 + B callbackasm1(SB) + HINT $38 + MOVD $608, R12 + B callbackasm1(SB) + HINT $38 + MOVD $609, R12 + B callbackasm1(SB) + HINT $38 + MOVD $610, R12 + B callbackasm1(SB) + HINT $38 + MOVD $611, R12 + B callbackasm1(SB) + HINT $38 + MOVD $612, R12 + B callbackasm1(SB) + HINT $38 + MOVD $613, R12 + B callbackasm1(SB) + HINT $38 + MOVD $614, R12 + B callbackasm1(SB) + HINT $38 + MOVD $615, R12 + B callbackasm1(SB) + HINT $38 + MOVD $616, R12 + B callbackasm1(SB) + HINT $38 + MOVD $617, R12 + B callbackasm1(SB) + HINT $38 + MOVD $618, R12 + B callbackasm1(SB) + HINT $38 + MOVD $619, R12 + B callbackasm1(SB) + HINT $38 + MOVD $620, R12 + B callbackasm1(SB) + HINT $38 + MOVD $621, R12 + B callbackasm1(SB) + HINT $38 + MOVD $622, R12 + B callbackasm1(SB) + HINT $38 + MOVD $623, R12 + B callbackasm1(SB) + HINT $38 + MOVD $624, R12 + B callbackasm1(SB) + HINT $38 + MOVD $625, R12 + B callbackasm1(SB) + HINT $38 + MOVD $626, R12 + B callbackasm1(SB) + HINT $38 + MOVD $627, R12 + B callbackasm1(SB) + HINT $38 + MOVD $628, R12 + B callbackasm1(SB) + HINT $38 + MOVD $629, R12 + B callbackasm1(SB) + HINT $38 + MOVD $630, R12 + B callbackasm1(SB) + HINT $38 + MOVD $631, R12 + B callbackasm1(SB) + HINT $38 + MOVD $632, R12 + B callbackasm1(SB) + HINT $38 + MOVD $633, R12 + B callbackasm1(SB) + HINT $38 + MOVD $634, R12 + B callbackasm1(SB) + HINT $38 + MOVD $635, R12 + B callbackasm1(SB) + HINT $38 + MOVD $636, R12 + B callbackasm1(SB) + HINT $38 + MOVD $637, R12 + B callbackasm1(SB) + HINT $38 + MOVD $638, R12 + B callbackasm1(SB) + HINT $38 + MOVD $639, R12 + B callbackasm1(SB) + HINT $38 + MOVD $640, R12 + B callbackasm1(SB) + HINT $38 + MOVD $641, R12 + B callbackasm1(SB) + HINT $38 + MOVD $642, R12 + B callbackasm1(SB) + HINT $38 + MOVD $643, R12 + B callbackasm1(SB) + HINT $38 + MOVD $644, R12 + B callbackasm1(SB) + HINT $38 + MOVD $645, R12 + B callbackasm1(SB) + HINT $38 + MOVD $646, R12 + B callbackasm1(SB) + HINT $38 + MOVD $647, R12 + B callbackasm1(SB) + HINT $38 + MOVD $648, R12 + B callbackasm1(SB) + HINT $38 + MOVD $649, R12 + B callbackasm1(SB) + HINT $38 + MOVD $650, R12 + B callbackasm1(SB) + HINT $38 + MOVD $651, R12 + B callbackasm1(SB) + HINT $38 + MOVD $652, R12 + B callbackasm1(SB) + HINT $38 + MOVD $653, R12 + B callbackasm1(SB) + HINT $38 + MOVD $654, R12 + B callbackasm1(SB) + HINT $38 + MOVD $655, R12 + B callbackasm1(SB) + HINT $38 + MOVD $656, R12 + B callbackasm1(SB) + HINT $38 + MOVD $657, R12 + B callbackasm1(SB) + HINT $38 + MOVD $658, R12 + B callbackasm1(SB) + HINT $38 + MOVD $659, R12 + B callbackasm1(SB) + HINT $38 + MOVD $660, R12 + B callbackasm1(SB) + HINT $38 + MOVD $661, R12 + B callbackasm1(SB) + HINT $38 + MOVD $662, R12 + B callbackasm1(SB) + HINT $38 + MOVD $663, R12 + B callbackasm1(SB) + HINT $38 + MOVD $664, R12 + B callbackasm1(SB) + HINT $38 + MOVD $665, R12 + B callbackasm1(SB) + HINT $38 + MOVD $666, R12 + B callbackasm1(SB) + HINT $38 + MOVD $667, R12 + B callbackasm1(SB) + HINT $38 + MOVD $668, R12 + B callbackasm1(SB) + HINT $38 + MOVD $669, R12 + B callbackasm1(SB) + HINT $38 + MOVD $670, R12 + B callbackasm1(SB) + HINT $38 + MOVD $671, R12 + B callbackasm1(SB) + HINT $38 + MOVD $672, R12 + B callbackasm1(SB) + HINT $38 + MOVD $673, R12 + B callbackasm1(SB) + HINT $38 + MOVD $674, R12 + B callbackasm1(SB) + HINT $38 + MOVD $675, R12 + B callbackasm1(SB) + HINT $38 + MOVD $676, R12 + B callbackasm1(SB) + HINT $38 + MOVD $677, R12 + B callbackasm1(SB) + HINT $38 + MOVD $678, R12 + B callbackasm1(SB) + HINT $38 + MOVD $679, R12 + B callbackasm1(SB) + HINT $38 + MOVD $680, R12 + B callbackasm1(SB) + HINT $38 + MOVD $681, R12 + B callbackasm1(SB) + HINT $38 + MOVD $682, R12 + B callbackasm1(SB) + HINT $38 + MOVD $683, R12 + B callbackasm1(SB) + HINT $38 + MOVD $684, R12 + B callbackasm1(SB) + HINT $38 + MOVD $685, R12 + B callbackasm1(SB) + HINT $38 + MOVD $686, R12 + B callbackasm1(SB) + HINT $38 + MOVD $687, R12 + B callbackasm1(SB) + HINT $38 + MOVD $688, R12 + B callbackasm1(SB) + HINT $38 + MOVD $689, R12 + B callbackasm1(SB) + HINT $38 + MOVD $690, R12 + B callbackasm1(SB) + HINT $38 + MOVD $691, R12 + B callbackasm1(SB) + HINT $38 + MOVD $692, R12 + B callbackasm1(SB) + HINT $38 + MOVD $693, R12 + B callbackasm1(SB) + HINT $38 + MOVD $694, R12 + B callbackasm1(SB) + HINT $38 + MOVD $695, R12 + B callbackasm1(SB) + HINT $38 + MOVD $696, R12 + B callbackasm1(SB) + HINT $38 + MOVD $697, R12 + B callbackasm1(SB) + HINT $38 + MOVD $698, R12 + B callbackasm1(SB) + HINT $38 + MOVD $699, R12 + B callbackasm1(SB) + HINT $38 + MOVD $700, R12 + B callbackasm1(SB) + HINT $38 + MOVD $701, R12 + B callbackasm1(SB) + HINT $38 + MOVD $702, R12 + B callbackasm1(SB) + HINT $38 + MOVD $703, R12 + B callbackasm1(SB) + HINT $38 + MOVD $704, R12 + B callbackasm1(SB) + HINT $38 + MOVD $705, R12 + B callbackasm1(SB) + HINT $38 + MOVD $706, R12 + B callbackasm1(SB) + HINT $38 + MOVD $707, R12 + B callbackasm1(SB) + HINT $38 + MOVD $708, R12 + B callbackasm1(SB) + HINT $38 + MOVD $709, R12 + B callbackasm1(SB) + HINT $38 + MOVD $710, R12 + B callbackasm1(SB) + HINT $38 + MOVD $711, R12 + B callbackasm1(SB) + HINT $38 + MOVD $712, R12 + B callbackasm1(SB) + HINT $38 + MOVD $713, R12 + B callbackasm1(SB) + HINT $38 + MOVD $714, R12 + B callbackasm1(SB) + HINT $38 + MOVD $715, R12 + B callbackasm1(SB) + HINT $38 + MOVD $716, R12 + B callbackasm1(SB) + HINT $38 + MOVD $717, R12 + B callbackasm1(SB) + HINT $38 + MOVD $718, R12 + B callbackasm1(SB) + HINT $38 + MOVD $719, R12 + B callbackasm1(SB) + HINT $38 + MOVD $720, R12 + B callbackasm1(SB) + HINT $38 + MOVD $721, R12 + B callbackasm1(SB) + HINT $38 + MOVD $722, R12 + B callbackasm1(SB) + HINT $38 + MOVD $723, R12 + B callbackasm1(SB) + HINT $38 + MOVD $724, R12 + B callbackasm1(SB) + HINT $38 + MOVD $725, R12 + B callbackasm1(SB) + HINT $38 + MOVD $726, R12 + B callbackasm1(SB) + HINT $38 + MOVD $727, R12 + B callbackasm1(SB) + HINT $38 + MOVD $728, R12 + B callbackasm1(SB) + HINT $38 + MOVD $729, R12 + B callbackasm1(SB) + HINT $38 + MOVD $730, R12 + B callbackasm1(SB) + HINT $38 + MOVD $731, R12 + B callbackasm1(SB) + HINT $38 + MOVD $732, R12 + B callbackasm1(SB) + HINT $38 + MOVD $733, R12 + B callbackasm1(SB) + HINT $38 + MOVD $734, R12 + B callbackasm1(SB) + HINT $38 + MOVD $735, R12 + B callbackasm1(SB) + HINT $38 + MOVD $736, R12 + B callbackasm1(SB) + HINT $38 + MOVD $737, R12 + B callbackasm1(SB) + HINT $38 + MOVD $738, R12 + B callbackasm1(SB) + HINT $38 + MOVD $739, R12 + B callbackasm1(SB) + HINT $38 + MOVD $740, R12 + B callbackasm1(SB) + HINT $38 + MOVD $741, R12 + B callbackasm1(SB) + HINT $38 + MOVD $742, R12 + B callbackasm1(SB) + HINT $38 + MOVD $743, R12 + B callbackasm1(SB) + HINT $38 + MOVD $744, R12 + B callbackasm1(SB) + HINT $38 + MOVD $745, R12 + B callbackasm1(SB) + HINT $38 + MOVD $746, R12 + B callbackasm1(SB) + HINT $38 + MOVD $747, R12 + B callbackasm1(SB) + HINT $38 + MOVD $748, R12 + B callbackasm1(SB) + HINT $38 + MOVD $749, R12 + B callbackasm1(SB) + HINT $38 + MOVD $750, R12 + B callbackasm1(SB) + HINT $38 + MOVD $751, R12 + B callbackasm1(SB) + HINT $38 + MOVD $752, R12 + B callbackasm1(SB) + HINT $38 + MOVD $753, R12 + B callbackasm1(SB) + HINT $38 + MOVD $754, R12 + B callbackasm1(SB) + HINT $38 + MOVD $755, R12 + B callbackasm1(SB) + HINT $38 + MOVD $756, R12 + B callbackasm1(SB) + HINT $38 + MOVD $757, R12 + B callbackasm1(SB) + HINT $38 + MOVD $758, R12 + B callbackasm1(SB) + HINT $38 + MOVD $759, R12 + B callbackasm1(SB) + HINT $38 + MOVD $760, R12 + B callbackasm1(SB) + HINT $38 + MOVD $761, R12 + B callbackasm1(SB) + HINT $38 + MOVD $762, R12 + B callbackasm1(SB) + HINT $38 + MOVD $763, R12 + B callbackasm1(SB) + HINT $38 + MOVD $764, R12 + B callbackasm1(SB) + HINT $38 + MOVD $765, R12 + B callbackasm1(SB) + HINT $38 + MOVD $766, R12 + B callbackasm1(SB) + HINT $38 + MOVD $767, R12 + B callbackasm1(SB) + HINT $38 + MOVD $768, R12 + B callbackasm1(SB) + HINT $38 + MOVD $769, R12 + B callbackasm1(SB) + HINT $38 + MOVD $770, R12 + B callbackasm1(SB) + HINT $38 + MOVD $771, R12 + B callbackasm1(SB) + HINT $38 + MOVD $772, R12 + B callbackasm1(SB) + HINT $38 + MOVD $773, R12 + B callbackasm1(SB) + HINT $38 + MOVD $774, R12 + B callbackasm1(SB) + HINT $38 + MOVD $775, R12 + B callbackasm1(SB) + HINT $38 + MOVD $776, R12 + B callbackasm1(SB) + HINT $38 + MOVD $777, R12 + B callbackasm1(SB) + HINT $38 + MOVD $778, R12 + B callbackasm1(SB) + HINT $38 + MOVD $779, R12 + B callbackasm1(SB) + HINT $38 + MOVD $780, R12 + B callbackasm1(SB) + HINT $38 + MOVD $781, R12 + B callbackasm1(SB) + HINT $38 + MOVD $782, R12 + B callbackasm1(SB) + HINT $38 + MOVD $783, R12 + B callbackasm1(SB) + HINT $38 + MOVD $784, R12 + B callbackasm1(SB) + HINT $38 + MOVD $785, R12 + B callbackasm1(SB) + HINT $38 + MOVD $786, R12 + B callbackasm1(SB) + HINT $38 + MOVD $787, R12 + B callbackasm1(SB) + HINT $38 + MOVD $788, R12 + B callbackasm1(SB) + HINT $38 + MOVD $789, R12 + B callbackasm1(SB) + HINT $38 + MOVD $790, R12 + B callbackasm1(SB) + HINT $38 + MOVD $791, R12 + B callbackasm1(SB) + HINT $38 + MOVD $792, R12 + B callbackasm1(SB) + HINT $38 + MOVD $793, R12 + B callbackasm1(SB) + HINT $38 + MOVD $794, R12 + B callbackasm1(SB) + HINT $38 + MOVD $795, R12 + B callbackasm1(SB) + HINT $38 + MOVD $796, R12 + B callbackasm1(SB) + HINT $38 + MOVD $797, R12 + B callbackasm1(SB) + HINT $38 + MOVD $798, R12 + B callbackasm1(SB) + HINT $38 + MOVD $799, R12 + B callbackasm1(SB) + HINT $38 + MOVD $800, R12 + B callbackasm1(SB) + HINT $38 + MOVD $801, R12 + B callbackasm1(SB) + HINT $38 + MOVD $802, R12 + B callbackasm1(SB) + HINT $38 + MOVD $803, R12 + B callbackasm1(SB) + HINT $38 + MOVD $804, R12 + B callbackasm1(SB) + HINT $38 + MOVD $805, R12 + B callbackasm1(SB) + HINT $38 + MOVD $806, R12 + B callbackasm1(SB) + HINT $38 + MOVD $807, R12 + B callbackasm1(SB) + HINT $38 + MOVD $808, R12 + B callbackasm1(SB) + HINT $38 + MOVD $809, R12 + B callbackasm1(SB) + HINT $38 + MOVD $810, R12 + B callbackasm1(SB) + HINT $38 + MOVD $811, R12 + B callbackasm1(SB) + HINT $38 + MOVD $812, R12 + B callbackasm1(SB) + HINT $38 + MOVD $813, R12 + B callbackasm1(SB) + HINT $38 + MOVD $814, R12 + B callbackasm1(SB) + HINT $38 + MOVD $815, R12 + B callbackasm1(SB) + HINT $38 + MOVD $816, R12 + B callbackasm1(SB) + HINT $38 + MOVD $817, R12 + B callbackasm1(SB) + HINT $38 + MOVD $818, R12 + B callbackasm1(SB) + HINT $38 + MOVD $819, R12 + B callbackasm1(SB) + HINT $38 + MOVD $820, R12 + B callbackasm1(SB) + HINT $38 + MOVD $821, R12 + B callbackasm1(SB) + HINT $38 + MOVD $822, R12 + B callbackasm1(SB) + HINT $38 + MOVD $823, R12 + B callbackasm1(SB) + HINT $38 + MOVD $824, R12 + B callbackasm1(SB) + HINT $38 + MOVD $825, R12 + B callbackasm1(SB) + HINT $38 + MOVD $826, R12 + B callbackasm1(SB) + HINT $38 + MOVD $827, R12 + B callbackasm1(SB) + HINT $38 + MOVD $828, R12 + B callbackasm1(SB) + HINT $38 + MOVD $829, R12 + B callbackasm1(SB) + HINT $38 + MOVD $830, R12 + B callbackasm1(SB) + HINT $38 + MOVD $831, R12 + B callbackasm1(SB) + HINT $38 + MOVD $832, R12 + B callbackasm1(SB) + HINT $38 + MOVD $833, R12 + B callbackasm1(SB) + HINT $38 + MOVD $834, R12 + B callbackasm1(SB) + HINT $38 + MOVD $835, R12 + B callbackasm1(SB) + HINT $38 + MOVD $836, R12 + B callbackasm1(SB) + HINT $38 + MOVD $837, R12 + B callbackasm1(SB) + HINT $38 + MOVD $838, R12 + B callbackasm1(SB) + HINT $38 + MOVD $839, R12 + B callbackasm1(SB) + HINT $38 + MOVD $840, R12 + B callbackasm1(SB) + HINT $38 + MOVD $841, R12 + B callbackasm1(SB) + HINT $38 + MOVD $842, R12 + B callbackasm1(SB) + HINT $38 + MOVD $843, R12 + B callbackasm1(SB) + HINT $38 + MOVD $844, R12 + B callbackasm1(SB) + HINT $38 + MOVD $845, R12 + B callbackasm1(SB) + HINT $38 + MOVD $846, R12 + B callbackasm1(SB) + HINT $38 + MOVD $847, R12 + B callbackasm1(SB) + HINT $38 + MOVD $848, R12 + B callbackasm1(SB) + HINT $38 + MOVD $849, R12 + B callbackasm1(SB) + HINT $38 + MOVD $850, R12 + B callbackasm1(SB) + HINT $38 + MOVD $851, R12 + B callbackasm1(SB) + HINT $38 + MOVD $852, R12 + B callbackasm1(SB) + HINT $38 + MOVD $853, R12 + B callbackasm1(SB) + HINT $38 + MOVD $854, R12 + B callbackasm1(SB) + HINT $38 + MOVD $855, R12 + B callbackasm1(SB) + HINT $38 + MOVD $856, R12 + B callbackasm1(SB) + HINT $38 + MOVD $857, R12 + B callbackasm1(SB) + HINT $38 + MOVD $858, R12 + B callbackasm1(SB) + HINT $38 + MOVD $859, R12 + B callbackasm1(SB) + HINT $38 + MOVD $860, R12 + B callbackasm1(SB) + HINT $38 + MOVD $861, R12 + B callbackasm1(SB) + HINT $38 + MOVD $862, R12 + B callbackasm1(SB) + HINT $38 + MOVD $863, R12 + B callbackasm1(SB) + HINT $38 + MOVD $864, R12 + B callbackasm1(SB) + HINT $38 + MOVD $865, R12 + B callbackasm1(SB) + HINT $38 + MOVD $866, R12 + B callbackasm1(SB) + HINT $38 + MOVD $867, R12 + B callbackasm1(SB) + HINT $38 + MOVD $868, R12 + B callbackasm1(SB) + HINT $38 + MOVD $869, R12 + B callbackasm1(SB) + HINT $38 + MOVD $870, R12 + B callbackasm1(SB) + HINT $38 + MOVD $871, R12 + B callbackasm1(SB) + HINT $38 + MOVD $872, R12 + B callbackasm1(SB) + HINT $38 + MOVD $873, R12 + B callbackasm1(SB) + HINT $38 + MOVD $874, R12 + B callbackasm1(SB) + HINT $38 + MOVD $875, R12 + B callbackasm1(SB) + HINT $38 + MOVD $876, R12 + B callbackasm1(SB) + HINT $38 + MOVD $877, R12 + B callbackasm1(SB) + HINT $38 + MOVD $878, R12 + B callbackasm1(SB) + HINT $38 + MOVD $879, R12 + B callbackasm1(SB) + HINT $38 + MOVD $880, R12 + B callbackasm1(SB) + HINT $38 + MOVD $881, R12 + B callbackasm1(SB) + HINT $38 + MOVD $882, R12 + B callbackasm1(SB) + HINT $38 + MOVD $883, R12 + B callbackasm1(SB) + HINT $38 + MOVD $884, R12 + B callbackasm1(SB) + HINT $38 + MOVD $885, R12 + B callbackasm1(SB) + HINT $38 + MOVD $886, R12 + B callbackasm1(SB) + HINT $38 + MOVD $887, R12 + B callbackasm1(SB) + HINT $38 + MOVD $888, R12 + B callbackasm1(SB) + HINT $38 + MOVD $889, R12 + B callbackasm1(SB) + HINT $38 + MOVD $890, R12 + B callbackasm1(SB) + HINT $38 + MOVD $891, R12 + B callbackasm1(SB) + HINT $38 + MOVD $892, R12 + B callbackasm1(SB) + HINT $38 + MOVD $893, R12 + B callbackasm1(SB) + HINT $38 + MOVD $894, R12 + B callbackasm1(SB) + HINT $38 + MOVD $895, R12 + B callbackasm1(SB) + HINT $38 + MOVD $896, R12 + B callbackasm1(SB) + HINT $38 + MOVD $897, R12 + B callbackasm1(SB) + HINT $38 + MOVD $898, R12 + B callbackasm1(SB) + HINT $38 + MOVD $899, R12 + B callbackasm1(SB) + HINT $38 + MOVD $900, R12 + B callbackasm1(SB) + HINT $38 + MOVD $901, R12 + B callbackasm1(SB) + HINT $38 + MOVD $902, R12 + B callbackasm1(SB) + HINT $38 + MOVD $903, R12 + B callbackasm1(SB) + HINT $38 + MOVD $904, R12 + B callbackasm1(SB) + HINT $38 + MOVD $905, R12 + B callbackasm1(SB) + HINT $38 + MOVD $906, R12 + B callbackasm1(SB) + HINT $38 + MOVD $907, R12 + B callbackasm1(SB) + HINT $38 + MOVD $908, R12 + B callbackasm1(SB) + HINT $38 + MOVD $909, R12 + B callbackasm1(SB) + HINT $38 + MOVD $910, R12 + B callbackasm1(SB) + HINT $38 + MOVD $911, R12 + B callbackasm1(SB) + HINT $38 + MOVD $912, R12 + B callbackasm1(SB) + HINT $38 + MOVD $913, R12 + B callbackasm1(SB) + HINT $38 + MOVD $914, R12 + B callbackasm1(SB) + HINT $38 + MOVD $915, R12 + B callbackasm1(SB) + HINT $38 + MOVD $916, R12 + B callbackasm1(SB) + HINT $38 + MOVD $917, R12 + B callbackasm1(SB) + HINT $38 + MOVD $918, R12 + B callbackasm1(SB) + HINT $38 + MOVD $919, R12 + B callbackasm1(SB) + HINT $38 + MOVD $920, R12 + B callbackasm1(SB) + HINT $38 + MOVD $921, R12 + B callbackasm1(SB) + HINT $38 + MOVD $922, R12 + B callbackasm1(SB) + HINT $38 + MOVD $923, R12 + B callbackasm1(SB) + HINT $38 + MOVD $924, R12 + B callbackasm1(SB) + HINT $38 + MOVD $925, R12 + B callbackasm1(SB) + HINT $38 + MOVD $926, R12 + B callbackasm1(SB) + HINT $38 + MOVD $927, R12 + B callbackasm1(SB) + HINT $38 + MOVD $928, R12 + B callbackasm1(SB) + HINT $38 + MOVD $929, R12 + B callbackasm1(SB) + HINT $38 + MOVD $930, R12 + B callbackasm1(SB) + HINT $38 + MOVD $931, R12 + B callbackasm1(SB) + HINT $38 + MOVD $932, R12 + B callbackasm1(SB) + HINT $38 + MOVD $933, R12 + B callbackasm1(SB) + HINT $38 + MOVD $934, R12 + B callbackasm1(SB) + HINT $38 + MOVD $935, R12 + B callbackasm1(SB) + HINT $38 + MOVD $936, R12 + B callbackasm1(SB) + HINT $38 + MOVD $937, R12 + B callbackasm1(SB) + HINT $38 + MOVD $938, R12 + B callbackasm1(SB) + HINT $38 + MOVD $939, R12 + B callbackasm1(SB) + HINT $38 + MOVD $940, R12 + B callbackasm1(SB) + HINT $38 + MOVD $941, R12 + B callbackasm1(SB) + HINT $38 + MOVD $942, R12 + B callbackasm1(SB) + HINT $38 + MOVD $943, R12 + B callbackasm1(SB) + HINT $38 + MOVD $944, R12 + B callbackasm1(SB) + HINT $38 + MOVD $945, R12 + B callbackasm1(SB) + HINT $38 + MOVD $946, R12 + B callbackasm1(SB) + HINT $38 + MOVD $947, R12 + B callbackasm1(SB) + HINT $38 + MOVD $948, R12 + B callbackasm1(SB) + HINT $38 + MOVD $949, R12 + B callbackasm1(SB) + HINT $38 + MOVD $950, R12 + B callbackasm1(SB) + HINT $38 + MOVD $951, R12 + B callbackasm1(SB) + HINT $38 + MOVD $952, R12 + B callbackasm1(SB) + HINT $38 + MOVD $953, R12 + B callbackasm1(SB) + HINT $38 + MOVD $954, R12 + B callbackasm1(SB) + HINT $38 + MOVD $955, R12 + B callbackasm1(SB) + HINT $38 + MOVD $956, R12 + B callbackasm1(SB) + HINT $38 + MOVD $957, R12 + B callbackasm1(SB) + HINT $38 + MOVD $958, R12 + B callbackasm1(SB) + HINT $38 + MOVD $959, R12 + B callbackasm1(SB) + HINT $38 + MOVD $960, R12 + B callbackasm1(SB) + HINT $38 + MOVD $961, R12 + B callbackasm1(SB) + HINT $38 + MOVD $962, R12 + B callbackasm1(SB) + HINT $38 + MOVD $963, R12 + B callbackasm1(SB) + HINT $38 + MOVD $964, R12 + B callbackasm1(SB) + HINT $38 + MOVD $965, R12 + B callbackasm1(SB) + HINT $38 + MOVD $966, R12 + B callbackasm1(SB) + HINT $38 + MOVD $967, R12 + B callbackasm1(SB) + HINT $38 + MOVD $968, R12 + B callbackasm1(SB) + HINT $38 + MOVD $969, R12 + B callbackasm1(SB) + HINT $38 + MOVD $970, R12 + B callbackasm1(SB) + HINT $38 + MOVD $971, R12 + B callbackasm1(SB) + HINT $38 + MOVD $972, R12 + B callbackasm1(SB) + HINT $38 + MOVD $973, R12 + B callbackasm1(SB) + HINT $38 + MOVD $974, R12 + B callbackasm1(SB) + HINT $38 + MOVD $975, R12 + B callbackasm1(SB) + HINT $38 + MOVD $976, R12 + B callbackasm1(SB) + HINT $38 + MOVD $977, R12 + B callbackasm1(SB) + HINT $38 + MOVD $978, R12 + B callbackasm1(SB) + HINT $38 + MOVD $979, R12 + B callbackasm1(SB) + HINT $38 + MOVD $980, R12 + B callbackasm1(SB) + HINT $38 + MOVD $981, R12 + B callbackasm1(SB) + HINT $38 + MOVD $982, R12 + B callbackasm1(SB) + HINT $38 + MOVD $983, R12 + B callbackasm1(SB) + HINT $38 + MOVD $984, R12 + B callbackasm1(SB) + HINT $38 + MOVD $985, R12 + B callbackasm1(SB) + HINT $38 + MOVD $986, R12 + B callbackasm1(SB) + HINT $38 + MOVD $987, R12 + B callbackasm1(SB) + HINT $38 + MOVD $988, R12 + B callbackasm1(SB) + HINT $38 + MOVD $989, R12 + B callbackasm1(SB) + HINT $38 + MOVD $990, R12 + B callbackasm1(SB) + HINT $38 + MOVD $991, R12 + B callbackasm1(SB) + HINT $38 + MOVD $992, R12 + B callbackasm1(SB) + HINT $38 + MOVD $993, R12 + B callbackasm1(SB) + HINT $38 + MOVD $994, R12 + B callbackasm1(SB) + HINT $38 + MOVD $995, R12 + B callbackasm1(SB) + HINT $38 + MOVD $996, R12 + B callbackasm1(SB) + HINT $38 + MOVD $997, R12 + B callbackasm1(SB) + HINT $38 + MOVD $998, R12 + B callbackasm1(SB) + HINT $38 + MOVD $999, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1000, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1001, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1002, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1003, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1004, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1005, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1006, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1007, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1008, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1009, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1010, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1011, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1012, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1013, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1014, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1015, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1016, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1017, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1018, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1019, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1020, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1021, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1022, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1023, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1024, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1025, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1026, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1027, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1028, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1029, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1030, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1031, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1032, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1033, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1034, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1035, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1036, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1037, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1038, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1039, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1040, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1041, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1042, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1043, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1044, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1045, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1046, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1047, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1048, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1049, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1050, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1051, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1052, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1053, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1054, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1055, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1056, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1057, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1058, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1059, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1060, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1061, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1062, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1063, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1064, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1065, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1066, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1067, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1068, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1069, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1070, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1071, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1072, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1073, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1074, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1075, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1076, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1077, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1078, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1079, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1080, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1081, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1082, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1083, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1084, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1085, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1086, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1087, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1088, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1089, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1090, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1091, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1092, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1093, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1094, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1095, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1096, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1097, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1098, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1099, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1100, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1101, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1102, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1103, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1104, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1105, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1106, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1107, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1108, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1109, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1110, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1111, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1112, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1113, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1114, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1115, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1116, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1117, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1118, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1119, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1120, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1121, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1122, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1123, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1124, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1125, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1126, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1127, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1128, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1129, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1130, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1131, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1132, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1133, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1134, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1135, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1136, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1137, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1138, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1139, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1140, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1141, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1142, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1143, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1144, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1145, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1146, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1147, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1148, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1149, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1150, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1151, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1152, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1153, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1154, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1155, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1156, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1157, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1158, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1159, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1160, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1161, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1162, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1163, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1164, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1165, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1166, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1167, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1168, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1169, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1170, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1171, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1172, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1173, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1174, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1175, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1176, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1177, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1178, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1179, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1180, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1181, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1182, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1183, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1184, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1185, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1186, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1187, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1188, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1189, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1190, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1191, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1192, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1193, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1194, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1195, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1196, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1197, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1198, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1199, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1200, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1201, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1202, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1203, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1204, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1205, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1206, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1207, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1208, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1209, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1210, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1211, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1212, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1213, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1214, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1215, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1216, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1217, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1218, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1219, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1220, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1221, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1222, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1223, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1224, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1225, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1226, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1227, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1228, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1229, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1230, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1231, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1232, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1233, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1234, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1235, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1236, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1237, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1238, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1239, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1240, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1241, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1242, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1243, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1244, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1245, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1246, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1247, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1248, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1249, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1250, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1251, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1252, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1253, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1254, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1255, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1256, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1257, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1258, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1259, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1260, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1261, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1262, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1263, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1264, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1265, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1266, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1267, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1268, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1269, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1270, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1271, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1272, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1273, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1274, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1275, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1276, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1277, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1278, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1279, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1280, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1281, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1282, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1283, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1284, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1285, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1286, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1287, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1288, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1289, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1290, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1291, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1292, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1293, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1294, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1295, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1296, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1297, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1298, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1299, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1300, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1301, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1302, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1303, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1304, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1305, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1306, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1307, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1308, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1309, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1310, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1311, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1312, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1313, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1314, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1315, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1316, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1317, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1318, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1319, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1320, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1321, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1322, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1323, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1324, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1325, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1326, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1327, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1328, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1329, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1330, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1331, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1332, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1333, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1334, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1335, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1336, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1337, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1338, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1339, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1340, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1341, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1342, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1343, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1344, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1345, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1346, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1347, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1348, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1349, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1350, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1351, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1352, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1353, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1354, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1355, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1356, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1357, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1358, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1359, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1360, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1361, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1362, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1363, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1364, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1365, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1366, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1367, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1368, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1369, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1370, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1371, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1372, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1373, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1374, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1375, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1376, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1377, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1378, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1379, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1380, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1381, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1382, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1383, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1384, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1385, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1386, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1387, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1388, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1389, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1390, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1391, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1392, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1393, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1394, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1395, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1396, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1397, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1398, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1399, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1400, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1401, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1402, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1403, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1404, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1405, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1406, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1407, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1408, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1409, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1410, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1411, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1412, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1413, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1414, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1415, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1416, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1417, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1418, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1419, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1420, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1421, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1422, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1423, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1424, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1425, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1426, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1427, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1428, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1429, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1430, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1431, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1432, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1433, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1434, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1435, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1436, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1437, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1438, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1439, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1440, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1441, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1442, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1443, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1444, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1445, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1446, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1447, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1448, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1449, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1450, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1451, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1452, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1453, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1454, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1455, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1456, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1457, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1458, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1459, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1460, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1461, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1462, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1463, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1464, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1465, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1466, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1467, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1468, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1469, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1470, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1471, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1472, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1473, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1474, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1475, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1476, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1477, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1478, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1479, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1480, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1481, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1482, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1483, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1484, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1485, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1486, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1487, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1488, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1489, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1490, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1491, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1492, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1493, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1494, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1495, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1496, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1497, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1498, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1499, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1500, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1501, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1502, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1503, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1504, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1505, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1506, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1507, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1508, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1509, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1510, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1511, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1512, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1513, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1514, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1515, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1516, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1517, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1518, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1519, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1520, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1521, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1522, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1523, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1524, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1525, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1526, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1527, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1528, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1529, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1530, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1531, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1532, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1533, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1534, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1535, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1536, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1537, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1538, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1539, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1540, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1541, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1542, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1543, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1544, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1545, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1546, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1547, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1548, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1549, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1550, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1551, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1552, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1553, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1554, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1555, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1556, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1557, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1558, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1559, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1560, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1561, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1562, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1563, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1564, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1565, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1566, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1567, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1568, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1569, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1570, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1571, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1572, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1573, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1574, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1575, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1576, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1577, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1578, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1579, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1580, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1581, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1582, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1583, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1584, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1585, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1586, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1587, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1588, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1589, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1590, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1591, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1592, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1593, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1594, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1595, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1596, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1597, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1598, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1599, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1600, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1601, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1602, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1603, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1604, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1605, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1606, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1607, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1608, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1609, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1610, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1611, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1612, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1613, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1614, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1615, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1616, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1617, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1618, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1619, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1620, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1621, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1622, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1623, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1624, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1625, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1626, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1627, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1628, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1629, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1630, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1631, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1632, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1633, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1634, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1635, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1636, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1637, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1638, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1639, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1640, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1641, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1642, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1643, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1644, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1645, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1646, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1647, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1648, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1649, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1650, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1651, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1652, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1653, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1654, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1655, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1656, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1657, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1658, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1659, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1660, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1661, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1662, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1663, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1664, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1665, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1666, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1667, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1668, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1669, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1670, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1671, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1672, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1673, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1674, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1675, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1676, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1677, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1678, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1679, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1680, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1681, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1682, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1683, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1684, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1685, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1686, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1687, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1688, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1689, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1690, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1691, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1692, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1693, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1694, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1695, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1696, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1697, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1698, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1699, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1700, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1701, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1702, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1703, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1704, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1705, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1706, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1707, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1708, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1709, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1710, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1711, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1712, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1713, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1714, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1715, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1716, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1717, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1718, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1719, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1720, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1721, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1722, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1723, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1724, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1725, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1726, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1727, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1728, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1729, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1730, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1731, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1732, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1733, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1734, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1735, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1736, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1737, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1738, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1739, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1740, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1741, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1742, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1743, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1744, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1745, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1746, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1747, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1748, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1749, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1750, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1751, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1752, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1753, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1754, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1755, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1756, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1757, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1758, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1759, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1760, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1761, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1762, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1763, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1764, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1765, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1766, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1767, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1768, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1769, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1770, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1771, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1772, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1773, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1774, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1775, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1776, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1777, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1778, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1779, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1780, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1781, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1782, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1783, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1784, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1785, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1786, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1787, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1788, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1789, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1790, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1791, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1792, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1793, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1794, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1795, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1796, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1797, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1798, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1799, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1800, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1801, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1802, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1803, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1804, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1805, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1806, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1807, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1808, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1809, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1810, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1811, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1812, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1813, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1814, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1815, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1816, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1817, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1818, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1819, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1820, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1821, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1822, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1823, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1824, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1825, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1826, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1827, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1828, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1829, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1830, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1831, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1832, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1833, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1834, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1835, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1836, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1837, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1838, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1839, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1840, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1841, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1842, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1843, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1844, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1845, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1846, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1847, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1848, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1849, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1850, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1851, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1852, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1853, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1854, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1855, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1856, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1857, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1858, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1859, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1860, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1861, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1862, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1863, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1864, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1865, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1866, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1867, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1868, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1869, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1870, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1871, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1872, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1873, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1874, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1875, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1876, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1877, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1878, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1879, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1880, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1881, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1882, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1883, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1884, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1885, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1886, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1887, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1888, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1889, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1890, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1891, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1892, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1893, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1894, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1895, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1896, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1897, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1898, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1899, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1900, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1901, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1902, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1903, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1904, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1905, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1906, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1907, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1908, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1909, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1910, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1911, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1912, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1913, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1914, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1915, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1916, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1917, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1918, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1919, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1920, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1921, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1922, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1923, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1924, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1925, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1926, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1927, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1928, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1929, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1930, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1931, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1932, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1933, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1934, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1935, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1936, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1937, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1938, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1939, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1940, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1941, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1942, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1943, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1944, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1945, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1946, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1947, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1948, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1949, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1950, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1951, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1952, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1953, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1954, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1955, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1956, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1957, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1958, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1959, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1960, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1961, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1962, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1963, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1964, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1965, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1966, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1967, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1968, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1969, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1970, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1971, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1972, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1973, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1974, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1975, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1976, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1977, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1978, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1979, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1980, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1981, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1982, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1983, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1984, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1985, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1986, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1987, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1988, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1989, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1990, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1991, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1992, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1993, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1994, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1995, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1996, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1997, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1998, R12 + B callbackasm1(SB) + HINT $38 + MOVD $1999, R12 + B callbackasm1(SB)