1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK
3 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -verify-machineinstrs -aarch64-lower-to-sme-routines=false < %s | FileCheck %s -check-prefixes=CHECK-NO-SME-ROUTINES
4 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -mattr=+mops -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK-MOPS
6 @dst = global [512 x i8] zeroinitializer, align 1
7 @src = global [512 x i8] zeroinitializer, align 1
9 define void @se_memcpy(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
10 ; CHECK-LABEL: se_memcpy:
11 ; CHECK: // %bb.0: // %entry
12 ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
13 ; CHECK-NEXT: mov x2, x0
14 ; CHECK-NEXT: adrp x0, :got:dst
15 ; CHECK-NEXT: adrp x1, :got:src
16 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:dst]
17 ; CHECK-NEXT: ldr x1, [x1, :got_lo12:src]
18 ; CHECK-NEXT: bl __arm_sc_memcpy
19 ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
22 ; CHECK-NO-SME-ROUTINES-LABEL: se_memcpy:
23 ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
24 ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
25 ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
26 ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
27 ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
28 ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
29 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
30 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
31 ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
32 ; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
33 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
34 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
35 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
36 ; CHECK-NO-SME-ROUTINES-NEXT: bl memcpy
37 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
38 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
39 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
40 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
41 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
42 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
43 ; CHECK-NO-SME-ROUTINES-NEXT: ret
45 ; CHECK-MOPS-LABEL: se_memcpy:
46 ; CHECK-MOPS: // %bb.0: // %entry
47 ; CHECK-MOPS-NEXT: adrp x8, :got:src
48 ; CHECK-MOPS-NEXT: adrp x9, :got:dst
49 ; CHECK-MOPS-NEXT: ldr x8, [x8, :got_lo12:src]
50 ; CHECK-MOPS-NEXT: ldr x9, [x9, :got_lo12:dst]
51 ; CHECK-MOPS-NEXT: cpyfp [x9]!, [x8]!, x0!
52 ; CHECK-MOPS-NEXT: cpyfm [x9]!, [x8]!, x0!
53 ; CHECK-MOPS-NEXT: cpyfe [x9]!, [x8]!, x0!
54 ; CHECK-MOPS-NEXT: ret
56 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
60 define void @se_memset(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
61 ; CHECK-LABEL: se_memset:
62 ; CHECK: // %bb.0: // %entry
63 ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
64 ; CHECK-NEXT: mov x2, x0
65 ; CHECK-NEXT: adrp x0, :got:dst
66 ; CHECK-NEXT: mov w1, #2 // =0x2
67 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:dst]
68 ; CHECK-NEXT: bl __arm_sc_memset
69 ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
72 ; CHECK-NO-SME-ROUTINES-LABEL: se_memset:
73 ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
74 ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
75 ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
76 ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
77 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
78 ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
79 ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
80 ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
81 ; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
82 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
83 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
84 ; CHECK-NO-SME-ROUTINES-NEXT: mov w1, #2 // =0x2
85 ; CHECK-NO-SME-ROUTINES-NEXT: bl memset
86 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
87 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
88 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
89 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
90 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
91 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
92 ; CHECK-NO-SME-ROUTINES-NEXT: ret
94 ; CHECK-MOPS-LABEL: se_memset:
95 ; CHECK-MOPS: // %bb.0: // %entry
96 ; CHECK-MOPS-NEXT: adrp x8, :got:dst
97 ; CHECK-MOPS-NEXT: mov w9, #2 // =0x2
98 ; CHECK-MOPS-NEXT: ldr x8, [x8, :got_lo12:dst]
99 ; CHECK-MOPS-NEXT: setp [x8]!, x0!, x9
100 ; CHECK-MOPS-NEXT: setm [x8]!, x0!, x9
101 ; CHECK-MOPS-NEXT: sete [x8]!, x0!, x9
102 ; CHECK-MOPS-NEXT: ret
104 tail call void @llvm.memset.p0.i64(ptr align 1 @dst, i8 2, i64 %n, i1 false)
108 define void @se_memmove(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
109 ; CHECK-LABEL: se_memmove:
110 ; CHECK: // %bb.0: // %entry
111 ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
112 ; CHECK-NEXT: mov x2, x0
113 ; CHECK-NEXT: adrp x0, :got:dst
114 ; CHECK-NEXT: adrp x1, :got:src
115 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:dst]
116 ; CHECK-NEXT: ldr x1, [x1, :got_lo12:src]
117 ; CHECK-NEXT: bl __arm_sc_memmove
118 ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
121 ; CHECK-NO-SME-ROUTINES-LABEL: se_memmove:
122 ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
123 ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
124 ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
125 ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
126 ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
127 ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
128 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
129 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
130 ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
131 ; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
132 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
133 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
134 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
135 ; CHECK-NO-SME-ROUTINES-NEXT: bl memmove
136 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
137 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
138 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
139 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
140 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
141 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
142 ; CHECK-NO-SME-ROUTINES-NEXT: ret
144 ; CHECK-MOPS-LABEL: se_memmove:
145 ; CHECK-MOPS: // %bb.0: // %entry
146 ; CHECK-MOPS-NEXT: adrp x8, :got:src
147 ; CHECK-MOPS-NEXT: adrp x9, :got:dst
148 ; CHECK-MOPS-NEXT: ldr x8, [x8, :got_lo12:src]
149 ; CHECK-MOPS-NEXT: ldr x9, [x9, :got_lo12:dst]
150 ; CHECK-MOPS-NEXT: cpyp [x9]!, [x8]!, x0!
151 ; CHECK-MOPS-NEXT: cpym [x9]!, [x8]!, x0!
152 ; CHECK-MOPS-NEXT: cpye [x9]!, [x8]!, x0!
153 ; CHECK-MOPS-NEXT: ret
155 tail call void @llvm.memmove.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
159 define void @sc_memcpy(i64 noundef %n) "aarch64_pstate_sm_compatible" nounwind {
160 ; CHECK-LABEL: sc_memcpy:
161 ; CHECK: // %bb.0: // %entry
162 ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
163 ; CHECK-NEXT: mov x2, x0
164 ; CHECK-NEXT: adrp x0, :got:dst
165 ; CHECK-NEXT: adrp x1, :got:src
166 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:dst]
167 ; CHECK-NEXT: ldr x1, [x1, :got_lo12:src]
168 ; CHECK-NEXT: bl __arm_sc_memcpy
169 ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
172 ; CHECK-NO-SME-ROUTINES-LABEL: sc_memcpy:
173 ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
174 ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
175 ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
176 ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
177 ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
178 ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
179 ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
180 ; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
181 ; CHECK-NO-SME-ROUTINES-NEXT: str x19, [sp, #80] // 8-byte Folded Spill
182 ; CHECK-NO-SME-ROUTINES-NEXT: bl __arm_sme_state
183 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x8, :got:dst
184 ; CHECK-NO-SME-ROUTINES-NEXT: and x19, x0, #0x1
185 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
186 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x8, [x8, :got_lo12:dst]
187 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
188 ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB3_2
189 ; CHECK-NO-SME-ROUTINES-NEXT: // %bb.1: // %entry
190 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
191 ; CHECK-NO-SME-ROUTINES-NEXT: .LBB3_2: // %entry
192 ; CHECK-NO-SME-ROUTINES-NEXT: mov x0, x8
193 ; CHECK-NO-SME-ROUTINES-NEXT: bl memcpy
194 ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB3_4
195 ; CHECK-NO-SME-ROUTINES-NEXT: // %bb.3: // %entry
196 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
197 ; CHECK-NO-SME-ROUTINES-NEXT: .LBB3_4: // %entry
198 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
199 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x19, [sp, #80] // 8-byte Folded Reload
200 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
201 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
202 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
203 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
204 ; CHECK-NO-SME-ROUTINES-NEXT: ret
206 ; CHECK-MOPS-LABEL: sc_memcpy:
207 ; CHECK-MOPS: // %bb.0: // %entry
208 ; CHECK-MOPS-NEXT: adrp x8, :got:src
209 ; CHECK-MOPS-NEXT: adrp x9, :got:dst
210 ; CHECK-MOPS-NEXT: ldr x8, [x8, :got_lo12:src]
211 ; CHECK-MOPS-NEXT: ldr x9, [x9, :got_lo12:dst]
212 ; CHECK-MOPS-NEXT: cpyfp [x9]!, [x8]!, x0!
213 ; CHECK-MOPS-NEXT: cpyfm [x9]!, [x8]!, x0!
214 ; CHECK-MOPS-NEXT: cpyfe [x9]!, [x8]!, x0!
215 ; CHECK-MOPS-NEXT: ret
217 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
221 define void @sb_memcpy(i64 noundef %n) "aarch64_pstate_sm_body" nounwind {
222 ; CHECK-LABEL: sb_memcpy:
223 ; CHECK: // %bb.0: // %entry
224 ; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
225 ; CHECK-NEXT: rdsvl x9, #1
226 ; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
227 ; CHECK-NEXT: mov x2, x0
228 ; CHECK-NEXT: lsr x9, x9, #3
229 ; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
230 ; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
231 ; CHECK-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
232 ; CHECK-NEXT: cntd x9
233 ; CHECK-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
234 ; CHECK-NEXT: smstart sm
235 ; CHECK-NEXT: adrp x0, :got:dst
236 ; CHECK-NEXT: adrp x1, :got:src
237 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:dst]
238 ; CHECK-NEXT: ldr x1, [x1, :got_lo12:src]
239 ; CHECK-NEXT: bl __arm_sc_memcpy
240 ; CHECK-NEXT: smstop sm
241 ; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
242 ; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
243 ; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
244 ; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
245 ; CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
248 ; CHECK-NO-SME-ROUTINES-LABEL: sb_memcpy:
249 ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
250 ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
251 ; CHECK-NO-SME-ROUTINES-NEXT: rdsvl x9, #1
252 ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
253 ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
254 ; CHECK-NO-SME-ROUTINES-NEXT: lsr x9, x9, #3
255 ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
256 ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
257 ; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
258 ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
259 ; CHECK-NO-SME-ROUTINES-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
260 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
261 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
262 ; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
263 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
264 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
265 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
266 ; CHECK-NO-SME-ROUTINES-NEXT: bl memcpy
267 ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
268 ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
269 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
270 ; CHECK-NO-SME-ROUTINES-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
271 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
272 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
273 ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
274 ; CHECK-NO-SME-ROUTINES-NEXT: ret
276 ; CHECK-MOPS-LABEL: sb_memcpy:
277 ; CHECK-MOPS: // %bb.0: // %entry
278 ; CHECK-MOPS-NEXT: rdsvl x9, #1
279 ; CHECK-MOPS-NEXT: lsr x9, x9, #3
280 ; CHECK-MOPS-NEXT: str x9, [sp, #-80]! // 8-byte Folded Spill
281 ; CHECK-MOPS-NEXT: cntd x9
282 ; CHECK-MOPS-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill
283 ; CHECK-MOPS-NEXT: str x9, [sp, #8] // 8-byte Folded Spill
284 ; CHECK-MOPS-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill
285 ; CHECK-MOPS-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill
286 ; CHECK-MOPS-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill
287 ; CHECK-MOPS-NEXT: smstart sm
288 ; CHECK-MOPS-NEXT: adrp x8, :got:src
289 ; CHECK-MOPS-NEXT: adrp x9, :got:dst
290 ; CHECK-MOPS-NEXT: ldr x8, [x8, :got_lo12:src]
291 ; CHECK-MOPS-NEXT: ldr x9, [x9, :got_lo12:dst]
292 ; CHECK-MOPS-NEXT: cpyfp [x9]!, [x8]!, x0!
293 ; CHECK-MOPS-NEXT: cpyfm [x9]!, [x8]!, x0!
294 ; CHECK-MOPS-NEXT: cpyfe [x9]!, [x8]!, x0!
295 ; CHECK-MOPS-NEXT: smstop sm
296 ; CHECK-MOPS-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload
297 ; CHECK-MOPS-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload
298 ; CHECK-MOPS-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload
299 ; CHECK-MOPS-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload
300 ; CHECK-MOPS-NEXT: add sp, sp, #80
301 ; CHECK-MOPS-NEXT: ret
303 tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
307 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
308 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg)
309 declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg)