[Pkg-golang-commits] [golang] 21/27: * Update d/patches/0001-s390x-port.patch from IBM's repo.
Michael Hudson-Doyle
mwhudson-guest at moszumanska.debian.org
Tue Mar 1 02:57:44 UTC 2016
This is an automated email from the git hooks/post-receive script.
mwhudson-guest pushed a commit to branch gbp
in repository golang.
commit 6d9f771f1f9d1ee1de00426ca1657d231fa15d70
Author: Michael Hudson-Doyle <michael.hudson at canonical.com>
Date: Fri Feb 12 10:42:29 2016 +1300
* Update d/patches/0001-s390x-port.patch from IBM's repo.
---
debian/patches/0001-s390x-port.patch | 1700 ++++++++++++++++++----------------
debian/patches/series | 2 +-
2 files changed, 878 insertions(+), 824 deletions(-)
diff --git a/debian/patches/0001-s390x-port.patch b/debian/patches/0001-s390x-port.patch
index e91f8a6..0c1fe29 100644
--- a/debian/patches/0001-s390x-port.patch
+++ b/debian/patches/0001-s390x-port.patch
@@ -1,31 +1,30 @@
-From 0a8f1b89b079033d8d21bf3b75a276f7fa8dd6fe Mon Sep 17 00:00:00 2001
+From e4d19dfc2ef61ebfa1cf512a99a0b59ff6bdb5ff Mon Sep 17 00:00:00 2001
From: wgo <billo at ca.ibm.com>
Date: Sun, 12 Jul 2015 23:28:19 -0400
Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
---
api/go1.6.txt | 9279 ++++++++++++++++++++
- misc/cgo/test/issue9400/asm_s390x.s | 32 +
+ misc/cgo/test/issue9400/asm_s390x.s | 31 +
src/cmd/api/goapi.go | 2 +
src/cmd/asm/internal/arch/arch.go | 55 +
src/cmd/asm/internal/arch/s390x.go | 116 +
src/cmd/asm/internal/asm/asm.go | 23 +
- src/cmd/cgo/main.go | 4 +-
+ src/cmd/cgo/main.go | 2 +-
src/cmd/cgo/out.go | 1 +
src/cmd/compile/internal/gc/cgen.go | 14 +-
- src/cmd/compile/internal/gc/go.go | 4 +
+ src/cmd/compile/internal/gc/go.go | 6 +
src/cmd/compile/internal/gc/gsubr.go | 6 +-
- src/cmd/compile/internal/gc/lex.go | 3 +
+ src/cmd/compile/internal/gc/lex.go | 4 +
src/cmd/compile/internal/gc/pgen.go | 4 +-
src/cmd/compile/internal/gc/reg.go | 6 +-
src/cmd/compile/internal/gc/walk.go | 4 +-
src/cmd/compile/internal/s390x/cgen.go | 178 +
src/cmd/compile/internal/s390x/galign.go | 95 +
src/cmd/compile/internal/s390x/ggen.go | 611 ++
- src/cmd/compile/internal/s390x/gsubr.go | 1048 +++
- src/cmd/compile/internal/s390x/opt.go | 12 +
- src/cmd/compile/internal/s390x/peep.go | 1303 +++
- src/cmd/compile/internal/s390x/prog.go | 182 +
+ src/cmd/compile/internal/s390x/gsubr.go | 976 ++
+ src/cmd/compile/internal/s390x/peep.go | 1407 +++
+ src/cmd/compile/internal/s390x/prog.go | 183 +
src/cmd/compile/internal/s390x/reg.go | 131 +
src/cmd/compile/main.go | 3 +
src/cmd/dist/build.go | 1 +
@@ -38,7 +37,7 @@ Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
src/cmd/internal/obj/s390x/anamesz.go | 64 +
src/cmd/internal/obj/s390x/asmz.go | 3983 +++++++++
src/cmd/internal/obj/s390x/listz.go | 70 +
- src/cmd/internal/obj/s390x/objz.go | 873 ++
+ src/cmd/internal/obj/s390x/objz.go | 900 ++
src/cmd/internal/obj/util.go | 2 +
src/cmd/internal/objfile/disasm.go | 1 +
src/cmd/internal/objfile/elf.go | 2 +
@@ -48,7 +47,7 @@ Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
src/cmd/link/internal/ld/elf.go | 120 +-
src/cmd/link/internal/ld/ldelf.go | 45 +-
src/cmd/link/internal/ld/link.go | 1 +
- src/cmd/link/internal/ld/symtab.go | 5 +-
+ src/cmd/link/internal/ld/symtab.go | 3 +-
src/cmd/link/internal/s390x/asm.go | 564 ++
src/cmd/link/internal/s390x/l.go | 78 +
src/cmd/link/internal/s390x/obj.go | 111 +
@@ -59,6 +58,7 @@ Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
src/crypto/aes/cipher_asm.go | 2 +-
src/crypto/aes/cipher_generic.go | 10 +-
src/crypto/aes/gcm_generic.go | 15 +
+ src/crypto/cipher/xor.go | 2 +-
src/crypto/sha1/sha1block_decl.go | 2 +-
src/crypto/sha1/sha1block_generic.go | 2 +-
src/crypto/sha1/sha1block_s390x.s | 37 +
@@ -70,54 +70,56 @@ Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
src/crypto/sha512/sha512block_decl.go | 2 +-
src/crypto/sha512/sha512block_generic.go | 9 +
src/crypto/sha512/sha512block_s390x.s | 37 +
+ src/crypto/x509/sec1.go | 8 +-
+ src/crypto/x509/sec1_test.go | 4 +-
src/debug/elf/elf.go | 66 +
src/debug/elf/file.go | 51 +
src/debug/gosym/pclntab.go | 2 +-
src/go/build/build.go | 1 +
src/hash/crc32/crc32_generic.go | 2 +-
- src/internal/syscall/unix/getrandom_linux_s390x.go | 9 +
+ src/internal/syscall/unix/getrandom_linux_s390x.go | 7 +
src/math/big/arith_s390x.s | 340 +
src/math/dim_s390x.s | 132 +
src/math/sqrt_s390x.s | 12 +
- src/math/stubs_s390x.s | 79 +
- src/net/dnsclient_unix_test.go | 2 +-
+ src/math/stubs_s390x.s | 77 +
+ src/net/http/fs_test.go | 6 +-
src/net/lookup_test.go | 5 +
- src/reflect/asm_s390x.s | 32 +
- src/runtime/asm_s390x.s | 1165 +++
- src/runtime/cgo/asm_s390x.s | 58 +
- src/runtime/cgo/callbacks_s390x.go | 12 +
- src/runtime/cgo/gcc_linux_s390x.c | 70 +
- src/runtime/cgo/gcc_s390x.S | 46 +
+ src/reflect/asm_s390x.s | 30 +
+ src/runtime/asm_s390x.s | 1162 +++
+ src/runtime/cgo/asm_s390x.s | 56 +
+ src/runtime/cgo/callbacks_s390x.go | 10 +
+ src/runtime/cgo/gcc_linux_s390x.c | 68 +
+ src/runtime/cgo/gcc_s390x.S | 44 +
src/runtime/cgocall.go | 6 +-
src/runtime/defs_linux_s390x.go | 176 +
src/runtime/extern.go | 2 +-
src/runtime/gcinfo_test.go | 2 +-
src/runtime/hash64.go | 2 +-
- src/runtime/internal/atomic/asm_s390x.s | 160 +
- src/runtime/internal/atomic/atomic_s390x.go | 96 +
+ src/runtime/internal/atomic/asm_s390x.s | 202 +
+ src/runtime/internal/atomic/atomic_s390x.go | 63 +
src/runtime/internal/sys/arch_s390x.go | 18 +
src/runtime/internal/sys/zgoarch_s390x.go | 26 +
- src/runtime/lfstack_linux_s390x.go | 32 +
- src/runtime/memclr_s390x.s | 124 +
- src/runtime/memmove_s390x.s | 191 +
+ src/runtime/lfstack_linux_s390x.go | 25 +
+ src/runtime/memclr_s390x.s | 122 +
+ src/runtime/memmove_s390x.s | 189 +
src/runtime/noasm.go | 2 +-
src/runtime/os1_linux_generic.go | 1 +
- src/runtime/os1_linux_s390x.go | 32 +
+ src/runtime/os1_linux_s390x.go | 29 +
src/runtime/os2_linux_generic.go | 1 +
- src/runtime/os2_linux_s390x.go | 25 +
- src/runtime/rt0_linux_s390x.s | 16 +
+ src/runtime/os2_linux_s390x.go | 22 +
+ src/runtime/rt0_linux_s390x.s | 20 +
src/runtime/runtime-gdb_test.go | 2 +-
- src/runtime/signal_linux_s390x.go | 53 +
- src/runtime/signal_s390x.go | 171 +
- src/runtime/sys_linux_s390x.s | 440 +
- src/runtime/sys_s390x.go | 50 +
- src/runtime/tls_s390x.s | 69 +
+ src/runtime/signal_linux_s390x.go | 50 +
+ src/runtime/signal_s390x.go | 170 +
+ src/runtime/sys_linux_s390x.s | 437 +
+ src/runtime/sys_s390x.go | 48 +
+ src/runtime/tls_s390x.s | 67 +
src/runtime/unaligned1.go | 2 +-
- src/sync/atomic/asm_s390x.s | 151 +
- src/syscall/asm_linux_s390x.s | 176 +
+ src/sync/atomic/asm_s390x.s | 149 +
+ src/syscall/asm_linux_s390x.s | 173 +
src/syscall/exec_linux.go | 7 +-
src/syscall/mkall.sh | 7 +
- src/syscall/syscall_linux_s390x.go | 299 +
+ src/syscall/syscall_linux_s390x.go | 296 +
src/syscall/types_linux.go | 18 +
src/syscall/zerrors_linux_s390x.go | 1869 ++++
src/syscall/zsyscall_linux_s390x.go | 1578 ++++
@@ -127,14 +129,13 @@ Subject: [PATCH] [s390x] Add support for Linux on IBM z architecture (s390x)
test/init1.go | 2 +-
test/nilptr3.go | 3 +-
test/nosplit.go | 3 +
- 123 files changed, 28653 insertions(+), 96 deletions(-)
+ 125 files changed, 28671 insertions(+), 102 deletions(-)
create mode 100644 misc/cgo/test/issue9400/asm_s390x.s
create mode 100644 src/cmd/asm/internal/arch/s390x.go
create mode 100644 src/cmd/compile/internal/s390x/cgen.go
create mode 100644 src/cmd/compile/internal/s390x/galign.go
create mode 100644 src/cmd/compile/internal/s390x/ggen.go
create mode 100644 src/cmd/compile/internal/s390x/gsubr.go
- create mode 100644 src/cmd/compile/internal/s390x/opt.go
create mode 100644 src/cmd/compile/internal/s390x/peep.go
create mode 100644 src/cmd/compile/internal/s390x/prog.go
create mode 100644 src/cmd/compile/internal/s390x/reg.go
@@ -9478,15 +9479,14 @@ index d63efd0..6261e9c 100644
+pkg syscall (linux-s390x), var Stdout int
diff --git a/misc/cgo/test/issue9400/asm_s390x.s b/misc/cgo/test/issue9400/asm_s390x.s
new file mode 100644
-index 0000000..d47e9b1
+index 0000000..ffe260a
--- /dev/null
+++ b/misc/cgo/test/issue9400/asm_s390x.s
-@@ -0,0 +1,32 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,31 @@
++// Copyright 2016 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.
+
-+// +build s390x
+// +build !gccgo
+
+#include "textflag.h"
@@ -9528,17 +9528,17 @@ index 8b20d12..373e71e 100644
{GOOS: "darwin", GOARCH: "386"},
{GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
diff --git a/src/cmd/asm/internal/arch/arch.go b/src/cmd/asm/internal/arch/arch.go
-index b6a51a8..902355f 100644
+index c14a13c..4cf5fb7 100644
--- a/src/cmd/asm/internal/arch/arch.go
+++ b/src/cmd/asm/internal/arch/arch.go
-@@ -11,6 +11,7 @@ import (
+@@ -10,6 +10,7 @@ import (
+ "cmd/internal/obj/arm64"
"cmd/internal/obj/mips"
"cmd/internal/obj/ppc64"
- "cmd/internal/obj/x86"
+ "cmd/internal/obj/s390x"
+ "cmd/internal/obj/x86"
"fmt"
"strings"
- )
@@ -82,6 +83,10 @@ func Set(GOARCH string) *Arch {
a := archPPC64()
a.LinkArch = &ppc64.Linkppc64le
@@ -9577,9 +9577,9 @@ index b6a51a8..902355f 100644
+ delete(register, "R13")
+ register["g"] = s390x.REG_R13
+ registerPrefix := map[string]bool{
-+ "AR": true,
-+ "F": true,
-+ "R": true,
++ "AR": true,
++ "F": true,
++ "R": true,
+ }
+
+ instructions := make(map[string]int)
@@ -9606,11 +9606,11 @@ index b6a51a8..902355f 100644
+}
diff --git a/src/cmd/asm/internal/arch/s390x.go b/src/cmd/asm/internal/arch/s390x.go
new file mode 100644
-index 0000000..b17b0af
+index 0000000..62a8101
--- /dev/null
+++ b/src/cmd/asm/internal/arch/s390x.go
@@ -0,0 +1,116 @@
-+// Copyright 2015 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
@@ -9655,7 +9655,7 @@ index 0000000..b17b0af
+ return false
+}
+
-+// Iss390xRLD reports whether the op (as defined by an s390x.A* constant) is
++// IsS390xRLD reports whether the op (as defined by an s390x.A* constant) is
+// one of the RLD-like instructions that require special handling.
+// The FMADD-like instructions behave similarly.
+func IsS390xRLD(op int) bool {
@@ -9675,7 +9675,7 @@ index 0000000..b17b0af
+ return false
+}
+
-+// Iss390xCMP reports whether the op (as defined by an s390x.A* constant) is
++// IsS390xCMP reports whether the op (as defined by an s390x.A* constant) is
+// one of the CMP instructions that require special handling.
+func IsS390xCMP(op int) bool {
+ switch op {
@@ -9685,7 +9685,7 @@ index 0000000..b17b0af
+ return false
+}
+
-+// Iss390xNEG reports whether the op (as defined by an s390x.A* constant) is
++// IsS390xNEG reports whether the op (as defined by an s390x.A* constant) is
+// one of the NEG-like instructions that require special handling.
+func IsS390xNEG(op int) bool {
+ switch op {
@@ -9727,7 +9727,7 @@ index 0000000..b17b0af
+ return 0, false
+}
diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go
-index 9da3664..0aa2382 100644
+index 9827d70..f67e8ee 100644
--- a/src/cmd/asm/internal/asm/asm.go
+++ b/src/cmd/asm/internal/asm/asm.go
@@ -381,6 +381,20 @@ func (p *Parser) asmJump(op int, cond string, a []obj.Addr) {
@@ -9768,22 +9768,13 @@ index 9da3664..0aa2382 100644
p.errorf("TODO: implement three-operand instructions for this architecture")
return
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
-index 0906ceb..38e672a 100644
+index 0906ceb..ff82e16 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
-@@ -142,7 +142,6 @@ var ptrSizeMap = map[string]int64{
- "mips64le": 8,
- "ppc64": 8,
- "ppc64le": 8,
-- "s390": 4,
- "s390x": 8,
- }
-
-@@ -155,8 +154,7 @@ var intSizeMap = map[string]int64{
- "mips64le": 8,
+@@ -156,7 +156,7 @@ var intSizeMap = map[string]int64{
"ppc64": 8,
"ppc64le": 8,
-- "s390": 4,
+ "s390": 4,
- "s390x": 4,
+ "s390x": 8,
}
@@ -9868,13 +9859,15 @@ index 6456240..8855bac 100644
}
w = int(nl.Type.Width * 8)
diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go
-index 3146cae..8c85c8f 100644
+index 3146cae..d4fec64 100644
--- a/src/cmd/compile/internal/gc/go.go
+++ b/src/cmd/compile/internal/gc/go.go
-@@ -493,6 +493,10 @@ var debugstr string
+@@ -493,6 +493,12 @@ var debugstr string
var Debug_checknil int
var Debug_typeassert int
++var Debugmovprop int = -1
++
+var Debugmergeopmv int = -1
+
+var Debugcnb int = -1
@@ -9883,7 +9876,7 @@ index 3146cae..8c85c8f 100644
var localpkg *Pkg // package being compiled
diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go
-index 30bf736..20d14cf 100644
+index 30bf736..4a4d23e 100644
--- a/src/cmd/compile/internal/gc/gsubr.go
+++ b/src/cmd/compile/internal/gc/gsubr.go
@@ -57,7 +57,7 @@ func Ismem(n *Node) bool {
@@ -9891,7 +9884,7 @@ index 30bf736..20d14cf 100644
case OADDR:
- return Thearch.Thechar == '6' || Thearch.Thechar == '9' // because 6g uses PC-relative addressing; TODO(rsc): not sure why 9g too
-+ return Thearch.Thechar == '6' || Thearch.Thechar == '9' || Ctxt.Arch.Thechar == 'z' // because 6g uses PC-relative addressing; TODO(rsc): not sure why 9g too
++ return Thearch.Thechar == '6' || Thearch.Thechar == '9' || Ctxt.Arch.Thechar == 'z' // because 6g uses PC-relative addressing; TODO(rsc): not sure why 9g too
}
return false
@@ -9914,7 +9907,7 @@ index 30bf736..20d14cf 100644
}
if a.Type != obj.TYPE_MEM {
diff --git a/src/cmd/compile/internal/gc/lex.go b/src/cmd/compile/internal/gc/lex.go
-index fb30d58..83ba689 100644
+index b9c2735..cf48d0f 100644
--- a/src/cmd/compile/internal/gc/lex.go
+++ b/src/cmd/compile/internal/gc/lex.go
@@ -178,12 +178,14 @@ func Main() {
@@ -9932,8 +9925,11 @@ index fb30d58..83ba689 100644
obj.Flagstr("d", "print debug information about items in `list`", &debugstr)
obj.Flagcount("e", "no limit on number of errors reported", &Debug['e'])
obj.Flagcount("f", "debug stack frames", &Debug['f'])
-@@ -198,6 +200,7 @@ func Main() {
+@@ -196,8 +198,10 @@ func Main() {
+ obj.Flagcount("l", "disable inlining", &Debug['l'])
+ obj.Flagcount("live", "debug liveness analysis", &debuglive)
obj.Flagcount("m", "print optimization decisions", &Debug['m'])
++ obj.Flagcount("movprop", "debug MOV copy propagation, step n", &Debugmovprop)
obj.Flagcount("msan", "build code compatible with C/C++ memory sanitizer", &flag_msan)
obj.Flagcount("newexport", "use new export format", &newexport) // TODO(gri) remove eventually (issue 13241)
+ obj.Flagcount("mergeopmv", "debug merge operation-move optimization, step n", &Debugmergeopmv)
@@ -10017,11 +10013,11 @@ index e008317..0335138 100644
diff --git a/src/cmd/compile/internal/s390x/cgen.go b/src/cmd/compile/internal/s390x/cgen.go
new file mode 100644
-index 0000000..a6fc7e3
+index 0000000..8b047ed
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/cgen.go
@@ -0,0 +1,178 @@
-+// Copyright 2009 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
@@ -10201,11 +10197,11 @@ index 0000000..a6fc7e3
+}
diff --git a/src/cmd/compile/internal/s390x/galign.go b/src/cmd/compile/internal/s390x/galign.go
new file mode 100644
-index 0000000..14e6fe7
+index 0000000..a1298a2
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/galign.go
@@ -0,0 +1,95 @@
-+// Copyright 2009 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
@@ -10302,11 +10298,11 @@ index 0000000..14e6fe7
+}
diff --git a/src/cmd/compile/internal/s390x/ggen.go b/src/cmd/compile/internal/s390x/ggen.go
new file mode 100644
-index 0000000..7e92422
+index 0000000..756f193
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/ggen.go
@@ -0,0 +1,611 @@
-+// Copyright 2009 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
@@ -10384,7 +10380,7 @@ index 0000000..7e92422
+ }
+
+ // Adjust the frame to account for LR.
-+ frame += 8
++ frame += gc.Ctxt.FixedFrameSize()
+ offset := frame + lo
+ reg := s390x.REGSP
+
@@ -10919,10 +10915,10 @@ index 0000000..7e92422
+}
diff --git a/src/cmd/compile/internal/s390x/gsubr.go b/src/cmd/compile/internal/s390x/gsubr.go
new file mode 100644
-index 0000000..2fafa7f
+index 0000000..a68864b
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/gsubr.go
-@@ -0,0 +1,1048 @@
+@@ -0,0 +1,976 @@
+// Derived from Inferno utils/6c/txt.c
+// http://code.google.com/p/inferno-os/source/browse/utils/6c/txt.c
+//
@@ -10967,19 +10963,16 @@ index 0000000..2fafa7f
+ s390x.REGZERO,
+ s390x.REGSP, // reserved for SP
+ s390x.REGG,
-+ s390x.REGTMP, // REGTMP
++ s390x.REGTMP,
+ s390x.REGTMP2,
+ s390x.FREGCVI,
+ s390x.FREGZERO,
+ s390x.FREGONE,
+ s390x.FREGTWO,
-+ // s390x.FREGTMP,
+}
+
-+/*
-+ * generate
-+ * as $c, n
-+ */
++// generate
++// as $c, n
+func ginscon(as int, c int64, n2 *gc.Node) {
+ var n1 gc.Node
+
@@ -11000,10 +10993,8 @@ index 0000000..2fafa7f
+ rawgins(as, &n1, n2)
+}
+
-+/*
-+ * generate
-+ * as n, $c (CMP/CMPU)
-+ */
++// generate
++// as n, $c (CMP/CMPU)
+func ginscon2(as int, n2 *gc.Node, c int64) {
+ var n1 gc.Node
+
@@ -11133,11 +11124,9 @@ index 0000000..2fafa7f
+ return true
+}
+
-+/*
-+ * generate move:
-+ * t = f
-+ * hard part is conversions.
-+ */
++// generate move:
++// t = f
++// hard part is conversions.
+func gmove(f *gc.Node, t *gc.Node) {
+ if gc.Debug['M'] != 0 {
+ fmt.Printf("gmove %v -> %v\n", gc.Nconv(f, obj.FmtLong), gc.Nconv(t, obj.FmtLong))
@@ -11197,40 +11186,20 @@ index 0000000..2fafa7f
+ goto hard
+ }
+
-+ // float constants come from memory.
-+ //if(isfloat[tt])
-+ // goto hard;
-+
-+ // 64-bit immediates are also from memory.
-+ //if(isint[tt])
-+ // goto hard;
-+ //// 64-bit immediates are really 32-bit sign-extended
-+ //// unless moving into a register.
-+ //if(isint[tt]) {
-+ // if(mpcmpfixfix(con.val.u.xval, minintval[TINT32]) < 0)
-+ // goto hard;
-+ // if(mpcmpfixfix(con.val.u.xval, maxintval[TINT32]) > 0)
-+ // goto hard;
-+ //}
-+
+ // value -> value copy, only one memory operand.
+ // figure out the instruction to use.
+ // break out of switch for one-instruction gins.
+ // goto rdst for "destination must be register".
+ // goto hard for "convert to cvt type first".
+ // otherwise handle and return.
-+
+ switch uint32(ft)<<16 | uint32(tt) {
+ default:
+ gc.Fatalf("gmove %v -> %v", gc.Tconv(f.Type, obj.FmtLong), gc.Tconv(t.Type, obj.FmtLong))
+
-+ /*
-+ * integer copy and truncate
-+ */
-+ case gc.TINT8<<16 | gc.TINT8, // same size
++ // integer copy and truncate
++ case gc.TINT8<<16 | gc.TINT8,
+ gc.TUINT8<<16 | gc.TINT8,
+ gc.TINT16<<16 | gc.TINT8,
-+ // truncate
+ gc.TUINT16<<16 | gc.TINT8,
+ gc.TINT32<<16 | gc.TINT8,
+ gc.TUINT32<<16 | gc.TINT8,
@@ -11238,10 +11207,9 @@ index 0000000..2fafa7f
+ gc.TUINT64<<16 | gc.TINT8:
+ a = s390x.AMOVB
+
-+ case gc.TINT8<<16 | gc.TUINT8, // same size
++ case gc.TINT8<<16 | gc.TUINT8,
+ gc.TUINT8<<16 | gc.TUINT8,
+ gc.TINT16<<16 | gc.TUINT8,
-+ // truncate
+ gc.TUINT16<<16 | gc.TUINT8,
+ gc.TINT32<<16 | gc.TUINT8,
+ gc.TUINT32<<16 | gc.TUINT8,
@@ -11249,231 +11217,195 @@ index 0000000..2fafa7f
+ gc.TUINT64<<16 | gc.TUINT8:
+ a = s390x.AMOVBZ
+
-+ case gc.TINT16<<16 | gc.TINT16, // same size
++ case gc.TINT16<<16 | gc.TINT16,
+ gc.TUINT16<<16 | gc.TINT16,
+ gc.TINT32<<16 | gc.TINT16,
-+ // truncate
+ gc.TUINT32<<16 | gc.TINT16,
+ gc.TINT64<<16 | gc.TINT16,
+ gc.TUINT64<<16 | gc.TINT16:
+ a = s390x.AMOVH
+
-+ case gc.TINT16<<16 | gc.TUINT16, // same size
++ case gc.TINT16<<16 | gc.TUINT16,
+ gc.TUINT16<<16 | gc.TUINT16,
+ gc.TINT32<<16 | gc.TUINT16,
-+ // truncate
+ gc.TUINT32<<16 | gc.TUINT16,
+ gc.TINT64<<16 | gc.TUINT16,
+ gc.TUINT64<<16 | gc.TUINT16:
+ a = s390x.AMOVHZ
+
-+ case gc.TINT32<<16 | gc.TINT32, // same size
++ case gc.TINT32<<16 | gc.TINT32,
+ gc.TUINT32<<16 | gc.TINT32,
+ gc.TINT64<<16 | gc.TINT32,
-+ // truncate
+ gc.TUINT64<<16 | gc.TINT32:
+ a = s390x.AMOVW
+
-+ case gc.TINT32<<16 | gc.TUINT32, // same size
++ case gc.TINT32<<16 | gc.TUINT32,
+ gc.TUINT32<<16 | gc.TUINT32,
+ gc.TINT64<<16 | gc.TUINT32,
+ gc.TUINT64<<16 | gc.TUINT32:
+ a = s390x.AMOVWZ
+
-+ case gc.TINT64<<16 | gc.TINT64, // same size
++ case gc.TINT64<<16 | gc.TINT64,
+ gc.TINT64<<16 | gc.TUINT64,
+ gc.TUINT64<<16 | gc.TINT64,
+ gc.TUINT64<<16 | gc.TUINT64:
+ a = s390x.AMOVD
+
-+ /*
-+ * integer up-conversions
-+ */
-+ case gc.TINT8<<16 | gc.TINT16, // sign extend int8
++ // sign extend int8
++ case gc.TINT8<<16 | gc.TINT16,
+ gc.TINT8<<16 | gc.TUINT16,
+ gc.TINT8<<16 | gc.TINT32,
+ gc.TINT8<<16 | gc.TUINT32,
+ gc.TINT8<<16 | gc.TINT64,
+ gc.TINT8<<16 | gc.TUINT64:
+ a = s390x.AMOVB
-+
+ goto rdst
+
-+ case gc.TUINT8<<16 | gc.TINT16, // zero extend uint8
++ // sign extend uint8
++ case gc.TUINT8<<16 | gc.TINT16,
+ gc.TUINT8<<16 | gc.TUINT16,
+ gc.TUINT8<<16 | gc.TINT32,
+ gc.TUINT8<<16 | gc.TUINT32,
+ gc.TUINT8<<16 | gc.TINT64,
+ gc.TUINT8<<16 | gc.TUINT64:
+ a = s390x.AMOVBZ
-+
+ goto rdst
+
-+ case gc.TINT16<<16 | gc.TINT32, // sign extend int16
++ // sign extend int16
++ case gc.TINT16<<16 | gc.TINT32,
+ gc.TINT16<<16 | gc.TUINT32,
+ gc.TINT16<<16 | gc.TINT64,
+ gc.TINT16<<16 | gc.TUINT64:
+ a = s390x.AMOVH
-+
+ goto rdst
+
-+ case gc.TUINT16<<16 | gc.TINT32, // zero extend uint16
++ // zero extend uint16
++ case gc.TUINT16<<16 | gc.TINT32,
+ gc.TUINT16<<16 | gc.TUINT32,
+ gc.TUINT16<<16 | gc.TINT64,
+ gc.TUINT16<<16 | gc.TUINT64:
+ a = s390x.AMOVHZ
-+
+ goto rdst
+
-+ case gc.TINT32<<16 | gc.TINT64, // sign extend int32
++ // sign extend int32
++ case gc.TINT32<<16 | gc.TINT64,
+ gc.TINT32<<16 | gc.TUINT64:
+ a = s390x.AMOVW
-+
+ goto rdst
+
-+ case gc.TUINT32<<16 | gc.TINT64, // zero extend uint32
++ // zero extend uint32
++ case gc.TUINT32<<16 | gc.TINT64,
+ gc.TUINT32<<16 | gc.TUINT64:
+ a = s390x.AMOVWZ
-+
+ goto rdst
+
-+ /*
-+ * float to integer
-+ */
++ // float to integer
+ case gc.TFLOAT32<<16 | gc.TUINT8,
+ gc.TFLOAT32<<16 | gc.TUINT16:
+ cvt = gc.Types[gc.TUINT32]
-+
+ goto hard
+
+ case gc.TFLOAT32<<16 | gc.TUINT32:
+ a = s390x.ACLFEBR
-+
+ goto rdst
+
+ case gc.TFLOAT32<<16 | gc.TUINT64:
+ a = s390x.ACLGEBR
-+
+ goto rdst
+
+ case gc.TFLOAT64<<16 | gc.TUINT8,
+ gc.TFLOAT64<<16 | gc.TUINT16:
+ cvt = gc.Types[gc.TUINT32]
-+
+ goto hard
+
+ case gc.TFLOAT64<<16 | gc.TUINT32:
+ a = s390x.ACLFDBR
-+
+ goto rdst
+
+ case gc.TFLOAT64<<16 | gc.TUINT64:
+ a = s390x.ACLGDBR
-+
+ goto rdst
+
+ case gc.TFLOAT32<<16 | gc.TINT8,
+ gc.TFLOAT32<<16 | gc.TINT16:
+ cvt = gc.Types[gc.TINT32]
-+
+ goto hard
+
+ case gc.TFLOAT32<<16 | gc.TINT32:
+ a = s390x.ACFEBRA
-+
+ goto rdst
+
+ case gc.TFLOAT32<<16 | gc.TINT64:
+ a = s390x.ACGEBRA
-+
+ goto rdst
+
+ case gc.TFLOAT64<<16 | gc.TINT8,
+ gc.TFLOAT64<<16 | gc.TINT16:
+ cvt = gc.Types[gc.TINT32]
-+
+ goto hard
+
+ case gc.TFLOAT64<<16 | gc.TINT32:
+ a = s390x.ACFDBRA
-+
+ goto rdst
+
+ case gc.TFLOAT64<<16 | gc.TINT64:
+ a = s390x.ACGDBRA
-+
+ goto rdst
+
-+ /*
-+ * integer to float
-+ */
++ // integer to float
+ case gc.TUINT8<<16 | gc.TFLOAT32,
+ gc.TUINT16<<16 | gc.TFLOAT32:
+ cvt = gc.Types[gc.TUINT32]
-+
+ goto hard
+
+ case gc.TUINT32<<16 | gc.TFLOAT32:
+ a = s390x.ACELFBR
-+
+ goto rdst
+
+ case gc.TUINT64<<16 | gc.TFLOAT32:
+ a = s390x.ACELGBR
-+
+ goto rdst
+
+ case gc.TUINT8<<16 | gc.TFLOAT64,
+ gc.TUINT16<<16 | gc.TFLOAT64:
+ cvt = gc.Types[gc.TUINT32]
-+
+ goto hard
+
+ case gc.TUINT32<<16 | gc.TFLOAT64:
+ a = s390x.ACDLFBR
-+
+ goto rdst
+
+ case gc.TUINT64<<16 | gc.TFLOAT64:
+ a = s390x.ACDLGBR
-+
+ goto rdst
+
+ case gc.TINT8<<16 | gc.TFLOAT32,
+ gc.TINT16<<16 | gc.TFLOAT32:
+ cvt = gc.Types[gc.TINT32]
-+
+ goto hard
+
+ case gc.TINT32<<16 | gc.TFLOAT32:
+ a = s390x.ACEFBRA
-+
+ goto rdst
+
+ case gc.TINT64<<16 | gc.TFLOAT32:
+ a = s390x.ACEGBRA
-+
+ goto rdst
+
+ case gc.TINT8<<16 | gc.TFLOAT64,
+ gc.TINT16<<16 | gc.TFLOAT64:
+ cvt = gc.Types[gc.TINT32]
-+
+ goto hard
+
+ case gc.TINT32<<16 | gc.TFLOAT64:
+ a = s390x.ACDFBRA
-+
+ goto rdst
+
+ case gc.TINT64<<16 | gc.TFLOAT64:
+ a = s390x.ACDGBRA
-+
+ goto rdst
+
-+ /*
-+ * float to float
-+ */
++ // float to float
+ case gc.TFLOAT32<<16 | gc.TFLOAT32:
+ a = s390x.AFMOVS
+
@@ -11546,14 +11478,11 @@ index 0000000..2fafa7f
+ return rawgins(as, f, t)
+}
+
-+/*
-+ * generate one instruction:
-+ * as f, t
-+ */
++// generate one instruction:
++// as f, t
+func rawgins(as int, f *gc.Node, t *gc.Node) *obj.Prog {
-+ // TODO(austin): Add self-move test like in 6g (but be careful
-+ // of truncation moves)
-+
++ // TODO(mundaym): add self-move tests like amd64 but be careful of
++ // truncation moves.
+ p := gc.Prog(as)
+ gc.Naddr(&p.From, f)
+ gc.Naddr(&p.To, t)
@@ -11603,9 +11532,7 @@ index 0000000..2fafa7f
+ return p
+}
+
-+/*
-+ * return Axxx for Oxxx on type t.
-+ */
++// optoas returns the Axxx equivalent of Oxxx for type t
+func optoas(op gc.Op, t *gc.Type) int {
+ if t == nil {
+ gc.Fatalf("optoas: t is nil")
@@ -11945,56 +11872,35 @@ index 0000000..2fafa7f
+)
+
+func xgen(n *gc.Node, a *gc.Node, o int) bool {
-+ // TODO(minux)
-+
-+ return -1 != 0 /*TypeKind(100016)*/
++ // TODO(mundaym)
++ return -1 != 0
+}
+
+func sudoclean() {
+ return
+}
+
-+/*
-+ * generate code to compute address of n,
-+ * a reference to a (perhaps nested) field inside
-+ * an array or struct.
-+ * return 0 on failure, 1 on success.
-+ * on success, leaves usable address in a.
-+ *
-+ * caller is responsible for calling sudoclean
-+ * after successful sudoaddable,
-+ * to release the register used for a.
-+ */
++// generate code to compute address of n,
++// a reference to a (perhaps nested) field inside
++// an array or struct.
++// return 0 on failure, 1 on success.
++// on success, leaves usable address in a.
++//
++// caller is responsible for calling sudoclean
++// after successful sudoaddable,
++// to release the register used for a.
+func sudoaddable(as int, n *gc.Node, a *obj.Addr) bool {
-+ // TODO(minux)
++ // TODO(mundaym)
+
+ *a = obj.Addr{}
+ return false
+}
-diff --git a/src/cmd/compile/internal/s390x/opt.go b/src/cmd/compile/internal/s390x/opt.go
-new file mode 100644
-index 0000000..07c2814
---- /dev/null
-+++ b/src/cmd/compile/internal/s390x/opt.go
-@@ -0,0 +1,12 @@
-+// Copyright 2014 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.
-+
-+package s390x
-+
-+// Many Power ISA arithmetic and logical instructions come in four
-+// standard variants. These bits let us map between variants.
-+const (
-+ V_CC = 1 << 0 // xCC (affect CR field 0 flags)
-+ V_V = 1 << 1 // xV (affect SO and OV flags)
-+)
diff --git a/src/cmd/compile/internal/s390x/peep.go b/src/cmd/compile/internal/s390x/peep.go
new file mode 100644
-index 0000000..9d7e8cc
+index 0000000..8654823
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/peep.go
-@@ -0,0 +1,1303 @@
+@@ -0,0 +1,1407 @@
+// Derived from Inferno utils/6c/peep.c
+// http://code.google.com/p/inferno-os/source/browse/utils/6c/peep.c
+//
@@ -12035,6 +11941,7 @@ index 0000000..9d7e8cc
+)
+
+var gactive uint32
++var movprop_cnt int
+var mergeopmv_cnt int
+var cnb_cnt int
+
@@ -12047,21 +11954,21 @@ index 0000000..9d7e8cc
+
+ var p *obj.Prog
+
-+ if false {
-+ // constant propagation
-+ // find MOV $con,R followed by
-+ // another MOV $con,R without
-+ // setting R in the interim
-+ for r := (*gc.Flow)(g.Start); r != nil; r = r.Link {
-+ p = r.Prog
-+ switch p.As {
-+ case s390x.AMOVB,
-+ s390x.AMOVW,
-+ s390x.AMOVD:
-+ if regtyp(&p.To) {
-+ if p.From.Type == obj.TYPE_CONST || p.From.Type == obj.TYPE_FCONST {
-+ conprop(r)
-+ }
++ // constant propagation
++ // find MOV $con,R followed by
++ // another MOV $con,R without
++ // setting R in the interim
++ for r := (*gc.Flow)(g.Start); r != nil; r = r.Link {
++ p = r.Prog
++ switch p.As {
++ case s390x.AMOVD,
++ s390x.AMOVW, s390x.AMOVWZ,
++ s390x.AMOVH, s390x.AMOVHZ,
++ s390x.AMOVB, s390x.AMOVBZ,
++ s390x.AFMOVS, s390x.AFMOVD:
++ if regtyp(&p.To) {
++ if p.From.Type == obj.TYPE_CONST || p.From.Type == obj.TYPE_FCONST {
++ conprop(r)
+ }
+ }
+ }
@@ -12127,6 +12034,118 @@ index 0000000..9d7e8cc
+ }
+
+ /*
++ * For any kind of MOV in (AMOVD, AFMOVD, AMOVW, AMOVWZ, AMOVH, AMOVHZ, AMOVB, AMOVBZ)
++ * MOV Ra, Rb; ...; MOV Rb, Rc; -> MOV Ra, Rc;
++ */
++
++ for r := (*gc.Flow)(g.Start); r != nil; r = r.Link {
++
++ if (gc.Debugmovprop != -1) && (movprop_cnt >= gc.Debugmovprop) {
++ break
++ }
++
++ p = r.Prog
++
++ switch p.As {
++ case
++ s390x.AMOVW, s390x.AMOVWZ,
++ s390x.AMOVH, s390x.AMOVHZ,
++ s390x.AMOVB, s390x.AMOVBZ:
++ if !regtyp(&p.From) || !regtyp(&p.To) {
++ continue
++ }
++
++ default:
++ continue
++ }
++
++ r0 := r
++ p0 := (*obj.Prog)(r0.Prog)
++ s0 := (*obj.Addr)(&p0.From)
++ v0 := (*obj.Addr)(&p0.To)
++ r1 := gc.Uniqs(r0)
++
++ // v0used: 0 means must not be used;
++ // 1 means didn't find, but can't decide;
++ // 2 means found a use, must be used;
++ // v0used is used as a tag to decide if r0 can be eliminited.
++ var v0used int = 1
++
++ for ; ; r1 = gc.Uniqs(r1) {
++ var p1 *obj.Prog
++ var t int
++
++ if r1 == nil || r1 == r0 {
++ break
++ }
++ if gc.Uniqp(r1) == nil {
++ break
++ }
++ breakloop := false
++ p1 = r1.Prog
++
++ if p1.As == p0.As && regtyp(&p1.From) && regtyp(&p1.To) && copyas(&p0.To, &p1.From) {
++ if gc.Debug['v'] != 0 {
++ fmt.Printf("mov prop\n")
++ fmt.Printf("%v\n", p0)
++ fmt.Printf("%v\n", p1)
++ }
++ p1.From = p0.From
++ movprop_cnt += 1
++ } else {
++ t = copyu(p1, v0, nil)
++ if gc.Debug['v'] != 0 {
++ fmt.Printf("try v0 mov prop t=%d\n", t)
++ fmt.Printf("%v\n", p0)
++ fmt.Printf("%v\n", p1)
++ }
++ switch t {
++ case 0: // miss
++ case 1: // use
++ v0used = 2
++ case 2, // rar
++ 4: // use and set
++ v0used = 2
++ breakloop = true
++ case 3: // set
++ if v0used != 2 {
++ v0used = 0
++ }
++ breakloop = true
++ default:
++ }
++
++ t = copyu(p1, s0, nil)
++ if gc.Debug['v'] != 0 {
++ fmt.Printf("try s0 mov prop t=%d\n", t)
++ fmt.Printf("%v\n", p0)
++ fmt.Printf("%v\n", p1)
++ }
++ switch t {
++ case 0, // miss
++ 1: // use
++ case 2, // rar
++ 4: // use and set
++ breakloop = true
++ case 3: // set
++ breakloop = true
++ default:
++ }
++ }
++ if breakloop {
++ break
++ }
++ }
++ if v0used == 0 {
++ excise(r0)
++ }
++ }
++
++ if gc.Debug['v'] != 0 && gc.Debug['v'] != 0 {
++ gc.Dumpit("pass 7 MOV copy propagation", g.Start, 0)
++ }
++
++ /*
+ * look for MOVB x,R; MOVB R,R (for small MOVs not handled above)
+ */
+ var p1 *obj.Prog
@@ -12435,22 +12454,11 @@ index 0000000..9d7e8cc
+ break
+
+ case 3: // set
-+ if p.As == p0.As {
-+ if p.From.Type == p0.From.Type {
-+ if p.From.Reg == p0.From.Reg {
-+ if p.From.Node == p0.From.Node {
-+ if p.From.Offset == p0.From.Offset {
-+ if p.From.Scale == p0.From.Scale {
-+ if p.From.Type == obj.TYPE_FCONST && p.From.Val.(float64) == p0.From.Val.(float64) {
-+ if p.From.Index == p0.From.Index {
-+ excise(r)
-+ goto loop
-+ }
-+ }
-+ }
-+ }
-+ }
-+ }
++ if p.As == p0.As && p.From.Type == p0.From.Type && p.From.Reg == p0.From.Reg && p.From.Node == p0.From.Node &&
++ p.From.Offset == p0.From.Offset && p.From.Scale == p0.From.Scale && p.From.Index == p0.From.Index {
++ if p.From.Val == p0.From.Val {
++ excise(r)
++ goto loop
+ }
+ }
+ }
@@ -13087,7 +13095,9 @@ index 0000000..9d7e8cc
+ case obj.APCDATA,
+ obj.AFUNCDATA,
+ obj.AVARDEF,
-+ obj.AVARKILL:
++ obj.AVARKILL,
++ obj.AVARLIVE,
++ obj.AUSEFIELD:
+ return 0
+ }
+}
@@ -13300,11 +13310,11 @@ index 0000000..9d7e8cc
+}
diff --git a/src/cmd/compile/internal/s390x/prog.go b/src/cmd/compile/internal/s390x/prog.go
new file mode 100644
-index 0000000..7330d32
+index 0000000..591638c
--- /dev/null
+++ b/src/cmd/compile/internal/s390x/prog.go
-@@ -0,0 +1,182 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,183 @@
++// Copyright 2016 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.
+
@@ -13340,6 +13350,7 @@ index 0000000..7330d32
+ obj.ACHECKNIL: {Flags: gc.LeftRead},
+ obj.AVARDEF: {Flags: gc.Pseudo | gc.RightWrite},
+ obj.AVARKILL: {Flags: gc.Pseudo | gc.RightWrite},
++ obj.AVARLIVE: {Flags: gc.Pseudo | gc.LeftRead},
+
+ // NOP is an internal no-op that also stands
+ // for USED and SET annotations, not the Power opcode.
@@ -13624,17 +13635,17 @@ index 0000000..ece9060
+ return gc.Bitno(b) + s390x.REG_F0
+}
diff --git a/src/cmd/compile/main.go b/src/cmd/compile/main.go
-index 3d11f51..a73f4f6 100644
+index 3d11f51..66bbf84 100644
--- a/src/cmd/compile/main.go
+++ b/src/cmd/compile/main.go
-@@ -11,6 +11,7 @@ import (
+@@ -10,6 +10,7 @@ import (
+ "cmd/compile/internal/arm64"
"cmd/compile/internal/mips64"
"cmd/compile/internal/ppc64"
- "cmd/compile/internal/x86"
+ "cmd/compile/internal/s390x"
+ "cmd/compile/internal/x86"
"cmd/internal/obj"
"fmt"
- "log"
@@ -38,5 +39,7 @@ func main() {
mips64.Main()
case "ppc64", "ppc64le":
@@ -13697,10 +13708,10 @@ index 1b5d1f9..cf8966d 100644
if strings.Contains(run("", CheckExit, "uname", "-v"), "RELEASE_ARM_") {
gohostarch = "arm"
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
-index ebeb11c..4e10902 100644
+index 1286700..0d4b8bf 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
-@@ -2954,6 +2954,8 @@ func (b *builder) gccArchArgs() []string {
+@@ -2957,6 +2957,8 @@ func (b *builder) gccArchArgs() []string {
return []string{"-m64"}
case "arm":
return []string{"-marm"} // not thumb
@@ -13710,7 +13721,7 @@ index ebeb11c..4e10902 100644
return nil
}
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
-index f7f7662..771ca29 100644
+index 762a49e..465e4d0 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -521,6 +521,9 @@ const (
@@ -14329,7 +14340,7 @@ index 0000000..230eddb
+// )
diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go
new file mode 100644
-index 0000000..b3d4bd5
+index 0000000..4fd0ee6
--- /dev/null
+++ b/src/cmd/internal/obj/s390x/asmz.go
@@ -0,0 +1,3983 @@
@@ -14678,7 +14689,7 @@ index 0000000..b3d4bd5
+ return
+ }
+ ctxt.Cursym = cursym
-+ ctxt.Autosize = int32(p.To.Offset + 8)
++ ctxt.Autosize = int32(p.To.Offset)
+
+ if oprange[AANDN&obj.AMask].start == nil {
+ buildop(ctxt)
@@ -14760,7 +14771,7 @@ index 0000000..b3d4bd5
+ return C_LAUTO
+
+ case obj.NAME_PARAM:
-+ ctxt.Instoffset = int64(ctxt.Autosize) + a.Offset + 8
++ ctxt.Instoffset = int64(ctxt.Autosize) + a.Offset + ctxt.FixedFrameSize()
+ if ctxt.Instoffset >= -BIG && ctxt.Instoffset < BIG {
+ return C_SAUTO
+ }
@@ -14822,7 +14833,7 @@ index 0000000..b3d4bd5
+ return C_LACON
+
+ case obj.NAME_PARAM:
-+ ctxt.Instoffset = int64(ctxt.Autosize) + a.Offset + 8
++ ctxt.Instoffset = int64(ctxt.Autosize) + a.Offset + ctxt.FixedFrameSize()
+ if ctxt.Instoffset >= -BIG && ctxt.Instoffset < BIG {
+ return C_SACON
+ }
@@ -17531,11 +17542,12 @@ index 0000000..b3d4bd5
+
+ case AMOVB, AMOVBZ: // The zero extension doesn't affect store instructions
+ RIL(b, OP_LARL, REGTMP, 0, asm)
++ adj := uint32(0) // adjustment needed for odd addresses
+ if v&1 != 0 {
-+ RX(OP_LA, REGTMP, REGTMP, 0, 1, asm)
+ v -= 1
++ adj = 1
+ }
-+ RX(OP_STC, uint32(p.From.Reg), REGTMP, 0, 0, asm)
++ RX(OP_STC, uint32(p.From.Reg), REGTMP, 0, adj, asm)
+
+ case AFMOVD:
+ RIL(b, OP_LARL, REGTMP, uint32(v), asm)
@@ -17557,8 +17569,7 @@ index 0000000..b3d4bd5
+ case AMOVD:
+ if d&1 != 0 {
+ RIL(b, OP_LARL, REGTMP, 0, asm)
-+ RX(OP_LA, REGTMP, REGTMP, 0, 1, asm)
-+ RXY(0, OP_LG, uint32(p.To.Reg), REGTMP, 0, 0, asm)
++ RXY(0, OP_LG, uint32(p.To.Reg), REGTMP, 0, 1, asm)
+ d -= 1
+ } else {
+ RIL(b, OP_LGRL, uint32(p.To.Reg), uint32(d), asm)
@@ -17578,16 +17589,16 @@ index 0000000..b3d4bd5
+
+ case AMOVB, AMOVBZ:
+ RIL(b, OP_LARL, REGTMP, 0, asm)
++ adj := uint32(0) // adjustment needed for odd addresses
+ if d&1 != 0 {
-+ RX(OP_LA, REGTMP, REGTMP, 0, 1, asm)
+ d -= 1
++ adj = 1
+ }
-+
+ switch p.As {
+ case AMOVB:
-+ RXY(0, OP_LGB, uint32(p.To.Reg), REGTMP, 0, 0, asm)
++ RXY(0, OP_LGB, uint32(p.To.Reg), REGTMP, 0, adj, asm)
+ case AMOVBZ:
-+ RXY(0, OP_LLGC, uint32(p.To.Reg), REGTMP, 0, 0, asm)
++ RXY(0, OP_LLGC, uint32(p.To.Reg), REGTMP, 0, adj, asm)
+ }
+
+ case AFMOVD:
@@ -18394,10 +18405,10 @@ index 0000000..8834deb
+}
diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go
new file mode 100644
-index 0000000..cf72382
+index 0000000..405a7d2
--- /dev/null
+++ b/src/cmd/internal/obj/s390x/objz.go
-@@ -0,0 +1,873 @@
+@@ -0,0 +1,900 @@
+// Based on cmd/internal/obj/ppc64/obj9.go.
+//
+// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
@@ -18518,6 +18529,19 @@ index 0000000..cf72382
+
+ p := cursym.Text
+ textstksiz := p.To.Offset
++ if textstksiz == -8 {
++ // Compatibility hack.
++ p.From3.Offset |= obj.NOFRAME
++ textstksiz = 0
++ }
++ if textstksiz%8 != 0 {
++ ctxt.Diag("frame size %d not a multiple of 8", textstksiz)
++ }
++ if p.From3.Offset&obj.NOFRAME != 0 {
++ if textstksiz != 0 {
++ ctxt.Diag("NOFRAME functions must have a frame size of 0, not %d", textstksiz)
++ }
++ }
+
+ cursym.Args = p.To.Val.(int32)
+ cursym.Locals = int32(textstksiz)
@@ -18671,19 +18695,27 @@ index 0000000..cf72382
+ o = int(p.As)
+ switch o {
+ case obj.ATEXT:
-+ autosize = int32(textstksiz + 8)
-+ if (p.Mark&LEAF != 0) && autosize <= 8 {
-+ autosize = 0
-+ } else if autosize&4 != 0 {
-+ autosize += 4
++ autosize = int32(textstksiz)
++
++ if p.Mark&LEAF != 0 && autosize == 0 && p.From3.Offset&obj.NOFRAME == 0 {
++ // A leaf function with no locals has no frame.
++ p.From3.Offset |= obj.NOFRAME
+ }
-+ p.To.Offset = int64(autosize) - 8
-+ if p.From3.Offset&obj.NOSPLIT == 0 {
-+ p = stacksplit(ctxt, p, autosize) // emit split check
++
++ if p.From3.Offset&obj.NOFRAME == 0 {
++ // If there is a stack frame at all, it includes
++ // space to save the LR.
++ autosize += int32(ctxt.FixedFrameSize())
+ }
+
++ p.To.Offset = int64(autosize)
++
+ q = p
+
++ if p.From3.Offset&obj.NOSPLIT == 0 {
++ p = stacksplit(ctxt, p, autosize) // emit split check
++ }
++
+ if autosize != 0 {
+ q = obj.Appendp(ctxt, p)
+ q.As = AADD
@@ -18693,10 +18725,9 @@ index 0000000..cf72382
+ q.To.Reg = REGSP
+ q.Spadj = autosize
+ } else if cursym.Text.Mark&LEAF == 0 {
-+ if ctxt.Debugvlog != 0 {
-+ fmt.Fprintf(ctxt.Bso, "save suppressed in: %s\n", cursym.Name)
-+ ctxt.Bso.Flush()
-+ }
++ // A very few functions that do not return to their caller
++ // (e.g. gogo) are not identified as leaves but still have
++ // no frame.
+ cursym.Text.Mark |= LEAF
+ }
+
@@ -18763,7 +18794,7 @@ index 0000000..cf72382
+ q = obj.Appendp(ctxt, q)
+ q.As = AADD
+ q.From.Type = obj.TYPE_CONST
-+ q.From.Offset = int64(autosize) + 8
++ q.From.Offset = int64(autosize) + ctxt.FixedFrameSize()
+ q.Reg = REGSP
+ q.To.Type = obj.TYPE_REG
+ q.To.Reg = REG_R5
@@ -18783,7 +18814,7 @@ index 0000000..cf72382
+ q = obj.Appendp(ctxt, q)
+ q.As = AADD
+ q.From.Type = obj.TYPE_CONST
-+ q.From.Offset = 8
++ q.From.Offset = ctxt.FixedFrameSize()
+ q.Reg = REGSP
+ q.To.Type = obj.TYPE_REG
+ q.To.Reg = REG_R6
@@ -18809,21 +18840,23 @@ index 0000000..cf72382
+ break
+ }
+
-+ if p.To.Sym != nil { // retjmp
-+ p.As = ABR
-+ p.To.Type = obj.TYPE_BRANCH
-+ break
-+ }
++ retTarget := p.To.Sym
+
+ if cursym.Text.Mark&LEAF != 0 {
+ if autosize == 0 {
+ p.As = ABR
+ p.From = obj.Addr{}
-+ p.To.Type = obj.TYPE_REG
-+ p.To.Reg = REG_LR
++ if retTarget == nil {
++ p.To.Type = obj.TYPE_REG
++ p.To.Reg = REG_LR
++ } else {
++ p.To.Type = obj.TYPE_BRANCH
++ p.To.Sym = retTarget
++ }
+ p.Mark |= BRANCH
+ break
+ }
++
+ p.As = AADD
+ p.From.Type = obj.TYPE_CONST
+ p.From.Offset = int64(autosize)
@@ -18863,8 +18896,13 @@ index 0000000..cf72382
+ q = obj.Appendp(ctxt, q)
+ q.As = ABR
+ q.From = obj.Addr{}
-+ q.To.Type = obj.TYPE_REG
-+ q.To.Reg = REG_LR
++ if retTarget == nil {
++ q.To.Type = obj.TYPE_REG
++ q.To.Reg = REG_LR
++ } else {
++ q.To.Type = obj.TYPE_BRANCH
++ q.To.Sym = retTarget
++ }
+ q.Mark |= BRANCH
+ q.Spadj = autosize
+
@@ -19272,14 +19310,14 @@ index 0000000..cf72382
+ Regsize: 8,
+}
diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go
-index 1a97429..3b056ca 100644
+index 5103299..06391cb 100644
--- a/src/cmd/internal/obj/util.go
+++ b/src/cmd/internal/obj/util.go
@@ -530,6 +530,7 @@ const (
RBasePPC64 = 4 * 1024 // range [4k, 8k)
RBaseARM64 = 8 * 1024 // range [8k, 13k)
- RBaseMIPS64 = 13 * 1024 // range [13k, 16k)
-+ RBaseS390X = 17 * 1024 // TODO(mundaym): 16 * 1024 doesn't work, conflict with MIPS?
+ RBaseMIPS64 = 13 * 1024 // range [13k, 14k)
++ RBaseS390X = 14 * 1024 // range [14k, 15k)
)
// RegisterRegister binds a pretty-printer (Rconv) for register
@@ -19474,7 +19512,7 @@ index ca8eabb..bf96661 100644
}
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go
-index 563600d..d44dc81 100644
+index 563600d..3ed7b35 100644
--- a/src/cmd/link/internal/ld/dwarf.go
+++ b/src/cmd/link/internal/ld/dwarf.go
@@ -1715,7 +1715,7 @@ func writelines() {
@@ -19506,7 +19544,7 @@ index 563600d..d44dc81 100644
+ uleb128put(int64(Thearch.Dwarfreglr))
} else {
+ Cput(DW_CFA_offset_extended)
-+ uleb128put(int64(Thearch.Dwarfreglr)) // return address
++ uleb128put(int64(Thearch.Dwarfreglr)) // return address
uleb128put(int64(-Thearch.Ptrsize) / DATAALIGNMENTFACTOR) // at cfa - x*4
}
@@ -19569,7 +19607,7 @@ index 563600d..d44dc81 100644
default:
sh.type_ = SHT_REL
diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go
-index a34cf3c..6942343 100644
+index 6d34978..00aa344 100644
--- a/src/cmd/link/internal/ld/elf.go
+++ b/src/cmd/link/internal/ld/elf.go
@@ -284,6 +284,8 @@ const (
@@ -19659,7 +19697,7 @@ index a34cf3c..6942343 100644
if Ctxt.Arch.ByteOrder == binary.BigEndian {
ehdr.flags = 1 /* Version 1 ABI */
} else {
-@@ -1370,13 +1434,25 @@ func elfdynhash() {
+@@ -1380,13 +1444,25 @@ func elfdynhash() {
buckets[b] = uint32(sy.Dynid)
}
@@ -19692,7 +19730,7 @@ index a34cf3c..6942343 100644
}
// version symbols
-@@ -1444,7 +1520,7 @@ func elfdynhash() {
+@@ -1454,7 +1530,7 @@ func elfdynhash() {
}
switch Thearch.Thechar {
@@ -19701,7 +19739,7 @@ index a34cf3c..6942343 100644
sy := Linklookup(Ctxt, ".rela.plt", 0)
if sy.Size > 0 {
Elfwritedynent(s, DT_PLTREL, DT_RELA)
-@@ -1584,7 +1660,7 @@ func elfshreloc(sect *Section) *ElfShdr {
+@@ -1594,7 +1670,7 @@ func elfshreloc(sect *Section) *ElfShdr {
var prefix string
var typ int
switch Thearch.Thechar {
@@ -19710,7 +19748,7 @@ index a34cf3c..6942343 100644
prefix = ".rela"
typ = SHT_RELA
default:
-@@ -1757,7 +1833,7 @@ func doelf() {
+@@ -1767,7 +1843,7 @@ func doelf() {
Debug['d'] = 1
switch Thearch.Thechar {
@@ -19719,7 +19757,7 @@ index a34cf3c..6942343 100644
Addstring(shstrtab, ".rela.text")
Addstring(shstrtab, ".rela.rodata")
Addstring(shstrtab, ".rela"+relro_prefix+".typelink")
-@@ -1803,7 +1879,7 @@ func doelf() {
+@@ -1813,7 +1889,7 @@ func doelf() {
if hasinitarr {
Addstring(shstrtab, ".init_array")
switch Thearch.Thechar {
@@ -19728,7 +19766,7 @@ index a34cf3c..6942343 100644
Addstring(shstrtab, ".rela.init_array")
default:
Addstring(shstrtab, ".rel.init_array")
-@@ -1830,7 +1906,7 @@ func doelf() {
+@@ -1840,7 +1916,7 @@ func doelf() {
Addstring(shstrtab, ".dynsym")
Addstring(shstrtab, ".dynstr")
switch Thearch.Thechar {
@@ -19737,7 +19775,7 @@ index a34cf3c..6942343 100644
Addstring(shstrtab, ".rela")
Addstring(shstrtab, ".rela.plt")
default:
-@@ -1848,7 +1924,7 @@ func doelf() {
+@@ -1858,7 +1934,7 @@ func doelf() {
s.Type = obj.SELFROSECT
s.Reachable = true
switch Thearch.Thechar {
@@ -19746,7 +19784,7 @@ index a34cf3c..6942343 100644
s.Size += ELF64SYMSIZE
default:
s.Size += ELF32SYMSIZE
-@@ -1866,7 +1942,7 @@ func doelf() {
+@@ -1876,7 +1952,7 @@ func doelf() {
/* relocation table */
switch Thearch.Thechar {
@@ -19755,7 +19793,7 @@ index a34cf3c..6942343 100644
s = Linklookup(Ctxt, ".rela", 0)
default:
s = Linklookup(Ctxt, ".rel", 0)
-@@ -1911,7 +1987,7 @@ func doelf() {
+@@ -1921,7 +1997,7 @@ func doelf() {
Thearch.Elfsetupplt()
switch Thearch.Thechar {
@@ -19764,7 +19802,7 @@ index a34cf3c..6942343 100644
s = Linklookup(Ctxt, ".rela.plt", 0)
default:
s = Linklookup(Ctxt, ".rel.plt", 0)
-@@ -1940,7 +2016,7 @@ func doelf() {
+@@ -1950,7 +2026,7 @@ func doelf() {
elfwritedynentsym(s, DT_SYMTAB, Linklookup(Ctxt, ".dynsym", 0))
switch Thearch.Thechar {
@@ -19773,7 +19811,7 @@ index a34cf3c..6942343 100644
Elfwritedynent(s, DT_SYMENT, ELF64SYMSIZE)
default:
Elfwritedynent(s, DT_SYMENT, ELF32SYMSIZE)
-@@ -1948,7 +2024,7 @@ func doelf() {
+@@ -1958,7 +2034,7 @@ func doelf() {
elfwritedynentsym(s, DT_STRTAB, Linklookup(Ctxt, ".dynstr", 0))
elfwritedynentsymsize(s, DT_STRSZ, Linklookup(Ctxt, ".dynstr", 0))
switch Thearch.Thechar {
@@ -19782,7 +19820,7 @@ index a34cf3c..6942343 100644
elfwritedynentsym(s, DT_RELA, Linklookup(Ctxt, ".rela", 0))
elfwritedynentsymsize(s, DT_RELASZ, Linklookup(Ctxt, ".rela", 0))
Elfwritedynent(s, DT_RELAENT, ELF64RELASIZE)
-@@ -1964,6 +2040,8 @@ func doelf() {
+@@ -1974,6 +2050,8 @@ func doelf() {
if Thearch.Thechar == '9' {
elfwritedynentsym(s, DT_PLTGOT, Linklookup(Ctxt, ".plt", 0))
@@ -19791,7 +19829,7 @@ index a34cf3c..6942343 100644
} else {
elfwritedynentsym(s, DT_PLTGOT, Linklookup(Ctxt, ".got.plt", 0))
}
-@@ -2059,6 +2137,8 @@ func Asmbelf(symo int64) {
+@@ -2069,6 +2147,8 @@ func Asmbelf(symo int64) {
eh.machine = EM_386
case '9':
eh.machine = EM_PPC64
@@ -19800,7 +19838,7 @@ index a34cf3c..6942343 100644
}
elfreserve := int64(ELFRESERVE)
-@@ -2244,7 +2324,7 @@ func Asmbelf(symo int64) {
+@@ -2254,7 +2334,7 @@ func Asmbelf(symo int64) {
}
switch eh.machine {
@@ -19809,7 +19847,7 @@ index a34cf3c..6942343 100644
sh := elfshname(".rela.plt")
sh.type_ = SHT_RELA
sh.flags = SHF_ALLOC
-@@ -2293,6 +2373,8 @@ func Asmbelf(symo int64) {
+@@ -2303,6 +2383,8 @@ func Asmbelf(symo int64) {
sh.flags = SHF_ALLOC + SHF_EXECINSTR
if eh.machine == EM_X86_64 {
sh.entsize = 16
@@ -19918,7 +19956,7 @@ index 73d23c6..75dc7e2 100644
RV_TYPE_MASK = RV_CHECK_OVERFLOW - 1
)
diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go
-index 3e6169e..10f6f3d 100644
+index 3e6169e..78198eb 100644
--- a/src/cmd/link/internal/ld/symtab.go
+++ b/src/cmd/link/internal/ld/symtab.go
@@ -67,7 +67,7 @@ func putelfstr(s string) int {
@@ -19938,15 +19976,6 @@ index 3e6169e..10f6f3d 100644
// The rest of moduledata is zero initialized.
// When linking an object that does not contain the runtime we are
// creating the moduledata from scratch and it does not have a
-@@ -569,7 +570,7 @@ func symtab() {
- moduledatatype := Linkrlookup(Ctxt, "type.runtime.moduledata", 0)
- moduledata.Size = decodetype_size(moduledatatype)
- Symgrow(Ctxt, moduledata, moduledata.Size)
--
-+
- lastmoduledatap := Linklookup(Ctxt, "runtime.lastmoduledatap", 0)
- if lastmoduledatap.Type != obj.SDYNIMPORT {
- lastmoduledatap.Type = obj.SNOPTRDATA
diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go
new file mode 100644
index 0000000..dfd3ad4
@@ -20719,17 +20748,17 @@ index 0000000..414c3a6
+ }
+}
diff --git a/src/cmd/link/main.go b/src/cmd/link/main.go
-index 63df8de..fd47d1b 100644
+index 63df8de..0122bda 100644
--- a/src/cmd/link/main.go
+++ b/src/cmd/link/main.go
-@@ -12,6 +12,7 @@ import (
+@@ -11,6 +11,7 @@ import (
+ "cmd/link/internal/arm64"
"cmd/link/internal/mips64"
"cmd/link/internal/ppc64"
- "cmd/link/internal/x86"
+ "cmd/link/internal/s390x"
+ "cmd/link/internal/x86"
"fmt"
"os"
- )
@@ -33,5 +34,7 @@ func main() {
mips64.Main()
case "ppc64", "ppc64le":
@@ -20761,14 +20790,14 @@ index 8ceaba0..cd55e16 100644
// TODO(jsing): Reenable once openbsd/arm has external linking support.
if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm" {
diff --git a/src/cmd/vet/asmdecl.go b/src/cmd/vet/asmdecl.go
-index e4a9871..2524cb4 100644
+index e4a9871..025d3e0 100644
--- a/src/cmd/vet/asmdecl.go
+++ b/src/cmd/vet/asmdecl.go
@@ -65,6 +65,7 @@ var (
asmArchAmd64p32 = asmArch{"amd64p32", 4, 4, 8, false, "SP", false}
asmArchPpc64 = asmArch{"ppc64", 8, 8, 8, true, "R1", true}
asmArchPpc64LE = asmArch{"ppc64le", 8, 8, 8, false, "R1", true}
-+ asmArchs390x = asmArch{"s390x", 8, 8, 8, true, "R15", true}
++ asmArchS390x = asmArch{"s390x", 8, 8, 8, true, "R15", true}
arches = []*asmArch{
&asmArch386,
@@ -20776,7 +20805,7 @@ index e4a9871..2524cb4 100644
&asmArchAmd64p32,
&asmArchPpc64,
&asmArchPpc64LE,
-+ &asmArchs390x,
++ &asmArchS390x,
}
)
@@ -20942,6 +20971,19 @@ index 0000000..8c8c066
+type aesCipherGCM struct {
+ aesCipher
+}
+diff --git a/src/crypto/cipher/xor.go b/src/crypto/cipher/xor.go
+index f88dc89..9e1151a 100644
+--- a/src/crypto/cipher/xor.go
++++ b/src/crypto/cipher/xor.go
+@@ -10,7 +10,7 @@ import (
+ )
+
+ const wordSize = int(unsafe.Sizeof(uintptr(0)))
+-const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64"
++const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x"
+
+ // fastXORBytes xors in bulk. It only works on architectures that
+ // support unaligned read/writes.
diff --git a/src/crypto/sha1/sha1block_decl.go b/src/crypto/sha1/sha1block_decl.go
index 24e521a..bddb747 100644
--- a/src/crypto/sha1/sha1block_decl.go
@@ -21179,8 +21221,56 @@ index 0000000..c875288
+ BR ·blockGeneric(SB)
+
+GLOBL ·kimdQueryResult(SB), NOPTR, $16
+diff --git a/src/crypto/x509/sec1.go b/src/crypto/x509/sec1.go
+index f484b6d..1424dea 100644
+--- a/src/crypto/x509/sec1.go
++++ b/src/crypto/x509/sec1.go
+@@ -41,8 +41,8 @@ func MarshalECPrivateKey(key *ecdsa.PrivateKey) ([]byte, error) {
+ }
+
+ privateKeyBytes := key.D.Bytes()
+- paddedPrivateKey := make([]byte, (key.Curve.Params().N.BitLen() + 7) / 8)
+- copy(paddedPrivateKey[len(paddedPrivateKey) - len(privateKeyBytes):], privateKeyBytes)
++ paddedPrivateKey := make([]byte, (key.Curve.Params().N.BitLen()+7)/8)
++ copy(paddedPrivateKey[len(paddedPrivateKey)-len(privateKeyBytes):], privateKeyBytes)
+
+ return asn1.Marshal(ecPrivateKey{
+ Version: 1,
+@@ -84,7 +84,7 @@ func parseECPrivateKey(namedCurveOID *asn1.ObjectIdentifier, der []byte) (key *e
+ priv.Curve = curve
+ priv.D = k
+
+- privateKey := make([]byte, (curveOrder.BitLen() + 7) / 8)
++ privateKey := make([]byte, (curveOrder.BitLen()+7)/8)
+
+ // Some private keys have leading zero padding. This is invalid
+ // according to [SEC1], but this code will ignore it.
+@@ -98,7 +98,7 @@ func parseECPrivateKey(namedCurveOID *asn1.ObjectIdentifier, der []byte) (key *e
+ // Some private keys remove all leading zeros, this is also invalid
+ // according to [SEC1] but since OpenSSL used to do this, we ignore
+ // this too.
+- copy(privateKey[len(privateKey) - len(privKey.PrivateKey):], privKey.PrivateKey)
++ copy(privateKey[len(privateKey)-len(privKey.PrivateKey):], privKey.PrivateKey)
+ priv.X, priv.Y = curve.ScalarBaseMult(privateKey)
+
+ return priv, nil
+diff --git a/src/crypto/x509/sec1_test.go b/src/crypto/x509/sec1_test.go
+index 5e9ded5..55b76d6 100644
+--- a/src/crypto/x509/sec1_test.go
++++ b/src/crypto/x509/sec1_test.go
+@@ -10,8 +10,8 @@ import (
+ "testing"
+ )
+
+-var ecKeyTests = []struct{
+- derHex string
++var ecKeyTests = []struct {
++ derHex string
+ shouldReserialize bool
+ }{
+ // Generated using:
diff --git a/src/debug/elf/elf.go b/src/debug/elf/elf.go
-index f53ba00..57d04df 100644
+index f53ba00..0ee840d 100644
--- a/src/debug/elf/elf.go
+++ b/src/debug/elf/elf.go
@@ -1725,6 +1725,72 @@ var rppc64Strings = []intName{
@@ -21191,46 +21281,46 @@ index f53ba00..57d04df 100644
+type R_S390X int
+
+const (
-+ R_390_NONE R_S390X = 0
-+ R_390_8 R_S390X = 1
-+ R_390_12 R_S390X = 2
-+ R_390_16 R_S390X = 3
-+ R_390_32 R_S390X = 4
-+ R_390_PC32 R_S390X = 5
-+ R_390_GOT12 R_S390X = 6
-+ R_390_GOT32 R_S390X = 7
-+ R_390_PLT32 R_S390X = 8
-+ R_390_COPY R_S390X = 9
-+ R_390_GLOB_DAT R_S390X = 10
-+ R_390_JMP_SLOT R_S390X = 11
-+ R_390_RELATIVE R_S390X = 12
-+ R_390_GOTOFF R_S390X = 13
-+ R_390_GOTPC R_S390X = 14
-+ R_390_GOT16 R_S390X = 15
-+ R_390_PC16 R_S390X = 16
-+ R_390_PC16DBL R_S390X = 17
-+ R_390_PLT16DBL R_S390X = 18
-+ R_390_PC32DBL R_S390X = 19
-+ R_390_PLT32DBL R_S390X = 20
-+ R_390_GOTPCDBL R_S390X = 21
-+ R_390_64 R_S390X = 22
-+ R_390_PC64 R_S390X = 23
-+ R_390_GOT64 R_S390X = 24
-+ R_390_PLT64 R_S390X = 25
-+ R_390_GOTENT R_S390X = 26
++ R_390_NONE R_S390X = 0
++ R_390_8 R_S390X = 1
++ R_390_12 R_S390X = 2
++ R_390_16 R_S390X = 3
++ R_390_32 R_S390X = 4
++ R_390_PC32 R_S390X = 5
++ R_390_GOT12 R_S390X = 6
++ R_390_GOT32 R_S390X = 7
++ R_390_PLT32 R_S390X = 8
++ R_390_COPY R_S390X = 9
++ R_390_GLOB_DAT R_S390X = 10
++ R_390_JMP_SLOT R_S390X = 11
++ R_390_RELATIVE R_S390X = 12
++ R_390_GOTOFF R_S390X = 13
++ R_390_GOTPC R_S390X = 14
++ R_390_GOT16 R_S390X = 15
++ R_390_PC16 R_S390X = 16
++ R_390_PC16DBL R_S390X = 17
++ R_390_PLT16DBL R_S390X = 18
++ R_390_PC32DBL R_S390X = 19
++ R_390_PLT32DBL R_S390X = 20
++ R_390_GOTPCDBL R_S390X = 21
++ R_390_64 R_S390X = 22
++ R_390_PC64 R_S390X = 23
++ R_390_GOT64 R_S390X = 24
++ R_390_PLT64 R_S390X = 25
++ R_390_GOTENT R_S390X = 26
+)
+
+var rs390xStrings = []intName{
-+ {0 , "R_390_NONE"},
-+ {1 , "R_390_8"},
-+ {2 , "R_390_12"},
-+ {3 , "R_390_16"},
-+ {4 , "R_390_32"},
-+ {5 , "R_390_PC32"},
-+ {6 , "R_390_GOT12"},
-+ {7 , "R_390_GOT32"},
-+ {8 , "R_390_PLT32"},
-+ {9 , "R_390_COPY"},
++ {0, "R_390_NONE"},
++ {1, "R_390_8"},
++ {2, "R_390_12"},
++ {3, "R_390_16"},
++ {4, "R_390_32"},
++ {5, "R_390_PC32"},
++ {6, "R_390_GOT12"},
++ {7, "R_390_GOT32"},
++ {8, "R_390_PLT32"},
++ {9, "R_390_COPY"},
+ {10, "R_390_GLOB_DAT"},
+ {11, "R_390_JMP_SLOT"},
+ {12, "R_390_RELATIVE"},
@@ -21257,7 +21347,7 @@ index f53ba00..57d04df 100644
type R_SPARC int
diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go
-index 199aa4e..43a1ce3 100644
+index 199aa4e..2221f3f 100644
--- a/src/debug/elf/file.go
+++ b/src/debug/elf/file.go
@@ -596,6 +596,8 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error {
@@ -21296,11 +21386,11 @@ index 199aa4e..43a1ce3 100644
+ continue
+ }
+ sym := &symbols[symNo-1]
-+ switch SymType(sym.Info&0xf) {
-+ case STT_SECTION, STT_NOTYPE:
-+ break
-+ default:
-+ continue
++ switch SymType(sym.Info & 0xf) {
++ case STT_SECTION, STT_NOTYPE:
++ break
++ default:
++ continue
+ }
+
+ switch t {
@@ -21339,14 +21429,14 @@ index 6620aef..1fcc8a8 100644
return
}
diff --git a/src/go/build/build.go b/src/go/build/build.go
-index 9539413..9b0834d 100644
+index c1b70bc..4cfc4be 100644
--- a/src/go/build/build.go
+++ b/src/go/build/build.go
@@ -282,6 +282,7 @@ var cgoEnabled = map[string]bool{
"solaris/amd64": true,
"windows/386": true,
"windows/amd64": true,
-+ "linux/s390x": true,
++ "linux/s390x": true,
}
func defaultContext() Context {
@@ -21365,30 +21455,28 @@ index 8fc11a7..25f2d55 100644
diff --git a/src/internal/syscall/unix/getrandom_linux_s390x.go b/src/internal/syscall/unix/getrandom_linux_s390x.go
new file mode 100644
-index 0000000..467dea1
+index 0000000..d435f71
--- /dev/null
+++ b/src/internal/syscall/unix/getrandom_linux_s390x.go
-@@ -0,0 +1,9 @@
-+// Copyright 2015 The Go Authors. All rights reserved.
+@@ -0,0 +1,7 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+package unix
+
+const randomTrap uintptr = 349
diff --git a/src/math/big/arith_s390x.s b/src/math/big/arith_s390x.s
new file mode 100644
-index 0000000..fe03e51
+index 0000000..956e5e9
--- /dev/null
+++ b/src/math/big/arith_s390x.s
@@ -0,0 +1,340 @@
-+// Copyright 2013 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
-+// +build !math_big_pure_go,s390x
++// +build !math_big_pure_go
+
+#include "textflag.h"
+
@@ -21434,8 +21522,8 @@ index 0000000..fe03e51
+ MOVD 8(R8)(R10*1), R6
+ MOVD 16(R8)(R10*1), R7
+ MOVD 24(R8)(R10*1), R1
-+ ADDC R4, R5 //SLGR -> SUBC
-+ ADDE R0, R6 //SLBGR -> SUBE
++ ADDC R4, R5 //SLGR -> SUBC
++ ADDE R0, R6 //SLBGR -> SUBE
+ ADDE R0, R7
+ ADDE R0, R1
+ ADDE R0, R0
@@ -21490,8 +21578,8 @@ index 0000000..fe03e51
+ MOVD 8(R8)(R10*1), R6
+ MOVD 16(R8)(R10*1), R7
+ MOVD 24(R8)(R10*1), R1
-+ SUBC R4, R5 //SLGR -> SUBC
-+ SUBE R0, R6 //SLBGR -> SUBE
++ SUBC R4, R5 // SLGR -> SUBC
++ SUBE R0, R6 // SLBGR -> SUBE
+ SUBE R0, R7
+ SUBE R0, R1
+ SUBE R4, R4 // save CF
@@ -21525,187 +21613,187 @@ index 0000000..fe03e51
+
+// func shlVU(z, x []Word, s uint) (c Word)
+TEXT ·shlVU(SB),NOSPLIT,$0
-+ MOVD z_len+8(FP), R5
-+ SUB $1, R5 // n--
-+ BLT X8b // n < 0 (n <= 0)
-+
-+ // n > 0
-+ MOVD s+48(FP), R4
-+ CMPBEQ R0, R4, Z80 //handle 0 case beq
-+ MOVD $64, R6
-+ CMP R6, R4
-+ BEQ Z864 //handle 64 case beq
-+ MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
-+ SUB R4, R6, R7
-+ MOVD (R8)(R5*1), R10 // w1 = x[i-1]
-+ SRD R7, R10, R3
-+ MOVD R3, c+56(FP)
-+
-+ MOVD $0, R1 // i = 0
-+ BR E8
-+
-+ // i < n-1
-+L8: MOVD R10, R3 // w = w1
-+ MOVD -8(R8)(R5*1), R10 // w1 = x[i+1]
-+
-+ SLD R4, R3 // w<<s | w1>>ŝ
-+ SRD R7, R10, R6
-+ OR R6, R3
-+ MOVD R3, (R2)(R5*1) // z[i] = w<<s | w1>>ŝ
-+ SUB $8, R5 // i--
-+
-+E8: CMP R5, R0
-+ BGT L8 // i < n-1
-+
-+ // i >= n-1
-+X8a: SLD R4, R10 // w1<<s
-+ MOVD R10, (R2) // z[0] = w1<<s
-+ RET
++ MOVD z_len+8(FP), R5
++ SUB $1, R5 // n--
++ BLT X8b // n < 0 (n <= 0)
++
++ // n > 0
++ MOVD s+48(FP), R4
++ CMPBEQ R0, R4, Z80 // handle 0 case beq
++ MOVD $64, R6
++ CMP R6, R4
++ BEQ Z864 // handle 64 case beq
++ MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
++ SUB R4, R6, R7
++ MOVD (R8)(R5*1), R10 // w1 = x[i-1]
++ SRD R7, R10, R3
++ MOVD R3, c+56(FP)
++
++ MOVD $0, R1 // i = 0
++ BR E8
++
++ // i < n-1
++L8: MOVD R10, R3 // w = w1
++ MOVD -8(R8)(R5*1), R10 // w1 = x[i+1]
++
++ SLD R4, R3 // w<<s | w1>>ŝ
++ SRD R7, R10, R6
++ OR R6, R3
++ MOVD R3, (R2)(R5*1) // z[i] = w<<s | w1>>ŝ
++ SUB $8, R5 // i--
++
++E8: CMP R5, R0
++ BGT L8 // i < n-1
++
++ // i >= n-1
++X8a: SLD R4, R10 // w1<<s
++ MOVD R10, (R2) // z[0] = w1<<s
++ RET
+
-+X8b: MOVD R0, c+56(FP)
-+ RET
++X8b: MOVD R0, c+56(FP)
++ RET
+
-+Z80: MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
++Z80: MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
+
-+ MOVD (R8), R10
-+ MOVD $0, R3
-+ MOVD R3, c+56(FP)
++ MOVD (R8), R10
++ MOVD $0, R3
++ MOVD R3, c+56(FP)
+
-+ MOVD $0, R1 // i = 0
-+ BR E8Z
++ MOVD $0, R1 // i = 0
++ BR E8Z
+
-+ // i < n-1
-+L8Z: MOVD R10, R3
-+ MOVD 8(R8)(R1*1), R10
++ // i < n-1
++L8Z: MOVD R10, R3
++ MOVD 8(R8)(R1*1), R10
+
-+ MOVD R3, (R2)(R1*1)
-+ ADD $8, R1
++ MOVD R3, (R2)(R1*1)
++ ADD $8, R1
+
-+E8Z: CMP R1, R5
-+ BLT L8Z
++E8Z: CMP R1, R5
++ BLT L8Z
+
-+ // i >= n-1
-+ MOVD R10, (R2)(R5*1)
-+ RET
++ // i >= n-1
++ MOVD R10, (R2)(R5*1)
++ RET
+
-+Z864: MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
-+ MOVD (R8)(R5*1), R3 // w1 = x[n-1]
-+ MOVD R3, c+56(FP) // z[i] = x[n-1]
++Z864: MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
++ MOVD (R8)(R5*1), R3 // w1 = x[n-1]
++ MOVD R3, c+56(FP) // z[i] = x[n-1]
+
-+ BR E864
++ BR E864
+
-+ // i < n-1
-+L864: MOVD -8(R8)(R5*1), R3
++ // i < n-1
++L864: MOVD -8(R8)(R5*1), R3
+
-+ MOVD R3, (R2)(R5*1) // z[i] = x[n-1]
-+ SUB $8, R5 // i--
++ MOVD R3, (R2)(R5*1) // z[i] = x[n-1]
++ SUB $8, R5 // i--
+
-+E864: CMP R5, R0
-+ BGT L864 // i < n-1
++E864: CMP R5, R0
++ BGT L864 // i < n-1
+
-+ MOVD R0, (R2) // z[n-1] = 0
++ MOVD R0, (R2) // z[n-1] = 0
+
-+ RET
++ RET
+
+
+// CX = R4, r8 = r8, r10 = r2 , r11 = r5, DX = r3, AX = r10 , BX = R1 , 64-count = r7 (R0 set to 0) temp = R6
+// func shrVU(z, x []Word, s uint) (c Word)
+TEXT ·shrVU(SB),NOSPLIT,$0
-+ MOVD z_len+8(FP), R5
-+ SUB $1, R5 // n--
-+ BLT X9b // n < 0 (n <= 0)
-+
-+ // n > 0
-+ MOVD s+48(FP), R4
-+ CMPBEQ R0, R4, ZB0 //handle 0 case beq
-+ MOVD $64, R6
-+ CMP R6, R4
-+ BEQ ZB64 //handle 64 case beq
-+ MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
-+ SUB R4, R6, R7
-+ MOVD (R8), R10 // w1 = x[0]
-+ SLD R7, R10, R3
-+ MOVD R3, c+56(FP)
-+
-+ MOVD $0, R1 // i = 0
-+ BR E9
-+
-+ // i < n-1
-+L9: MOVD R10, R3 // w = w1
-+ MOVD 8(R8)(R1*1), R10 // w1 = x[i+1]
-+
-+ SRD R4, R3 // w>>s | w1<<s
-+ SLD R7, R10, R6
-+ OR R6, R3
-+ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
-+ ADD $8, R1 // i++
-+
-+E9: CMP R1, R5
-+ BLT L9 // i < n-1
-+
-+ // i >= n-1
-+X9a: SRD R4, R10 // w1>>s
-+ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
-+ RET
++ MOVD z_len+8(FP), R5
++ SUB $1, R5 // n--
++ BLT X9b // n < 0 (n <= 0)
++
++ // n > 0
++ MOVD s+48(FP), R4
++ CMPBEQ R0, R4, ZB0 // handle 0 case beq
++ MOVD $64, R6
++ CMP R6, R4
++ BEQ ZB64 // handle 64 case beq
++ MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
++ SUB R4, R6, R7
++ MOVD (R8), R10 // w1 = x[0]
++ SLD R7, R10, R3
++ MOVD R3, c+56(FP)
++
++ MOVD $0, R1 // i = 0
++ BR E9
++
++ // i < n-1
++L9: MOVD R10, R3 // w = w1
++ MOVD 8(R8)(R1*1), R10 // w1 = x[i+1]
++
++ SRD R4, R3 // w>>s | w1<<s
++ SLD R7, R10, R6
++ OR R6, R3
++ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
++ ADD $8, R1 // i++
++
++E9: CMP R1, R5
++ BLT L9 // i < n-1
++
++ // i >= n-1
++X9a: SRD R4, R10 // w1>>s
++ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
++ RET
+
-+X9b: MOVD R0, c+56(FP)
-+ RET
++X9b: MOVD R0, c+56(FP)
++ RET
+
-+ZB0: MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
++ZB0: MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
+
-+ MOVD (R8), R10 // w1 = x[0]
-+ MOVD $0, R3 // R10 << 64
-+ MOVD R3, c+56(FP)
++ MOVD (R8), R10 // w1 = x[0]
++ MOVD $0, R3 // R10 << 64
++ MOVD R3, c+56(FP)
+
-+ MOVD $0, R1 // i = 0
-+ BR E9Z
++ MOVD $0, R1 // i = 0
++ BR E9Z
+
-+ // i < n-1
-+L9Z: MOVD R10, R3 // w = w1
-+ MOVD 8(R8)(R1*1), R10 // w1 = x[i+1]
++ // i < n-1
++L9Z: MOVD R10, R3 // w = w1
++ MOVD 8(R8)(R1*1), R10 // w1 = x[i+1]
+
-+ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
-+ ADD $8, R1 // i++
++ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
++ ADD $8, R1 // i++
+
-+E9Z: CMP R1, R5
-+ BLT L9Z // i < n-1
++E9Z: CMP R1, R5
++ BLT L9Z // i < n-1
+
-+ // i >= n-1
-+ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
-+ RET
++ // i >= n-1
++ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
++ RET
+
-+ZB64: MOVD z+0(FP), R2
-+ MOVD x+24(FP), R8
-+ SLD $3, R5 // n = n*8
-+ MOVD (R8), R3 // w1 = x[0]
-+ MOVD R3, c+56(FP)
++ZB64: MOVD z+0(FP), R2
++ MOVD x+24(FP), R8
++ SLD $3, R5 // n = n*8
++ MOVD (R8), R3 // w1 = x[0]
++ MOVD R3, c+56(FP)
+
-+ MOVD $0, R1 // i = 0
-+ BR E964
++ MOVD $0, R1 // i = 0
++ BR E964
+
-+ // i < n-1
-+L964: MOVD 8(R8)(R1*1), R3 // w1 = x[i+1]
++ // i < n-1
++L964: MOVD 8(R8)(R1*1), R3 // w1 = x[i+1]
+
-+ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
-+ ADD $8, R1 // i++
++ MOVD R3, (R2)(R1*1) // z[i] = w>>s | w1<<s
++ ADD $8, R1 // i++
+
-+E964: CMP R1, R5
-+ BLT L964 // i < n-1
++E964: CMP R1, R5
++ BLT L964 // i < n-1
+
-+ // i >= n-1
-+ MOVD $0, R10 // w1>>s
-+ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
-+ RET
++ // i >= n-1
++ MOVD $0, R10 // w1>>s
++ MOVD R10, (R2)(R5*1) // z[n-1] = w1>>s
++ RET
+
+TEXT ·mulAddVWW(SB),NOSPLIT,$0
+ BR ·mulAddVWW_g(SB)
@@ -21719,7 +21807,7 @@ index 0000000..fe03e51
+// func bitLen(x Word) (n int)
+TEXT ·bitLen(SB),NOSPLIT,$0
+ MOVD x+0(FP), R2
-+ WORD $0xb9830022 // FLOGR R2,R2
++ WORD $0xb9830022 // FLOGR R2,R2
+ MOVD $64, R3
+ SUB R2, R3
+ MOVD R3, n+8(FP)
@@ -21882,16 +21970,14 @@ index 0000000..3989b89
+ RET
diff --git a/src/math/stubs_s390x.s b/src/math/stubs_s390x.s
new file mode 100644
-index 0000000..55d51ae
+index 0000000..305480e
--- /dev/null
+++ b/src/math/stubs_s390x.s
-@@ -0,0 +1,79 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,77 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "../runtime/textflag.h"
+
+TEXT ·Asin(SB),NOSPLIT,$0
@@ -21965,24 +22051,28 @@ index 0000000..55d51ae
+
+TEXT ·Tan(SB),NOSPLIT,$0
+ BR ·tan(SB)
-diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go
-index 5ef02a1..35f5847 100644
---- a/src/net/dnsclient_unix_test.go
-+++ b/src/net/dnsclient_unix_test.go
-@@ -80,7 +80,7 @@ func TestSpecialDomainName(t *testing.T) {
+diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
+index 69d7806..9799ec7 100644
+--- a/src/net/http/fs_test.go
++++ b/src/net/http/fs_test.go
+@@ -963,9 +963,9 @@ func TestLinuxSendfile(t *testing.T) {
+
+ syscalls := "sendfile,sendfile64"
+ switch runtime.GOARCH {
+- case "mips64", "mips64le":
+- // mips64 strace doesn't support sendfile64 and will error out
+- // if we specify that with `-e trace='.
++ case "mips64", "mips64le", "s390x":
++ // strace on the above platforms doesn't support sendfile64
++ // and will error out if we specify that with `-e trace='.
+ syscalls = "sendfile"
+ }
- server := "8.8.8.8:53"
- for _, tt := range specialDomainNameTests {
-- msg, err := exchange(server, tt.name, tt.qtype, 0)
-+ msg, err := exchange(server, tt.name, tt.qtype, 5 * time.Second)
- if err != nil {
- t.Error(err)
- continue
diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go
-index 677a5f5..facaff4 100644
+index 439496a..f8f69c7 100644
--- a/src/net/lookup_test.go
+++ b/src/net/lookup_test.go
-@@ -615,6 +615,11 @@ func TestLookupPort(t *testing.T) {
+@@ -626,6 +626,11 @@ func TestLookupPort(t *testing.T) {
t.Skipf("not supported on %s", runtime.GOOS)
}
@@ -21996,16 +22086,14 @@ index 677a5f5..facaff4 100644
t.Errorf("LookupPort(%q, %q) = %d, %v; want %d", tt.network, tt.name, port, err, tt.port)
diff --git a/src/reflect/asm_s390x.s b/src/reflect/asm_s390x.s
new file mode 100644
-index 0000000..7c0e9b8
+index 0000000..4810d46
--- /dev/null
+++ b/src/reflect/asm_s390x.s
-@@ -0,0 +1,32 @@
-+// Copyright 2012 The Go Authors. All rights reserved.
+@@ -0,0 +1,30 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+#include "funcdata.h"
+
@@ -22034,16 +22122,14 @@ index 0000000..7c0e9b8
+ RET
diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s
new file mode 100644
-index 0000000..a53975b
+index 0000000..80a3f07
--- /dev/null
+++ b/src/runtime/asm_s390x.s
-@@ -0,0 +1,1165 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,1162 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "go_asm.h"
+#include "go_tls.h"
+#include "funcdata.h"
@@ -22128,24 +22214,24 @@ index 0000000..a53975b
+DATA runtime·mainPC+0(SB)/8,$runtime·main(SB)
+GLOBL runtime·mainPC(SB),RODATA,$8
+
-+TEXT runtime·breakpoint(SB),NOSPLIT,$-8-0
++TEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0
+ MOVD R0, 2(R0) // TODO: TD
+ RET
+
-+TEXT runtime·asminit(SB),NOSPLIT,$-8-0
++TEXT runtime·asminit(SB),NOSPLIT|NOFRAME,$0-0
+ RET
+
-+TEXT _cgo_load_g(SB),NOSPLIT,$-8-0
-+ // crosscall_ppc64 and crosscall2 need to reginit, but can't
++TEXT _cgo_load_g(SB),NOSPLIT|NOFRAME,$0-0
++ // crosscall_s390x and crosscall2 need to reginit, but can't
+ // get at the 'runtime.load_g' symbol.
+ BR runtime·load_g(SB)
+
-+TEXT _cgo_reginit(SB),NOSPLIT,$-8-0
-+ // crosscall_ppc64 and crosscall2 need to reginit, but can't
++TEXT _cgo_reginit(SB),NOSPLIT|NOFRAME,$0-0
++ // crosscall_s390x and crosscall2 need to reginit, but can't
+ // get at the 'runtime.reginit' symbol.
+ BR runtime·reginit(SB)
+
-+TEXT runtime·reginit(SB),NOSPLIT,$-8-0
++TEXT runtime·reginit(SB),NOSPLIT|NOFRAME,$0-0
+ // set R0 to zero, it's expected by the toolchain
+ XOR R0, R0
+ // initialize essential FP registers
@@ -22306,7 +22392,7 @@ index 0000000..a53975b
+// the top of a stack (for example, morestack calling newstack
+// calling the scheduler calling newm calling gc), so we must
+// record an argument size. For that purpose, it has no arguments.
-+TEXT runtime·morestack(SB),NOSPLIT,$-8-0
++TEXT runtime·morestack(SB),NOSPLIT|NOFRAME,$0-0
+ // Cannot grow scheduler stack (m->g0).
+ MOVD g_m(g), R7
+ MOVD m_g0(R7), R8
@@ -22343,7 +22429,7 @@ index 0000000..a53975b
+ // is still in this function, and not the beginning of the next.
+ UNDEF
+
-+TEXT runtime·morestack_noctxt(SB),NOSPLIT,$-8-0
++TEXT runtime·morestack_noctxt(SB),NOSPLIT|NOFRAME,$0-0
+ MOVD $0, R12
+ BR runtime·morestack(SB)
+
@@ -22505,7 +22591,7 @@ index 0000000..a53975b
+// 1. grab stored LR for caller
+// 2. sub 6 bytes to get back to BL deferreturn (size of BRASL instruction)
+// 3. BR to fn
-+TEXT runtime·jmpdefer(SB), NOSPLIT, $-8-16
++TEXT runtime·jmpdefer(SB),NOSPLIT|NOFRAME,$0-16
+ MOVD 0(R15), R10
+ SUB $6, R10
+ MOVD R10, LR
@@ -22518,7 +22604,7 @@ index 0000000..a53975b
+ BR (R10)
+
+// Save state of caller into g->sched. Smashes R31.
-+TEXT gosave<>(SB),NOSPLIT,$-8
++TEXT gosave<>(SB),NOSPLIT|NOFRAME,$0
+ MOVD LR, R10
+ MOVD R10, (g_sched+gobuf_pc)(g)
+ MOVD R15, (g_sched+gobuf_sp)(g)
@@ -22603,8 +22689,8 @@ index 0000000..a53975b
+ MOVB runtime·iscgo(SB), R3
+ CMPBEQ R3, $0, nocgo
+ BL runtime·load_g(SB)
-+nocgo:
+
++nocgo:
+ // If g is nil, Go did not create the current thread.
+ // Call needm to obtain one for temporary use.
+ // In this case, we're running on the thread stack, so there's
@@ -22619,8 +22705,7 @@ index 0000000..a53975b
+needm:
+ MOVD g, savedm-8(SP) // g is zero, so is m.
+ MOVD $runtime·needm(SB), R3
-+ MOVD R3, R10
-+ BL (R10)
++ BL (R3)
+
+ // Set m->sched.sp = SP, so that if a panic happens
+ // during the function we are about to execute, it will
@@ -22708,9 +22793,9 @@ index 0000000..a53975b
+
+// void setg_gcc(G*); set g in C TLS.
+// Must obey the gcc calling convention.
-+TEXT setg_gcc<>(SB),NOSPLIT,$-8-0
++TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0
+ // The standard prologue clobbers LR (R14), which is callee-save in
-+ // the C ABI, so we have to use $-8-0 and save LR ourselves.
++ // the C ABI, so we have to use NOFRAME and save LR ourselves.
+ MOVD LR, R1
+ // Also save g, R10, and R11 since they're callee-save in C ABI
+ MOVD R10, R3
@@ -22756,7 +22841,7 @@ index 0000000..a53975b
+ MOVD R3, ret+8(FP)
+ RET
+
-+TEXT runtime·abort(SB),NOSPLIT,$-8-0
++TEXT runtime·abort(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW (R0), R0
+ UNDEF
+
@@ -22793,21 +22878,21 @@ index 0000000..a53975b
+ MOVD R3, ret+16(FP)
+ RET
+
-+// AES hashing not implemented for ppc64
-+TEXT runtime·aeshash(SB),NOSPLIT,$-8-0
++// AES hashing not implemented for s390x
++TEXT runtime·aeshash(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW (R0), R15
-+TEXT runtime·aeshash32(SB),NOSPLIT,$-8-0
++TEXT runtime·aeshash32(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW (R0), R15
-+TEXT runtime·aeshash64(SB),NOSPLIT,$-8-0
++TEXT runtime·aeshash64(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW (R0), R15
-+TEXT runtime·aeshashstr(SB),NOSPLIT,$-8-0
++TEXT runtime·aeshashstr(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW (R0), R15
+
+TEXT runtime·clc(SB),NOSPLIT,$0-0
+ CLC $1, 0(R3), 0(R4)
+ RET
+
-+TEXT runtime·memeq(SB),NOSPLIT,$-8-25
++TEXT runtime·memeq(SB),NOSPLIT|NOFRAME,$0-25
+ MOVD a+0(FP), R3
+ MOVD b+8(FP), R4
+ CMPBNE R3, R4, 4(PC)
@@ -23031,7 +23116,7 @@ index 0000000..a53975b
+
+// Called from cgo wrappers, this function returns g->m->curg.stack.hi.
+// Must obey the gcc calling convention.
-+TEXT _cgo_topofstack(SB),NOSPLIT,$-8
++TEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0
+ // g (R13), R10, R11 and LR (R14) are callee-save in the C ABI, so save them
+ MOVD g, R1
+ MOVD R10, R3
@@ -23051,7 +23136,7 @@ index 0000000..a53975b
+
+// The top-most function running on a goroutine
+// returns to goexit+PCQuantum.
-+TEXT runtime·goexit(SB),NOSPLIT,$-8-0
++TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0
+ BYTE $0x07; BYTE $0x00; // 2-byte nop
+ BL runtime·goexit1(SB) // does not return
+ // traceback from goexit1 must hit code range of goexit
@@ -23069,7 +23154,7 @@ index 0000000..a53975b
+TEXT runtime·prefetchnta(SB),NOSPLIT,$0-8
+ RET
+
-+TEXT ·publicationBarrier(SB),NOSPLIT,$0-8
++TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0
+ SYNC
+ RET
+
@@ -23165,7 +23250,7 @@ index 0000000..a53975b
+// R4 = alen
+// R6 = blen
+// R7 = address of output word (stores -1/0/1 here)
-+TEXT runtime·cmpbody(SB),NOSPLIT,$-8-0
++TEXT runtime·cmpbody(SB),NOSPLIT|NOFRAME,$0-0
+ MOVD R4, R8
+ CMPBGE R4, R6, 2(PC)
+ MOVD R6, R8
@@ -23205,16 +23290,14 @@ index 0000000..a53975b
+
diff --git a/src/runtime/cgo/asm_s390x.s b/src/runtime/cgo/asm_s390x.s
new file mode 100644
-index 0000000..0818be7
+index 0000000..3682f12
--- /dev/null
+++ b/src/runtime/cgo/asm_s390x.s
-@@ -0,0 +1,58 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,56 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+
+/*
@@ -23222,7 +23305,7 @@ index 0000000..0818be7
+ * Save registers and call fn with two arguments.
+ * crosscall2 obeys the C ABI; fn obeys the Go ABI.
+ */
-+TEXT crosscall2(SB),NOSPLIT,$-8
++TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
+ // Start with standard C stack frame layout and linkage
+
+ // Save R6-R15, F0, F2, F4 and F6 in the
@@ -23269,16 +23352,14 @@ index 0000000..0818be7
+
diff --git a/src/runtime/cgo/callbacks_s390x.go b/src/runtime/cgo/callbacks_s390x.go
new file mode 100644
-index 0000000..6859fe4
+index 0000000..b6eb7b6
--- /dev/null
+++ b/src/runtime/cgo/callbacks_s390x.go
-@@ -0,0 +1,12 @@
-+// Copyright 2015 The Go Authors. All rights reserved.
+@@ -0,0 +1,10 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+package cgo
+
+//go:cgo_export_static _cgo_reginit
@@ -23287,16 +23368,14 @@ index 0000000..6859fe4
+//go:cgo_export_dynamic _cgo_load_g
diff --git a/src/runtime/cgo/gcc_linux_s390x.c b/src/runtime/cgo/gcc_linux_s390x.c
new file mode 100644
-index 0000000..d990f2f
+index 0000000..80550e6
--- /dev/null
+++ b/src/runtime/cgo/gcc_linux_s390x.c
-@@ -0,0 +1,70 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,68 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include <pthread.h>
+#include <string.h>
+#include <signal.h>
@@ -23363,10 +23442,14 @@ index 0000000..d990f2f
+}
diff --git a/src/runtime/cgo/gcc_s390x.S b/src/runtime/cgo/gcc_s390x.S
new file mode 100644
-index 0000000..4469dad
+index 0000000..5d2abe3
--- /dev/null
+++ b/src/runtime/cgo/gcc_s390x.S
-@@ -0,0 +1,46 @@
+@@ -0,0 +1,44 @@
++// Copyright 2016 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.
++
+/*
+ * void crosscall_s390x(void (*fn)(void), void *g)
+ *
@@ -23404,17 +23487,11 @@ index 0000000..4469dad
+
+ br %r14 /* restored by lmg */
+
-+.globl __stack_chk_fail_local
-+__stack_chk_fail_local:
-+1:
-+ larl %r10,1b
-+ br %r10
-+
+#ifdef __ELF__
+.section .note.GNU-stack,"",%progbits
+#endif
diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go
-index 210d186..9576904 100644
+index 66115fd..634b6e7 100644
--- a/src/runtime/cgocall.go
+++ b/src/runtime/cgocall.go
@@ -239,8 +239,8 @@ func cgocallbackg1() {
@@ -23439,7 +23516,7 @@ index 210d186..9576904 100644
sched.sp = *(*uintptr)(unsafe.Pointer(sched.sp + 16))
diff --git a/src/runtime/defs_linux_s390x.go b/src/runtime/defs_linux_s390x.go
new file mode 100644
-index 0000000..fbdc008
+index 0000000..893a31c
--- /dev/null
+++ b/src/runtime/defs_linux_s390x.go
@@ -0,0 +1,176 @@
@@ -23597,10 +23674,10 @@ index 0000000..fbdc008
+)
+
+type sigaltstackt struct {
-+ ss_sp *byte
-+ ss_flags int32
++ ss_sp *byte
++ ss_flags int32
+ //pad_cgo_0 [4]byte
-+ ss_size uintptr
++ ss_size uintptr
+}
+
+type sigcontext struct {
@@ -23658,26 +23735,24 @@ index fb3dba4..d61f114 100644
diff --git a/src/runtime/internal/atomic/asm_s390x.s b/src/runtime/internal/atomic/asm_s390x.s
new file mode 100644
-index 0000000..3dcfd2d
+index 0000000..d2b1217
--- /dev/null
+++ b/src/runtime/internal/atomic/asm_s390x.s
-@@ -0,0 +1,160 @@
-+// Copyright 20145 The Go Authors. All rights reserved.
+@@ -0,0 +1,202 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+
-+// bool runtime/internal/atomic·Cas(uint32 *ptr, uint32 old, uint32 new)
++// bool ·Cas(uint32 *ptr, uint32 old, uint32 new)
+// Atomically:
+// if(*val == old){
+// *val = new;
+// return 1;
+// } else
+// return 0;
-+TEXT runtime∕internal∕atomic·Cas(SB), NOSPLIT, $0-17
++TEXT ·Cas(SB), NOSPLIT, $0-17
+ MOVD ptr+0(FP), R3
+ MOVWZ old+8(FP), R4
+ MOVWZ new+12(FP), R5
@@ -23691,7 +23766,7 @@ index 0000000..3dcfd2d
+ MOVB R3, ret+16(FP)
+ RET
+
-+// bool runtime∕internal∕atomic·Cas64(uint64 *ptr, uint64 old, uint64 new)
++// bool ·Cas64(uint64 *ptr, uint64 old, uint64 new)
+// Atomically:
+// if(*val == *old){
+// *val = new;
@@ -23699,7 +23774,7 @@ index 0000000..3dcfd2d
+// } else {
+// return 0;
+// }
-+TEXT runtime∕internal∕atomic·Cas64(SB), NOSPLIT, $0-25
++TEXT ·Cas64(SB), NOSPLIT, $0-25
+ MOVD ptr+0(FP), R3
+ MOVD old+8(FP), R4
+ MOVD new+16(FP), R5
@@ -23713,36 +23788,36 @@ index 0000000..3dcfd2d
+ MOVB R3, ret+24(FP)
+ RET
+
-+TEXT runtime∕internal∕atomic·Casuintptr(SB), NOSPLIT, $0-25
-+ BR runtime∕internal∕atomic·Cas64(SB)
++TEXT ·Casuintptr(SB), NOSPLIT, $0-25
++ BR ·Cas64(SB)
+
-+TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Load64(SB)
++TEXT ·Loaduintptr(SB), NOSPLIT, $0-16
++ BR ·Load64(SB)
+
-+TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Load64(SB)
++TEXT ·Loaduint(SB), NOSPLIT, $0-16
++ BR ·Load64(SB)
+
-+TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Store64(SB)
++TEXT ·Storeuintptr(SB), NOSPLIT, $0-16
++ BR ·Store64(SB)
+
-+TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Load64(SB)
++TEXT ·Loadint64(SB), NOSPLIT, $0-16
++ BR ·Load64(SB)
+
-+TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24
-+ BR runtime∕internal∕atomic·Xadd64(SB)
++TEXT ·Xadduintptr(SB), NOSPLIT, $0-24
++ BR ·Xadd64(SB)
+
-+TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Xadd64(SB)
++TEXT ·Xaddint64(SB), NOSPLIT, $0-16
++ BR ·Xadd64(SB)
+
-+// bool runtime∕internal∕atomic·Casp1(void **val, void *old, void *new)
++// bool ·Casp1(void **val, void *old, void *new)
+// Atomically:
+// if(*val == old){
+// *val = new;
+// return 1;
+// } else
+// return 0;
-+TEXT runtime∕internal∕atomic·Casp1(SB), NOSPLIT, $0-25
-+ BR runtime∕internal∕atomic·Cas64(SB)
++TEXT ·Casp1(SB), NOSPLIT, $0-25
++ BR ·Cas64(SB)
+
+// bool casp(void **val, void *old, void *new)
+// Atomically:
@@ -23751,14 +23826,14 @@ index 0000000..3dcfd2d
+// return 1;
+// } else
+// return 0;
-+TEXT runtime·casp1(SB), NOSPLIT, $-8-25
++TEXT runtime·casp1(SB),NOSPLIT|NOFRAME,$0-25
+ BR runtime·cas64(SB)
+
-+// uint32 runtime∕internal∕atomic·Xadd(uint32 volatile *ptr, int32 delta)
++// uint32 ·Xadd(uint32 volatile *ptr, int32 delta)
+// Atomically:
+// *val += delta;
+// return *val;
-+TEXT runtime∕internal∕atomic·Xadd(SB), NOSPLIT, $0-20
++TEXT ·Xadd(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R4
+ MOVW delta+8(FP), R5
+repeat:
@@ -23770,7 +23845,7 @@ index 0000000..3dcfd2d
+ MOVW R3, ret+16(FP)
+ RET
+
-+TEXT runtime∕internal∕atomic·Xadd64(SB), NOSPLIT, $0-24
++TEXT ·Xadd64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R4
+ MOVD delta+8(FP), R5
+repeat:
@@ -23782,7 +23857,7 @@ index 0000000..3dcfd2d
+ MOVD R3, ret+16(FP)
+ RET
+
-+TEXT runtime∕internal∕atomic·Xchg(SB), NOSPLIT, $0-20
++TEXT ·Xchg(SB), NOSPLIT, $0-20
+ MOVD ptr+0(FP), R4
+ MOVW new+8(FP), R3
+repeat:
@@ -23792,7 +23867,7 @@ index 0000000..3dcfd2d
+ MOVW R6, ret+16(FP)
+ RET
+
-+TEXT runtime∕internal∕atomic·Xchg64(SB), NOSPLIT, $0-24
++TEXT ·Xchg64(SB), NOSPLIT, $0-24
+ MOVD ptr+0(FP), R4
+ MOVD new+8(FP), R3
+repeat:
@@ -23802,46 +23877,84 @@ index 0000000..3dcfd2d
+ MOVD R6, ret+16(FP)
+ RET
+
-+TEXT runtime∕internal∕atomic·Xchguintptr(SB), NOSPLIT, $0-24
-+ BR runtime∕internal∕atomic·Xchg64(SB)
++TEXT ·Xchguintptr(SB), NOSPLIT, $0-24
++ BR ·Xchg64(SB)
+
-+TEXT runtime∕internal∕atomic·Storep1(SB), NOSPLIT, $0-16
-+ BR runtime∕internal∕atomic·Store64(SB)
++TEXT ·Storep1(SB), NOSPLIT, $0-16
++ BR ·Store64(SB)
+
+// on Z, load & store both are atomic operations
-+TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12
++TEXT ·Store(SB), NOSPLIT, $0-12
+ MOVD ptr+0(FP), R3
+ MOVW val+8(FP), R4
+ SYNC
+ MOVW R4, 0(R3)
+ RET
+
-+TEXT runtime∕internal∕atomic·Store64(SB), NOSPLIT, $0-16
++TEXT ·Store64(SB), NOSPLIT, $0-16
+ MOVD ptr+0(FP), R3
+ MOVD val+8(FP), R4
+ SYNC
+ MOVD R4, 0(R3)
+ RET
++
++// func Or8(addr *uint8, v uint8)
++TEXT ·Or8(SB), NOSPLIT, $0-9
++ MOVD ptr+0(FP), R3
++ MOVBZ val+8(FP), R4
++ // Calculate shift.
++ AND $3, R3, R5
++ XOR $3, R5 // big endian - flip direction
++ SLD $3, R5 // MUL $8, R5
++ SLD R5, R4
++ // Align ptr down to 4 bytes so we can use 32-bit load/store.
++ SRD $2, R3, R5
++ SLD $2, R5
++ MOVWZ 0(R5), R6
++again:
++ OR R4, R6, R7
++ CS R6, R7, 0(R5) // if (R6 == 0(R5)) then 0(R5)= R7 else R6= 0(R5)
++ BNE again
++ RET
++
++// func And8(addr *uint8, v uint8)
++TEXT ·And8(SB), NOSPLIT, $0-9
++ MOVD ptr+0(FP), R3
++ MOVBZ val+8(FP), R4
++ // Calculate shift.
++ AND $3, R3, R5
++ XOR $3, R5 // big endian - flip direction
++ SLD $3, R5 // MUL $8, R5
++ OR $-256, R4 // create 0xffffffffffffffxx
++ BYTE $0xEB // RLLG R5, R4
++ BYTE $0x44
++ BYTE $0x50
++ BYTE $0x00
++ BYTE $0x00
++ BYTE $0x1C
++ // Align ptr down to 4 bytes so we can use 32-bit load/store.
++ SRD $2, R3, R5
++ SLD $2, R5
++ MOVWZ 0(R5), R6
++again:
++ AND R4, R6, R7
++ CS R6, R7, 0(R5) // if (R6 == 0(R5)) then 0(R5)= R7 else R6= 0(R5)
++ BNE again
++ RET
diff --git a/src/runtime/internal/atomic/atomic_s390x.go b/src/runtime/internal/atomic/atomic_s390x.go
new file mode 100644
-index 0000000..b63d1d4
+index 0000000..67f50e4
--- /dev/null
+++ b/src/runtime/internal/atomic/atomic_s390x.go
-@@ -0,0 +1,96 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,63 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+package atomic
+
+import "unsafe"
+
-+// The calls to nop are to keep these functions from being inlined.
-+// If they are inlined we have no guarantee that later rewrites of the
-+// code by optimizers will preserve the relative order of memory accesses.
-+
+//go:nosplit
+//go:noinline
+func Load(ptr *uint32) uint32 {
@@ -23860,38 +23973,11 @@ index 0000000..b63d1d4
+ return *ptr
+}
+
-+//go:nosplit
-+func And8(addr *uint8, v uint8) {
-+ // TODO(mundaym) implement this in asm.
-+ // Align down to 4 bytes and use 32-bit CAS.
-+ uaddr := uintptr(unsafe.Pointer(addr))
-+ addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
-+ shift_bits := ((uaddr & 3) ^ 3 ) * 8 // big endian
-+ word := uint32(v) << (shift_bits) // big endian
-+ mask := uint32(0xFF) << (shift_bits) // big endian
-+ word |= ^mask
-+ for {
-+ old := *addr32
-+ if Cas(addr32, old, old&word) {
-+ return
-+ }
-+ }
-+}
++//go:noescape
++func And8(ptr *uint8, val uint8)
+
-+//go:nosplit
-+func Or8(addr *uint8, v uint8) {
-+ // TODO(mundaym) implement this in asm.
-+ // Align down to 4 bytes and use 32-bit CAS.
-+ uaddr := uintptr(unsafe.Pointer(addr))
-+ addr32 := (*uint32)(unsafe.Pointer(uaddr &^ 3))
-+ word := uint32(v) << (((uaddr & 3) ^ 3) * 8) // big endian
-+ for {
-+ old := *addr32
-+ if Cas(addr32, old, old|word) {
-+ return
-+ }
-+ }
-+}
++//go:noescape
++func Or8(ptr *uint8, val uint8)
+
+// NOTE: Do not add atomicxor8 (XOR is not idempotent).
+
@@ -23926,11 +24012,11 @@ index 0000000..b63d1d4
+func Storep1(ptr unsafe.Pointer, val unsafe.Pointer)
diff --git a/src/runtime/internal/sys/arch_s390x.go b/src/runtime/internal/sys/arch_s390x.go
new file mode 100644
-index 0000000..d3aa6b3
+index 0000000..8690571
--- /dev/null
+++ b/src/runtime/internal/sys/arch_s390x.go
@@ -0,0 +1,18 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
++// Copyright 2016 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.
+
@@ -23944,7 +24030,7 @@ index 0000000..d3aa6b3
+ PCQuantum = 2
+ Int64Align = 8
+ HugePageSize = 0
-+ MinFrameSize = 8 // TODO(mundaym): Not sure if this is correct.
++ MinFrameSize = 8
+)
+
+type Uintreg uint64
@@ -23982,25 +24068,18 @@ index 0000000..ce85f20
+const GoarchSparc64 = 0
diff --git a/src/runtime/lfstack_linux_s390x.go b/src/runtime/lfstack_linux_s390x.go
new file mode 100644
-index 0000000..444c8fe
+index 0000000..14c1d07
--- /dev/null
+++ b/src/runtime/lfstack_linux_s390x.go
-@@ -0,0 +1,32 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,25 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+// +build linux
-+
+package runtime
+
+import "unsafe"
+
-+// On ppc64, Linux limits the user address space to 46 bits (see
-+// TASK_SIZE_USER64 in the Linux kernel). This has grown over time,
-+// so here we allow 48 bit addresses.
-+//
+// In addition to the 16 bits taken from the top, we can take 3 from the
+// bottom, because node must be pointer-aligned, giving a total of 19 bits
+// of count.
@@ -24020,20 +24099,18 @@ index 0000000..444c8fe
+}
diff --git a/src/runtime/memclr_s390x.s b/src/runtime/memclr_s390x.s
new file mode 100644
-index 0000000..d121468
+index 0000000..86eafec
--- /dev/null
+++ b/src/runtime/memclr_s390x.s
-@@ -0,0 +1,124 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,122 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+
+// void runtime·memclr(void*, uintptr)
-+TEXT runtime·memclr(SB),NOSPLIT,$0-16
++TEXT runtime·memclr(SB),NOSPLIT|NOFRAME,$0-16
+ MOVD ptr+0(FP), R4
+ MOVD n+8(FP), R5
+
@@ -24143,27 +24220,25 @@ index 0000000..d121468
+ RET
+
+// DO NOT CALL - target for exrl (execute relative long) instruction.
-+TEXT runtime·memclr_s390x_exrl_xc(SB),NOSPLIT, $0-0
++TEXT runtime·memclr_s390x_exrl_xc(SB),NOSPLIT|NOFRAME,$0-0
+ XC $1, 0(R4), 0(R4)
+ MOVD R0, 0(R0)
+ RET
+
diff --git a/src/runtime/memmove_s390x.s b/src/runtime/memmove_s390x.s
new file mode 100644
-index 0000000..da591be
+index 0000000..238f308
--- /dev/null
+++ b/src/runtime/memmove_s390x.s
-@@ -0,0 +1,191 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,189 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+
+// void runtime·memmove(void*, void*, uintptr)
-+TEXT runtime·memmove(SB), NOSPLIT, $-8-24
++TEXT runtime·memmove(SB),NOSPLIT|NOFRAME,$0-24
+ MOVD to+0(FP), R6
+ MOVD from+8(FP), R4
+ MOVD n+16(FP), R5
@@ -24340,7 +24415,7 @@ index 0000000..da591be
+ RET
+
+// DO NOT CALL - target for exrl (execute relative long) instruction.
-+TEXT runtime·memmove_s390x_exrl_mvc(SB),NOSPLIT, $0-0
++TEXT runtime·memmove_s390x_exrl_mvc(SB),NOSPLIT|NOFRAME,$0-0
+ MVC $1, 0(R4), 0(R6)
+ MOVD R0, 0(R0)
+ RET
@@ -24372,17 +24447,14 @@ index 2c8b743..50d6d6a 100644
package runtime
diff --git a/src/runtime/os1_linux_s390x.go b/src/runtime/os1_linux_s390x.go
new file mode 100644
-index 0000000..6f2c6bd
+index 0000000..704d5ca
--- /dev/null
+++ b/src/runtime/os1_linux_s390x.go
-@@ -0,0 +1,32 @@
-+// Copyright 2015 The Go Authors. All rights reserved.
+@@ -0,0 +1,29 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+// +build linux
-+
+package runtime
+
+var sigset_all = sigset(^uint64(0))
@@ -24422,17 +24494,14 @@ index 01e6c8a..f1a2dd5 100644
package runtime
diff --git a/src/runtime/os2_linux_s390x.go b/src/runtime/os2_linux_s390x.go
new file mode 100644
-index 0000000..3a04015
+index 0000000..d03b499
--- /dev/null
+++ b/src/runtime/os2_linux_s390x.go
-@@ -0,0 +1,25 @@
-+// Copyright 2015 The Go Authors. All rights reserved.
+@@ -0,0 +1,22 @@
++// Copyright 2016 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.
+
-+// +build linux
-+// +build s390x
-+
+package runtime
+
+const (
@@ -24453,13 +24522,17 @@ index 0000000..3a04015
+}
diff --git a/src/runtime/rt0_linux_s390x.s b/src/runtime/rt0_linux_s390x.s
new file mode 100644
-index 0000000..0be121e
+index 0000000..cd66122
--- /dev/null
+++ b/src/runtime/rt0_linux_s390x.s
-@@ -0,0 +1,16 @@
+@@ -0,0 +1,20 @@
++// Copyright 2016 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.
++
+#include "textflag.h"
+
-+TEXT _rt0_s390x_linux(SB),NOSPLIT,$-8
++TEXT _rt0_s390x_linux(SB),NOSPLIT|NOFRAME,$0
+ // In a statically linked binary, the stack contains argc,
+ // argv as argc string pointers followed by a NULL, envv as a
+ // sequence of string pointers followed by a NULL, and auxv.
@@ -24470,7 +24543,7 @@ index 0000000..0be121e
+ ADD $8, R15, R3 // argv
+ BR main(SB)
+
-+TEXT main(SB),NOSPLIT,$-8
++TEXT main(SB),NOSPLIT|NOFRAME,$0
+ MOVD $runtime·rt0_go(SB), R11
+ BR R11
diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go
@@ -24488,17 +24561,14 @@ index 6ebc69a..34e6b21 100644
"-ex", "echo BEGIN goroutine 2 bt\n",
diff --git a/src/runtime/signal_linux_s390x.go b/src/runtime/signal_linux_s390x.go
new file mode 100644
-index 0000000..8fd7b2a
+index 0000000..0643cfc
--- /dev/null
+++ b/src/runtime/signal_linux_s390x.go
-@@ -0,0 +1,53 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,50 @@
++// Copyright 2016 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.
+
-+// +build linux
-+// +build s390x
-+
+package runtime
+
+import (
@@ -24547,16 +24617,15 @@ index 0000000..8fd7b2a
+}
diff --git a/src/runtime/signal_s390x.go b/src/runtime/signal_s390x.go
new file mode 100644
-index 0000000..24a5901
+index 0000000..0b09332
--- /dev/null
+++ b/src/runtime/signal_s390x.go
-@@ -0,0 +1,171 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,170 @@
++// Copyright 2016 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.
+
+// +build linux
-+// +build s390x
+
+package runtime
+
@@ -24724,17 +24793,14 @@ index 0000000..24a5901
+}
diff --git a/src/runtime/sys_linux_s390x.s b/src/runtime/sys_linux_s390x.s
new file mode 100644
-index 0000000..0dbfd1f
+index 0000000..80e3b64
--- /dev/null
+++ b/src/runtime/sys_linux_s390x.s
-@@ -0,0 +1,440 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,437 @@
++// Copyright 2016 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.
+
-+// +build linux
-+// +build s390x
-+
+// System calls and other system stuff for Linux s390x; see
+// /usr/include/asm-s390/unistd.h for the syscall number definitions.
+
@@ -24776,19 +24842,19 @@ index 0000000..0dbfd1f
+#define SYS_clock_gettime 260 //
+#define SYS_epoll_create1 327 //
+
-+TEXT runtime·exit(SB),NOSPLIT,$-8-4
++TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
+ MOVW code+0(FP), R2
+ MOVW $SYS_exit_group, R1
+ SYSCALL
+ RET
+
-+TEXT runtime·exit1(SB),NOSPLIT,$-8-4
++TEXT runtime·exit1(SB),NOSPLIT|NOFRAME,$0-4
+ MOVW code+0(FP), R2
+ MOVW $SYS_exit, R1
+ SYSCALL
+ RET
+
-+TEXT runtime·open(SB),NOSPLIT,$-8-20
++TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
+ MOVD name+0(FP), R2
+ MOVW mode+8(FP), R3
+ MOVW perm+12(FP), R4
@@ -24800,7 +24866,7 @@ index 0000000..0dbfd1f
+ MOVW R2, ret+16(FP)
+ RET
+
-+TEXT runtime·closefd(SB),NOSPLIT,$-8-12
++TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
+ MOVW fd+0(FP), R2
+ MOVW $SYS_close, R1
+ SYSCALL
@@ -24810,7 +24876,7 @@ index 0000000..0dbfd1f
+ MOVW R2, ret+8(FP)
+ RET
+
-+TEXT runtime·write(SB),NOSPLIT,$-8-28
++TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0-28
+ MOVD fd+0(FP), R2
+ MOVD p+8(FP), R3
+ MOVW n+16(FP), R4
@@ -24822,7 +24888,7 @@ index 0000000..0dbfd1f
+ MOVW R2, ret+24(FP)
+ RET
+
-+TEXT runtime·read(SB),NOSPLIT,$-8-28
++TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
+ MOVW fd+0(FP), R2
+ MOVD p+8(FP), R3
+ MOVW n+16(FP), R4
@@ -24834,7 +24900,7 @@ index 0000000..0dbfd1f
+ MOVW R2, ret+24(FP)
+ RET
+
-+TEXT runtime·getrlimit(SB),NOSPLIT,$-8-20
++TEXT runtime·getrlimit(SB),NOSPLIT|NOFRAME,$0-20
+ MOVW kind+0(FP), R2
+ MOVD limit+8(FP), R3
+ MOVW $SYS_ugetrlimit, R1
@@ -24868,7 +24934,7 @@ index 0000000..0dbfd1f
+ MOVW R2, ret+0(FP)
+ RET
+
-+TEXT runtime·raise(SB),NOSPLIT,$-8
++TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
+ MOVW $SYS_gettid, R1
+ SYSCALL
+ MOVW R2, R2 // arg 1 tid
@@ -24877,7 +24943,7 @@ index 0000000..0dbfd1f
+ SYSCALL
+ RET
+
-+TEXT runtime·raiseproc(SB),NOSPLIT,$-8
++TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
+ MOVW $SYS_getpid, R1
+ SYSCALL
+ MOVW R2, R2 // arg 1 pid
@@ -24886,7 +24952,7 @@ index 0000000..0dbfd1f
+ SYSCALL
+ RET
+
-+TEXT runtime·setitimer(SB),NOSPLIT,$-8-24
++TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
+ MOVW mode+0(FP), R2
+ MOVD new+8(FP), R3
+ MOVD old+16(FP), R4
@@ -24894,7 +24960,7 @@ index 0000000..0dbfd1f
+ SYSCALL
+ RET
+
-+TEXT runtime·mincore(SB),NOSPLIT,$-8-28
++TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
+ MOVD addr+0(FP), R2
+ MOVD n+8(FP), R3
+ MOVD dst+16(FP), R4
@@ -24932,7 +24998,7 @@ index 0000000..0dbfd1f
+ MOVD R2, ret+0(FP)
+ RET
+
-+TEXT runtime·rtsigprocmask(SB),NOSPLIT,$-8-28
++TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
+ MOVW sig+0(FP), R2
+ MOVD new+8(FP), R3
+ MOVD old+16(FP), R4
@@ -24944,7 +25010,7 @@ index 0000000..0dbfd1f
+ MOVD R0, 0(R0) // crash
+ RET
+
-+TEXT runtime·rt_sigaction(SB),NOSPLIT,$-8-36
++TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
+ MOVD sig+0(FP), R2
+ MOVD new+8(FP), R3
+ MOVD old+16(FP), R4
@@ -25003,7 +25069,7 @@ index 0000000..0dbfd1f
+ MOVD R2, ret+32(FP)
+ RET
+
-+TEXT runtime·munmap(SB),NOSPLIT,$-8
++TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
+ MOVD addr+0(FP), R2
+ MOVD n+8(FP), R3
+ MOVW $SYS_munmap, R1
@@ -25013,7 +25079,7 @@ index 0000000..0dbfd1f
+ MOVD R0, 0(R0) // crash
+ RET
+
-+TEXT runtime·madvise(SB),NOSPLIT,$-8
++TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
+ MOVD addr+0(FP), R2
+ MOVD n+8(FP), R3
+ MOVW flags+16(FP), R4
@@ -25024,7 +25090,7 @@ index 0000000..0dbfd1f
+
+// int64 futex(int32 *uaddr, int32 op, int32 val,
+// struct timespec *timeout, int32 *uaddr2, int32 val2);
-+TEXT runtime·futex(SB),NOSPLIT,$-8
++TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
+ MOVD addr+0(FP), R2
+ MOVW op+8(FP), R3
+ MOVW val+12(FP), R4
@@ -25037,7 +25103,7 @@ index 0000000..0dbfd1f
+ RET
+
+// int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
-+TEXT runtime·clone(SB),NOSPLIT,$-8
++TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
+ MOVW flags+0(FP), R3
+ MOVD stk+8(FP), R2
+
@@ -25098,7 +25164,7 @@ index 0000000..0dbfd1f
+ SYSCALL
+ BR -2(PC) // keep exiting
+
-+TEXT runtime·sigaltstack(SB),NOSPLIT,$-8
++TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
+ MOVD new+0(FP), R2
+ MOVD old+8(FP), R3
+ MOVW $SYS_sigaltstack, R1
@@ -25108,12 +25174,12 @@ index 0000000..0dbfd1f
+ MOVD R0, 0(R0) // crash
+ RET
+
-+TEXT runtime·osyield(SB),NOSPLIT,$-8
++TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
+ MOVW $SYS_sched_yield, R1
+ SYSCALL
+ RET
+
-+TEXT runtime·sched_getaffinity(SB),NOSPLIT,$-8
++TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
+ MOVD pid+0(FP), R2
+ MOVD len+8(FP), R3
+ MOVD buf+16(FP), R4
@@ -25123,7 +25189,7 @@ index 0000000..0dbfd1f
+ RET
+
+// int32 runtime·epollcreate(int32 size);
-+TEXT runtime·epollcreate(SB),NOSPLIT,$-8
++TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0
+ MOVW size+0(FP), R2
+ MOVW $SYS_epoll_create, R1
+ SYSCALL
@@ -25131,7 +25197,7 @@ index 0000000..0dbfd1f
+ RET
+
+// int32 runtime·epollcreate1(int32 flags);
-+TEXT runtime·epollcreate1(SB),NOSPLIT,$-8
++TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0
+ MOVW flags+0(FP), R2
+ MOVW $SYS_epoll_create1, R1
+ SYSCALL
@@ -25139,7 +25205,7 @@ index 0000000..0dbfd1f
+ RET
+
+// func epollctl(epfd, op, fd int32, ev *epollEvent) int
-+TEXT runtime·epollctl(SB),NOSPLIT,$-8
++TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0
+ MOVW epfd+0(FP), R2
+ MOVW op+4(FP), R3
+ MOVW fd+8(FP), R4
@@ -25150,7 +25216,7 @@ index 0000000..0dbfd1f
+ RET
+
+// int32 runtime·epollwait(int32 epfd, EpollEvent *ev, int32 nev, int32 timeout);
-+TEXT runtime·epollwait(SB),NOSPLIT,$-8
++TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0
+ MOVW epfd+0(FP), R2
+ MOVD ev+8(FP), R3
+ MOVW nev+16(FP), R4
@@ -25161,7 +25227,7 @@ index 0000000..0dbfd1f
+ RET
+
+// void runtime·closeonexec(int32 fd);
-+TEXT runtime·closeonexec(SB),NOSPLIT,$-8
++TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0
+ MOVW fd+0(FP), R2 // fd
+ MOVD $2, R3 // F_SETFD
+ MOVD $1, R4 // FD_CLOEXEC
@@ -25170,16 +25236,14 @@ index 0000000..0dbfd1f
+ RET
diff --git a/src/runtime/sys_s390x.go b/src/runtime/sys_s390x.go
new file mode 100644
-index 0000000..82418d3
+index 0000000..106d7ea
--- /dev/null
+++ b/src/runtime/sys_s390x.go
-@@ -0,0 +1,50 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,48 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+package runtime
+
+import "unsafe"
@@ -25226,16 +25290,14 @@ index 0000000..82418d3
+}
diff --git a/src/runtime/tls_s390x.s b/src/runtime/tls_s390x.s
new file mode 100644
-index 0000000..403e53b
+index 0000000..371d535
--- /dev/null
+++ b/src/runtime/tls_s390x.s
-@@ -0,0 +1,69 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,67 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "go_asm.h"
+#include "go_tls.h"
+#include "funcdata.h"
@@ -25254,7 +25316,7 @@ index 0000000..403e53b
+// If !iscgo, this is a no-op.
+//
+// NOTE: setg_gcc<> assume this clobbers only R10 and R11.
-+TEXT runtime·save_g(SB),NOSPLIT,$-8-0
++TEXT runtime·save_g(SB),NOSPLIT|NOFRAME,$0-0
+ MOVB runtime·iscgo(SB), R10
+ CMPBEQ R10, $0, nocgo
+
@@ -25286,7 +25348,7 @@ index 0000000..403e53b
+// usual Go registers aren't set up.
+//
+// NOTE: _cgo_topofstack assumes this only clobbers g (R13), R10 and R11.
-+TEXT runtime·load_g(SB),NOSPLIT,$-8-0
++TEXT runtime·load_g(SB),NOSPLIT|NOFRAME,$0-0
+ MOVW AR0, R11
+ SLD $32, R11
+ MOVW AR1, R11
@@ -25298,7 +25360,7 @@ index 0000000..403e53b
+ MOVD 0(R10), g
+ RET
+
-+GLOBL runtime·tlsg_offset+0(SB), RODATA, $8
++GLOBL runtime·tlsg_offset+0(SB),RODATA,$8
diff --git a/src/runtime/unaligned1.go b/src/runtime/unaligned1.go
index d3d6c70..602fd67 100644
--- a/src/runtime/unaligned1.go
@@ -25314,16 +25376,14 @@ index d3d6c70..602fd67 100644
diff --git a/src/sync/atomic/asm_s390x.s b/src/sync/atomic/asm_s390x.s
new file mode 100644
-index 0000000..cdc18ac
+index 0000000..a96cce3
--- /dev/null
+++ b/src/sync/atomic/asm_s390x.s
-@@ -0,0 +1,151 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,149 @@
++// Copyright 2016 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.
+
-+// +build s390x
-+
+#include "textflag.h"
+
+TEXT ·SwapInt32(SB),NOSPLIT,$0-20
@@ -25471,17 +25531,14 @@ index 0000000..cdc18ac
+ BR ·StoreUint64(SB)
diff --git a/src/syscall/asm_linux_s390x.s b/src/syscall/asm_linux_s390x.s
new file mode 100644
-index 0000000..d694225
+index 0000000..5d9bf07
--- /dev/null
+++ b/src/syscall/asm_linux_s390x.s
-@@ -0,0 +1,176 @@
-+// Copyright 2014 The Go Authors. All rights reserved.
+@@ -0,0 +1,173 @@
++// Copyright 2016 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.
+
-+// +build linux
-+// +build s390x
-+
+#include "textflag.h"
+
+//
@@ -25696,17 +25753,14 @@ index 85fab4f..1d40092 100755
mksyscall="./mksyscall.pl -l32 -nacl"
diff --git a/src/syscall/syscall_linux_s390x.go b/src/syscall/syscall_linux_s390x.go
new file mode 100644
-index 0000000..d21dd04
+index 0000000..20a1a45
--- /dev/null
+++ b/src/syscall/syscall_linux_s390x.go
-@@ -0,0 +1,299 @@
-+// Copyright 2009 The Go Authors. All rights reserved.
+@@ -0,0 +1,296 @@
++// Copyright 2016 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.
+
-+// +build linux
-+// +build s390x
-+
+package syscall
+
+import "unsafe"
@@ -25806,7 +25860,7 @@ index 0000000..d21dd04
+// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
+// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
+func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
-+ mmap_args := [6]uintptr{ addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset) }
++ mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
+ r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
+ use(unsafe.Pointer(&mmap_args[0]))
+ xaddr = uintptr(r0)
diff --git a/debian/patches/series b/debian/patches/series
index 0f83bf3..9142d39 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1 @@
-0001-s390x-port.patch -p1
+0001-s390x-port.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-golang/golang.git
More information about the pkg-golang-commits
mailing list