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