xref: /llvm-project/llvm/test/CodeGen/AArch64/aarch64-mops-mte.ll (revision ebbfdca586d5543c13617b15d0cdf5b7fdc4fd4a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
3; RUN: llc %s -o - -mtriple=aarch64 -O0 -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte  | FileCheck %s --check-prefix=GISel-O0
4; RUN: llc %s -o - -mtriple=aarch64     -global-isel=1 -global-isel-abort=1 -mattr=+mops,+mte  | FileCheck %s --check-prefix=GISel
5; RUN: llc %s -o - -mtriple=aarch64 -O2 -mattr=+mops,+mte  | FileCheck %s --check-prefix=SDAG
6
7declare ptr @llvm.aarch64.mops.memset.tag(ptr, i8, i64)
8
9define ptr @memset_tagged_0_zeroval(ptr %dst, i64 %size) {
10; GISel-O0-LABEL: memset_tagged_0_zeroval:
11; GISel-O0:       // %bb.0: // %entry
12; GISel-O0-NEXT:    mov x8, xzr
13; GISel-O0-NEXT:    setgp [x0]!, x8!, x8
14; GISel-O0-NEXT:    setgm [x0]!, x8!, x8
15; GISel-O0-NEXT:    setge [x0]!, x8!, x8
16; GISel-O0-NEXT:    ret
17;
18; GISel-LABEL: memset_tagged_0_zeroval:
19; GISel:       // %bb.0: // %entry
20; GISel-NEXT:    mov x8, xzr
21; GISel-NEXT:    setgp [x0]!, x8!, xzr
22; GISel-NEXT:    setgm [x0]!, x8!, xzr
23; GISel-NEXT:    setge [x0]!, x8!, xzr
24; GISel-NEXT:    ret
25;
26; SDAG-LABEL: memset_tagged_0_zeroval:
27; SDAG:       // %bb.0: // %entry
28; SDAG-NEXT:    mov x8, xzr
29; SDAG-NEXT:    setgp [x0]!, x8!, xzr
30; SDAG-NEXT:    setgm [x0]!, x8!, xzr
31; SDAG-NEXT:    setge [x0]!, x8!, xzr
32; SDAG-NEXT:    ret
33entry:
34  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 0)
35  ret ptr %r
36}
37
38define ptr @memset_tagged_1_zeroval(ptr %dst, i64 %size) {
39; GISel-O0-LABEL: memset_tagged_1_zeroval:
40; GISel-O0:       // %bb.0: // %entry
41; GISel-O0-NEXT:    mov w8, #1
42; GISel-O0-NEXT:    // kill: def $x8 killed $w8
43; GISel-O0-NEXT:    mov x9, xzr
44; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
45; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
46; GISel-O0-NEXT:    setge [x0]!, x8!, x9
47; GISel-O0-NEXT:    ret
48;
49; GISel-LABEL: memset_tagged_1_zeroval:
50; GISel:       // %bb.0: // %entry
51; GISel-NEXT:    mov w8, #1
52; GISel-NEXT:    setgp [x0]!, x8!, xzr
53; GISel-NEXT:    setgm [x0]!, x8!, xzr
54; GISel-NEXT:    setge [x0]!, x8!, xzr
55; GISel-NEXT:    ret
56;
57; SDAG-LABEL: memset_tagged_1_zeroval:
58; SDAG:       // %bb.0: // %entry
59; SDAG-NEXT:    mov w8, #1
60; SDAG-NEXT:    setgp [x0]!, x8!, xzr
61; SDAG-NEXT:    setgm [x0]!, x8!, xzr
62; SDAG-NEXT:    setge [x0]!, x8!, xzr
63; SDAG-NEXT:    ret
64entry:
65  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 1)
66  ret ptr %r
67}
68
69define ptr @memset_tagged_10_zeroval(ptr %dst, i64 %size) {
70; GISel-O0-LABEL: memset_tagged_10_zeroval:
71; GISel-O0:       // %bb.0: // %entry
72; GISel-O0-NEXT:    mov w8, #10
73; GISel-O0-NEXT:    // kill: def $x8 killed $w8
74; GISel-O0-NEXT:    mov x9, xzr
75; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
76; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
77; GISel-O0-NEXT:    setge [x0]!, x8!, x9
78; GISel-O0-NEXT:    ret
79;
80; GISel-LABEL: memset_tagged_10_zeroval:
81; GISel:       // %bb.0: // %entry
82; GISel-NEXT:    mov w8, #10
83; GISel-NEXT:    setgp [x0]!, x8!, xzr
84; GISel-NEXT:    setgm [x0]!, x8!, xzr
85; GISel-NEXT:    setge [x0]!, x8!, xzr
86; GISel-NEXT:    ret
87;
88; SDAG-LABEL: memset_tagged_10_zeroval:
89; SDAG:       // %bb.0: // %entry
90; SDAG-NEXT:    mov w8, #10
91; SDAG-NEXT:    setgp [x0]!, x8!, xzr
92; SDAG-NEXT:    setgm [x0]!, x8!, xzr
93; SDAG-NEXT:    setge [x0]!, x8!, xzr
94; SDAG-NEXT:    ret
95entry:
96  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 10)
97  ret ptr %r
98}
99
100define ptr @memset_tagged_10000_zeroval(ptr %dst, i64 %size) {
101; GISel-O0-LABEL: memset_tagged_10000_zeroval:
102; GISel-O0:       // %bb.0: // %entry
103; GISel-O0-NEXT:    mov w8, #10000
104; GISel-O0-NEXT:    // kill: def $x8 killed $w8
105; GISel-O0-NEXT:    mov x9, xzr
106; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
107; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
108; GISel-O0-NEXT:    setge [x0]!, x8!, x9
109; GISel-O0-NEXT:    ret
110;
111; GISel-LABEL: memset_tagged_10000_zeroval:
112; GISel:       // %bb.0: // %entry
113; GISel-NEXT:    mov w8, #10000
114; GISel-NEXT:    setgp [x0]!, x8!, xzr
115; GISel-NEXT:    setgm [x0]!, x8!, xzr
116; GISel-NEXT:    setge [x0]!, x8!, xzr
117; GISel-NEXT:    ret
118;
119; SDAG-LABEL: memset_tagged_10000_zeroval:
120; SDAG:       // %bb.0: // %entry
121; SDAG-NEXT:    mov w8, #10000
122; SDAG-NEXT:    setgp [x0]!, x8!, xzr
123; SDAG-NEXT:    setgm [x0]!, x8!, xzr
124; SDAG-NEXT:    setge [x0]!, x8!, xzr
125; SDAG-NEXT:    ret
126entry:
127  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 10000)
128  ret ptr %r
129}
130
131define ptr @memset_tagged_size_zeroval(ptr %dst, i64 %size) {
132; GISel-O0-LABEL: memset_tagged_size_zeroval:
133; GISel-O0:       // %bb.0: // %entry
134; GISel-O0-NEXT:    mov x8, xzr
135; GISel-O0-NEXT:    setgp [x0]!, x1!, x8
136; GISel-O0-NEXT:    setgm [x0]!, x1!, x8
137; GISel-O0-NEXT:    setge [x0]!, x1!, x8
138; GISel-O0-NEXT:    ret
139;
140; GISel-LABEL: memset_tagged_size_zeroval:
141; GISel:       // %bb.0: // %entry
142; GISel-NEXT:    setgp [x0]!, x1!, xzr
143; GISel-NEXT:    setgm [x0]!, x1!, xzr
144; GISel-NEXT:    setge [x0]!, x1!, xzr
145; GISel-NEXT:    ret
146;
147; SDAG-LABEL: memset_tagged_size_zeroval:
148; SDAG:       // %bb.0: // %entry
149; SDAG-NEXT:    setgp [x0]!, x1!, xzr
150; SDAG-NEXT:    setgm [x0]!, x1!, xzr
151; SDAG-NEXT:    setge [x0]!, x1!, xzr
152; SDAG-NEXT:    ret
153entry:
154  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 0, i64 %size)
155  ret ptr %r
156}
157
158define ptr @memset_tagged_0(ptr %dst, i64 %size, i32 %value) {
159; GISel-O0-LABEL: memset_tagged_0:
160; GISel-O0:       // %bb.0: // %entry
161; GISel-O0-NEXT:    mov x8, xzr
162; GISel-O0-NEXT:    // implicit-def: $x9
163; GISel-O0-NEXT:    mov w9, w2
164; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
165; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
166; GISel-O0-NEXT:    setge [x0]!, x8!, x9
167; GISel-O0-NEXT:    ret
168;
169; GISel-LABEL: memset_tagged_0:
170; GISel:       // %bb.0: // %entry
171; GISel-NEXT:    mov x8, xzr
172; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
173; GISel-NEXT:    setgp [x0]!, x8!, x2
174; GISel-NEXT:    setgm [x0]!, x8!, x2
175; GISel-NEXT:    setge [x0]!, x8!, x2
176; GISel-NEXT:    ret
177;
178; SDAG-LABEL: memset_tagged_0:
179; SDAG:       // %bb.0: // %entry
180; SDAG-NEXT:    mov x8, xzr
181; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
182; SDAG-NEXT:    setgp [x0]!, x8!, x2
183; SDAG-NEXT:    setgm [x0]!, x8!, x2
184; SDAG-NEXT:    setge [x0]!, x8!, x2
185; SDAG-NEXT:    ret
186entry:
187  %value_trunc = trunc i32 %value to i8
188  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 0)
189  ret ptr %r
190}
191
192define ptr @memset_tagged_1(ptr %dst, i64 %size, i32 %value) {
193; GISel-O0-LABEL: memset_tagged_1:
194; GISel-O0:       // %bb.0: // %entry
195; GISel-O0-NEXT:    mov w8, #1
196; GISel-O0-NEXT:    // kill: def $x8 killed $w8
197; GISel-O0-NEXT:    // implicit-def: $x9
198; GISel-O0-NEXT:    mov w9, w2
199; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
200; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
201; GISel-O0-NEXT:    setge [x0]!, x8!, x9
202; GISel-O0-NEXT:    ret
203;
204; GISel-LABEL: memset_tagged_1:
205; GISel:       // %bb.0: // %entry
206; GISel-NEXT:    mov w8, #1
207; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
208; GISel-NEXT:    setgp [x0]!, x8!, x2
209; GISel-NEXT:    setgm [x0]!, x8!, x2
210; GISel-NEXT:    setge [x0]!, x8!, x2
211; GISel-NEXT:    ret
212;
213; SDAG-LABEL: memset_tagged_1:
214; SDAG:       // %bb.0: // %entry
215; SDAG-NEXT:    mov w8, #1
216; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
217; SDAG-NEXT:    setgp [x0]!, x8!, x2
218; SDAG-NEXT:    setgm [x0]!, x8!, x2
219; SDAG-NEXT:    setge [x0]!, x8!, x2
220; SDAG-NEXT:    ret
221entry:
222  %value_trunc = trunc i32 %value to i8
223  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 1)
224  ret ptr %r
225}
226
227define ptr @memset_tagged_10(ptr %dst, i64 %size, i32 %value) {
228; GISel-O0-LABEL: memset_tagged_10:
229; GISel-O0:       // %bb.0: // %entry
230; GISel-O0-NEXT:    mov w8, #10
231; GISel-O0-NEXT:    // kill: def $x8 killed $w8
232; GISel-O0-NEXT:    // implicit-def: $x9
233; GISel-O0-NEXT:    mov w9, w2
234; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
235; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
236; GISel-O0-NEXT:    setge [x0]!, x8!, x9
237; GISel-O0-NEXT:    ret
238;
239; GISel-LABEL: memset_tagged_10:
240; GISel:       // %bb.0: // %entry
241; GISel-NEXT:    mov w8, #10
242; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
243; GISel-NEXT:    setgp [x0]!, x8!, x2
244; GISel-NEXT:    setgm [x0]!, x8!, x2
245; GISel-NEXT:    setge [x0]!, x8!, x2
246; GISel-NEXT:    ret
247;
248; SDAG-LABEL: memset_tagged_10:
249; SDAG:       // %bb.0: // %entry
250; SDAG-NEXT:    mov w8, #10
251; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
252; SDAG-NEXT:    setgp [x0]!, x8!, x2
253; SDAG-NEXT:    setgm [x0]!, x8!, x2
254; SDAG-NEXT:    setge [x0]!, x8!, x2
255; SDAG-NEXT:    ret
256entry:
257  %value_trunc = trunc i32 %value to i8
258  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 10)
259  ret ptr %r
260}
261
262define ptr @memset_tagged_10000(ptr %dst, i64 %size, i32 %value) {
263; GISel-O0-LABEL: memset_tagged_10000:
264; GISel-O0:       // %bb.0: // %entry
265; GISel-O0-NEXT:    mov w8, #10000
266; GISel-O0-NEXT:    // kill: def $x8 killed $w8
267; GISel-O0-NEXT:    // implicit-def: $x9
268; GISel-O0-NEXT:    mov w9, w2
269; GISel-O0-NEXT:    setgp [x0]!, x8!, x9
270; GISel-O0-NEXT:    setgm [x0]!, x8!, x9
271; GISel-O0-NEXT:    setge [x0]!, x8!, x9
272; GISel-O0-NEXT:    ret
273;
274; GISel-LABEL: memset_tagged_10000:
275; GISel:       // %bb.0: // %entry
276; GISel-NEXT:    mov w8, #10000
277; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
278; GISel-NEXT:    setgp [x0]!, x8!, x2
279; GISel-NEXT:    setgm [x0]!, x8!, x2
280; GISel-NEXT:    setge [x0]!, x8!, x2
281; GISel-NEXT:    ret
282;
283; SDAG-LABEL: memset_tagged_10000:
284; SDAG:       // %bb.0: // %entry
285; SDAG-NEXT:    mov w8, #10000
286; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
287; SDAG-NEXT:    setgp [x0]!, x8!, x2
288; SDAG-NEXT:    setgm [x0]!, x8!, x2
289; SDAG-NEXT:    setge [x0]!, x8!, x2
290; SDAG-NEXT:    ret
291entry:
292  %value_trunc = trunc i32 %value to i8
293  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 10000)
294  ret ptr %r
295}
296
297define ptr @memset_tagged_size(ptr %dst, i64 %size, i32 %value) {
298; GISel-O0-LABEL: memset_tagged_size:
299; GISel-O0:       // %bb.0: // %entry
300; GISel-O0-NEXT:    // implicit-def: $x8
301; GISel-O0-NEXT:    mov w8, w2
302; GISel-O0-NEXT:    setgp [x0]!, x1!, x8
303; GISel-O0-NEXT:    setgm [x0]!, x1!, x8
304; GISel-O0-NEXT:    setge [x0]!, x1!, x8
305; GISel-O0-NEXT:    ret
306;
307; GISel-LABEL: memset_tagged_size:
308; GISel:       // %bb.0: // %entry
309; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
310; GISel-NEXT:    setgp [x0]!, x1!, x2
311; GISel-NEXT:    setgm [x0]!, x1!, x2
312; GISel-NEXT:    setge [x0]!, x1!, x2
313; GISel-NEXT:    ret
314;
315; SDAG-LABEL: memset_tagged_size:
316; SDAG:       // %bb.0: // %entry
317; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
318; SDAG-NEXT:    setgp [x0]!, x1!, x2
319; SDAG-NEXT:    setgm [x0]!, x1!, x2
320; SDAG-NEXT:    setge [x0]!, x1!, x2
321; SDAG-NEXT:    ret
322entry:
323  %value_trunc = trunc i32 %value to i8
324  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr %dst, i8 %value_trunc, i64 %size)
325  ret ptr %r
326}
327
328define ptr @memset_tagged_size_aligned(ptr %dst, i64 %size, i32 %value) {
329; GISel-O0-LABEL: memset_tagged_size_aligned:
330; GISel-O0:       // %bb.0: // %entry
331; GISel-O0-NEXT:    // implicit-def: $x8
332; GISel-O0-NEXT:    mov w8, w2
333; GISel-O0-NEXT:    setgp [x0]!, x1!, x8
334; GISel-O0-NEXT:    setgm [x0]!, x1!, x8
335; GISel-O0-NEXT:    setge [x0]!, x1!, x8
336; GISel-O0-NEXT:    ret
337;
338; GISel-LABEL: memset_tagged_size_aligned:
339; GISel:       // %bb.0: // %entry
340; GISel-NEXT:    // kill: def $w2 killed $w2 def $x2
341; GISel-NEXT:    setgp [x0]!, x1!, x2
342; GISel-NEXT:    setgm [x0]!, x1!, x2
343; GISel-NEXT:    setge [x0]!, x1!, x2
344; GISel-NEXT:    ret
345;
346; SDAG-LABEL: memset_tagged_size_aligned:
347; SDAG:       // %bb.0: // %entry
348; SDAG-NEXT:    // kill: def $w2 killed $w2 def $x2
349; SDAG-NEXT:    setgp [x0]!, x1!, x2
350; SDAG-NEXT:    setgm [x0]!, x1!, x2
351; SDAG-NEXT:    setge [x0]!, x1!, x2
352; SDAG-NEXT:    ret
353entry:
354  %value_trunc = trunc i32 %value to i8
355  %r = tail call ptr @llvm.aarch64.mops.memset.tag(ptr align 16 %dst, i8 %value_trunc, i64 %size)
356  ret ptr %r
357}
358