xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/atomicrmw-nand-04.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test 64-bit atomic NANDs.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Check NANDs of a variable.
6*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
8*9880d681SAndroid Build Coastguard Worker; CHECK: lg %r2, 0(%r3)
9*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]:
10*9880d681SAndroid Build Coastguard Worker; CHECK: lgr %r0, %r2
11*9880d681SAndroid Build Coastguard Worker; CHECK: ngr %r0, %r4
12*9880d681SAndroid Build Coastguard Worker; CHECK: lcgr %r0, %r0
13*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r0, -1
14*9880d681SAndroid Build Coastguard Worker; CHECK: csg %r2, %r0, 0(%r3)
15*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]]
16*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
17*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 %b seq_cst
18*9880d681SAndroid Build Coastguard Worker  ret i64 %res
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; Check NANDs of 1, which are done using a register.  (We could use RISBG
22*9880d681SAndroid Build Coastguard Worker; instead, but that isn't implemented yet.)
23*9880d681SAndroid Build Coastguard Workerdefine i64 @f2(i64 %dummy, i64 *%src) {
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
25*9880d681SAndroid Build Coastguard Worker; CHECK: ngr
26*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
27*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 1 seq_cst
28*9880d681SAndroid Build Coastguard Worker  ret i64 %res
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; Check the equivalent of NIHF with 1, which can use RISBG instead.
32*9880d681SAndroid Build Coastguard Workerdefine i64 @f3(i64 %dummy, i64 *%src) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
34*9880d681SAndroid Build Coastguard Worker; CHECK: lg %r2, 0(%r3)
35*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]:
36*9880d681SAndroid Build Coastguard Worker; CHECK: risbg %r0, %r2, 31, 191, 0
37*9880d681SAndroid Build Coastguard Worker; CHECK: lcgr %r0, %r0
38*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r0, -1
39*9880d681SAndroid Build Coastguard Worker; CHECK: csg %r2, %r0, 0(%r3)
40*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]]
41*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
42*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 8589934591 seq_cst
43*9880d681SAndroid Build Coastguard Worker  ret i64 %res
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; Check the lowest NIHF value outside the range of RISBG.
47*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i64 %dummy, i64 *%src) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
49*9880d681SAndroid Build Coastguard Worker; CHECK: lg %r2, 0(%r3)
50*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]:
51*9880d681SAndroid Build Coastguard Worker; CHECK: lgr %r0, %r2
52*9880d681SAndroid Build Coastguard Worker; CHECK: nihf %r0, 2
53*9880d681SAndroid Build Coastguard Worker; CHECK: lcgr %r0, %r0
54*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r0, -1
55*9880d681SAndroid Build Coastguard Worker; CHECK: csg %r2, %r0, 0(%r3)
56*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]]
57*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
58*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 12884901887 seq_cst
59*9880d681SAndroid Build Coastguard Worker  ret i64 %res
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; Check the next value up, which must use a register.
63*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(i64 %dummy, i64 *%src) {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
65*9880d681SAndroid Build Coastguard Worker; CHECK: ngr
66*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
67*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 12884901888 seq_cst
68*9880d681SAndroid Build Coastguard Worker  ret i64 %res
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; Check the lowest NIHH value outside the range of RISBG.
72*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(i64 %dummy, i64 *%src) {
73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
74*9880d681SAndroid Build Coastguard Worker; CHECK: nihh {{%r[0-5]}}, 2
75*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
76*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 844424930131967 seq_cst
77*9880d681SAndroid Build Coastguard Worker  ret i64 %res
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; Check the next value up, which must use a register.
81*9880d681SAndroid Build Coastguard Workerdefine i64 @f7(i64 %dummy, i64 *%src) {
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
83*9880d681SAndroid Build Coastguard Worker; CHECK: ngr
84*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
85*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 281474976710656 seq_cst
86*9880d681SAndroid Build Coastguard Worker  ret i64 %res
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; Check the highest NILL value outside the range of RISBG.
90*9880d681SAndroid Build Coastguard Workerdefine i64 @f8(i64 %dummy, i64 *%src) {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
92*9880d681SAndroid Build Coastguard Worker; CHECK: nill {{%r[0-5]}}, 65530
93*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
94*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -6 seq_cst
95*9880d681SAndroid Build Coastguard Worker  ret i64 %res
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; Check the lowest NILL value outside the range of RISBG.
99*9880d681SAndroid Build Coastguard Workerdefine i64 @f9(i64 %dummy, i64 *%src) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
101*9880d681SAndroid Build Coastguard Worker; CHECK: nill {{%r[0-5]}}, 2
102*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
103*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -65534 seq_cst
104*9880d681SAndroid Build Coastguard Worker  ret i64 %res
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; Check the highest useful NILF value.
108*9880d681SAndroid Build Coastguard Workerdefine i64 @f10(i64 %dummy, i64 *%src) {
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
110*9880d681SAndroid Build Coastguard Worker; CHECK: nilf {{%r[0-5]}}, 4294901758
111*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
112*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -65538 seq_cst
113*9880d681SAndroid Build Coastguard Worker  ret i64 %res
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; Check the highest NILH value outside the range of RISBG.
117*9880d681SAndroid Build Coastguard Workerdefine i64 @f11(i64 %dummy, i64 *%src) {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
119*9880d681SAndroid Build Coastguard Worker; CHECK: nilh {{%r[0-5]}}, 65530
120*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
121*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -327681 seq_cst
122*9880d681SAndroid Build Coastguard Worker  ret i64 %res
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; Check the lowest NILH value outside the range of RISBG.
126*9880d681SAndroid Build Coastguard Workerdefine i64 @f12(i64 %dummy, i64 *%src) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
128*9880d681SAndroid Build Coastguard Worker; CHECK: nilh {{%r[0-5]}}, 2
129*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
130*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -4294770689 seq_cst
131*9880d681SAndroid Build Coastguard Worker  ret i64 %res
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; Check the lowest NILF value outside the range of RISBG.
135*9880d681SAndroid Build Coastguard Workerdefine i64 @f13(i64 %dummy, i64 *%src) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
137*9880d681SAndroid Build Coastguard Worker; CHECK: nilf {{%r[0-5]}}, 2
138*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
139*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -4294967294 seq_cst
140*9880d681SAndroid Build Coastguard Worker  ret i64 %res
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; Check the highest NIHL value outside the range of RISBG.
144*9880d681SAndroid Build Coastguard Workerdefine i64 @f14(i64 %dummy, i64 *%src) {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
146*9880d681SAndroid Build Coastguard Worker; CHECK: nihl {{%r[0-5]}}, 65530
147*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
148*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -21474836481 seq_cst
149*9880d681SAndroid Build Coastguard Worker  ret i64 %res
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; Check the lowest NIHL value outside the range of RISBG.
153*9880d681SAndroid Build Coastguard Workerdefine i64 @f15(i64 %dummy, i64 *%src) {
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
155*9880d681SAndroid Build Coastguard Worker; CHECK: nihl {{%r[0-5]}}, 2
156*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
157*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -281462091808769 seq_cst
158*9880d681SAndroid Build Coastguard Worker  ret i64 %res
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker; Check the highest NIHH value outside the range of RISBG.
162*9880d681SAndroid Build Coastguard Workerdefine i64 @f16(i64 %dummy, i64 *%src) {
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
164*9880d681SAndroid Build Coastguard Worker; CHECK: nihh {{%r[0-5]}}, 65530
165*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
166*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -1407374883553281 seq_cst
167*9880d681SAndroid Build Coastguard Worker  ret i64 %res
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; Check the highest useful NIHF value.
171*9880d681SAndroid Build Coastguard Workerdefine i64 @f17(i64 %dummy, i64 *%src) {
172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
173*9880d681SAndroid Build Coastguard Worker; CHECK: nihf {{%r[0-5]}}, 4294901758
174*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
175*9880d681SAndroid Build Coastguard Worker  %res = atomicrmw nand i64 *%src, i64 -281479271677953 seq_cst
176*9880d681SAndroid Build Coastguard Worker  ret i64 %res
177*9880d681SAndroid Build Coastguard Worker}
178