]> Cypherpunks.ru repositories - gostls13.git/blob - test/codegen/copy.go
4c4c857460fa1d1c7028d2ed6db6a9c31f3e68b3
[gostls13.git] / test / codegen / copy.go
1 // asmcheck
2
3 // Copyright 2018 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 package codegen
8
9 import "runtime"
10
11 // Check small copies are replaced with moves.
12
13 func movesmall4() {
14         x := [...]byte{1, 2, 3, 4}
15         // 386:-".*memmove"
16         // amd64:-".*memmove"
17         // arm:-".*memmove"
18         // arm64:-".*memmove"
19         // ppc64x:-".*memmove"
20         copy(x[1:], x[:])
21 }
22
23 func movesmall7() {
24         x := [...]byte{1, 2, 3, 4, 5, 6, 7}
25         // 386:-".*memmove"
26         // amd64:-".*memmove"
27         // arm64:-".*memmove"
28         // ppc64x:-".*memmove"
29         copy(x[1:], x[:])
30 }
31
32 func movesmall16() {
33         x := [...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
34         // amd64:-".*memmove"
35         // ppc64x:".*memmove"
36         copy(x[1:], x[:])
37 }
38
39 var x [256]byte
40
41 // Check that large disjoint copies are replaced with moves.
42
43 func moveDisjointStack32() {
44         var s [32]byte
45         // ppc64x:-".*memmove"
46         // ppc64x/power8:"LXVD2X",-"ADD",-"BC"
47         // ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
48         copy(s[:], x[:32])
49         runtime.KeepAlive(&s)
50 }
51
52 func moveDisjointStack64() {
53         var s [96]byte
54         // ppc64x:-".*memmove"
55         // ppc64x/power8:"LXVD2X","ADD","BC"
56         // ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
57         copy(s[:], x[:96])
58         runtime.KeepAlive(&s)
59 }
60
61 func moveDisjointStack() {
62         var s [256]byte
63         // s390x:-".*memmove"
64         // amd64:-".*memmove"
65         // ppc64x:-".*memmove"
66         // ppc64x/power8:"LXVD2X"
67         // ppc64x/power9:"LXV",-"LXVD2X"
68         copy(s[:], x[:])
69         runtime.KeepAlive(&s)
70 }
71
72 func moveDisjointArg(b *[256]byte) {
73         var s [256]byte
74         // s390x:-".*memmove"
75         // amd64:-".*memmove"
76         // ppc64x:-".*memmove"
77         // ppc64x/power8:"LXVD2X"
78         // ppc64x/power9:"LXV",-"LXVD2X"
79         copy(s[:], b[:])
80         runtime.KeepAlive(&s)
81 }
82
83 func moveDisjointNoOverlap(a *[256]byte) {
84         // s390x:-".*memmove"
85         // amd64:-".*memmove"
86         // ppc64x:-".*memmove"
87         // ppc64x/power8:"LXVD2X"
88         // ppc64x/power9:"LXV",-"LXVD2X"
89         copy(a[:], a[128:])
90 }
91
92 // Check arch-specific memmove lowering. See issue 41662 fot details
93
94 func moveArchLowering1(b []byte, x *[1]byte) {
95         _ = b[1]
96         // amd64:-".*memmove"
97         // arm64:-".*memmove"
98         // ppc64x:-".*memmove"
99         copy(b, x[:])
100 }
101
102 func moveArchLowering2(b []byte, x *[2]byte) {
103         _ = b[2]
104         // amd64:-".*memmove"
105         // arm64:-".*memmove"
106         // ppc64x:-".*memmove"
107         copy(b, x[:])
108 }
109
110 func moveArchLowering4(b []byte, x *[4]byte) {
111         _ = b[4]
112         // amd64:-".*memmove"
113         // arm64:-".*memmove"
114         // ppc64x:-".*memmove"
115         copy(b, x[:])
116 }
117
118 func moveArchLowering8(b []byte, x *[8]byte) {
119         _ = b[8]
120         // amd64:-".*memmove"
121         // arm64:-".*memmove"
122         // ppc64x:-".*memmove"
123         copy(b, x[:])
124 }
125
126 func moveArchLowering16(b []byte, x *[16]byte) {
127         _ = b[16]
128         // amd64:-".*memmove"
129         copy(b, x[:])
130 }
131
132 // Check that no branches are generated when the pointers are [not] equal.
133
134 func ptrEqual() {
135         // amd64:-"JEQ",-"JNE"
136         // ppc64x:-"BEQ",-"BNE"
137         // s390x:-"BEQ",-"BNE"
138         copy(x[:], x[:])
139 }
140
141 func ptrOneOffset() {
142         // amd64:-"JEQ",-"JNE"
143         // ppc64x:-"BEQ",-"BNE"
144         // s390x:-"BEQ",-"BNE"
145         copy(x[1:], x[:])
146 }
147
148 func ptrBothOffset() {
149         // amd64:-"JEQ",-"JNE"
150         // ppc64x:-"BEQ",-"BNE"
151         // s390x:-"BEQ",-"BNE"
152         copy(x[1:], x[2:])
153 }