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