[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / settag.ll
blob9ca188fbce325dcdd7971919b26597ce50e526e0
1 ; RUN: llc < %s -mtriple=aarch64 -mattr=+mte | FileCheck %s
3 define void @stg1(i8* %p) {
4 entry:
5 ; CHECK-LABEL: stg1:
6 ; CHECK: stg x0, [x0]
7 ; CHECK: ret
8   call void @llvm.aarch64.settag(i8* %p, i64 16)
9   ret void
12 define void @stg2(i8* %p) {
13 entry:
14 ; CHECK-LABEL: stg2:
15 ; CHECK: st2g x0, [x0]
16 ; CHECK: ret
17   call void @llvm.aarch64.settag(i8* %p, i64 32)
18   ret void
21 define void @stg3(i8* %p) {
22 entry:
23 ; CHECK-LABEL: stg3:
24 ; CHECK: stg  x0, [x0, #32]
25 ; CHECK: st2g x0, [x0]
26 ; CHECK: ret
27   call void @llvm.aarch64.settag(i8* %p, i64 48)
28   ret void
31 define void @stg4(i8* %p) {
32 entry:
33 ; CHECK-LABEL: stg4:
34 ; CHECK: st2g x0, [x0, #32]
35 ; CHECK: st2g x0, [x0]
36 ; CHECK: ret
37   call void @llvm.aarch64.settag(i8* %p, i64 64)
38   ret void
41 define void @stg5(i8* %p) {
42 entry:
43 ; CHECK-LABEL: stg5:
44 ; CHECK: stg  x0, [x0, #64]
45 ; CHECK: st2g x0, [x0, #32]
46 ; CHECK: st2g x0, [x0]
47 ; CHECK: ret
48   call void @llvm.aarch64.settag(i8* %p, i64 80)
49   ret void
52 define void @stg16(i8* %p) {
53 entry:
54 ; CHECK-LABEL: stg16:
55 ; CHECK: mov  {{(w|x)}}[[R:[0-9]+]], #256
56 ; CHECK: st2g x0, [x0], #32
57 ; CHECK: sub  x[[R]], x[[R]], #32
58 ; CHECK: cbnz x[[R]],
59 ; CHECK: ret
60   call void @llvm.aarch64.settag(i8* %p, i64 256)
61   ret void
64 define void @stg17(i8* %p) {
65 entry:
66 ; CHECK-LABEL: stg17:
67 ; CHECK: mov  {{(w|x)}}[[R:[0-9]+]], #256
68 ; CHECK: stg x0, [x0], #16
69 ; CHECK: st2g x0, [x0], #32
70 ; CHECK: sub  x[[R]], x[[R]], #32
71 ; CHECK: cbnz x[[R]],
72 ; CHECK: ret
73   call void @llvm.aarch64.settag(i8* %p, i64 272)
74   ret void
77 define void @stzg3(i8* %p) {
78 entry:
79 ; CHECK-LABEL: stzg3:
80 ; CHECK: stzg  x0, [x0, #32]
81 ; CHECK: stz2g x0, [x0]
82 ; CHECK: ret
83   call void @llvm.aarch64.settag.zero(i8* %p, i64 48)
84   ret void
87 define void @stzg17(i8* %p) {
88 entry:
89 ; CHECK-LABEL: stzg17:
90 ; CHECK: mov  {{w|x}}[[R:[0-9]+]], #256
91 ; CHECK: stzg x0, [x0], #16
92 ; CHECK: stz2g x0, [x0], #32
93 ; CHECK: sub  x[[R]], x[[R]], #32
94 ; CHECK: cbnz x[[R]],
95 ; CHECK: ret
96   call void @llvm.aarch64.settag.zero(i8* %p, i64 272)
97   ret void
100 define void @stg_alloca1() {
101 entry:
102 ; CHECK-LABEL: stg_alloca1:
103 ; CHECK: stg sp, [sp]
104 ; CHECK: ret
105   %a = alloca i8, i32 16, align 16
106   call void @llvm.aarch64.settag(i8* %a, i64 16)
107   ret void
110 define void @stg_alloca5() {
111 entry:
112 ; CHECK-LABEL: stg_alloca5:
113 ; CHECK: stg  sp, [sp, #64]
114 ; CHECK: st2g sp, [sp, #32]
115 ; CHECK: st2g sp, [sp]
116 ; CHECK: ret
117   %a = alloca i8, i32 80, align 16
118   call void @llvm.aarch64.settag(i8* %a, i64 80)
119   ret void
122 define void @stg_alloca17() {
123 entry:
124 ; CHECK-LABEL: stg_alloca17:
125 ; CHECK: mov [[P:x[0-9]+]], sp
126 ; CHECK: stg [[P]], {{\[}}[[P]]{{\]}}, #16
127 ; CHECK: mov  {{w|x}}[[R:[0-9]+]], #256
128 ; CHECK: st2g [[P]], {{\[}}[[P]]{{\]}}, #32
129 ; CHECK: sub  x[[R]], x[[R]], #32
130 ; CHECK: cbnz x[[R]],
131 ; CHECK: ret
132   %a = alloca i8, i32 272, align 16
133   call void @llvm.aarch64.settag(i8* %a, i64 272)
134   ret void
137 declare void @llvm.aarch64.settag(i8* %p, i64 %a)
138 declare void @llvm.aarch64.settag.zero(i8* %p, i64 %a)