1*9880d681SAndroid Build Coastguard Worker; Test 8-bit atomic NANDs. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-SHIFT1 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s -check-prefix=CHECK-SHIFT2 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Check NAND of a variable. 8*9880d681SAndroid Build Coastguard Worker; - CHECK is for the main loop. 9*9880d681SAndroid Build Coastguard Worker; - CHECK-SHIFT1 makes sure that the negated shift count used by the second 10*9880d681SAndroid Build Coastguard Worker; RLL is set up correctly. The negation is independent of the NILL and L 11*9880d681SAndroid Build Coastguard Worker; tested in CHECK. 12*9880d681SAndroid Build Coastguard Worker; - CHECK-SHIFT2 makes sure that %b is shifted into the high part of the word 13*9880d681SAndroid Build Coastguard Worker; before being used, and that the low bits are set to 1. This sequence is 14*9880d681SAndroid Build Coastguard Worker; independent of the other loop prologue instructions. 15*9880d681SAndroid Build Coastguard Workerdefine i8 @f1(i8 *%src, i8 %b) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 17*9880d681SAndroid Build Coastguard Worker; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}} 18*9880d681SAndroid Build Coastguard Worker; CHECK: sll %r2, 3 19*9880d681SAndroid Build Coastguard Worker; CHECK: l [[OLD:%r[0-9]+]], 0([[RISBG]]) 20*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]: 21*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2) 22*9880d681SAndroid Build Coastguard Worker; CHECK: nr [[ROT]], %r3 23*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 24*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}}) 25*9880d681SAndroid Build Coastguard Worker; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]]) 26*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]] 27*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, [[OLD]], 8(%r2) 28*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f1: 31*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: sll %r2, 3 32*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2 33*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 34*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]]) 35*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 36*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 37*9880d681SAndroid Build Coastguard Worker; 38*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f1: 39*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: sll %r3, 24 40*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: oilf %r3, 16777215 41*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 42*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: nr {{%r[0-9]+}}, %r3 43*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 44*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 45*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 46*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 %b seq_cst 47*9880d681SAndroid Build Coastguard Worker ret i8 %res 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; Check the minimum signed value. We AND the rotated word with 0x80ffffff. 51*9880d681SAndroid Build Coastguard Workerdefine i8 @f2(i8 *%src) { 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 53*9880d681SAndroid Build Coastguard Worker; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK: sll %r2, 3 55*9880d681SAndroid Build Coastguard Worker; CHECK: l [[OLD:%r[0-9]+]], 0([[RISBG]]) 56*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]: 57*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2) 58*9880d681SAndroid Build Coastguard Worker; CHECK: nilh [[ROT]], 33023 59*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 60*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0([[NEGSHIFT:%r[1-9]+]]) 61*9880d681SAndroid Build Coastguard Worker; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]]) 62*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]] 63*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, [[OLD]], 8(%r2) 64*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 65*9880d681SAndroid Build Coastguard Worker; 66*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f2: 67*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: sll %r2, 3 68*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], %r2 69*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 70*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]]) 71*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 72*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f2: 75*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 76*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 -128 seq_cst 77*9880d681SAndroid Build Coastguard Worker ret i8 %res 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; Check NANDs of -2 (-1 isn't useful). We AND the rotated word with 0xfeffffff. 81*9880d681SAndroid Build Coastguard Workerdefine i8 @f3(i8 *%src) { 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 83*9880d681SAndroid Build Coastguard Worker; CHECK: nilh [[ROT]], 65279 84*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 85*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 86*9880d681SAndroid Build Coastguard Worker; 87*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f3: 88*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 89*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f3: 90*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 91*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 -2 seq_cst 92*9880d681SAndroid Build Coastguard Worker ret i8 %res 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; Check NANDs of 1. We AND the rotated word with 0x01ffffff. 96*9880d681SAndroid Build Coastguard Workerdefine i8 @f4(i8 *%src) { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 98*9880d681SAndroid Build Coastguard Worker; CHECK: nilh [[ROT]], 511 99*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 100*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 101*9880d681SAndroid Build Coastguard Worker; 102*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f4: 103*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 104*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f4: 105*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 106*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 1 seq_cst 107*9880d681SAndroid Build Coastguard Worker ret i8 %res 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; Check the maximum signed value. We AND the rotated word with 0x7fffffff. 111*9880d681SAndroid Build Coastguard Workerdefine i8 @f5(i8 *%src) { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 113*9880d681SAndroid Build Coastguard Worker; CHECK: nilh [[ROT]], 32767 114*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 115*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 116*9880d681SAndroid Build Coastguard Worker; 117*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f5: 118*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 119*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f5: 120*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 121*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 127 seq_cst 122*9880d681SAndroid Build Coastguard Worker ret i8 %res 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; Check NANDs of a large unsigned value. We AND the rotated word with 126*9880d681SAndroid Build Coastguard Worker; 0xfdffffff. 127*9880d681SAndroid Build Coastguard Workerdefine i8 @f6(i8 *%src) { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 129*9880d681SAndroid Build Coastguard Worker; CHECK: nilh [[ROT]], 65023 130*9880d681SAndroid Build Coastguard Worker; CHECK: xilf [[ROT]], 4278190080 131*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 132*9880d681SAndroid Build Coastguard Worker; 133*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f6: 134*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 135*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f6: 136*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 137*9880d681SAndroid Build Coastguard Worker %res = atomicrmw nand i8 *%src, i8 253 seq_cst 138*9880d681SAndroid Build Coastguard Worker ret i8 %res 139*9880d681SAndroid Build Coastguard Worker} 140