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