11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK
3- ; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -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 -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -mattr=+mops -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK-MOPS
2+ ; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK-COMMON,CHECK
3+ ; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -verify-machineinstrs -aarch64-lower-to-sme-routines=false < %s | FileCheck %s -check-prefixes=CHECK-COMMON,CHECK- NO-SME-ROUTINES
4+ ; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-streaming-hazard-size=0 -mattr=+sve -mattr=+sme2 -mattr=+mops -verify-machineinstrs < %s | FileCheck %s -check-prefixes=CHECK-COMMON,CHECK- MOPS
55
66@dst = global [512 x i8 ] zeroinitializer , align 1
77@src = global [512 x i8 ] zeroinitializer , align 1
@@ -153,6 +153,172 @@ entry:
153153 ret void
154154}
155155
156+ define ptr @se_memchr (ptr %src , i64 %n ) "aarch64_pstate_sm_enabled" {
157+ ; CHECK-LABEL: se_memchr:
158+ ; CHECK: // %bb.0: // %entry
159+ ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
160+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
161+ ; CHECK-NEXT: .cfi_offset w30, -16
162+ ; CHECK-NEXT: mov x2, x1
163+ ; CHECK-NEXT: mov w1, #5 // =0x5
164+ ; CHECK-NEXT: bl __arm_sc_memchr
165+ ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
166+ ; CHECK-NEXT: ret
167+ ;
168+ ; CHECK-NO-SME-ROUTINES-LABEL: se_memchr:
169+ ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
170+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
171+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_def_cfa_offset 96
172+ ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
173+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
174+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
175+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
176+ ; CHECK-NO-SME-ROUTINES-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill
177+ ; CHECK-NO-SME-ROUTINES-NEXT: str x9, [sp, #80] // 8-byte Spill
178+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset vg, -16
179+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset w30, -24
180+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset w29, -32
181+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b8, -40
182+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b9, -48
183+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b10, -56
184+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b11, -64
185+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b12, -72
186+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b13, -80
187+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b14, -88
188+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b15, -96
189+ ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x1
190+ ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
191+ ; CHECK-NO-SME-ROUTINES-NEXT: mov w1, #5 // =0x5
192+ ; CHECK-NO-SME-ROUTINES-NEXT: bl memchr
193+ ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
194+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload
195+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
196+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
197+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
198+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
199+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_def_cfa_offset 0
200+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore vg
201+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore w30
202+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore w29
203+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b8
204+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b9
205+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b10
206+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b11
207+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b12
208+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b13
209+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b14
210+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b15
211+ ; CHECK-NO-SME-ROUTINES-NEXT: ret
212+ ;
213+ ; CHECK-MOPS-LABEL: se_memchr:
214+ ; CHECK-MOPS: // %bb.0: // %entry
215+ ; CHECK-MOPS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
216+ ; CHECK-MOPS-NEXT: .cfi_def_cfa_offset 16
217+ ; CHECK-MOPS-NEXT: .cfi_offset w30, -16
218+ ; CHECK-MOPS-NEXT: mov x2, x1
219+ ; CHECK-MOPS-NEXT: mov w1, #5 // =0x5
220+ ; CHECK-MOPS-NEXT: bl __arm_sc_memchr
221+ ; CHECK-MOPS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
222+ ; CHECK-MOPS-NEXT: ret
223+ entry:
224+ %res = tail call ptr @memchr (ptr %src , i32 5 , i64 %n )
225+ ret ptr %res
226+ }
227+
228+ define ptr @sc_memchr (ptr %src , i64 %n ) "aarch64_pstate_sm_compatible" {
229+ ; CHECK-LABEL: sc_memchr:
230+ ; CHECK: // %bb.0: // %entry
231+ ; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
232+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
233+ ; CHECK-NEXT: .cfi_offset w30, -16
234+ ; CHECK-NEXT: mov x2, x1
235+ ; CHECK-NEXT: mov w1, #5 // =0x5
236+ ; CHECK-NEXT: bl __arm_sc_memchr
237+ ; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
238+ ; CHECK-NEXT: ret
239+ ;
240+ ; CHECK-NO-SME-ROUTINES-LABEL: sc_memchr:
241+ ; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
242+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
243+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_def_cfa_offset 96
244+ ; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
245+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
246+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
247+ ; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
248+ ; CHECK-NO-SME-ROUTINES-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill
249+ ; CHECK-NO-SME-ROUTINES-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill
250+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset w19, -8
251+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset vg, -16
252+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset w30, -24
253+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset w29, -32
254+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b8, -40
255+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b9, -48
256+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b10, -56
257+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b11, -64
258+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b12, -72
259+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b13, -80
260+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b14, -88
261+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_offset b15, -96
262+ ; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x1
263+ ; CHECK-NO-SME-ROUTINES-NEXT: mrs x19, SVCR
264+ ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB4_2
265+ ; CHECK-NO-SME-ROUTINES-NEXT: // %bb.1: // %entry
266+ ; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
267+ ; CHECK-NO-SME-ROUTINES-NEXT: .LBB4_2: // %entry
268+ ; CHECK-NO-SME-ROUTINES-NEXT: mov w1, #5 // =0x5
269+ ; CHECK-NO-SME-ROUTINES-NEXT: bl memchr
270+ ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB4_4
271+ ; CHECK-NO-SME-ROUTINES-NEXT: // %bb.3: // %entry
272+ ; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
273+ ; CHECK-NO-SME-ROUTINES-NEXT: .LBB4_4: // %entry
274+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload
275+ ; CHECK-NO-SME-ROUTINES-NEXT: ldr x19, [sp, #88] // 8-byte Reload
276+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
277+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
278+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
279+ ; CHECK-NO-SME-ROUTINES-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
280+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_def_cfa_offset 0
281+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore w19
282+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore vg
283+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore w30
284+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore w29
285+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b8
286+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b9
287+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b10
288+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b11
289+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b12
290+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b13
291+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b14
292+ ; CHECK-NO-SME-ROUTINES-NEXT: .cfi_restore b15
293+ ; CHECK-NO-SME-ROUTINES-NEXT: ret
294+ ;
295+ ; CHECK-MOPS-LABEL: sc_memchr:
296+ ; CHECK-MOPS: // %bb.0: // %entry
297+ ; CHECK-MOPS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
298+ ; CHECK-MOPS-NEXT: .cfi_def_cfa_offset 16
299+ ; CHECK-MOPS-NEXT: .cfi_offset w30, -16
300+ ; CHECK-MOPS-NEXT: mov x2, x1
301+ ; CHECK-MOPS-NEXT: mov w1, #5 // =0x5
302+ ; CHECK-MOPS-NEXT: bl __arm_sc_memchr
303+ ; CHECK-MOPS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
304+ ; CHECK-MOPS-NEXT: ret
305+ entry:
306+ %res = tail call ptr @memchr (ptr %src , i32 5 , i64 %n )
307+ ret ptr %res
308+ }
309+
310+ ; Non-streaming[-compatible] call to memchr.
311+ define ptr @ns_memcpy (ptr %src , i64 %n ) {
312+ ; CHECK-COMMON-LABEL: ns_memcpy:
313+ ; CHECK-COMMON: // %bb.0: // %entry
314+ ; CHECK-COMMON-NEXT: mov x2, x1
315+ ; CHECK-COMMON-NEXT: mov w1, #5 // =0x5
316+ ; CHECK-COMMON-NEXT: b memchr
317+ entry:
318+ %res = tail call ptr @memchr (ptr %src , i32 5 , i64 %n )
319+ ret ptr %res
320+ }
321+
156322define void @sc_memcpy (i64 noundef %n ) "aarch64_pstate_sm_compatible" nounwind {
157323; CHECK-LABEL: sc_memcpy:
158324; CHECK: // %bb.0: // %entry
@@ -179,15 +345,15 @@ define void @sc_memcpy(i64 noundef %n) "aarch64_pstate_sm_compatible" nounwind {
179345; CHECK-NO-SME-ROUTINES-NEXT: mrs x19, SVCR
180346; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
181347; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
182- ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB3_2
348+ ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB6_2
183349; CHECK-NO-SME-ROUTINES-NEXT: // %bb.1: // %entry
184350; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
185- ; CHECK-NO-SME-ROUTINES-NEXT: .LBB3_2 : // %entry
351+ ; CHECK-NO-SME-ROUTINES-NEXT: .LBB6_2 : // %entry
186352; CHECK-NO-SME-ROUTINES-NEXT: bl memcpy
187- ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB3_4
353+ ; CHECK-NO-SME-ROUTINES-NEXT: tbz w19, #0, .LBB6_4
188354; CHECK-NO-SME-ROUTINES-NEXT: // %bb.3: // %entry
189355; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
190- ; CHECK-NO-SME-ROUTINES-NEXT: .LBB3_4 : // %entry
356+ ; CHECK-NO-SME-ROUTINES-NEXT: .LBB6_4 : // %entry
191357; CHECK-NO-SME-ROUTINES-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload
192358; CHECK-NO-SME-ROUTINES-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
193359; CHECK-NO-SME-ROUTINES-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
@@ -283,3 +449,4 @@ entry:
283449declare void @llvm.memset.p0.i64 (ptr nocapture writeonly , i8 , i64 , i1 immarg)
284450declare void @llvm.memcpy.p0.p0.i64 (ptr nocapture writeonly , ptr nocapture readonly , i64 , i1 immarg)
285451declare void @llvm.memmove.p0.p0.i64 (ptr nocapture writeonly , ptr nocapture readonly , i64 , i1 immarg)
452+ declare ptr @memchr (ptr , i32 , i64 )
0 commit comments