166 lines · plain
1; Test ORs of a constant into a byte of memory.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check the lowest useful constant, expressed as a signed integer.6define void @f1(ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: oi 0(%r2), 19; CHECK: br %r1410 %val = load i8, ptr %ptr11 %or = or i8 %val, -25512 store i8 %or, ptr %ptr13 ret void14}15 16; Check the highest useful constant, expressed as a signed integer.17define void @f2(ptr %ptr) {18; CHECK-LABEL: f2:19; CHECK: oi 0(%r2), 25420; CHECK: br %r1421 %val = load i8, ptr %ptr22 %or = or i8 %val, -223 store i8 %or, ptr %ptr24 ret void25}26 27; Check the lowest useful constant, expressed as an unsigned integer.28define void @f3(ptr %ptr) {29; CHECK-LABEL: f3:30; CHECK: oi 0(%r2), 131; CHECK: br %r1432 %val = load i8, ptr %ptr33 %or = or i8 %val, 134 store i8 %or, ptr %ptr35 ret void36}37 38; Check the highest useful constant, expressed as a unsigned integer.39define void @f4(ptr %ptr) {40; CHECK-LABEL: f4:41; CHECK: oi 0(%r2), 25442; CHECK: br %r1443 %val = load i8, ptr %ptr44 %or = or i8 %val, 25445 store i8 %or, ptr %ptr46 ret void47}48 49; Check the high end of the OI range.50define void @f5(ptr %src) {51; CHECK-LABEL: f5:52; CHECK: oi 4095(%r2), 12753; CHECK: br %r1454 %ptr = getelementptr i8, ptr %src, i64 409555 %val = load i8, ptr %ptr56 %or = or i8 %val, 12757 store i8 %or, ptr %ptr58 ret void59}60 61; Check the next byte up, which should use OIY instead of OI.62define void @f6(ptr %src) {63; CHECK-LABEL: f6:64; CHECK: oiy 4096(%r2), 12765; CHECK: br %r1466 %ptr = getelementptr i8, ptr %src, i64 409667 %val = load i8, ptr %ptr68 %or = or i8 %val, 12769 store i8 %or, ptr %ptr70 ret void71}72 73; Check the high end of the OIY range.74define void @f7(ptr %src) {75; CHECK-LABEL: f7:76; CHECK: oiy 524287(%r2), 12777; CHECK: br %r1478 %ptr = getelementptr i8, ptr %src, i64 52428779 %val = load i8, ptr %ptr80 %or = or i8 %val, 12781 store i8 %or, ptr %ptr82 ret void83}84 85; Check the next byte up, which needs separate address logic.86; Other sequences besides this one would be OK.87define void @f8(ptr %src) {88; CHECK-LABEL: f8:89; CHECK: agfi %r2, 52428890; CHECK: oi 0(%r2), 12791; CHECK: br %r1492 %ptr = getelementptr i8, ptr %src, i64 52428893 %val = load i8, ptr %ptr94 %or = or i8 %val, 12795 store i8 %or, ptr %ptr96 ret void97}98 99; Check the high end of the negative OIY range.100define void @f9(ptr %src) {101; CHECK-LABEL: f9:102; CHECK: oiy -1(%r2), 127103; CHECK: br %r14104 %ptr = getelementptr i8, ptr %src, i64 -1105 %val = load i8, ptr %ptr106 %or = or i8 %val, 127107 store i8 %or, ptr %ptr108 ret void109}110 111; Check the low end of the OIY range.112define void @f10(ptr %src) {113; CHECK-LABEL: f10:114; CHECK: oiy -524288(%r2), 127115; CHECK: br %r14116 %ptr = getelementptr i8, ptr %src, i64 -524288117 %val = load i8, ptr %ptr118 %or = or i8 %val, 127119 store i8 %or, ptr %ptr120 ret void121}122 123; Check the next byte down, which needs separate address logic.124; Other sequences besides this one would be OK.125define void @f11(ptr %src) {126; CHECK-LABEL: f11:127; CHECK: agfi %r2, -524289128; CHECK: oi 0(%r2), 127129; CHECK: br %r14130 %ptr = getelementptr i8, ptr %src, i64 -524289131 %val = load i8, ptr %ptr132 %or = or i8 %val, 127133 store i8 %or, ptr %ptr134 ret void135}136 137; Check that OI does not allow an index138define void @f12(i64 %src, i64 %index) {139; CHECK-LABEL: f12:140; CHECK: agr %r2, %r3141; CHECK: oi 4095(%r2), 127142; CHECK: br %r14143 %add1 = add i64 %src, %index144 %add2 = add i64 %add1, 4095145 %ptr = inttoptr i64 %add2 to ptr146 %val = load i8, ptr %ptr147 %or = or i8 %val, 127148 store i8 %or, ptr %ptr149 ret void150}151 152; Check that OIY does not allow an index153define void @f13(i64 %src, i64 %index) {154; CHECK-LABEL: f13:155; CHECK: agr %r2, %r3156; CHECK: oiy 4096(%r2), 127157; CHECK: br %r14158 %add1 = add i64 %src, %index159 %add2 = add i64 %add1, 4096160 %ptr = inttoptr i64 %add2 to ptr161 %val = load i8, ptr %ptr162 %or = or i8 %val, 127163 store i8 %or, ptr %ptr164 ret void165}166