1// compile
2
3// Copyright 2021 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// issue 44739: cmd/compile: incorrect offset in MOVD
8// load/store on ppc64/ppc64le causes assembler error.
9
10// Test other 8 byte loads and stores where the
11// compile time offset is not aligned to 8, as
12// well as cases where the offset is not known
13// until link time (e.g. gostrings).
14
15package main
16
17import (
18	"fmt"
19)
20
21type T struct {
22	x [4]byte
23	y [8]byte
24}
25
26var st T
27
28const (
29	gostring1 = "abc"
30	gostring2 = "defghijk"
31	gostring3 = "lmnopqrs"
32)
33
34func f(a T, _ byte, b T) bool {
35	// initialization of a,b
36	// tests unaligned store
37	return a.y == b.y
38}
39
40func g(a T) {
41	// test load of unaligned
42	// 8 byte gostring, store
43	// to unaligned static
44	copy(a.y[:], gostring2)
45}
46
47func main() {
48	var t1, t2 T
49
50	// test copy to automatic storage,
51	// load of unaligned gostring.
52	copy(st.y[:], gostring2)
53	copy(t1.y[:], st.y[:])
54	copy(t2.y[:], gostring3)
55	// test initialization of params
56	if !f(t1, 'a', t2) {
57		// gostring1 added so it has a use
58		fmt.Printf("FAIL: %s\n", gostring1)
59	}
60}
61
62