[AMDGPU] Mark AGPR tuple implicit in the first instr of AGPR spills. (#115285)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / streaming-compatible-memory-ops.ll
blob20faeb23eed59d9ce44cee24a491a6c7c2125a28
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
20 ; CHECK-NEXT:    ret
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
55 entry:
56   tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
57   ret void
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
70 ; CHECK-NEXT:    ret
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
103 entry:
104   tail call void @llvm.memset.p0.i64(ptr align 1 @dst, i8 2, i64 %n, i1 false)
105   ret void
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
119 ; CHECK-NEXT:    ret
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
154 entry:
155   tail call void @llvm.memmove.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
156   ret void
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
170 ; CHECK-NEXT:    ret
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
216 entry:
217   tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
218   ret void
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
246 ; CHECK-NEXT:    ret
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:    ldp d9, d8, [sp, #48] // 16-byte Folded Reload
268 ; CHECK-NO-SME-ROUTINES-NEXT:    ldr x30, [sp, #64] // 8-byte Folded Reload
269 ; CHECK-NO-SME-ROUTINES-NEXT:    ldp d11, d10, [sp, #32] // 16-byte Folded Reload
270 ; CHECK-NO-SME-ROUTINES-NEXT:    ldp d13, d12, [sp, #16] // 16-byte Folded Reload
271 ; CHECK-NO-SME-ROUTINES-NEXT:    ldp d15, d14, [sp], #96 // 16-byte Folded Reload
272 ; CHECK-NO-SME-ROUTINES-NEXT:    ret
274 ; CHECK-MOPS-LABEL: sb_memcpy:
275 ; CHECK-MOPS:       // %bb.0: // %entry
276 ; CHECK-MOPS-NEXT:    rdsvl x9, #1
277 ; CHECK-MOPS-NEXT:    lsr x9, x9, #3
278 ; CHECK-MOPS-NEXT:    str x9, [sp, #-80]! // 8-byte Folded Spill
279 ; CHECK-MOPS-NEXT:    cntd x9
280 ; CHECK-MOPS-NEXT:    stp d15, d14, [sp, #16] // 16-byte Folded Spill
281 ; CHECK-MOPS-NEXT:    str x9, [sp, #8] // 8-byte Folded Spill
282 ; CHECK-MOPS-NEXT:    stp d13, d12, [sp, #32] // 16-byte Folded Spill
283 ; CHECK-MOPS-NEXT:    stp d11, d10, [sp, #48] // 16-byte Folded Spill
284 ; CHECK-MOPS-NEXT:    stp d9, d8, [sp, #64] // 16-byte Folded Spill
285 ; CHECK-MOPS-NEXT:    smstart sm
286 ; CHECK-MOPS-NEXT:    adrp x8, :got:src
287 ; CHECK-MOPS-NEXT:    adrp x9, :got:dst
288 ; CHECK-MOPS-NEXT:    ldr x8, [x8, :got_lo12:src]
289 ; CHECK-MOPS-NEXT:    ldr x9, [x9, :got_lo12:dst]
290 ; CHECK-MOPS-NEXT:    cpyfp [x9]!, [x8]!, x0!
291 ; CHECK-MOPS-NEXT:    cpyfm [x9]!, [x8]!, x0!
292 ; CHECK-MOPS-NEXT:    cpyfe [x9]!, [x8]!, x0!
293 ; CHECK-MOPS-NEXT:    smstop sm
294 ; CHECK-MOPS-NEXT:    ldp d9, d8, [sp, #64] // 16-byte Folded Reload
295 ; CHECK-MOPS-NEXT:    ldp d11, d10, [sp, #48] // 16-byte Folded Reload
296 ; CHECK-MOPS-NEXT:    ldp d13, d12, [sp, #32] // 16-byte Folded Reload
297 ; CHECK-MOPS-NEXT:    ldp d15, d14, [sp, #16] // 16-byte Folded Reload
298 ; CHECK-MOPS-NEXT:    add sp, sp, #80
299 ; CHECK-MOPS-NEXT:    ret
300 entry:
301   tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 @dst, ptr nonnull align 1 @src, i64 %n, i1 false)
302   ret void
305 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
306 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg)
307 declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg)