118 lines · plain
1; Test 32-bit GPR stores.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Test an i32 store.6define void @f1(ptr %dst, i32 %val) {7; CHECK-LABEL: f1:8; CHECK: st %r3, 0(%r2)9; CHECK: br %r1410 store i32 %val, ptr %dst11 ret void12}13 14; Test a truncating i64 store.15define void @f2(ptr %dst, i64 %val) {16 %word = trunc i64 %val to i3217 store i32 %word, ptr %dst18 ret void19}20 21; Check the high end of the aligned ST range.22define void @f3(ptr %dst, i32 %val) {23; CHECK-LABEL: f3:24; CHECK: st %r3, 4092(%r2)25; CHECK: br %r1426 %ptr = getelementptr i32, ptr %dst, i64 102327 store i32 %val, ptr %ptr28 ret void29}30 31; Check the next word up, which should use STY instead of ST.32define void @f4(ptr %dst, i32 %val) {33; CHECK-LABEL: f4:34; CHECK: sty %r3, 4096(%r2)35; CHECK: br %r1436 %ptr = getelementptr i32, ptr %dst, i64 102437 store i32 %val, ptr %ptr38 ret void39}40 41; Check the high end of the aligned STY range.42define void @f5(ptr %dst, i32 %val) {43; CHECK-LABEL: f5:44; CHECK: sty %r3, 524284(%r2)45; CHECK: br %r1446 %ptr = getelementptr i32, ptr %dst, i64 13107147 store i32 %val, ptr %ptr48 ret void49}50 51; Check the next word up, which needs separate address logic.52; Other sequences besides this one would be OK.53define void @f6(ptr %dst, i32 %val) {54; CHECK-LABEL: f6:55; CHECK: agfi %r2, 52428856; CHECK: st %r3, 0(%r2)57; CHECK: br %r1458 %ptr = getelementptr i32, ptr %dst, i64 13107259 store i32 %val, ptr %ptr60 ret void61}62 63; Check the high end of the negative aligned STY range.64define void @f7(ptr %dst, i32 %val) {65; CHECK-LABEL: f7:66; CHECK: sty %r3, -4(%r2)67; CHECK: br %r1468 %ptr = getelementptr i32, ptr %dst, i64 -169 store i32 %val, ptr %ptr70 ret void71}72 73; Check the low end of the STY range.74define void @f8(ptr %dst, i32 %val) {75; CHECK-LABEL: f8:76; CHECK: sty %r3, -524288(%r2)77; CHECK: br %r1478 %ptr = getelementptr i32, ptr %dst, i64 -13107279 store i32 %val, ptr %ptr80 ret void81}82 83; Check the next word down, which needs separate address logic.84; Other sequences besides this one would be OK.85define void @f9(ptr %dst, i32 %val) {86; CHECK-LABEL: f9:87; CHECK: agfi %r2, -52429288; CHECK: st %r3, 0(%r2)89; CHECK: br %r1490 %ptr = getelementptr i32, ptr %dst, i64 -13107391 store i32 %val, ptr %ptr92 ret void93}94 95; Check that ST allows an index.96define void @f10(i64 %dst, i64 %index, i32 %val) {97; CHECK-LABEL: f10:98; CHECK: st %r4, 4095(%r3,%r2)99; CHECK: br %r14100 %add1 = add i64 %dst, %index101 %add2 = add i64 %add1, 4095102 %ptr = inttoptr i64 %add2 to ptr103 store i32 %val, ptr %ptr104 ret void105}106 107; Check that STY allows an index.108define void @f11(i64 %dst, i64 %index, i32 %val) {109; CHECK-LABEL: f11:110; CHECK: sty %r4, 4096(%r3,%r2)111; CHECK: br %r14112 %add1 = add i64 %dst, %index113 %add2 = add i64 %add1, 4096114 %ptr = inttoptr i64 %add2 to ptr115 store i32 %val, ptr %ptr116 ret void117}118