371 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \3; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s \4; RUN: -check-prefix=P9-VSX5; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \6; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs -mattr=-vsx < %s | FileCheck %s \7; RUN: -check-prefix=P9-NOVSX8; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \9; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s \10; RUN: -check-prefix=P8-VSX11; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \12; RUN: -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs -mattr=-vsx < %s | FileCheck %s \13; RUN: -check-prefix=P8-NOVSX14 15define <1 x i128> @rotl_64(<1 x i128> %num) {16; P9-VSX-LABEL: rotl_64:17; P9-VSX: # %bb.0: # %entry18; P9-VSX-NEXT: xxswapd v2, v219; P9-VSX-NEXT: blr20;21; P9-NOVSX-LABEL: rotl_64:22; P9-NOVSX: # %bb.0: # %entry23; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 824; P9-NOVSX-NEXT: blr25;26; P8-VSX-LABEL: rotl_64:27; P8-VSX: # %bb.0: # %entry28; P8-VSX-NEXT: xxswapd v2, v229; P8-VSX-NEXT: blr30;31; P8-NOVSX-LABEL: rotl_64:32; P8-NOVSX: # %bb.0: # %entry33; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 834; P8-NOVSX-NEXT: blr35entry:36 %shl = shl <1 x i128> %num, <i128 64>37 %shr = lshr <1 x i128> %num, <i128 64>38 %or = or <1 x i128> %shl, %shr39 ret <1 x i128> %or40}41 42define <1 x i128> @rotl_32(<1 x i128> %num) {43; P9-VSX-LABEL: rotl_32:44; P9-VSX: # %bb.0: # %entry45; P9-VSX-NEXT: xxsldwi v2, v2, v2, 346; P9-VSX-NEXT: blr47;48; P9-NOVSX-LABEL: rotl_32:49; P9-NOVSX: # %bb.0: # %entry50; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 1251; P9-NOVSX-NEXT: blr52;53; P8-VSX-LABEL: rotl_32:54; P8-VSX: # %bb.0: # %entry55; P8-VSX-NEXT: xxsldwi v2, v2, v2, 356; P8-VSX-NEXT: blr57;58; P8-NOVSX-LABEL: rotl_32:59; P8-NOVSX: # %bb.0: # %entry60; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 1261; P8-NOVSX-NEXT: blr62entry:63 %shl = shl <1 x i128> %num, <i128 32>64 %shr = lshr <1 x i128> %num, <i128 96>65 %or = or <1 x i128> %shl, %shr66 ret <1 x i128> %or67}68 69define <1 x i128> @rotl_96(<1 x i128> %num) {70; P9-VSX-LABEL: rotl_96:71; P9-VSX: # %bb.0: # %entry72; P9-VSX-NEXT: xxsldwi v2, v2, v2, 173; P9-VSX-NEXT: blr74;75; P9-NOVSX-LABEL: rotl_96:76; P9-NOVSX: # %bb.0: # %entry77; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 478; P9-NOVSX-NEXT: blr79;80; P8-VSX-LABEL: rotl_96:81; P8-VSX: # %bb.0: # %entry82; P8-VSX-NEXT: xxsldwi v2, v2, v2, 183; P8-VSX-NEXT: blr84;85; P8-NOVSX-LABEL: rotl_96:86; P8-NOVSX: # %bb.0: # %entry87; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 488; P8-NOVSX-NEXT: blr89entry:90 %shl = shl <1 x i128> %num, <i128 96>91 %shr = lshr <1 x i128> %num, <i128 32>92 %or = or <1 x i128> %shl, %shr93 ret <1 x i128> %or94}95 96define <1 x i128> @rotl_16(<1 x i128> %num) {97; P9-VSX-LABEL: rotl_16:98; P9-VSX: # %bb.0: # %entry99; P9-VSX-NEXT: vsldoi v2, v2, v2, 14100; P9-VSX-NEXT: blr101;102; P9-NOVSX-LABEL: rotl_16:103; P9-NOVSX: # %bb.0: # %entry104; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 14105; P9-NOVSX-NEXT: blr106;107; P8-VSX-LABEL: rotl_16:108; P8-VSX: # %bb.0: # %entry109; P8-VSX-NEXT: vsldoi v2, v2, v2, 14110; P8-VSX-NEXT: blr111;112; P8-NOVSX-LABEL: rotl_16:113; P8-NOVSX: # %bb.0: # %entry114; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 14115; P8-NOVSX-NEXT: blr116entry:117 %shl = shl <1 x i128> %num, <i128 16>118 %shr = lshr <1 x i128> %num, <i128 112>119 %or = or <1 x i128> %shl, %shr120 ret <1 x i128> %or121}122 123define <1 x i128> @rotl_112(<1 x i128> %num) {124; P9-VSX-LABEL: rotl_112:125; P9-VSX: # %bb.0: # %entry126; P9-VSX-NEXT: vsldoi v2, v2, v2, 2127; P9-VSX-NEXT: blr128;129; P9-NOVSX-LABEL: rotl_112:130; P9-NOVSX: # %bb.0: # %entry131; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 2132; P9-NOVSX-NEXT: blr133;134; P8-VSX-LABEL: rotl_112:135; P8-VSX: # %bb.0: # %entry136; P8-VSX-NEXT: vsldoi v2, v2, v2, 2137; P8-VSX-NEXT: blr138;139; P8-NOVSX-LABEL: rotl_112:140; P8-NOVSX: # %bb.0: # %entry141; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 2142; P8-NOVSX-NEXT: blr143entry:144 %shl = shl <1 x i128> %num, <i128 112>145 %shr = lshr <1 x i128> %num, <i128 16>146 %or = or <1 x i128> %shl, %shr147 ret <1 x i128> %or148}149 150define <1 x i128> @rotl_8(<1 x i128> %num) {151; P9-VSX-LABEL: rotl_8:152; P9-VSX: # %bb.0: # %entry153; P9-VSX-NEXT: vsldoi v2, v2, v2, 15154; P9-VSX-NEXT: blr155;156; P9-NOVSX-LABEL: rotl_8:157; P9-NOVSX: # %bb.0: # %entry158; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 15159; P9-NOVSX-NEXT: blr160;161; P8-VSX-LABEL: rotl_8:162; P8-VSX: # %bb.0: # %entry163; P8-VSX-NEXT: vsldoi v2, v2, v2, 15164; P8-VSX-NEXT: blr165;166; P8-NOVSX-LABEL: rotl_8:167; P8-NOVSX: # %bb.0: # %entry168; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 15169; P8-NOVSX-NEXT: blr170entry:171 %shl = shl <1 x i128> %num, <i128 8>172 %shr = lshr <1 x i128> %num, <i128 120>173 %or = or <1 x i128> %shl, %shr174 ret <1 x i128> %or175}176 177define <1 x i128> @rotl_120(<1 x i128> %num) {178; P9-VSX-LABEL: rotl_120:179; P9-VSX: # %bb.0: # %entry180; P9-VSX-NEXT: vsldoi v2, v2, v2, 1181; P9-VSX-NEXT: blr182;183; P9-NOVSX-LABEL: rotl_120:184; P9-NOVSX: # %bb.0: # %entry185; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 1186; P9-NOVSX-NEXT: blr187;188; P8-VSX-LABEL: rotl_120:189; P8-VSX: # %bb.0: # %entry190; P8-VSX-NEXT: vsldoi v2, v2, v2, 1191; P8-VSX-NEXT: blr192;193; P8-NOVSX-LABEL: rotl_120:194; P8-NOVSX: # %bb.0: # %entry195; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 1196; P8-NOVSX-NEXT: blr197entry:198 %shl = shl <1 x i128> %num, <i128 120>199 %shr = lshr <1 x i128> %num, <i128 8>200 %or = or <1 x i128> %shl, %shr201 ret <1 x i128> %or202}203 204define <1 x i128> @rotl_28(<1 x i128> %num) {205; P9-VSX-LABEL: rotl_28:206; P9-VSX: # %bb.0: # %entry207; P9-VSX-NEXT: mfvsrld r4, v2208; P9-VSX-NEXT: mfvsrd r3, v2209; P9-VSX-NEXT: rotldi r5, r4, 28210; P9-VSX-NEXT: rldimi r5, r3, 28, 0211; P9-VSX-NEXT: rotldi r3, r3, 28212; P9-VSX-NEXT: rldimi r3, r4, 28, 0213; P9-VSX-NEXT: mtvsrdd v2, r5, r3214; P9-VSX-NEXT: blr215;216; P9-NOVSX-LABEL: rotl_28:217; P9-NOVSX: # %bb.0: # %entry218; P9-NOVSX-NEXT: addi r3, r1, -32219; P9-NOVSX-NEXT: stvx v2, 0, r3220; P9-NOVSX-NEXT: ld r4, -32(r1)221; P9-NOVSX-NEXT: ld r3, -24(r1)222; P9-NOVSX-NEXT: rotldi r5, r4, 28223; P9-NOVSX-NEXT: rldimi r5, r3, 28, 0224; P9-NOVSX-NEXT: rotldi r3, r3, 28225; P9-NOVSX-NEXT: rldimi r3, r4, 28, 0226; P9-NOVSX-NEXT: std r5, -8(r1)227; P9-NOVSX-NEXT: std r3, -16(r1)228; P9-NOVSX-NEXT: addi r3, r1, -16229; P9-NOVSX-NEXT: lvx v2, 0, r3230; P9-NOVSX-NEXT: blr231;232; P8-VSX-LABEL: rotl_28:233; P8-VSX: # %bb.0: # %entry234; P8-VSX-NEXT: xxswapd vs0, v2235; P8-VSX-NEXT: mfvsrd r4, v2236; P8-VSX-NEXT: rotldi r5, r4, 28237; P8-VSX-NEXT: mffprd r3, f0238; P8-VSX-NEXT: rldimi r5, r3, 28, 0239; P8-VSX-NEXT: rotldi r3, r3, 28240; P8-VSX-NEXT: rldimi r3, r4, 28, 0241; P8-VSX-NEXT: mtfprd f0, r5242; P8-VSX-NEXT: mtfprd f1, r3243; P8-VSX-NEXT: xxmrghd v2, vs1, vs0244; P8-VSX-NEXT: blr245;246; P8-NOVSX-LABEL: rotl_28:247; P8-NOVSX: # %bb.0: # %entry248; P8-NOVSX-NEXT: addi r3, r1, -32249; P8-NOVSX-NEXT: stvx v2, 0, r3250; P8-NOVSX-NEXT: ld r4, -32(r1)251; P8-NOVSX-NEXT: ld r3, -24(r1)252; P8-NOVSX-NEXT: rotldi r5, r4, 28253; P8-NOVSX-NEXT: rldimi r5, r3, 28, 0254; P8-NOVSX-NEXT: rotldi r3, r3, 28255; P8-NOVSX-NEXT: rldimi r3, r4, 28, 0256; P8-NOVSX-NEXT: std r5, -8(r1)257; P8-NOVSX-NEXT: std r3, -16(r1)258; P8-NOVSX-NEXT: addi r3, r1, -16259; P8-NOVSX-NEXT: lvx v2, 0, r3260; P8-NOVSX-NEXT: blr261entry:262 %shl = shl <1 x i128> %num, <i128 28>263 %shr = lshr <1 x i128> %num, <i128 100>264 %or = or <1 x i128> %shl, %shr265 ret <1 x i128> %or266}267 268define <1 x i128> @NO_rotl(<1 x i128> %num) {269; P9-VSX-LABEL: NO_rotl:270; P9-VSX: # %bb.0: # %entry271; P9-VSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha272; P9-VSX-NEXT: addi r3, r3, .LCPI8_0@toc@l273; P9-VSX-NEXT: lxv v3, 0(r3)274; P9-VSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha275; P9-VSX-NEXT: addi r3, r3, .LCPI8_1@toc@l276; P9-VSX-NEXT: vslo v4, v2, v3277; P9-VSX-NEXT: vspltb v3, v3, 15278; P9-VSX-NEXT: vsl v3, v4, v3279; P9-VSX-NEXT: lxv v4, 0(r3)280; P9-VSX-NEXT: vsro v2, v2, v4281; P9-VSX-NEXT: vspltb v4, v4, 15282; P9-VSX-NEXT: vsr v2, v2, v4283; P9-VSX-NEXT: xxlor v2, v3, v2284; P9-VSX-NEXT: blr285;286; P9-NOVSX-LABEL: NO_rotl:287; P9-NOVSX: # %bb.0: # %entry288; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha289; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l290; P9-NOVSX-NEXT: lvx v3, 0, r3291; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha292; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l293; P9-NOVSX-NEXT: vslo v4, v2, v3294; P9-NOVSX-NEXT: vspltb v3, v3, 15295; P9-NOVSX-NEXT: vsl v3, v4, v3296; P9-NOVSX-NEXT: lvx v4, 0, r3297; P9-NOVSX-NEXT: vsro v2, v2, v4298; P9-NOVSX-NEXT: vspltb v4, v4, 15299; P9-NOVSX-NEXT: vsr v2, v2, v4300; P9-NOVSX-NEXT: vor v2, v3, v2301; P9-NOVSX-NEXT: blr302;303; P8-VSX-LABEL: NO_rotl:304; P8-VSX: # %bb.0: # %entry305; P8-VSX-NEXT: xxswapd vs0, v2306; P8-VSX-NEXT: mfvsrd r4, v2307; P8-VSX-NEXT: mffprd r3, f0308; P8-VSX-NEXT: rotldi r5, r3, 20309; P8-VSX-NEXT: sldi r3, r3, 20310; P8-VSX-NEXT: rldimi r5, r4, 20, 0311; P8-VSX-NEXT: mtfprd f0, r3312; P8-VSX-NEXT: li r3, 0313; P8-VSX-NEXT: mtfprd f1, r5314; P8-VSX-NEXT: xxmrghd v2, vs1, vs0315; P8-VSX-NEXT: mtfprd f0, r3316; P8-VSX-NEXT: rldicl r3, r4, 28, 36317; P8-VSX-NEXT: mtfprd f1, r3318; P8-VSX-NEXT: xxmrghd v3, vs0, vs1319; P8-VSX-NEXT: xxlor v2, v2, v3320; P8-VSX-NEXT: blr321;322; P8-NOVSX-LABEL: NO_rotl:323; P8-NOVSX: # %bb.0: # %entry324; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha325; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l326; P8-NOVSX-NEXT: lvx v3, 0, r3327; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha328; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l329; P8-NOVSX-NEXT: lvx v5, 0, r3330; P8-NOVSX-NEXT: vslo v4, v2, v3331; P8-NOVSX-NEXT: vspltb v3, v3, 15332; P8-NOVSX-NEXT: vsl v3, v4, v3333; P8-NOVSX-NEXT: vsro v2, v2, v5334; P8-NOVSX-NEXT: vspltb v5, v5, 15335; P8-NOVSX-NEXT: vsr v2, v2, v5336; P8-NOVSX-NEXT: vor v2, v3, v2337; P8-NOVSX-NEXT: blr338entry:339 %shl = shl <1 x i128> %num, <i128 20>340 %shr = lshr <1 x i128> %num, <i128 100>341 %or = or <1 x i128> %shl, %shr342 ret <1 x i128> %or343}344 345define <1 x i128> @shufflevector(<1 x i128> %num) {346; P9-VSX-LABEL: shufflevector:347; P9-VSX: # %bb.0: # %entry348; P9-VSX-NEXT: xxswapd v2, v2349; P9-VSX-NEXT: blr350;351; P9-NOVSX-LABEL: shufflevector:352; P9-NOVSX: # %bb.0: # %entry353; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 8354; P9-NOVSX-NEXT: blr355;356; P8-VSX-LABEL: shufflevector:357; P8-VSX: # %bb.0: # %entry358; P8-VSX-NEXT: xxswapd v2, v2359; P8-VSX-NEXT: blr360;361; P8-NOVSX-LABEL: shufflevector:362; P8-NOVSX: # %bb.0: # %entry363; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 8364; P8-NOVSX-NEXT: blr365entry:366 %0 = bitcast <1 x i128> %num to <2 x i64>367 %vecins2 = shufflevector <2 x i64> %0, <2 x i64> undef, <2 x i32> <i32 1, i32 0>368 %1 = bitcast <2 x i64> %vecins2 to <1 x i128>369 ret <1 x i128> %1370}371