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