1; Test 64-bit atomic additions. 2; 3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s 4 5; Check addition of a variable. 6define i64 @f1(i64 %dummy, ptr %src, i64 %b) { 7; CHECK-LABEL: f1: 8; CHECK: lg %r2, 0(%r3) 9; CHECK: [[LABEL:\.[^:]*]]: 10; CHECK: lgr %r0, %r2 11; CHECK: agr %r0, %r4 12; CHECK: csg %r2, %r0, 0(%r3) 13; CHECK: jl [[LABEL]] 14; CHECK: br %r14 15 %res = atomicrmw add ptr %src, i64 %b seq_cst 16 ret i64 %res 17} 18 19; Check addition of 1. 20define i64 @f2(i64 %dummy, ptr %src) { 21; CHECK-LABEL: f2: 22; CHECK: lg %r2, 0(%r3) 23; CHECK: [[LABEL:\.[^:]*]]: 24; CHECK: la %r0, 1(%r2) 25; CHECK: csg %r2, %r0, 0(%r3) 26; CHECK: jl [[LABEL]] 27; CHECK: br %r14 28 %res = atomicrmw add ptr %src, i64 1 seq_cst 29 ret i64 %res 30} 31 32; Check use of LAY. 33define i64 @f3(i64 %dummy, ptr %src) { 34; CHECK-LABEL: f3: 35; CHECK: lay %r0, 32767(%r2) 36; CHECK: br %r14 37 %res = atomicrmw add ptr %src, i64 32767 seq_cst 38 ret i64 %res 39} 40 41; Check the high end of the AGFI range. 42define i64 @f4(i64 %dummy, ptr %src) { 43; CHECK-LABEL: f4: 44; CHECK: agfi %r0, 2147483647 45; CHECK: br %r14 46 %res = atomicrmw add ptr %src, i64 2147483647 seq_cst 47 ret i64 %res 48} 49 50; Check the next value up, which uses an ALGFI. 51define i64 @f5(i64 %dummy, ptr %src) { 52; CHECK-LABEL: f5: 53; CHECK: algfi %r0, 2147483648 54; CHECK: br %r14 55 %res = atomicrmw add ptr %src, i64 2147483648 seq_cst 56 ret i64 %res 57} 58 59; Check addition of -1, which can use LAY. 60define i64 @f6(i64 %dummy, ptr %src) { 61; CHECK-LABEL: f6: 62; CHECK: lay %r0, -1(%r2) 63; CHECK: br %r14 64 %res = atomicrmw add ptr %src, i64 -1 seq_cst 65 ret i64 %res 66} 67 68; LAY still OK. 69define i64 @f7(i64 %dummy, ptr %src) { 70; CHECK-LABEL: f7: 71; CHECK: lay %r0, -32769(%r2) 72; CHECK: br %r14 73 %res = atomicrmw add ptr %src, i64 -32769 seq_cst 74 ret i64 %res 75} 76 77; Check the low end of the AGFI range. 78define i64 @f8(i64 %dummy, ptr %src) { 79; CHECK-LABEL: f8: 80; CHECK: agfi %r0, -2147483648 81; CHECK: br %r14 82 %res = atomicrmw add ptr %src, i64 -2147483648 seq_cst 83 ret i64 %res 84} 85 86; Check the next value down, which uses an SLGFI. 87define i64 @f9(i64 %dummy, ptr %src) { 88; CHECK-LABEL: f9: 89; CHECK: slgfi %r0, 2147483649 90; CHECK: br %r14 91 %res = atomicrmw add ptr %src, i64 -2147483649 seq_cst 92 ret i64 %res 93} 94