brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · 8f5f9ab Raw
303 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; Test 128-bit funnel shifts.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s --check-prefix=Z156 7declare i128 @llvm.fshl.i128(i128, i128, i128)8declare i128 @llvm.fshr.i128(i128, i128, i128)9 10; Funnel shift left by constant multiple of 8.11define i128 @f1(i128 %a, i128 %b) {12; CHECK-LABEL: f1:13; CHECK:       # %bb.0:14; CHECK-NEXT:    vl %v0, 0(%r4), 315; CHECK-NEXT:    vl %v1, 0(%r3), 316; CHECK-NEXT:    vsldb %v0, %v1, %v0, 417; CHECK-NEXT:    vst %v0, 0(%r2), 318; CHECK-NEXT:    br %r1419;20; Z15-LABEL: f1:21; Z15:       # %bb.0:22; Z15-NEXT:    vl %v0, 0(%r4), 323; Z15-NEXT:    vl %v1, 0(%r3), 324; Z15-NEXT:    vsldb %v0, %v1, %v0, 425; Z15-NEXT:    vst %v0, 0(%r2), 326; Z15-NEXT:    br %r1427  %res = tail call i128 @llvm.fshl.i128(i128 %a, i128 %b, i128 32)28  ret i128 %res29}30 31; Funnel shift left by constant smaller than 8.32define i128 @f2(i128 %a, i128 %b) {33; CHECK-LABEL: f2:34; CHECK:       # %bb.0:35; CHECK-NEXT:    vl %v1, 0(%r3), 336; CHECK-NEXT:    vl %v0, 0(%r4), 337; CHECK-NEXT:    vrepib %v2, 538; CHECK-NEXT:    vsl %v1, %v1, %v239; CHECK-NEXT:    vrepib %v2, 12340; CHECK-NEXT:    vsrlb %v0, %v0, %v241; CHECK-NEXT:    vsrl %v0, %v0, %v242; CHECK-NEXT:    vo %v0, %v1, %v043; CHECK-NEXT:    vst %v0, 0(%r2), 344; CHECK-NEXT:    br %r1445;46; Z15-LABEL: f2:47; Z15:       # %bb.0:48; Z15-NEXT:    vl %v0, 0(%r4), 349; Z15-NEXT:    vl %v1, 0(%r3), 350; Z15-NEXT:    vsld %v0, %v1, %v0, 551; Z15-NEXT:    vst %v0, 0(%r2), 352; Z15-NEXT:    br %r1453  %res = tail call i128 @llvm.fshl.i128(i128 %a, i128 %b, i128 5)54  ret i128 %res55}56 57; Funnel shift left by some other constant.58define i128 @f3(i128 %a, i128 %b) {59; CHECK-LABEL: f3:60; CHECK:       # %bb.0:61; CHECK-NEXT:    vl %v1, 0(%r4), 362; CHECK-NEXT:    vrepib %v2, 8663; CHECK-NEXT:    vsrlb %v1, %v1, %v264; CHECK-NEXT:    vl %v0, 0(%r3), 365; CHECK-NEXT:    vsrl %v1, %v1, %v266; CHECK-NEXT:    vrepib %v2, 4267; CHECK-NEXT:    vslb %v0, %v0, %v268; CHECK-NEXT:    vsl %v0, %v0, %v269; CHECK-NEXT:    vo %v0, %v0, %v170; CHECK-NEXT:    vst %v0, 0(%r2), 371; CHECK-NEXT:    br %r1472;73; Z15-LABEL: f3:74; Z15:       # %bb.0:75; Z15-NEXT:    vl %v0, 0(%r4), 376; Z15-NEXT:    vl %v1, 0(%r3), 377; Z15-NEXT:    vsldb %v1, %v1, %v0, 578; Z15-NEXT:    vsldb %v0, %v0, %v0, 579; Z15-NEXT:    vsld %v0, %v1, %v0, 280; Z15-NEXT:    vst %v0, 0(%r2), 381; Z15-NEXT:    br %r1482  %res = tail call i128 @llvm.fshl.i128(i128 %a, i128 %b, i128 42)83  ret i128 %res84}85 86; Funnel shift left by a variable amount.87define i128 @f4(i128 %a, i128 %b, i128 %sh) {88; CHECK-LABEL: f4:89; CHECK:       # %bb.0:90; CHECK-NEXT:    l %r0, 12(%r5)91; CHECK-NEXT:    vlvgp %v2, %r0, %r092; CHECK-NEXT:    vl %v1, 0(%r3), 393; CHECK-NEXT:    vrepb %v2, %v2, 1594; CHECK-NEXT:    vslb %v1, %v1, %v295; CHECK-NEXT:    vl %v0, 0(%r4), 396; CHECK-NEXT:    vsl %v1, %v1, %v297; CHECK-NEXT:    vrepib %v2, 198; CHECK-NEXT:    xilf %r0, 429496729599; CHECK-NEXT:    vsrl %v0, %v0, %v2100; CHECK-NEXT:    vlvgp %v2, %r0, %r0101; CHECK-NEXT:    vrepb %v2, %v2, 15102; CHECK-NEXT:    vsrlb %v0, %v0, %v2103; CHECK-NEXT:    vsrl %v0, %v0, %v2104; CHECK-NEXT:    vo %v0, %v1, %v0105; CHECK-NEXT:    vst %v0, 0(%r2), 3106; CHECK-NEXT:    br %r14107;108; Z15-LABEL: f4:109; Z15:       # %bb.0:110; Z15-NEXT:    l %r0, 12(%r5)111; Z15-NEXT:    vlvgp %v2, %r0, %r0112; Z15-NEXT:    vl %v1, 0(%r3), 3113; Z15-NEXT:    vrepb %v2, %v2, 15114; Z15-NEXT:    vl %v0, 0(%r4), 3115; Z15-NEXT:    vslb %v1, %v1, %v2116; Z15-NEXT:    vsl %v1, %v1, %v2117; Z15-NEXT:    vrepib %v2, 1118; Z15-NEXT:    xilf %r0, 4294967295119; Z15-NEXT:    vsrl %v0, %v0, %v2120; Z15-NEXT:    vlvgp %v2, %r0, %r0121; Z15-NEXT:    vrepb %v2, %v2, 15122; Z15-NEXT:    vsrlb %v0, %v0, %v2123; Z15-NEXT:    vsrl %v0, %v0, %v2124; Z15-NEXT:    vo %v0, %v1, %v0125; Z15-NEXT:    vst %v0, 0(%r2), 3126; Z15-NEXT:    br %r14127  %res = tail call i128 @llvm.fshl.i128(i128 %a, i128 %b, i128 %sh)128  ret i128 %res129}130 131; Funnel shift right by constant multiple of 8.132define i128 @f5(i128 %a, i128 %b) {133; CHECK-LABEL: f5:134; CHECK:       # %bb.0:135; CHECK-NEXT:    vl %v0, 0(%r4), 3136; CHECK-NEXT:    vl %v1, 0(%r3), 3137; CHECK-NEXT:    vsldb %v0, %v1, %v0, 12138; CHECK-NEXT:    vst %v0, 0(%r2), 3139; CHECK-NEXT:    br %r14140;141; Z15-LABEL: f5:142; Z15:       # %bb.0:143; Z15-NEXT:    vl %v0, 0(%r4), 3144; Z15-NEXT:    vl %v1, 0(%r3), 3145; Z15-NEXT:    vsldb %v0, %v1, %v0, 12146; Z15-NEXT:    vst %v0, 0(%r2), 3147; Z15-NEXT:    br %r14148  %res = tail call i128 @llvm.fshr.i128(i128 %a, i128 %b, i128 32)149  ret i128 %res150}151 152; Funnel shift right by constant smaller than 8.153define i128 @f6(i128 %a, i128 %b) {154; CHECK-LABEL: f6:155; CHECK:       # %bb.0:156; CHECK-NEXT:    vl %v1, 0(%r4), 3157; CHECK-NEXT:    vl %v0, 0(%r3), 3158; CHECK-NEXT:    vrepib %v2, 5159; CHECK-NEXT:    vsrl %v1, %v1, %v2160; CHECK-NEXT:    vrepib %v2, 123161; CHECK-NEXT:    vslb %v0, %v0, %v2162; CHECK-NEXT:    vsl %v0, %v0, %v2163; CHECK-NEXT:    vo %v0, %v0, %v1164; CHECK-NEXT:    vst %v0, 0(%r2), 3165; CHECK-NEXT:    br %r14166;167; Z15-LABEL: f6:168; Z15:       # %bb.0:169; Z15-NEXT:    vl %v0, 0(%r4), 3170; Z15-NEXT:    vl %v1, 0(%r3), 3171; Z15-NEXT:    vsrd %v0, %v1, %v0, 5172; Z15-NEXT:    vst %v0, 0(%r2), 3173; Z15-NEXT:    br %r14174  %res = tail call i128 @llvm.fshr.i128(i128 %a, i128 %b, i128 5)175  ret i128 %res176}177 178; Funnel shift right by some other constant.179define i128 @f7(i128 %a, i128 %b) {180; CHECK-LABEL: f7:181; CHECK:       # %bb.0:182; CHECK-NEXT:    vl %v1, 0(%r4), 3183; CHECK-NEXT:    vrepib %v2, 42184; CHECK-NEXT:    vsrlb %v1, %v1, %v2185; CHECK-NEXT:    vl %v0, 0(%r3), 3186; CHECK-NEXT:    vsrl %v1, %v1, %v2187; CHECK-NEXT:    vrepib %v2, 86188; CHECK-NEXT:    vslb %v0, %v0, %v2189; CHECK-NEXT:    vsl %v0, %v0, %v2190; CHECK-NEXT:    vo %v0, %v0, %v1191; CHECK-NEXT:    vst %v0, 0(%r2), 3192; CHECK-NEXT:    br %r14193;194; Z15-LABEL: f7:195; Z15:       # %bb.0:196; Z15-NEXT:    vl %v0, 0(%r4), 3197; Z15-NEXT:    vl %v1, 0(%r3), 3198; Z15-NEXT:    vsldb %v0, %v1, %v0, 11199; Z15-NEXT:    vsldb %v1, %v1, %v1, 11200; Z15-NEXT:    vsrd %v0, %v1, %v0, 2201; Z15-NEXT:    vst %v0, 0(%r2), 3202; Z15-NEXT:    br %r14203  %res = tail call i128 @llvm.fshr.i128(i128 %a, i128 %b, i128 42)204  ret i128 %res205}206 207; Funnel shift right by a variable amount.208define i128 @f8(i128 %a, i128 %b, i128 %sh) {209; CHECK-LABEL: f8:210; CHECK:       # %bb.0:211; CHECK-NEXT:    l %r0, 12(%r5)212; CHECK-NEXT:    vlvgp %v2, %r0, %r0213; CHECK-NEXT:    vl %v1, 0(%r4), 3214; CHECK-NEXT:    vrepb %v2, %v2, 15215; CHECK-NEXT:    vsrlb %v1, %v1, %v2216; CHECK-NEXT:    vl %v0, 0(%r3), 3217; CHECK-NEXT:    vsrl %v1, %v1, %v2218; CHECK-NEXT:    vrepib %v2, 1219; CHECK-NEXT:    xilf %r0, 4294967295220; CHECK-NEXT:    vsl %v0, %v0, %v2221; CHECK-NEXT:    vlvgp %v2, %r0, %r0222; CHECK-NEXT:    vrepb %v2, %v2, 15223; CHECK-NEXT:    vslb %v0, %v0, %v2224; CHECK-NEXT:    vsl %v0, %v0, %v2225; CHECK-NEXT:    vo %v0, %v0, %v1226; CHECK-NEXT:    vst %v0, 0(%r2), 3227; CHECK-NEXT:    br %r14228;229; Z15-LABEL: f8:230; Z15:       # %bb.0:231; Z15-NEXT:    l %r0, 12(%r5)232; Z15-NEXT:    vlvgp %v2, %r0, %r0233; Z15-NEXT:    vl %v1, 0(%r4), 3234; Z15-NEXT:    vrepb %v2, %v2, 15235; Z15-NEXT:    vl %v0, 0(%r3), 3236; Z15-NEXT:    vsrlb %v1, %v1, %v2237; Z15-NEXT:    vsrl %v1, %v1, %v2238; Z15-NEXT:    vrepib %v2, 1239; Z15-NEXT:    xilf %r0, 4294967295240; Z15-NEXT:    vsl %v0, %v0, %v2241; Z15-NEXT:    vlvgp %v2, %r0, %r0242; Z15-NEXT:    vrepb %v2, %v2, 15243; Z15-NEXT:    vslb %v0, %v0, %v2244; Z15-NEXT:    vsl %v0, %v0, %v2245; Z15-NEXT:    vo %v0, %v0, %v1246; Z15-NEXT:    vst %v0, 0(%r2), 3247; Z15-NEXT:    br %r14248  %res = tail call i128 @llvm.fshr.i128(i128 %a, i128 %b, i128 %sh)249  ret i128 %res250}251 252; Funnel shift left by constant N in 121..128, in such cases fshl N == fshr (128 - N)253define i128 @f9(i128 %a, i128 %b) {254; CHECK-LABEL: f9:255; CHECK:       # %bb.0:256; CHECK-NEXT:    vl %v1, 0(%r4), 3257; CHECK-NEXT:    vl %v0, 0(%r3), 3258; CHECK-NEXT:    vrepib %v2, 5259; CHECK-NEXT:    vsrl %v1, %v1, %v2260; CHECK-NEXT:    vrepib %v2, 123261; CHECK-NEXT:    vslb %v0, %v0, %v2262; CHECK-NEXT:    vsl %v0, %v0, %v2263; CHECK-NEXT:    vo %v0, %v0, %v1264; CHECK-NEXT:    vst %v0, 0(%r2), 3265; CHECK-NEXT:    br %r14266;267; Z15-LABEL: f9:268; Z15:       # %bb.0:269; Z15-NEXT:    vl %v0, 0(%r4), 3270; Z15-NEXT:    vl %v1, 0(%r3), 3271; Z15-NEXT:    vsrd %v0, %v1, %v0, 5272; Z15-NEXT:    vst %v0, 0(%r2), 3273; Z15-NEXT:    br %r14274  %res = tail call i128 @llvm.fshl.i128(i128 %a, i128 %b, i128 123)275  ret i128 %res276}277 278; Funnel shift right by constant N in 121..128, in such cases fshr N == fshl (128 - N)279define i128 @f10(i128 %a, i128 %b) {280; CHECK-LABEL: f10:281; CHECK:       # %bb.0:282; CHECK-NEXT:    vl %v1, 0(%r3), 3283; CHECK-NEXT:    vl %v0, 0(%r4), 3284; CHECK-NEXT:    vrepib %v2, 5285; CHECK-NEXT:    vsl %v1, %v1, %v2286; CHECK-NEXT:    vrepib %v2, 123287; CHECK-NEXT:    vsrlb %v0, %v0, %v2288; CHECK-NEXT:    vsrl %v0, %v0, %v2289; CHECK-NEXT:    vo %v0, %v1, %v0290; CHECK-NEXT:    vst %v0, 0(%r2), 3291; CHECK-NEXT:    br %r14292;293; Z15-LABEL: f10:294; Z15:       # %bb.0:295; Z15-NEXT:    vl %v0, 0(%r4), 3296; Z15-NEXT:    vl %v1, 0(%r3), 3297; Z15-NEXT:    vsld %v0, %v1, %v0, 5298; Z15-NEXT:    vst %v0, 0(%r2), 3299; Z15-NEXT:    br %r14300  %res = tail call i128 @llvm.fshr.i128(i128 %a, i128 %b, i128 123)301  ret i128 %res302}303