165 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s3 4declare i8 @llvm.fshr.i8(i8, i8, i8)5declare i16 @llvm.fshr.i16(i16, i16, i16)6declare i32 @llvm.fshr.i32(i32, i32, i32)7declare i64 @llvm.fshr.i64(i64, i64, i64)8declare i128 @llvm.fshr.i128(i128, i128, i128)9 10;11; Variable Funnel Shift12;13 14define i8 @var_shift_i8(i8 %x, i8 %y, i8 %z) {15; CHECK-LABEL: var_shift_i8:16; CHECK: # %bb.0:17; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d18; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d19; CHECK-NEXT: sll %r2, 820; CHECK-NEXT: rosbg %r2, %r3, 56, 63, 021; CHECK-NEXT: nill %r4, 722; CHECK-NEXT: srl %r2, 0(%r4)23; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d24; CHECK-NEXT: br %r1425 %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 %z)26 ret i8 %tmp27}28 29define i16 @var_shift_i16(i16 %x, i16 %y, i16 %z) {30; CHECK-LABEL: var_shift_i16:31; CHECK: # %bb.0:32; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d33; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d34; CHECK-NEXT: sll %r2, 1635; CHECK-NEXT: rosbg %r2, %r3, 48, 63, 036; CHECK-NEXT: nill %r4, 1537; CHECK-NEXT: srl %r2, 0(%r4)38; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d39; CHECK-NEXT: br %r1440 %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 %z)41 ret i16 %tmp42}43 44define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) {45; CHECK-LABEL: var_shift_i32:46; CHECK: # %bb.0:47; CHECK-NEXT: lr %r1, %r448; CHECK-NEXT: nill %r1, 3149; CHECK-NEXT: srl %r3, 0(%r1)50; CHECK-NEXT: sll %r2, 151; CHECK-NEXT: xilf %r4, 429496729552; CHECK-NEXT: nill %r4, 3153; CHECK-NEXT: sll %r2, 0(%r4)54; CHECK-NEXT: or %r2, %r355; CHECK-NEXT: br %r1456 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)57 ret i32 %tmp58}59 60define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) {61; CHECK-LABEL: var_shift_i64:62; CHECK: # %bb.0:63; CHECK-NEXT: srlg %r0, %r3, 0(%r4)64; CHECK-NEXT: sllg %r1, %r2, 165; CHECK-NEXT: xilf %r4, 429496729566; CHECK-NEXT: sllg %r2, %r1, 0(%r4)67; CHECK-NEXT: ogr %r2, %r068; CHECK-NEXT: br %r1469 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z)70 ret i64 %tmp71}72 73define i128 @var_shift_i128(i128 %x, i128 %y, i128 %z) {74; CHECK-LABEL: var_shift_i128:75; CHECK: # %bb.0:76; CHECK-NEXT: stmg %r14, %r15, 112(%r15)77; CHECK-NEXT: .cfi_offset %r14, -4878; CHECK-NEXT: .cfi_offset %r15, -4079; CHECK-NEXT: lg %r1, 8(%r5)80; CHECK-NEXT: lg %r5, 8(%r3)81; CHECK-NEXT: lg %r0, 0(%r4)82; CHECK-NEXT: tmll %r1, 6483; CHECK-NEXT: jne .LBB4_284; CHECK-NEXT: # %bb.1:85; CHECK-NEXT: lg %r4, 8(%r4)86; CHECK-NEXT: srlg %r14, %r0, 0(%r1)87; CHECK-NEXT: jne .LBB4_388; CHECK-NEXT: j .LBB4_489; CHECK-NEXT: .LBB4_2:90; CHECK-NEXT: lgr %r4, %r091; CHECK-NEXT: lgr %r0, %r592; CHECK-NEXT: srlg %r14, %r0, 0(%r1)93; CHECK-NEXT: je .LBB4_494; CHECK-NEXT: .LBB4_3:95; CHECK-NEXT: lg %r5, 0(%r3)96; CHECK-NEXT: .LBB4_4:97; CHECK-NEXT: sllg %r3, %r5, 198; CHECK-NEXT: srlg %r4, %r4, 0(%r1)99; CHECK-NEXT: xilf %r1, 4294967295100; CHECK-NEXT: sllg %r3, %r3, 0(%r1)101; CHECK-NEXT: ogr %r3, %r14102; CHECK-NEXT: sllg %r0, %r0, 1103; CHECK-NEXT: sllg %r0, %r0, 0(%r1)104; CHECK-NEXT: ogr %r0, %r4105; CHECK-NEXT: stg %r0, 8(%r2)106; CHECK-NEXT: stg %r3, 0(%r2)107; CHECK-NEXT: lmg %r14, %r15, 112(%r15)108; CHECK-NEXT: br %r14109 %tmp = tail call i128 @llvm.fshr.i128(i128 %x, i128 %y, i128 %z)110 ret i128 %tmp111}112 113;114; Const Funnel Shift115;116 117define i8 @const_shift_i8(i8 %x, i8 %y) {118; CHECK-LABEL: const_shift_i8:119; CHECK: # %bb.0:120; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d121; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d122; CHECK-NEXT: sll %r2, 1123; CHECK-NEXT: rosbg %r2, %r3, 63, 63, 57124; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d125; CHECK-NEXT: br %r14126 %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 7)127 ret i8 %tmp128}129 130define i16 @const_shift_i16(i16 %x, i16 %y) {131; CHECK-LABEL: const_shift_i16:132; CHECK: # %bb.0:133; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d134; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d135; CHECK-NEXT: sll %r2, 9136; CHECK-NEXT: rosbg %r2, %r3, 55, 63, 57137; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d138; CHECK-NEXT: br %r14139 %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 7)140 ret i16 %tmp141}142 143define i32 @const_shift_i32(i32 %x, i32 %y) {144; CHECK-LABEL: const_shift_i32:145; CHECK: # %bb.0:146; CHECK-NEXT: # kill: def $r3l killed $r3l def $r3d147; CHECK-NEXT: # kill: def $r2l killed $r2l def $r2d148; CHECK-NEXT: sll %r2, 25149; CHECK-NEXT: rosbg %r2, %r3, 39, 63, 57150; CHECK-NEXT: # kill: def $r2l killed $r2l killed $r2d151; CHECK-NEXT: br %r14152 %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 7)153 ret i32 %tmp154}155 156define i64 @const_shift_i64(i64 %x, i64 %y) {157; CHECK-LABEL: const_shift_i64:158; CHECK: # %bb.0:159; CHECK-NEXT: sllg %r2, %r2, 57160; CHECK-NEXT: rosbg %r2, %r3, 7, 63, 57161; CHECK-NEXT: br %r14162 %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 7)163 ret i64 %tmp164}165