1 ; Test 64-bit atomic NANDs.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
5 ; Check NANDs of a variable.
6 define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
8 ; CHECK: lg %r2, 0(%r3)
9 ; CHECK: [[LABEL:\.[^:]*]]:
12 ; CHECK: lcgr %r0, %r0
14 ; CHECK: csg %r2, %r0, 0(%r3)
17 %res = atomicrmw nand i64 *%src, i64 %b seq_cst
21 ; Check NANDs of 1, which are done using a register. (We could use RISBG
22 ; instead, but that isn't implemented yet.)
23 define i64 @f2(i64 %dummy, i64 *%src) {
27 %res = atomicrmw nand i64 *%src, i64 1 seq_cst
31 ; Check the equivalent of NIHF with 1, which can use RISBG instead.
32 define i64 @f3(i64 %dummy, i64 *%src) {
34 ; CHECK: lg %r2, 0(%r3)
35 ; CHECK: [[LABEL:\.[^:]*]]:
36 ; CHECK: risbg %r0, %r2, 31, 191, 0
37 ; CHECK: lcgr %r0, %r0
39 ; CHECK: csg %r2, %r0, 0(%r3)
42 %res = atomicrmw nand i64 *%src, i64 8589934591 seq_cst
46 ; Check the lowest NIHF value outside the range of RISBG.
47 define i64 @f4(i64 %dummy, i64 *%src) {
49 ; CHECK: lg %r2, 0(%r3)
50 ; CHECK: [[LABEL:\.[^:]*]]:
53 ; CHECK: lcgr %r0, %r0
55 ; CHECK: csg %r2, %r0, 0(%r3)
58 %res = atomicrmw nand i64 *%src, i64 12884901887 seq_cst
62 ; Check the next value up, which must use a register.
63 define i64 @f5(i64 %dummy, i64 *%src) {
67 %res = atomicrmw nand i64 *%src, i64 12884901888 seq_cst
71 ; Check the lowest NIHH value outside the range of RISBG.
72 define i64 @f6(i64 %dummy, i64 *%src) {
74 ; CHECK: nihh {{%r[0-5]}}, 2
76 %res = atomicrmw nand i64 *%src, i64 844424930131967 seq_cst
80 ; Check the next value up, which must use a register.
81 define i64 @f7(i64 %dummy, i64 *%src) {
85 %res = atomicrmw nand i64 *%src, i64 281474976710656 seq_cst
89 ; Check the highest NILL value outside the range of RISBG.
90 define i64 @f8(i64 %dummy, i64 *%src) {
92 ; CHECK: nill {{%r[0-5]}}, 65530
94 %res = atomicrmw nand i64 *%src, i64 -6 seq_cst
98 ; Check the lowest NILL value outside the range of RISBG.
99 define i64 @f9(i64 %dummy, i64 *%src) {
101 ; CHECK: nill {{%r[0-5]}}, 2
103 %res = atomicrmw nand i64 *%src, i64 -65534 seq_cst
107 ; Check the highest useful NILF value.
108 define i64 @f10(i64 %dummy, i64 *%src) {
110 ; CHECK: nilf {{%r[0-5]}}, 4294901758
112 %res = atomicrmw nand i64 *%src, i64 -65538 seq_cst
116 ; Check the highest NILH value outside the range of RISBG.
117 define i64 @f11(i64 %dummy, i64 *%src) {
119 ; CHECK: nilh {{%r[0-5]}}, 65530
121 %res = atomicrmw nand i64 *%src, i64 -327681 seq_cst
125 ; Check the lowest NILH value outside the range of RISBG.
126 define i64 @f12(i64 %dummy, i64 *%src) {
128 ; CHECK: nilh {{%r[0-5]}}, 2
130 %res = atomicrmw nand i64 *%src, i64 -4294770689 seq_cst
134 ; Check the lowest NILF value outside the range of RISBG.
135 define i64 @f13(i64 %dummy, i64 *%src) {
137 ; CHECK: nilf {{%r[0-5]}}, 2
139 %res = atomicrmw nand i64 *%src, i64 -4294967294 seq_cst
143 ; Check the highest NIHL value outside the range of RISBG.
144 define i64 @f14(i64 %dummy, i64 *%src) {
146 ; CHECK: nihl {{%r[0-5]}}, 65530
148 %res = atomicrmw nand i64 *%src, i64 -21474836481 seq_cst
152 ; Check the lowest NIHL value outside the range of RISBG.
153 define i64 @f15(i64 %dummy, i64 *%src) {
155 ; CHECK: nihl {{%r[0-5]}}, 2
157 %res = atomicrmw nand i64 *%src, i64 -281462091808769 seq_cst
161 ; Check the highest NIHH value outside the range of RISBG.
162 define i64 @f16(i64 %dummy, i64 *%src) {
164 ; CHECK: nihh {{%r[0-5]}}, 65530
166 %res = atomicrmw nand i64 *%src, i64 -1407374883553281 seq_cst
170 ; Check the highest useful NIHF value.
171 define i64 @f17(i64 %dummy, i64 *%src) {
173 ; CHECK: nihf {{%r[0-5]}}, 4294901758
175 %res = atomicrmw nand i64 *%src, i64 -281479271677953 seq_cst