160 lines · plain
1; Test 64-bit atomic ORs.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s4 5; Check ORs 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, %r211; CHECK: ogr %r0, %r412; CHECK: csg %r2, %r0, 0(%r3)13; CHECK: jl [[LABEL]]14; CHECK: br %r1415 %res = atomicrmw or ptr %src, i64 %b seq_cst16 ret i64 %res17}18 19; Check the lowest useful OILL value.20define i64 @f2(i64 %dummy, ptr %src) {21; CHECK-LABEL: f2:22; CHECK: lg %r2, 0(%r3)23; CHECK: [[LABEL:\.[^ ]*]]:24; CHECK: lgr %r0, %r225; CHECK: oill %r0, 126; CHECK: csg %r2, %r0, 0(%r3)27; CHECK: jl [[LABEL]]28; CHECK: br %r1429 %res = atomicrmw or ptr %src, i64 1 seq_cst30 ret i64 %res31}32 33; Check the high end of the OILL range.34define i64 @f3(i64 %dummy, ptr %src) {35; CHECK-LABEL: f3:36; CHECK: oill %r0, 6553537; CHECK: br %r1438 %res = atomicrmw or ptr %src, i64 65535 seq_cst39 ret i64 %res40}41 42; Check the lowest useful OILH value, which is the next value up.43define i64 @f4(i64 %dummy, ptr %src) {44; CHECK-LABEL: f4:45; CHECK: oilh %r0, 146; CHECK: br %r1447 %res = atomicrmw or ptr %src, i64 65536 seq_cst48 ret i64 %res49}50 51; Check the lowest useful OILF value, which is the next value up again.52define i64 @f5(i64 %dummy, ptr %src) {53; CHECK-LABEL: f5:54; CHECK: oilf %r0, 6553755; CHECK: br %r1456 %res = atomicrmw or ptr %src, i64 65537 seq_cst57 ret i64 %res58}59 60; Check the high end of the OILH range.61define i64 @f6(i64 %dummy, ptr %src) {62; CHECK-LABEL: f6:63; CHECK: oilh %r0, 6553564; CHECK: br %r1465 %res = atomicrmw or ptr %src, i64 4294901760 seq_cst66 ret i64 %res67}68 69; Check the next value up, which must use OILF.70define i64 @f7(i64 %dummy, ptr %src) {71; CHECK-LABEL: f7:72; CHECK: oilf %r0, 429490176173; CHECK: br %r1474 %res = atomicrmw or ptr %src, i64 4294901761 seq_cst75 ret i64 %res76}77 78; Check the high end of the OILF range.79define i64 @f8(i64 %dummy, ptr %src) {80; CHECK-LABEL: f8:81; CHECK: oilf %r0, 429496729582; CHECK: br %r1483 %res = atomicrmw or ptr %src, i64 4294967295 seq_cst84 ret i64 %res85}86 87; Check the lowest useful OIHL value, which is one greater than above.88define i64 @f9(i64 %dummy, ptr %src) {89; CHECK-LABEL: f9:90; CHECK: oihl %r0, 191; CHECK: br %r1492 %res = atomicrmw or ptr %src, i64 4294967296 seq_cst93 ret i64 %res94}95 96; Check the next value up, which must use a register.97define i64 @f10(i64 %dummy, ptr %src) {98; CHECK-LABEL: f10:99; CHECK: oihl %r0, 1100; CHECK: oill %r0, 1101; CHECK: br %r14102 %res = atomicrmw or ptr %src, i64 4294967297 seq_cst103 ret i64 %res104}105 106; Check the high end of the OIHL range.107define i64 @f11(i64 %dummy, ptr %src) {108; CHECK-LABEL: f11:109; CHECK: oihl %r0, 65535110; CHECK: br %r14111 %res = atomicrmw or ptr %src, i64 281470681743360 seq_cst112 ret i64 %res113}114 115; Check the lowest useful OIHH value, which is 1<<32 greater than above.116define i64 @f12(i64 %dummy, ptr %src) {117; CHECK-LABEL: f12:118; CHECK: oihh %r0, 1119; CHECK: br %r14120 %res = atomicrmw or ptr %src, i64 281474976710656 seq_cst121 ret i64 %res122}123 124; Check the lowest useful OIHF value, which is 1<<32 greater again.125define i64 @f13(i64 %dummy, ptr %src) {126; CHECK-LABEL: f13:127; CHECK: oihf %r0, 65537128; CHECK: br %r14129 %res = atomicrmw or ptr %src, i64 281479271677952 seq_cst130 ret i64 %res131}132 133; Check the high end of the OIHH range.134define i64 @f14(i64 %dummy, ptr %src) {135; CHECK-LABEL: f14:136; CHECK: oihh %r0, 65535137; CHECK: br %r14138 %res = atomicrmw or ptr %src, i64 18446462598732840960 seq_cst139 ret i64 %res140}141 142; Check the next value up.143define i64 @f15(i64 %dummy, ptr %src) {144; CHECK-LABEL: f15:145; CHECK: oihh %r0, 65535146; CHECK: oill %r0, 1147; CHECK: br %r14148 %res = atomicrmw or ptr %src, i64 18446462598732840961 seq_cst149 ret i64 %res150}151 152; Check the high end of the OIHF range.153define i64 @f16(i64 %dummy, ptr %src) {154; CHECK-LABEL: f16:155; CHECK: oihf %r0, 4294967295156; CHECK: br %r14157 %res = atomicrmw or ptr %src, i64 -4294967296 seq_cst158 ret i64 %res159}160