100 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test that the case of (64 - shift) used by a shift/rotate instruction is3; implemented with an lcr. This should also work for any multiple of 64.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s6 7define i64 @f1(i64 %in, i64 %sh) {8; CHECK-LABEL: f1:9; CHECK: # %bb.0:10; CHECK-NEXT: lcr %r1, %r311; CHECK-NEXT: sllg %r2, %r2, 0(%r1)12; CHECK-NEXT: br %r1413 %sub = sub i64 64, %sh14 %shl = shl i64 %in, %sub15 ret i64 %shl16}17 18define i64 @f2(i64 %in, i64 %sh) {19; CHECK-LABEL: f2:20; CHECK: # %bb.0:21; CHECK-NEXT: lcr %r1, %r322; CHECK-NEXT: srag %r2, %r2, 0(%r1)23; CHECK-NEXT: br %r1424 %sub = sub i64 64, %sh25 %shl = ashr i64 %in, %sub26 ret i64 %shl27}28 29define i64 @f3(i64 %in, i64 %sh) {30; CHECK-LABEL: f3:31; CHECK: # %bb.0:32; CHECK-NEXT: lcr %r1, %r333; CHECK-NEXT: srlg %r2, %r2, 0(%r1)34; CHECK-NEXT: br %r1435 %sub = sub i64 64, %sh36 %shl = lshr i64 %in, %sub37 ret i64 %shl38}39 40define i64 @f4(i64 %in, i64 %sh) {41; CHECK-LABEL: f4:42; CHECK: # %bb.0:43; CHECK-NEXT: lcr %r1, %r344; CHECK-NEXT: rllg %r2, %r2, 0(%r1)45; CHECK-NEXT: br %r1446 %shr = lshr i64 %in, %sh47 %sub = sub i64 64, %sh48 %shl = shl i64 %in, %sub49 %or = or i64 %shl, %shr50 ret i64 %or51}52 53define i64 @f5(i64 %in, i64 %sh) {54; CHECK-LABEL: f5:55; CHECK: # %bb.0:56; CHECK-NEXT: lcr %r1, %r357; CHECK-NEXT: sllg %r2, %r2, 0(%r1)58; CHECK-NEXT: br %r1459 %sub = sub i64 128, %sh60 %shl = shl i64 %in, %sub61 ret i64 %shl62}63 64define i64 @f6(i64 %in, i64 %sh) {65; CHECK-LABEL: f6:66; CHECK: # %bb.0:67; CHECK-NEXT: lcr %r1, %r368; CHECK-NEXT: srag %r2, %r2, 0(%r1)69; CHECK-NEXT: br %r1470 %sub = sub i64 256, %sh71 %shl = ashr i64 %in, %sub72 ret i64 %shl73}74 75define i64 @f7(i64 %in, i64 %sh) {76; CHECK-LABEL: f7:77; CHECK: # %bb.0:78; CHECK-NEXT: lcr %r1, %r379; CHECK-NEXT: srlg %r2, %r2, 0(%r1)80; CHECK-NEXT: br %r1481 %sub = sub i64 512, %sh82 %shl = lshr i64 %in, %sub83 ret i64 %shl84}85 86define i64 @f8(i64 %in, i64 %sh) {87; CHECK-LABEL: f8:88; CHECK: # %bb.0:89; CHECK-NEXT: lcr %r1, %r390; CHECK-NEXT: srlg %r0, %r2, 0(%r3)91; CHECK-NEXT: sllg %r2, %r2, 0(%r1)92; CHECK-NEXT: ogr %r2, %r093; CHECK-NEXT: br %r1494 %shr = lshr i64 %in, %sh95 %sub = sub i64 1024, %sh96 %shl = shl i64 %in, %sub97 %or = or i64 %shl, %shr98 ret i64 %or99}100