blob: 89899a6a03af4bf66f54ae6528ee5cfe2b7b25bf [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 64-bit atomic ANDs.
2;
Richard Sandifordc57e5862013-07-19 16:24:22 +00003; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00004
5; Check ANDs of a variable.
6define i64 @f1(i64 %dummy, i64 *%src, i64 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +00007; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00008; CHECK: lg %r2, 0(%r3)
9; CHECK: [[LABEL:\.[^:]*]]:
10; CHECK: lgr %r0, %r2
11; CHECK: ngr %r0, %r4
12; CHECK: csg %r2, %r0, 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000013; CHECK: jl [[LABEL]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000014; CHECK: br %r14
15 %res = atomicrmw and i64 *%src, i64 %b seq_cst
16 ret i64 %res
17}
18
Richard Sandiford6a06ba32013-07-31 11:36:35 +000019; Check ANDs of 1, which are done using a register. (We could use RISBG
20; instead, but that isn't implemented yet.)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000021define i64 @f2(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000022; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000023; CHECK: ngr
24; CHECK: br %r14
25 %res = atomicrmw and i64 *%src, i64 1 seq_cst
26 ret i64 %res
27}
28
Richard Sandiford6a06ba32013-07-31 11:36:35 +000029; Check the equivalent of NIHF with 1, which can use RISBG instead.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000030define i64 @f3(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000031; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000032; CHECK: lg %r2, 0(%r3)
33; CHECK: [[LABEL:\.[^:]*]]:
Richard Sandiford6a06ba32013-07-31 11:36:35 +000034; CHECK: risbg %r0, %r2, 31, 191, 0
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000035; CHECK: csg %r2, %r0, 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000036; CHECK: jl [[LABEL]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000037; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +000038 %res = atomicrmw and i64 *%src, i64 8589934591 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000039 ret i64 %res
40}
41
Richard Sandiford6a06ba32013-07-31 11:36:35 +000042; Check the lowest NIHF value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000043define i64 @f4(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000044; CHECK-LABEL: f4:
Richard Sandiford6a06ba32013-07-31 11:36:35 +000045; CHECK: lg %r2, 0(%r3)
46; CHECK: [[LABEL:\.[^:]*]]:
47; CHECK: lgr %r0, %r2
48; CHECK: nihf %r0, 2
49; CHECK: csg %r2, %r0, 0(%r3)
Richard Sandiford3d768e32013-07-31 12:30:20 +000050; CHECK: jl [[LABEL]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000051; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +000052 %res = atomicrmw and i64 *%src, i64 12884901887 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000053 ret i64 %res
54}
55
56; Check the next value up, which must use a register.
Richard Sandiford6a06ba32013-07-31 11:36:35 +000057define i64 @f5(i64 %dummy, i64 *%src) {
58; CHECK-LABEL: f5:
59; CHECK: ngr
60; CHECK: br %r14
61 %res = atomicrmw and i64 *%src, i64 12884901888 seq_cst
62 ret i64 %res
63}
64
65; Check the lowest NIHH value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000066define i64 @f6(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000067; CHECK-LABEL: f6:
Richard Sandiford6a06ba32013-07-31 11:36:35 +000068; CHECK: nihh {{%r[0-5]}}, 2
69; CHECK: br %r14
70 %res = atomicrmw and i64 *%src, i64 844424930131967 seq_cst
71 ret i64 %res
72}
73
74; Check the next value up, which must use a register.
75define i64 @f7(i64 %dummy, i64 *%src) {
76; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000077; CHECK: ngr
78; CHECK: br %r14
79 %res = atomicrmw and i64 *%src, i64 281474976710656 seq_cst
80 ret i64 %res
81}
82
Richard Sandiford6a06ba32013-07-31 11:36:35 +000083; Check the highest NILL value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000084define i64 @f8(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000085; CHECK-LABEL: f8:
Richard Sandiford6a06ba32013-07-31 11:36:35 +000086; CHECK: nill {{%r[0-5]}}, 65530
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000087; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +000088 %res = atomicrmw and i64 *%src, i64 -6 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000089 ret i64 %res
90}
91
Richard Sandiford6a06ba32013-07-31 11:36:35 +000092; Check the lowest NILL value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000093define i64 @f9(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +000094; CHECK-LABEL: f9:
Richard Sandiford6a06ba32013-07-31 11:36:35 +000095; CHECK: nill {{%r[0-5]}}, 2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000096; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +000097 %res = atomicrmw and i64 *%src, i64 -65534 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000098 ret i64 %res
99}
100
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000101; Check the highest useful NILF value.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000102define i64 @f10(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000103; CHECK-LABEL: f10:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000104; CHECK: nilf {{%r[0-5]}}, 4294901758
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000105; CHECK: br %r14
106 %res = atomicrmw and i64 *%src, i64 -65538 seq_cst
107 ret i64 %res
108}
109
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000110; Check the highest NILH value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000111define i64 @f11(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000112; CHECK-LABEL: f11:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000113; CHECK: nilh {{%r[0-5]}}, 65530
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000114; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000115 %res = atomicrmw and i64 *%src, i64 -327681 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000116 ret i64 %res
117}
118
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000119; Check the lowest NILH value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000120define i64 @f12(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000121; CHECK-LABEL: f12:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000122; CHECK: nilh {{%r[0-5]}}, 2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000123; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000124 %res = atomicrmw and i64 *%src, i64 -4294770689 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000125 ret i64 %res
126}
127
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000128; Check the lowest NILF value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000129define i64 @f13(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000130; CHECK-LABEL: f13:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000131; CHECK: nilf {{%r[0-5]}}, 2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000132; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000133 %res = atomicrmw and i64 *%src, i64 -4294967294 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000134 ret i64 %res
135}
136
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000137; Check the highest NIHL value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000138define i64 @f14(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000139; CHECK-LABEL: f14:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000140; CHECK: nihl {{%r[0-5]}}, 65530
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000141; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000142 %res = atomicrmw and i64 *%src, i64 -21474836481 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000143 ret i64 %res
144}
145
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000146; Check the lowest NIHL value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000147define i64 @f15(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000148; CHECK-LABEL: f15:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000149; CHECK: nihl {{%r[0-5]}}, 2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000150; CHECK: br %r14
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000151 %res = atomicrmw and i64 *%src, i64 -281462091808769 seq_cst
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000152 ret i64 %res
153}
154
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000155; Check the highest NIHH value outside the range of RISBG.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000156define i64 @f16(i64 %dummy, i64 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000157; CHECK-LABEL: f16:
Richard Sandiford6a06ba32013-07-31 11:36:35 +0000158; CHECK: nihh {{%r[0-5]}}, 65530
159; CHECK: br %r14
160 %res = atomicrmw and i64 *%src, i64 -1407374883553281 seq_cst
161 ret i64 %res
162}
163
164; Check the highest useful NIHF value.
165define i64 @f17(i64 %dummy, i64 *%src) {
166; CHECK-LABEL: f17:
167; CHECK: nihf {{%r[0-5]}}, 4294901758
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000168; CHECK: br %r14
169 %res = atomicrmw and i64 *%src, i64 -281479271677953 seq_cst
170 ret i64 %res
171}