xref: /llvm-project/llvm/test/CodeGen/PowerPC/atomic-minmax.ll (revision eee024bf1bf87e3cb829962cd5b4755f09d80d25)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s | FileCheck %s
3target datalayout = "E-m:e-i64:64-n32:64"
4target triple = "powerpc64-unknown-linux-gnu"
5
6define void @a32min(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 {
7; CHECK-LABEL: a32min:
8; CHECK:       # %bb.0: # %entry
9; CHECK-NEXT:  .LBB0_1: # %entry
10; CHECK-NEXT:    #
11; CHECK-NEXT:    lwarx 5, 0, 3
12; CHECK-NEXT:    cmpw 5, 4
13; CHECK-NEXT:    bltlr 0
14; CHECK-NEXT:  # %bb.2: # %entry
15; CHECK-NEXT:    #
16; CHECK-NEXT:    stwcx. 4, 0, 3
17; CHECK-NEXT:    bne 0, .LBB0_1
18; CHECK-NEXT:  # %bb.3: # %entry
19; CHECK-NEXT:    blr
20entry:
21  %0 = atomicrmw min ptr %minimum, i32 %val monotonic
22  ret void
23
24}
25
26define void @a32max(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 {
27; CHECK-LABEL: a32max:
28; CHECK:       # %bb.0: # %entry
29; CHECK-NEXT:  .LBB1_1: # %entry
30; CHECK-NEXT:    #
31; CHECK-NEXT:    lwarx 5, 0, 3
32; CHECK-NEXT:    cmpw 5, 4
33; CHECK-NEXT:    bgtlr 0
34; CHECK-NEXT:  # %bb.2: # %entry
35; CHECK-NEXT:    #
36; CHECK-NEXT:    stwcx. 4, 0, 3
37; CHECK-NEXT:    bne 0, .LBB1_1
38; CHECK-NEXT:  # %bb.3: # %entry
39; CHECK-NEXT:    blr
40entry:
41  %0 = atomicrmw max ptr %minimum, i32 %val monotonic
42  ret void
43
44}
45
46define void @a32umin(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 {
47; CHECK-LABEL: a32umin:
48; CHECK:       # %bb.0: # %entry
49; CHECK-NEXT:  .LBB2_1: # %entry
50; CHECK-NEXT:    #
51; CHECK-NEXT:    lwarx 5, 0, 3
52; CHECK-NEXT:    cmplw 5, 4
53; CHECK-NEXT:    bltlr 0
54; CHECK-NEXT:  # %bb.2: # %entry
55; CHECK-NEXT:    #
56; CHECK-NEXT:    stwcx. 4, 0, 3
57; CHECK-NEXT:    bne 0, .LBB2_1
58; CHECK-NEXT:  # %bb.3: # %entry
59; CHECK-NEXT:    blr
60entry:
61  %0 = atomicrmw umin ptr %minimum, i32 %val monotonic
62  ret void
63
64}
65
66define void @a32umax(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 {
67; CHECK-LABEL: a32umax:
68; CHECK:       # %bb.0: # %entry
69; CHECK-NEXT:  .LBB3_1: # %entry
70; CHECK-NEXT:    #
71; CHECK-NEXT:    lwarx 5, 0, 3
72; CHECK-NEXT:    cmplw 5, 4
73; CHECK-NEXT:    bgtlr 0
74; CHECK-NEXT:  # %bb.2: # %entry
75; CHECK-NEXT:    #
76; CHECK-NEXT:    stwcx. 4, 0, 3
77; CHECK-NEXT:    bne 0, .LBB3_1
78; CHECK-NEXT:  # %bb.3: # %entry
79; CHECK-NEXT:    blr
80entry:
81  %0 = atomicrmw umax ptr %minimum, i32 %val monotonic
82  ret void
83
84}
85
86define void @a16min(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 {
87; CHECK-LABEL: a16min:
88; CHECK:       # %bb.0: # %entry
89; CHECK-NEXT:    extsh 4, 4
90; CHECK-NEXT:  .LBB4_1: # %entry
91; CHECK-NEXT:    #
92; CHECK-NEXT:    lharx 5, 0, 3
93; CHECK-NEXT:    extsh 5, 5
94; CHECK-NEXT:    cmpw 5, 4
95; CHECK-NEXT:    bltlr 0
96; CHECK-NEXT:  # %bb.2: # %entry
97; CHECK-NEXT:    #
98; CHECK-NEXT:    sthcx. 4, 0, 3
99; CHECK-NEXT:    bne 0, .LBB4_1
100; CHECK-NEXT:  # %bb.3: # %entry
101; CHECK-NEXT:    blr
102entry:
103  %0 = atomicrmw min ptr %minimum, i16 %val monotonic
104  ret void
105
106}
107
108define void @a16max(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 {
109; CHECK-LABEL: a16max:
110; CHECK:       # %bb.0: # %entry
111; CHECK-NEXT:    extsh 4, 4
112; CHECK-NEXT:  .LBB5_1: # %entry
113; CHECK-NEXT:    #
114; CHECK-NEXT:    lharx 5, 0, 3
115; CHECK-NEXT:    extsh 5, 5
116; CHECK-NEXT:    cmpw 5, 4
117; CHECK-NEXT:    bgtlr 0
118; CHECK-NEXT:  # %bb.2: # %entry
119; CHECK-NEXT:    #
120; CHECK-NEXT:    sthcx. 4, 0, 3
121; CHECK-NEXT:    bne 0, .LBB5_1
122; CHECK-NEXT:  # %bb.3: # %entry
123; CHECK-NEXT:    blr
124entry:
125  %0 = atomicrmw max ptr %minimum, i16 %val monotonic
126  ret void
127
128}
129
130define void @a16umin(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 {
131; CHECK-LABEL: a16umin:
132; CHECK:       # %bb.0: # %entry
133; CHECK-NEXT:  .LBB6_1: # %entry
134; CHECK-NEXT:    #
135; CHECK-NEXT:    lharx 5, 0, 3
136; CHECK-NEXT:    cmplw 5, 4
137; CHECK-NEXT:    bltlr 0
138; CHECK-NEXT:  # %bb.2: # %entry
139; CHECK-NEXT:    #
140; CHECK-NEXT:    sthcx. 4, 0, 3
141; CHECK-NEXT:    bne 0, .LBB6_1
142; CHECK-NEXT:  # %bb.3: # %entry
143; CHECK-NEXT:    blr
144entry:
145  %0 = atomicrmw umin ptr %minimum, i16 %val monotonic
146  ret void
147
148}
149
150define void @a16umax(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 {
151; CHECK-LABEL: a16umax:
152; CHECK:       # %bb.0: # %entry
153; CHECK-NEXT:  .LBB7_1: # %entry
154; CHECK-NEXT:    #
155; CHECK-NEXT:    lharx 5, 0, 3
156; CHECK-NEXT:    cmplw 5, 4
157; CHECK-NEXT:    bgtlr 0
158; CHECK-NEXT:  # %bb.2: # %entry
159; CHECK-NEXT:    #
160; CHECK-NEXT:    sthcx. 4, 0, 3
161; CHECK-NEXT:    bne 0, .LBB7_1
162; CHECK-NEXT:  # %bb.3: # %entry
163; CHECK-NEXT:    blr
164entry:
165  %0 = atomicrmw umax ptr %minimum, i16 %val monotonic
166  ret void
167
168}
169
170define void @a8min(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 {
171; CHECK-LABEL: a8min:
172; CHECK:       # %bb.0: # %entry
173; CHECK-NEXT:    extsb 4, 4
174; CHECK-NEXT:  .LBB8_1: # %entry
175; CHECK-NEXT:    #
176; CHECK-NEXT:    lbarx 5, 0, 3
177; CHECK-NEXT:    extsb 5, 5
178; CHECK-NEXT:    cmpw 5, 4
179; CHECK-NEXT:    bltlr 0
180; CHECK-NEXT:  # %bb.2: # %entry
181; CHECK-NEXT:    #
182; CHECK-NEXT:    stbcx. 4, 0, 3
183; CHECK-NEXT:    bne 0, .LBB8_1
184; CHECK-NEXT:  # %bb.3: # %entry
185; CHECK-NEXT:    blr
186entry:
187  %0 = atomicrmw min ptr %minimum, i8 %val monotonic
188  ret void
189
190}
191
192define void @a8max(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 {
193; CHECK-LABEL: a8max:
194; CHECK:       # %bb.0: # %entry
195; CHECK-NEXT:    extsb 4, 4
196; CHECK-NEXT:  .LBB9_1: # %entry
197; CHECK-NEXT:    #
198; CHECK-NEXT:    lbarx 5, 0, 3
199; CHECK-NEXT:    extsb 5, 5
200; CHECK-NEXT:    cmpw 5, 4
201; CHECK-NEXT:    bgtlr 0
202; CHECK-NEXT:  # %bb.2: # %entry
203; CHECK-NEXT:    #
204; CHECK-NEXT:    stbcx. 4, 0, 3
205; CHECK-NEXT:    bne 0, .LBB9_1
206; CHECK-NEXT:  # %bb.3: # %entry
207; CHECK-NEXT:    blr
208entry:
209  %0 = atomicrmw max ptr %minimum, i8 %val monotonic
210  ret void
211
212}
213
214define void @a8umin(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 {
215; CHECK-LABEL: a8umin:
216; CHECK:       # %bb.0: # %entry
217; CHECK-NEXT:  .LBB10_1: # %entry
218; CHECK-NEXT:    #
219; CHECK-NEXT:    lbarx 5, 0, 3
220; CHECK-NEXT:    cmplw 5, 4
221; CHECK-NEXT:    bltlr 0
222; CHECK-NEXT:  # %bb.2: # %entry
223; CHECK-NEXT:    #
224; CHECK-NEXT:    stbcx. 4, 0, 3
225; CHECK-NEXT:    bne 0, .LBB10_1
226; CHECK-NEXT:  # %bb.3: # %entry
227; CHECK-NEXT:    blr
228entry:
229  %0 = atomicrmw umin ptr %minimum, i8 %val monotonic
230  ret void
231
232}
233
234define void @a8umax(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 {
235; CHECK-LABEL: a8umax:
236; CHECK:       # %bb.0: # %entry
237; CHECK-NEXT:  .LBB11_1: # %entry
238; CHECK-NEXT:    #
239; CHECK-NEXT:    lbarx 5, 0, 3
240; CHECK-NEXT:    cmplw 5, 4
241; CHECK-NEXT:    bgtlr 0
242; CHECK-NEXT:  # %bb.2: # %entry
243; CHECK-NEXT:    #
244; CHECK-NEXT:    stbcx. 4, 0, 3
245; CHECK-NEXT:    bne 0, .LBB11_1
246; CHECK-NEXT:  # %bb.3: # %entry
247; CHECK-NEXT:    blr
248entry:
249  %0 = atomicrmw umax ptr %minimum, i8 %val monotonic
250  ret void
251
252}
253
254define void @a64min(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 {
255; CHECK-LABEL: a64min:
256; CHECK:       # %bb.0: # %entry
257; CHECK-NEXT:  .LBB12_1: # %entry
258; CHECK-NEXT:    #
259; CHECK-NEXT:    ldarx 5, 0, 3
260; CHECK-NEXT:    cmpd 5, 4
261; CHECK-NEXT:    bltlr 0
262; CHECK-NEXT:  # %bb.2: # %entry
263; CHECK-NEXT:    #
264; CHECK-NEXT:    stdcx. 4, 0, 3
265; CHECK-NEXT:    bne 0, .LBB12_1
266; CHECK-NEXT:  # %bb.3: # %entry
267; CHECK-NEXT:    blr
268entry:
269  %0 = atomicrmw min ptr %minimum, i64 %val monotonic
270  ret void
271
272}
273
274define void @a64max(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 {
275; CHECK-LABEL: a64max:
276; CHECK:       # %bb.0: # %entry
277; CHECK-NEXT:  .LBB13_1: # %entry
278; CHECK-NEXT:    #
279; CHECK-NEXT:    ldarx 5, 0, 3
280; CHECK-NEXT:    cmpd 5, 4
281; CHECK-NEXT:    bgtlr 0
282; CHECK-NEXT:  # %bb.2: # %entry
283; CHECK-NEXT:    #
284; CHECK-NEXT:    stdcx. 4, 0, 3
285; CHECK-NEXT:    bne 0, .LBB13_1
286; CHECK-NEXT:  # %bb.3: # %entry
287; CHECK-NEXT:    blr
288entry:
289  %0 = atomicrmw max ptr %minimum, i64 %val monotonic
290  ret void
291
292}
293
294define void @a64umin(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 {
295; CHECK-LABEL: a64umin:
296; CHECK:       # %bb.0: # %entry
297; CHECK-NEXT:  .LBB14_1: # %entry
298; CHECK-NEXT:    #
299; CHECK-NEXT:    ldarx 5, 0, 3
300; CHECK-NEXT:    cmpld 5, 4
301; CHECK-NEXT:    bltlr 0
302; CHECK-NEXT:  # %bb.2: # %entry
303; CHECK-NEXT:    #
304; CHECK-NEXT:    stdcx. 4, 0, 3
305; CHECK-NEXT:    bne 0, .LBB14_1
306; CHECK-NEXT:  # %bb.3: # %entry
307; CHECK-NEXT:    blr
308entry:
309  %0 = atomicrmw umin ptr %minimum, i64 %val monotonic
310  ret void
311
312}
313
314define void @a64umax(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 {
315; CHECK-LABEL: a64umax:
316; CHECK:       # %bb.0: # %entry
317; CHECK-NEXT:  .LBB15_1: # %entry
318; CHECK-NEXT:    #
319; CHECK-NEXT:    ldarx 5, 0, 3
320; CHECK-NEXT:    cmpld 5, 4
321; CHECK-NEXT:    bgtlr 0
322; CHECK-NEXT:  # %bb.2: # %entry
323; CHECK-NEXT:    #
324; CHECK-NEXT:    stdcx. 4, 0, 3
325; CHECK-NEXT:    bne 0, .LBB15_1
326; CHECK-NEXT:  # %bb.3: # %entry
327; CHECK-NEXT:    blr
328entry:
329  %0 = atomicrmw umax ptr %minimum, i64 %val monotonic
330  ret void
331
332}
333
334define void @ae16min(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 {
335; CHECK-LABEL: ae16min:
336; CHECK:       # %bb.0: # %entry
337; CHECK-NEXT:    li 5, 0
338; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 27
339; CHECK-NEXT:    extsh 4, 4
340; CHECK-NEXT:    ori 7, 5, 65535
341; CHECK-NEXT:    xori 5, 6, 16
342; CHECK-NEXT:    rldicr 3, 3, 0, 61
343; CHECK-NEXT:    slw 8, 4, 5
344; CHECK-NEXT:    slw 6, 7, 5
345; CHECK-NEXT:    and 7, 8, 6
346; CHECK-NEXT:  .LBB16_1: # %entry
347; CHECK-NEXT:    #
348; CHECK-NEXT:    lwarx 8, 0, 3
349; CHECK-NEXT:    and 9, 8, 6
350; CHECK-NEXT:    srw 9, 9, 5
351; CHECK-NEXT:    extsh 9, 9
352; CHECK-NEXT:    cmpw 9, 4
353; CHECK-NEXT:    bltlr 0
354; CHECK-NEXT:  # %bb.2: # %entry
355; CHECK-NEXT:    #
356; CHECK-NEXT:    andc 8, 8, 6
357; CHECK-NEXT:    or 8, 7, 8
358; CHECK-NEXT:    stwcx. 8, 0, 3
359; CHECK-NEXT:    bne 0, .LBB16_1
360; CHECK-NEXT:  # %bb.3: # %entry
361; CHECK-NEXT:    blr
362entry:
363  %0 = atomicrmw min ptr %minimum, i16 %val monotonic
364  ret void
365
366}
367
368define void @ae16max(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 {
369; CHECK-LABEL: ae16max:
370; CHECK:       # %bb.0: # %entry
371; CHECK-NEXT:    li 5, 0
372; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 27
373; CHECK-NEXT:    extsh 4, 4
374; CHECK-NEXT:    ori 7, 5, 65535
375; CHECK-NEXT:    xori 5, 6, 16
376; CHECK-NEXT:    rldicr 3, 3, 0, 61
377; CHECK-NEXT:    slw 8, 4, 5
378; CHECK-NEXT:    slw 6, 7, 5
379; CHECK-NEXT:    and 7, 8, 6
380; CHECK-NEXT:  .LBB17_1: # %entry
381; CHECK-NEXT:    #
382; CHECK-NEXT:    lwarx 8, 0, 3
383; CHECK-NEXT:    and 9, 8, 6
384; CHECK-NEXT:    srw 9, 9, 5
385; CHECK-NEXT:    extsh 9, 9
386; CHECK-NEXT:    cmpw 9, 4
387; CHECK-NEXT:    bgtlr 0
388; CHECK-NEXT:  # %bb.2: # %entry
389; CHECK-NEXT:    #
390; CHECK-NEXT:    andc 8, 8, 6
391; CHECK-NEXT:    or 8, 7, 8
392; CHECK-NEXT:    stwcx. 8, 0, 3
393; CHECK-NEXT:    bne 0, .LBB17_1
394; CHECK-NEXT:  # %bb.3: # %entry
395; CHECK-NEXT:    blr
396entry:
397  %0 = atomicrmw max ptr %minimum, i16 %val monotonic
398  ret void
399
400}
401
402define void @ae16umin(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 {
403; CHECK-LABEL: ae16umin:
404; CHECK:       # %bb.0: # %entry
405; CHECK-NEXT:    li 5, 0
406; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 27
407; CHECK-NEXT:    ori 5, 5, 65535
408; CHECK-NEXT:    xori 6, 6, 16
409; CHECK-NEXT:    slw 4, 4, 6
410; CHECK-NEXT:    slw 5, 5, 6
411; CHECK-NEXT:    rldicr 3, 3, 0, 61
412; CHECK-NEXT:    and 6, 4, 5
413; CHECK-NEXT:  .LBB18_1: # %entry
414; CHECK-NEXT:    #
415; CHECK-NEXT:    lwarx 7, 0, 3
416; CHECK-NEXT:    and 8, 7, 5
417; CHECK-NEXT:    cmplw 8, 4
418; CHECK-NEXT:    bltlr 0
419; CHECK-NEXT:  # %bb.2: # %entry
420; CHECK-NEXT:    #
421; CHECK-NEXT:    andc 7, 7, 5
422; CHECK-NEXT:    or 7, 6, 7
423; CHECK-NEXT:    stwcx. 7, 0, 3
424; CHECK-NEXT:    bne 0, .LBB18_1
425; CHECK-NEXT:  # %bb.3: # %entry
426; CHECK-NEXT:    blr
427entry:
428  %0 = atomicrmw umin ptr %minimum, i16 %val monotonic
429  ret void
430
431}
432
433define void @ae16umax(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 {
434; CHECK-LABEL: ae16umax:
435; CHECK:       # %bb.0: # %entry
436; CHECK-NEXT:    li 5, 0
437; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 27
438; CHECK-NEXT:    ori 5, 5, 65535
439; CHECK-NEXT:    xori 6, 6, 16
440; CHECK-NEXT:    slw 4, 4, 6
441; CHECK-NEXT:    slw 5, 5, 6
442; CHECK-NEXT:    rldicr 3, 3, 0, 61
443; CHECK-NEXT:    and 6, 4, 5
444; CHECK-NEXT:  .LBB19_1: # %entry
445; CHECK-NEXT:    #
446; CHECK-NEXT:    lwarx 7, 0, 3
447; CHECK-NEXT:    and 8, 7, 5
448; CHECK-NEXT:    cmplw 8, 4
449; CHECK-NEXT:    bgtlr 0
450; CHECK-NEXT:  # %bb.2: # %entry
451; CHECK-NEXT:    #
452; CHECK-NEXT:    andc 7, 7, 5
453; CHECK-NEXT:    or 7, 6, 7
454; CHECK-NEXT:    stwcx. 7, 0, 3
455; CHECK-NEXT:    bne 0, .LBB19_1
456; CHECK-NEXT:  # %bb.3: # %entry
457; CHECK-NEXT:    blr
458entry:
459  %0 = atomicrmw umax ptr %minimum, i16 %val monotonic
460  ret void
461
462}
463
464define void @ae8min(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 {
465; CHECK-LABEL: ae8min:
466; CHECK:       # %bb.0: # %entry
467; CHECK-NEXT:    rlwinm 5, 3, 3, 27, 28
468; CHECK-NEXT:    li 6, 255
469; CHECK-NEXT:    extsb 4, 4
470; CHECK-NEXT:    xori 5, 5, 24
471; CHECK-NEXT:    slw 7, 4, 5
472; CHECK-NEXT:    slw 6, 6, 5
473; CHECK-NEXT:    rldicr 3, 3, 0, 61
474; CHECK-NEXT:    and 7, 7, 6
475; CHECK-NEXT:  .LBB20_1: # %entry
476; CHECK-NEXT:    #
477; CHECK-NEXT:    lwarx 8, 0, 3
478; CHECK-NEXT:    and 9, 8, 6
479; CHECK-NEXT:    srw 9, 9, 5
480; CHECK-NEXT:    extsb 9, 9
481; CHECK-NEXT:    cmpw 9, 4
482; CHECK-NEXT:    bltlr 0
483; CHECK-NEXT:  # %bb.2: # %entry
484; CHECK-NEXT:    #
485; CHECK-NEXT:    andc 8, 8, 6
486; CHECK-NEXT:    or 8, 7, 8
487; CHECK-NEXT:    stwcx. 8, 0, 3
488; CHECK-NEXT:    bne 0, .LBB20_1
489; CHECK-NEXT:  # %bb.3: # %entry
490; CHECK-NEXT:    blr
491entry:
492  %0 = atomicrmw min ptr %minimum, i8 %val monotonic
493  ret void
494
495}
496
497define void @ae8max(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 {
498; CHECK-LABEL: ae8max:
499; CHECK:       # %bb.0: # %entry
500; CHECK-NEXT:    rlwinm 5, 3, 3, 27, 28
501; CHECK-NEXT:    li 6, 255
502; CHECK-NEXT:    extsb 4, 4
503; CHECK-NEXT:    xori 5, 5, 24
504; CHECK-NEXT:    slw 7, 4, 5
505; CHECK-NEXT:    slw 6, 6, 5
506; CHECK-NEXT:    rldicr 3, 3, 0, 61
507; CHECK-NEXT:    and 7, 7, 6
508; CHECK-NEXT:  .LBB21_1: # %entry
509; CHECK-NEXT:    #
510; CHECK-NEXT:    lwarx 8, 0, 3
511; CHECK-NEXT:    and 9, 8, 6
512; CHECK-NEXT:    srw 9, 9, 5
513; CHECK-NEXT:    extsb 9, 9
514; CHECK-NEXT:    cmpw 9, 4
515; CHECK-NEXT:    bgtlr 0
516; CHECK-NEXT:  # %bb.2: # %entry
517; CHECK-NEXT:    #
518; CHECK-NEXT:    andc 8, 8, 6
519; CHECK-NEXT:    or 8, 7, 8
520; CHECK-NEXT:    stwcx. 8, 0, 3
521; CHECK-NEXT:    bne 0, .LBB21_1
522; CHECK-NEXT:  # %bb.3: # %entry
523; CHECK-NEXT:    blr
524entry:
525  %0 = atomicrmw max ptr %minimum, i8 %val monotonic
526  ret void
527
528}
529
530define void @ae8umin(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 {
531; CHECK-LABEL: ae8umin:
532; CHECK:       # %bb.0: # %entry
533; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 28
534; CHECK-NEXT:    li 5, 255
535; CHECK-NEXT:    xori 6, 6, 24
536; CHECK-NEXT:    rldicr 3, 3, 0, 61
537; CHECK-NEXT:    slw 4, 4, 6
538; CHECK-NEXT:    slw 5, 5, 6
539; CHECK-NEXT:    and 6, 4, 5
540; CHECK-NEXT:  .LBB22_1: # %entry
541; CHECK-NEXT:    #
542; CHECK-NEXT:    lwarx 7, 0, 3
543; CHECK-NEXT:    and 8, 7, 5
544; CHECK-NEXT:    cmplw 8, 4
545; CHECK-NEXT:    bltlr 0
546; CHECK-NEXT:  # %bb.2: # %entry
547; CHECK-NEXT:    #
548; CHECK-NEXT:    andc 7, 7, 5
549; CHECK-NEXT:    or 7, 6, 7
550; CHECK-NEXT:    stwcx. 7, 0, 3
551; CHECK-NEXT:    bne 0, .LBB22_1
552; CHECK-NEXT:  # %bb.3: # %entry
553; CHECK-NEXT:    blr
554entry:
555  %0 = atomicrmw umin ptr %minimum, i8 %val monotonic
556  ret void
557
558}
559
560define void @ae8umax(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 {
561; CHECK-LABEL: ae8umax:
562; CHECK:       # %bb.0: # %entry
563; CHECK-NEXT:    rlwinm 6, 3, 3, 27, 28
564; CHECK-NEXT:    li 5, 255
565; CHECK-NEXT:    xori 6, 6, 24
566; CHECK-NEXT:    rldicr 3, 3, 0, 61
567; CHECK-NEXT:    slw 4, 4, 6
568; CHECK-NEXT:    slw 5, 5, 6
569; CHECK-NEXT:    and 6, 4, 5
570; CHECK-NEXT:  .LBB23_1: # %entry
571; CHECK-NEXT:    #
572; CHECK-NEXT:    lwarx 7, 0, 3
573; CHECK-NEXT:    and 8, 7, 5
574; CHECK-NEXT:    cmplw 8, 4
575; CHECK-NEXT:    bgtlr 0
576; CHECK-NEXT:  # %bb.2: # %entry
577; CHECK-NEXT:    #
578; CHECK-NEXT:    andc 7, 7, 5
579; CHECK-NEXT:    or 7, 6, 7
580; CHECK-NEXT:    stwcx. 7, 0, 3
581; CHECK-NEXT:    bne 0, .LBB23_1
582; CHECK-NEXT:  # %bb.3: # %entry
583; CHECK-NEXT:    blr
584entry:
585  %0 = atomicrmw umax ptr %minimum, i8 %val monotonic
586  ret void
587
588}
589
590attributes #0 = { nounwind "target-cpu"="ppc64" }
591attributes #1 = { nounwind "target-cpu"="pwr8" }
592
593