brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 6ec352f Raw
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