| // 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{} |
| } |