brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 2662c99 Raw
131 lines · plain
1; Test 8-bit GPR stores.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Test an i8 store, which should get converted into an i32 truncation.6define void @f1(ptr %dst, i8 %val) {7; CHECK-LABEL: f1:8; CHECK: stc %r3, 0(%r2)9; CHECK: br %r1410  store i8 %val, ptr %dst11  ret void12}13 14; Test an i32 truncating store.15define void @f2(ptr %dst, i32 %val) {16; CHECK-LABEL: f2:17; CHECK: stc %r3, 0(%r2)18; CHECK: br %r1419  %trunc = trunc i32 %val to i820  store i8 %trunc, ptr %dst21  ret void22}23 24; Test an i64 truncating store.25define void @f3(ptr %dst, i64 %val) {26; CHECK-LABEL: f3:27; CHECK: stc %r3, 0(%r2)28; CHECK: br %r1429  %trunc = trunc i64 %val to i830  store i8 %trunc, ptr %dst31  ret void32}33 34; Check the high end of the STC range.35define void @f4(ptr %dst, i8 %val) {36; CHECK-LABEL: f4:37; CHECK: stc %r3, 4095(%r2)38; CHECK: br %r1439  %ptr = getelementptr i8, ptr %dst, i64 409540  store i8 %val, ptr %ptr41  ret void42}43 44; Check the next byte up, which should use STCY instead of STC.45define void @f5(ptr %dst, i8 %val) {46; CHECK-LABEL: f5:47; CHECK: stcy %r3, 4096(%r2)48; CHECK: br %r1449  %ptr = getelementptr i8, ptr %dst, i64 409650  store i8 %val, ptr %ptr51  ret void52}53 54; Check the high end of the STCY range.55define void @f6(ptr %dst, i8 %val) {56; CHECK-LABEL: f6:57; CHECK: stcy %r3, 524287(%r2)58; CHECK: br %r1459  %ptr = getelementptr i8, ptr %dst, i64 52428760  store i8 %val, ptr %ptr61  ret void62}63 64; Check the next byte up, which needs separate address logic.65; Other sequences besides this one would be OK.66define void @f7(ptr %dst, i8 %val) {67; CHECK-LABEL: f7:68; CHECK: agfi %r2, 52428869; CHECK: stc %r3, 0(%r2)70; CHECK: br %r1471  %ptr = getelementptr i8, ptr %dst, i64 52428872  store i8 %val, ptr %ptr73  ret void74}75 76; Check the high end of the negative STCY range.77define void @f8(ptr %dst, i8 %val) {78; CHECK-LABEL: f8:79; CHECK: stcy %r3, -1(%r2)80; CHECK: br %r1481  %ptr = getelementptr i8, ptr %dst, i64 -182  store i8 %val, ptr %ptr83  ret void84}85 86; Check the low end of the STCY range.87define void @f9(ptr %dst, i8 %val) {88; CHECK-LABEL: f9:89; CHECK: stcy %r3, -524288(%r2)90; CHECK: br %r1491  %ptr = getelementptr i8, ptr %dst, i64 -52428892  store i8 %val, ptr %ptr93  ret void94}95 96; Check the next byte down, which needs separate address logic.97; Other sequences besides this one would be OK.98define void @f10(ptr %dst, i8 %val) {99; CHECK-LABEL: f10:100; CHECK: agfi %r2, -524289101; CHECK: stc %r3, 0(%r2)102; CHECK: br %r14103  %ptr = getelementptr i8, ptr %dst, i64 -524289104  store i8 %val, ptr %ptr105  ret void106}107 108; Check that STC allows an index.109define void @f11(i64 %dst, i64 %index, i8 %val) {110; CHECK-LABEL: f11:111; CHECK: stc %r4, 4095(%r3,%r2)112; CHECK: br %r14113  %add1 = add i64 %dst, %index114  %add2 = add i64 %add1, 4095115  %ptr = inttoptr i64 %add2 to ptr116  store i8 %val, ptr %ptr117  ret void118}119 120; Check that STCY allows an index.121define void @f12(i64 %dst, i64 %index, i8 %val) {122; CHECK-LABEL: f12:123; CHECK: stcy %r4, 4096(%r3,%r2)124; CHECK: br %r14125  %add1 = add i64 %dst, %index126  %add2 = add i64 %add1, 4096127  %ptr = inttoptr i64 %add2 to ptr128  store i8 %val, ptr %ptr129  ret void130}131