| // compile | |
| // Copyright 2017 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. | |
| // Issue 19137: folding address into load/store causes | |
| // odd offset on ARM64. | |
| package p | |
| type T struct { | |
| p *int | |
| a [2]byte | |
| b [6]byte // not 4-byte aligned | |
| } | |
| func f(b [6]byte) T { | |
| var x [1000]int // a large stack frame | |
| _ = x | |
| return T{b: b} | |
| } | |
| // Arg symbol's base address may be not at an aligned offset to | |
| // SP. Folding arg's address into load/store may cause odd offset. | |
| func move(a, b [20]byte) [20]byte { | |
| var x [1000]int // a large stack frame | |
| _ = x | |
| return b // b is not 8-byte aligned to SP | |
| } | |
| func zero() ([20]byte, [20]byte) { | |
| var x [1000]int // a large stack frame | |
| _ = x | |
| return [20]byte{}, [20]byte{} // the second return value is not 8-byte aligned to SP | |
| } | |
| // Issue 21992: unaligned offset between 256 and 504 and handled | |
| // incorrectly. | |
| type T2 struct { | |
| a [257]byte | |
| // fields below are not 8-, 4-, 2-byte aligned | |
| b [8]byte | |
| c [4]byte | |
| d [2]byte | |
| } | |
| func f2(x *T2) { | |
| x.b = [8]byte{} | |
| x.c = [4]byte{} | |
| x.d = [2]byte{} | |
| } |