blob: 69973f799d3da7e6500d061785a0f7f9e7a5cb8c [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 8-bit atomic min/max operations.
2;
Mandeep Singh Grang029a0562016-04-19 23:51:52 +00003; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00004; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-SHIFT1
5; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-SHIFT2
6
7; Check signed minimum.
8; - CHECK is for the main loop.
9; - CHECK-SHIFT1 makes sure that the negated shift count used by the second
10; RLL is set up correctly. The negation is independent of the NILL and L
11; tested in CHECK.
12; - CHECK-SHIFT2 makes sure that %b is shifted into the high part of the word
13; before being used, and that the low bits are set to 1. This sequence is
14; independent of the other loop prologue instructions.
15define i8 @f1(i8 *%src, i8 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000016; CHECK-LABEL: f1:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000017; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}
Jonas Paulssonc63ed222017-10-06 13:59:28 +000018; CHECK-DAG: sll %r2, 3
19; CHECK-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000020; CHECK: [[LOOP:\.[^:]*]]:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000021; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2)
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000022; CHECK: crjle [[ROT]], %r3, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000023; CHECK: risbg [[ROT]], %r3, 32, 39, 0
24; CHECK: [[KEEP]]:
25; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}})
Matt Arsenaultab2232c2016-04-29 19:53:16 +000026; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]])
Richard Sandiford3d768e32013-07-31 12:30:20 +000027; CHECK: jl [[LOOP]]
Matt Arsenaultab2232c2016-04-29 19:53:16 +000028; CHECK: rll %r2, [[OLD]], 8(%r2)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000029; CHECK: br %r14
30;
Stephen Lind24ab202013-07-14 06:24:09 +000031; CHECK-SHIFT1-LABEL: f1:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000032; CHECK-SHIFT1: sll %r2, 3
33; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000034; CHECK-SHIFT1: rll
35; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]])
36; CHECK-SHIFT1: rll
37; CHECK-SHIFT1: br %r14
38;
Stephen Lind24ab202013-07-14 06:24:09 +000039; CHECK-SHIFT2-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000040; CHECK-SHIFT2: sll %r3, 24
41; CHECK-SHIFT2: rll
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000042; CHECK-SHIFT2: crjle {{%r[0-9]+}}, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000043; CHECK-SHIFT2: rll
44; CHECK-SHIFT2: rll
45; CHECK-SHIFT2: br %r14
46 %res = atomicrmw min i8 *%src, i8 %b seq_cst
47 ret i8 %res
48}
49
50; Check signed maximum.
51define i8 @f2(i8 *%src, i8 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000052; CHECK-LABEL: f2:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000053; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}
Jonas Paulssonc63ed222017-10-06 13:59:28 +000054; CHECK-DAG: sll %r2, 3
55; CHECK-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000056; CHECK: [[LOOP:\.[^:]*]]:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000057; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2)
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000058; CHECK: crjhe [[ROT]], %r3, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000059; CHECK: risbg [[ROT]], %r3, 32, 39, 0
60; CHECK: [[KEEP]]:
61; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}})
Matt Arsenaultab2232c2016-04-29 19:53:16 +000062; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]])
Richard Sandiford3d768e32013-07-31 12:30:20 +000063; CHECK: jl [[LOOP]]
Matt Arsenaultab2232c2016-04-29 19:53:16 +000064; CHECK: rll %r2, [[OLD]], 8(%r2)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000065; CHECK: br %r14
66;
Stephen Lind24ab202013-07-14 06:24:09 +000067; CHECK-SHIFT1-LABEL: f2:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000068; CHECK-SHIFT1: sll %r2, 3
69; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000070; CHECK-SHIFT1: rll
71; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]])
72; CHECK-SHIFT1: rll
73; CHECK-SHIFT1: br %r14
74;
Stephen Lind24ab202013-07-14 06:24:09 +000075; CHECK-SHIFT2-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000076; CHECK-SHIFT2: sll %r3, 24
77; CHECK-SHIFT2: rll
Richard Sandiford0fb90ab2013-05-28 10:41:11 +000078; CHECK-SHIFT2: crjhe {{%r[0-9]+}}, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000079; CHECK-SHIFT2: rll
80; CHECK-SHIFT2: rll
81; CHECK-SHIFT2: br %r14
82 %res = atomicrmw max i8 *%src, i8 %b seq_cst
83 ret i8 %res
84}
85
86; Check unsigned minimum.
87define i8 @f3(i8 *%src, i8 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +000088; CHECK-LABEL: f3:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000089; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}
Jonas Paulssonc63ed222017-10-06 13:59:28 +000090; CHECK-DAG: sll %r2, 3
91; CHECK-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000092; CHECK: [[LOOP:\.[^:]*]]:
Matt Arsenaultab2232c2016-04-29 19:53:16 +000093; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2)
Richard Sandiford93183ee2013-09-18 09:56:40 +000094; CHECK: clrjle [[ROT]], %r3, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000095; CHECK: risbg [[ROT]], %r3, 32, 39, 0
96; CHECK: [[KEEP]]:
97; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}})
Matt Arsenaultab2232c2016-04-29 19:53:16 +000098; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]])
Richard Sandiford3d768e32013-07-31 12:30:20 +000099; CHECK: jl [[LOOP]]
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000100; CHECK: rll %r2, [[OLD]], 8(%r2)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000101; CHECK: br %r14
102;
Stephen Lind24ab202013-07-14 06:24:09 +0000103; CHECK-SHIFT1-LABEL: f3:
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000104; CHECK-SHIFT1: sll %r2, 3
105; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000106; CHECK-SHIFT1: rll
107; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]])
108; CHECK-SHIFT1: rll
109; CHECK-SHIFT1: br %r14
110;
Stephen Lind24ab202013-07-14 06:24:09 +0000111; CHECK-SHIFT2-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000112; CHECK-SHIFT2: sll %r3, 24
113; CHECK-SHIFT2: rll
Richard Sandiford93183ee2013-09-18 09:56:40 +0000114; CHECK-SHIFT2: clrjle {{%r[0-9]+}}, %r3,
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000115; CHECK-SHIFT2: rll
116; CHECK-SHIFT2: rll
117; CHECK-SHIFT2: br %r14
118 %res = atomicrmw umin i8 *%src, i8 %b seq_cst
119 ret i8 %res
120}
121
122; Check unsigned maximum.
123define i8 @f4(i8 *%src, i8 %b) {
Stephen Lind24ab202013-07-14 06:24:09 +0000124; CHECK-LABEL: f4:
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000125; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}}
Jonas Paulssonc63ed222017-10-06 13:59:28 +0000126; CHECK-DAG: sll %r2, 3
127; CHECK-DAG: l [[OLD:%r[0-9]+]], 0([[RISBG]])
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000128; CHECK: [[LOOP:\.[^:]*]]:
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000129; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2)
Richard Sandiford93183ee2013-09-18 09:56:40 +0000130; CHECK: clrjhe [[ROT]], %r3, [[KEEP:\..*]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000131; CHECK: risbg [[ROT]], %r3, 32, 39, 0
132; CHECK: [[KEEP]]:
133; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}})
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000134; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]])
Richard Sandiford3d768e32013-07-31 12:30:20 +0000135; CHECK: jl [[LOOP]]
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000136; CHECK: rll %r2, [[OLD]], 8(%r2)
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000137; CHECK: br %r14
138;
Stephen Lind24ab202013-07-14 06:24:09 +0000139; CHECK-SHIFT1-LABEL: f4:
Matt Arsenaultab2232c2016-04-29 19:53:16 +0000140; CHECK-SHIFT1: sll %r2, 3
141; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000142; CHECK-SHIFT1: rll
143; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]])
144; CHECK-SHIFT1: rll
145; CHECK-SHIFT1: br %r14
146;
Stephen Lind24ab202013-07-14 06:24:09 +0000147; CHECK-SHIFT2-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000148; CHECK-SHIFT2: sll %r3, 24
149; CHECK-SHIFT2: rll
Richard Sandiford93183ee2013-09-18 09:56:40 +0000150; CHECK-SHIFT2: clrjhe {{%r[0-9]+}}, %r3,
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000151; CHECK-SHIFT2: rll
152; CHECK-SHIFT2: rll
153; CHECK-SHIFT2: br %r14
154 %res = atomicrmw umax i8 *%src, i8 %b seq_cst
155 ret i8 %res
156}
157
158; Check the lowest useful signed minimum value. We need to load 0x81000000
159; into the source register.
160define i8 @f5(i8 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000161; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000162; CHECK: llilh [[SRC2:%r[0-9]+]], 33024
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000163; CHECK: crjle [[ROT:%r[0-9]+]], [[SRC2]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000164; CHECK: risbg [[ROT]], [[SRC2]], 32, 39, 0
165; CHECK: br %r14
166;
Stephen Lind24ab202013-07-14 06:24:09 +0000167; CHECK-SHIFT1-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000168; CHECK-SHIFT1: br %r14
Stephen Lind24ab202013-07-14 06:24:09 +0000169; CHECK-SHIFT2-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000170; CHECK-SHIFT2: br %r14
171 %res = atomicrmw min i8 *%src, i8 -127 seq_cst
172 ret i8 %res
173}
174
175; Check the highest useful signed maximum value. We need to load 0x7e000000
176; into the source register.
177define i8 @f6(i8 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000178; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000179; CHECK: llilh [[SRC2:%r[0-9]+]], 32256
Richard Sandiford0fb90ab2013-05-28 10:41:11 +0000180; CHECK: crjhe [[ROT:%r[0-9]+]], [[SRC2]]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000181; CHECK: risbg [[ROT]], [[SRC2]], 32, 39, 0
182; CHECK: br %r14
183;
Stephen Lind24ab202013-07-14 06:24:09 +0000184; CHECK-SHIFT1-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000185; CHECK-SHIFT1: br %r14
Stephen Lind24ab202013-07-14 06:24:09 +0000186; CHECK-SHIFT2-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000187; CHECK-SHIFT2: br %r14
188 %res = atomicrmw max i8 *%src, i8 126 seq_cst
189 ret i8 %res
190}
191
192; Check the lowest useful unsigned minimum value. We need to load 0x01000000
193; into the source register.
194define i8 @f7(i8 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000195; CHECK-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000196; CHECK: llilh [[SRC2:%r[0-9]+]], 256
Richard Sandiford93183ee2013-09-18 09:56:40 +0000197; CHECK: clrjle [[ROT:%r[0-9]+]], [[SRC2]],
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000198; CHECK: risbg [[ROT]], [[SRC2]], 32, 39, 0
199; CHECK: br %r14
200;
Stephen Lind24ab202013-07-14 06:24:09 +0000201; CHECK-SHIFT1-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000202; CHECK-SHIFT1: br %r14
Stephen Lind24ab202013-07-14 06:24:09 +0000203; CHECK-SHIFT2-LABEL: f7:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000204; CHECK-SHIFT2: br %r14
205 %res = atomicrmw umin i8 *%src, i8 1 seq_cst
206 ret i8 %res
207}
208
209; Check the highest useful unsigned maximum value. We need to load 0xfe000000
210; into the source register.
211define i8 @f8(i8 *%src) {
Stephen Lind24ab202013-07-14 06:24:09 +0000212; CHECK-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000213; CHECK: llilh [[SRC2:%r[0-9]+]], 65024
Richard Sandiford93183ee2013-09-18 09:56:40 +0000214; CHECK: clrjhe [[ROT:%r[0-9]+]], [[SRC2]],
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000215; CHECK: risbg [[ROT]], [[SRC2]], 32, 39, 0
216; CHECK: br %r14
217;
Stephen Lind24ab202013-07-14 06:24:09 +0000218; CHECK-SHIFT1-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000219; CHECK-SHIFT1: br %r14
Stephen Lind24ab202013-07-14 06:24:09 +0000220; CHECK-SHIFT2-LABEL: f8:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +0000221; CHECK-SHIFT2: br %r14
222 %res = atomicrmw umax i8 *%src, i8 254 seq_cst
223 ret i8 %res
224}