[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