1 ; Test 64-bit atomic minimum and maximum. Here we match the z10 versions, 2 ; which can't use LOCGR. 3 ; 4 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s 5 6 ; Check signed minium. 7 define i64 @f1(i64 %dummy, i64 *%src, i64 %b) { 8 ; CHECK-LABEL: f1: 9 ; CHECK: lg %r2, 0(%r3) 10 ; CHECK: j [[LOOP:\.[^:]*]] 11 ; CHECK: [[BB1:\.[^:]*]]: 12 ; CHECK: csg %r2, [[NEW:%r[0-9]+]], 0(%r3) 13 ; CHECK: ber %r14 14 ; CHECK: [[LOOP:\.[^:]*]]: 15 ; CHECK: lgr [[NEW:%r[0-9]+]], %r2 16 ; CHECK: cgrjle %r2, %r4, [[KEEP:\..*]] 17 ; CHECK: lgr [[NEW]], %r4 18 ; CHECK: j [[BB1]] 19 %res = atomicrmw min i64 *%src, i64 %b seq_cst 20 ret i64 %res 21 } 22 23 ; Check signed maximum. 24 define i64 @f2(i64 %dummy, i64 *%src, i64 %b) { 25 ; CHECK-LABEL: f2: 26 ; CHECK: lg %r2, 0(%r3) 27 ; CHECK: j [[LOOP:\.[^:]*]] 28 ; CHECK: [[BB1:\.[^:]*]]: 29 ; CHECK: csg %r2, [[NEW:%r[0-9]+]], 0(%r3) 30 ; CHECK: ber %r14 31 ; CHECK: [[LOOP:\.[^:]*]]: 32 ; CHECK: lgr [[NEW:%r[0-9]+]], %r2 33 ; CHECK: cgrjhe %r2, %r4, [[KEEP:\..*]] 34 ; CHECK: lgr [[NEW]], %r4 35 ; CHECK: j [[BB1]] 36 %res = atomicrmw max i64 *%src, i64 %b seq_cst 37 ret i64 %res 38 } 39 40 ; Check unsigned minimum. 41 define i64 @f3(i64 %dummy, i64 *%src, i64 %b) { 42 ; CHECK-LABEL: f3: 43 ; CHECK: lg %r2, 0(%r3) 44 ; CHECK: j [[LOOP:\.[^:]*]] 45 ; CHECK: [[BB1:\.[^:]*]]: 46 ; CHECK: csg %r2, [[NEW:%r[0-9]+]], 0(%r3) 47 ; CHECK: ber %r14 48 ; CHECK: [[LOOP:\.[^:]*]]: 49 ; CHECK: lgr [[NEW:%r[0-9]+]], %r2 50 ; CHECK: clgrjle %r2, %r4, [[KEEP:\..*]] 51 ; CHECK: lgr [[NEW]], %r4 52 ; CHECK: j [[BB1]] 53 %res = atomicrmw umin i64 *%src, i64 %b seq_cst 54 ret i64 %res 55 } 56 57 ; Check unsigned maximum. 58 define i64 @f4(i64 %dummy, i64 *%src, i64 %b) { 59 ; CHECK-LABEL: f4: 60 ; CHECK: lg %r2, 0(%r3) 61 ; CHECK: j [[LOOP:\.[^:]*]] 62 ; CHECK: [[BB1:\.[^:]*]]: 63 ; CHECK: csg %r2, [[NEW:%r[0-9]+]], 0(%r3) 64 ; CHECK: ber %r14 65 ; CHECK: [[LOOP:\.[^:]*]]: 66 ; CHECK: lgr [[NEW:%r[0-9]+]], %r2 67 ; CHECK: clgrjhe %r2, %r4, [[KEEP:\..*]] 68 ; CHECK: lgr [[NEW]], %r4 69 ; CHECK: j [[BB1]] 70 %res = atomicrmw umax i64 *%src, i64 %b seq_cst 71 ret i64 %res 72 } 73 74 ; Check the high end of the aligned CSG range. 75 define i64 @f5(i64 %dummy, i64 *%src, i64 %b) { 76 ; CHECK-LABEL: f5: 77 ; CHECK: lg %r2, 524280(%r3) 78 ; CHECK: csg %r2, {{%r[0-9]+}}, 524280(%r3) 79 ; CHECK: ber %r14 80 %ptr = getelementptr i64, i64 *%src, i64 65535 81 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst 82 ret i64 %res 83 } 84 85 ; Check the next doubleword up, which requires separate address logic. 86 define i64 @f6(i64 %dummy, i64 *%src, i64 %b) { 87 ; CHECK-LABEL: f6: 88 ; CHECK: agfi %r3, 524288 89 ; CHECK: lg %r2, 0(%r3) 90 ; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3) 91 ; CHECK: ber %r14 92 %ptr = getelementptr i64, i64 *%src, i64 65536 93 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst 94 ret i64 %res 95 } 96 97 ; Check the low end of the CSG range. 98 define i64 @f7(i64 %dummy, i64 *%src, i64 %b) { 99 ; CHECK-LABEL: f7: 100 ; CHECK: lg %r2, -524288(%r3) 101 ; CHECK: csg %r2, {{%r[0-9]+}}, -524288(%r3) 102 ; CHECK: ber %r14 103 %ptr = getelementptr i64, i64 *%src, i64 -65536 104 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst 105 ret i64 %res 106 } 107 108 ; Check the next doubleword down, which requires separate address logic. 109 define i64 @f8(i64 %dummy, i64 *%src, i64 %b) { 110 ; CHECK-LABEL: f8: 111 ; CHECK: agfi %r3, -524296 112 ; CHECK: lg %r2, 0(%r3) 113 ; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3) 114 ; CHECK: ber %r14 115 %ptr = getelementptr i64, i64 *%src, i64 -65537 116 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst 117 ret i64 %res 118 } 119 120 ; Check that indexed addresses are not allowed. 121 define i64 @f9(i64 %dummy, i64 %base, i64 %index, i64 %b) { 122 ; CHECK-LABEL: f9: 123 ; CHECK: agr %r3, %r4 124 ; CHECK: lg %r2, 0(%r3) 125 ; CHECK: csg %r2, {{%r[0-9]+}}, 0(%r3) 126 ; CHECK: ber %r14 127 %add = add i64 %base, %index 128 %ptr = inttoptr i64 %add to i64 * 129 %res = atomicrmw min i64 *%ptr, i64 %b seq_cst 130 ret i64 %res 131 } 132 133 ; Check that constants are handled. 134 define i64 @f10(i64 %dummy, i64 *%ptr) { 135 ; CHECK-LABEL: f10: 136 ; CHECK-DAG: lghi [[LIMIT:%r[0-9]+]], 42 137 ; CHECK-DAG: lg %r2, 0(%r3) 138 ; CHECK: j [[LOOP:\.[^:]*]] 139 ; CHECK: [[BB1:\.[^:]*]]: 140 ; CHECK: csg %r2, [[NEW:%r[0-9]+]], 0(%r3) 141 ; CHECK: ber %r14 142 ; CHECK: [[LOOP:\.[^:]*]]: 143 ; CHECK: lgr [[NEW:%r[0-9]+]], %r2 144 ; CHECK: cgrjle %r2, [[LIMIT]], [[KEEP:\..*]] 145 ; CHECK: lghi [[NEW]], 42 146 ; CHECK: j [[BB1]] 147 %res = atomicrmw min i64 *%ptr, i64 42 seq_cst 148 ret i64 %res 149 } 150