1*9880d681SAndroid Build Coastguard Worker; Test 8-bit atomic additions. 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 addition 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. This shift is independent of the other loop prologue 14*9880d681SAndroid Build Coastguard Worker; 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 %r1, %r2, 0, 189, 0{{$}} 18*9880d681SAndroid Build Coastguard Worker; CHECK: sll [[SHIFT:%r[0-9]+]], 3 19*9880d681SAndroid Build Coastguard Worker; CHECK: l [[OLD:%r[0-9]+]], 0(%r1) 20*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]: 21*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0([[SHIFT]]) 22*9880d681SAndroid Build Coastguard Worker; CHECK: ar [[ROT]], %r3 23*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0({{%r[1-9]+}}) 24*9880d681SAndroid Build Coastguard Worker; CHECK: cs [[OLD]], [[NEW]], 0(%r1) 25*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]] 26*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, [[OLD]], 8([[SHIFT]]) 27*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f1: 30*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: sll [[SHIFT:%r[1-9]+]], 3 31*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], [[SHIFT]] 32*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 33*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]]) 34*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 35*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 36*9880d681SAndroid Build Coastguard Worker; 37*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f1: 38*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: sll %r3, 24 39*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 40*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: ar {{%r[0-9]+}}, %r3 41*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 42*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: rll 43*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 44*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 %b seq_cst 45*9880d681SAndroid Build Coastguard Worker ret i8 %res 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; Check the minimum signed value. We add 0x80000000 to the rotated word. 49*9880d681SAndroid Build Coastguard Workerdefine i8 @f2(i8 *%src) { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 51*9880d681SAndroid Build Coastguard Worker; CHECK: risbg [[RISBG:%r[1-9]+]], %r2, 0, 189, 0 52*9880d681SAndroid Build Coastguard Worker; CHECK: sll %r2, 3 53*9880d681SAndroid Build Coastguard Worker; CHECK: l [[OLD:%r[0-9]+]], 0([[RISBG]]) 54*9880d681SAndroid Build Coastguard Worker; CHECK: [[LABEL:\.[^:]*]]: 55*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[ROT:%r[0-9]+]], [[OLD]], 0(%r2) 56*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[ROT]], -2147483648 57*9880d681SAndroid Build Coastguard Worker; CHECK: rll [[NEW:%r[0-9]+]], [[ROT]], 0([[NEGSHIFT:%r[1-9]+]]) 58*9880d681SAndroid Build Coastguard Worker; CHECK: cs [[OLD]], [[NEW]], 0([[RISBG]]) 59*9880d681SAndroid Build Coastguard Worker; CHECK: jl [[LABEL]] 60*9880d681SAndroid Build Coastguard Worker; CHECK: rll %r2, [[OLD]], 8([[SHIFT]]) 61*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 62*9880d681SAndroid Build Coastguard Worker; 63*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f2: 64*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: sll [[SHIFT:%r[1-9]+]], 3 65*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: lcr [[NEGSHIFT:%r[1-9]+]], [[SHIFT]] 66*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 67*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll {{%r[0-9]+}}, {{%r[0-9]+}}, 0([[NEGSHIFT]]) 68*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: rll 69*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f2: 72*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 73*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 -128 seq_cst 74*9880d681SAndroid Build Coastguard Worker ret i8 %res 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; Check addition of -1. We add 0xff000000 to the rotated word. 78*9880d681SAndroid Build Coastguard Workerdefine i8 @f3(i8 *%src) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 80*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[ROT]], -16777216 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker; 83*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f3: 84*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 85*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f3: 86*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 87*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 -1 seq_cst 88*9880d681SAndroid Build Coastguard Worker ret i8 %res 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; Check addition of 1. We add 0x01000000 to the rotated word. 92*9880d681SAndroid Build Coastguard Workerdefine i8 @f4(i8 *%src) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 94*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[ROT]], 16777216 95*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 96*9880d681SAndroid Build Coastguard Worker; 97*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f4: 98*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 99*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f4: 100*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 101*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 1 seq_cst 102*9880d681SAndroid Build Coastguard Worker ret i8 %res 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Check the maximum signed value. We add 0x7f000000 to the rotated word. 106*9880d681SAndroid Build Coastguard Workerdefine i8 @f5(i8 *%src) { 107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 108*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[ROT]], 2130706432 109*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 110*9880d681SAndroid Build Coastguard Worker; 111*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f5: 112*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 113*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f5: 114*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 115*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 127 seq_cst 116*9880d681SAndroid Build Coastguard Worker ret i8 %res 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; Check addition of a large unsigned value. We add 0xfe000000 to the 120*9880d681SAndroid Build Coastguard Worker; rotated word, expressed as a negative AFI operand. 121*9880d681SAndroid Build Coastguard Workerdefine i8 @f6(i8 *%src) { 122*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 123*9880d681SAndroid Build Coastguard Worker; CHECK: afi [[ROT]], -33554432 124*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 125*9880d681SAndroid Build Coastguard Worker; 126*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1-LABEL: f6: 127*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT1: br %r14 128*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2-LABEL: f6: 129*9880d681SAndroid Build Coastguard Worker; CHECK-SHIFT2: br %r14 130*9880d681SAndroid Build Coastguard Worker %res = atomicrmw add i8 *%src, i8 254 seq_cst 131*9880d681SAndroid Build Coastguard Worker ret i8 %res 132*9880d681SAndroid Build Coastguard Worker} 133