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