1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; 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-VSX 5; 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-NOVSX 8; 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-VSX 11; 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-NOVSX 14 15define <1 x i128> @rotl_64(<1 x i128> %num) { 16; P9-VSX-LABEL: rotl_64: 17; P9-VSX: # %bb.0: # %entry 18; P9-VSX-NEXT: xxswapd v2, v2 19; P9-VSX-NEXT: blr 20; 21; P9-NOVSX-LABEL: rotl_64: 22; P9-NOVSX: # %bb.0: # %entry 23; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 8 24; P9-NOVSX-NEXT: blr 25; 26; P8-VSX-LABEL: rotl_64: 27; P8-VSX: # %bb.0: # %entry 28; P8-VSX-NEXT: xxswapd v2, v2 29; P8-VSX-NEXT: blr 30; 31; P8-NOVSX-LABEL: rotl_64: 32; P8-NOVSX: # %bb.0: # %entry 33; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 8 34; P8-NOVSX-NEXT: blr 35entry: 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, %shr 39 ret <1 x i128> %or 40} 41 42define <1 x i128> @rotl_32(<1 x i128> %num) { 43; P9-VSX-LABEL: rotl_32: 44; P9-VSX: # %bb.0: # %entry 45; P9-VSX-NEXT: xxsldwi v2, v2, v2, 3 46; P9-VSX-NEXT: blr 47; 48; P9-NOVSX-LABEL: rotl_32: 49; P9-NOVSX: # %bb.0: # %entry 50; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 12 51; P9-NOVSX-NEXT: blr 52; 53; P8-VSX-LABEL: rotl_32: 54; P8-VSX: # %bb.0: # %entry 55; P8-VSX-NEXT: xxsldwi v2, v2, v2, 3 56; P8-VSX-NEXT: blr 57; 58; P8-NOVSX-LABEL: rotl_32: 59; P8-NOVSX: # %bb.0: # %entry 60; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 12 61; P8-NOVSX-NEXT: blr 62entry: 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, %shr 66 ret <1 x i128> %or 67} 68 69define <1 x i128> @rotl_96(<1 x i128> %num) { 70; P9-VSX-LABEL: rotl_96: 71; P9-VSX: # %bb.0: # %entry 72; P9-VSX-NEXT: xxsldwi v2, v2, v2, 1 73; P9-VSX-NEXT: blr 74; 75; P9-NOVSX-LABEL: rotl_96: 76; P9-NOVSX: # %bb.0: # %entry 77; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 4 78; P9-NOVSX-NEXT: blr 79; 80; P8-VSX-LABEL: rotl_96: 81; P8-VSX: # %bb.0: # %entry 82; P8-VSX-NEXT: xxsldwi v2, v2, v2, 1 83; P8-VSX-NEXT: blr 84; 85; P8-NOVSX-LABEL: rotl_96: 86; P8-NOVSX: # %bb.0: # %entry 87; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 4 88; P8-NOVSX-NEXT: blr 89entry: 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, %shr 93 ret <1 x i128> %or 94} 95 96define <1 x i128> @rotl_16(<1 x i128> %num) { 97; P9-VSX-LABEL: rotl_16: 98; P9-VSX: # %bb.0: # %entry 99; P9-VSX-NEXT: vsldoi v2, v2, v2, 14 100; P9-VSX-NEXT: blr 101; 102; P9-NOVSX-LABEL: rotl_16: 103; P9-NOVSX: # %bb.0: # %entry 104; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 14 105; P9-NOVSX-NEXT: blr 106; 107; P8-VSX-LABEL: rotl_16: 108; P8-VSX: # %bb.0: # %entry 109; P8-VSX-NEXT: vsldoi v2, v2, v2, 14 110; P8-VSX-NEXT: blr 111; 112; P8-NOVSX-LABEL: rotl_16: 113; P8-NOVSX: # %bb.0: # %entry 114; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 14 115; P8-NOVSX-NEXT: blr 116entry: 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, %shr 120 ret <1 x i128> %or 121} 122 123define <1 x i128> @rotl_112(<1 x i128> %num) { 124; P9-VSX-LABEL: rotl_112: 125; P9-VSX: # %bb.0: # %entry 126; P9-VSX-NEXT: vsldoi v2, v2, v2, 2 127; P9-VSX-NEXT: blr 128; 129; P9-NOVSX-LABEL: rotl_112: 130; P9-NOVSX: # %bb.0: # %entry 131; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 2 132; P9-NOVSX-NEXT: blr 133; 134; P8-VSX-LABEL: rotl_112: 135; P8-VSX: # %bb.0: # %entry 136; P8-VSX-NEXT: vsldoi v2, v2, v2, 2 137; P8-VSX-NEXT: blr 138; 139; P8-NOVSX-LABEL: rotl_112: 140; P8-NOVSX: # %bb.0: # %entry 141; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 2 142; P8-NOVSX-NEXT: blr 143entry: 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, %shr 147 ret <1 x i128> %or 148} 149 150define <1 x i128> @rotl_8(<1 x i128> %num) { 151; P9-VSX-LABEL: rotl_8: 152; P9-VSX: # %bb.0: # %entry 153; P9-VSX-NEXT: vsldoi v2, v2, v2, 15 154; P9-VSX-NEXT: blr 155; 156; P9-NOVSX-LABEL: rotl_8: 157; P9-NOVSX: # %bb.0: # %entry 158; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 15 159; P9-NOVSX-NEXT: blr 160; 161; P8-VSX-LABEL: rotl_8: 162; P8-VSX: # %bb.0: # %entry 163; P8-VSX-NEXT: vsldoi v2, v2, v2, 15 164; P8-VSX-NEXT: blr 165; 166; P8-NOVSX-LABEL: rotl_8: 167; P8-NOVSX: # %bb.0: # %entry 168; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 15 169; P8-NOVSX-NEXT: blr 170entry: 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, %shr 174 ret <1 x i128> %or 175} 176 177define <1 x i128> @rotl_120(<1 x i128> %num) { 178; P9-VSX-LABEL: rotl_120: 179; P9-VSX: # %bb.0: # %entry 180; P9-VSX-NEXT: vsldoi v2, v2, v2, 1 181; P9-VSX-NEXT: blr 182; 183; P9-NOVSX-LABEL: rotl_120: 184; P9-NOVSX: # %bb.0: # %entry 185; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 1 186; P9-NOVSX-NEXT: blr 187; 188; P8-VSX-LABEL: rotl_120: 189; P8-VSX: # %bb.0: # %entry 190; P8-VSX-NEXT: vsldoi v2, v2, v2, 1 191; P8-VSX-NEXT: blr 192; 193; P8-NOVSX-LABEL: rotl_120: 194; P8-NOVSX: # %bb.0: # %entry 195; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 1 196; P8-NOVSX-NEXT: blr 197entry: 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, %shr 201 ret <1 x i128> %or 202} 203 204define <1 x i128> @rotl_28(<1 x i128> %num) { 205; P9-VSX-LABEL: rotl_28: 206; P9-VSX: # %bb.0: # %entry 207; P9-VSX-NEXT: mfvsrld r4, v2 208; P9-VSX-NEXT: mfvsrd r3, v2 209; P9-VSX-NEXT: rotldi r5, r4, 28 210; P9-VSX-NEXT: rldimi r5, r3, 28, 0 211; P9-VSX-NEXT: rotldi r3, r3, 28 212; P9-VSX-NEXT: rldimi r3, r4, 28, 0 213; P9-VSX-NEXT: mtvsrdd v2, r5, r3 214; P9-VSX-NEXT: blr 215; 216; P9-NOVSX-LABEL: rotl_28: 217; P9-NOVSX: # %bb.0: # %entry 218; P9-NOVSX-NEXT: addi r3, r1, -32 219; P9-NOVSX-NEXT: stvx v2, 0, r3 220; P9-NOVSX-NEXT: ld r4, -32(r1) 221; P9-NOVSX-NEXT: ld r3, -24(r1) 222; P9-NOVSX-NEXT: rotldi r5, r4, 28 223; P9-NOVSX-NEXT: rldimi r5, r3, 28, 0 224; P9-NOVSX-NEXT: rotldi r3, r3, 28 225; P9-NOVSX-NEXT: rldimi r3, r4, 28, 0 226; P9-NOVSX-NEXT: std r5, -8(r1) 227; P9-NOVSX-NEXT: std r3, -16(r1) 228; P9-NOVSX-NEXT: addi r3, r1, -16 229; P9-NOVSX-NEXT: lvx v2, 0, r3 230; P9-NOVSX-NEXT: blr 231; 232; P8-VSX-LABEL: rotl_28: 233; P8-VSX: # %bb.0: # %entry 234; P8-VSX-NEXT: xxswapd vs0, v2 235; P8-VSX-NEXT: mfvsrd r4, v2 236; P8-VSX-NEXT: rotldi r5, r4, 28 237; P8-VSX-NEXT: mffprd r3, f0 238; P8-VSX-NEXT: rldimi r5, r3, 28, 0 239; P8-VSX-NEXT: rotldi r3, r3, 28 240; P8-VSX-NEXT: rldimi r3, r4, 28, 0 241; P8-VSX-NEXT: mtfprd f0, r5 242; P8-VSX-NEXT: mtfprd f1, r3 243; P8-VSX-NEXT: xxmrghd v2, vs1, vs0 244; P8-VSX-NEXT: blr 245; 246; P8-NOVSX-LABEL: rotl_28: 247; P8-NOVSX: # %bb.0: # %entry 248; P8-NOVSX-NEXT: addi r3, r1, -32 249; P8-NOVSX-NEXT: stvx v2, 0, r3 250; P8-NOVSX-NEXT: ld r4, -32(r1) 251; P8-NOVSX-NEXT: ld r3, -24(r1) 252; P8-NOVSX-NEXT: rotldi r5, r4, 28 253; P8-NOVSX-NEXT: rldimi r5, r3, 28, 0 254; P8-NOVSX-NEXT: rotldi r3, r3, 28 255; P8-NOVSX-NEXT: rldimi r3, r4, 28, 0 256; P8-NOVSX-NEXT: std r5, -8(r1) 257; P8-NOVSX-NEXT: std r3, -16(r1) 258; P8-NOVSX-NEXT: addi r3, r1, -16 259; P8-NOVSX-NEXT: lvx v2, 0, r3 260; P8-NOVSX-NEXT: blr 261entry: 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, %shr 265 ret <1 x i128> %or 266} 267 268define <1 x i128> @NO_rotl(<1 x i128> %num) { 269; P9-VSX-LABEL: NO_rotl: 270; P9-VSX: # %bb.0: # %entry 271; P9-VSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha 272; P9-VSX-NEXT: addi r3, r3, .LCPI8_0@toc@l 273; P9-VSX-NEXT: lxv v3, 0(r3) 274; P9-VSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha 275; P9-VSX-NEXT: addi r3, r3, .LCPI8_1@toc@l 276; P9-VSX-NEXT: vslo v4, v2, v3 277; P9-VSX-NEXT: vspltb v3, v3, 15 278; P9-VSX-NEXT: vsl v3, v4, v3 279; P9-VSX-NEXT: lxv v4, 0(r3) 280; P9-VSX-NEXT: vsro v2, v2, v4 281; P9-VSX-NEXT: vspltb v4, v4, 15 282; P9-VSX-NEXT: vsr v2, v2, v4 283; P9-VSX-NEXT: xxlor v2, v3, v2 284; P9-VSX-NEXT: blr 285; 286; P9-NOVSX-LABEL: NO_rotl: 287; P9-NOVSX: # %bb.0: # %entry 288; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha 289; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l 290; P9-NOVSX-NEXT: lvx v3, 0, r3 291; P9-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha 292; P9-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l 293; P9-NOVSX-NEXT: vslo v4, v2, v3 294; P9-NOVSX-NEXT: vspltb v3, v3, 15 295; P9-NOVSX-NEXT: vsl v3, v4, v3 296; P9-NOVSX-NEXT: lvx v4, 0, r3 297; P9-NOVSX-NEXT: vsro v2, v2, v4 298; P9-NOVSX-NEXT: vspltb v4, v4, 15 299; P9-NOVSX-NEXT: vsr v2, v2, v4 300; P9-NOVSX-NEXT: vor v2, v3, v2 301; P9-NOVSX-NEXT: blr 302; 303; P8-VSX-LABEL: NO_rotl: 304; P8-VSX: # %bb.0: # %entry 305; P8-VSX-NEXT: xxswapd vs0, v2 306; P8-VSX-NEXT: mfvsrd r4, v2 307; P8-VSX-NEXT: mffprd r3, f0 308; P8-VSX-NEXT: rotldi r5, r3, 20 309; P8-VSX-NEXT: sldi r3, r3, 20 310; P8-VSX-NEXT: rldimi r5, r4, 20, 0 311; P8-VSX-NEXT: mtfprd f0, r3 312; P8-VSX-NEXT: li r3, 0 313; P8-VSX-NEXT: mtfprd f1, r5 314; P8-VSX-NEXT: xxmrghd v2, vs1, vs0 315; P8-VSX-NEXT: mtfprd f0, r3 316; P8-VSX-NEXT: rldicl r3, r4, 28, 36 317; P8-VSX-NEXT: mtfprd f1, r3 318; P8-VSX-NEXT: xxmrghd v3, vs0, vs1 319; P8-VSX-NEXT: xxlor v2, v2, v3 320; P8-VSX-NEXT: blr 321; 322; P8-NOVSX-LABEL: NO_rotl: 323; P8-NOVSX: # %bb.0: # %entry 324; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_0@toc@ha 325; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_0@toc@l 326; P8-NOVSX-NEXT: lvx v3, 0, r3 327; P8-NOVSX-NEXT: addis r3, r2, .LCPI8_1@toc@ha 328; P8-NOVSX-NEXT: addi r3, r3, .LCPI8_1@toc@l 329; P8-NOVSX-NEXT: lvx v5, 0, r3 330; P8-NOVSX-NEXT: vslo v4, v2, v3 331; P8-NOVSX-NEXT: vspltb v3, v3, 15 332; P8-NOVSX-NEXT: vsl v3, v4, v3 333; P8-NOVSX-NEXT: vsro v2, v2, v5 334; P8-NOVSX-NEXT: vspltb v5, v5, 15 335; P8-NOVSX-NEXT: vsr v2, v2, v5 336; P8-NOVSX-NEXT: vor v2, v3, v2 337; P8-NOVSX-NEXT: blr 338entry: 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, %shr 342 ret <1 x i128> %or 343} 344 345define <1 x i128> @shufflevector(<1 x i128> %num) { 346; P9-VSX-LABEL: shufflevector: 347; P9-VSX: # %bb.0: # %entry 348; P9-VSX-NEXT: xxswapd v2, v2 349; P9-VSX-NEXT: blr 350; 351; P9-NOVSX-LABEL: shufflevector: 352; P9-NOVSX: # %bb.0: # %entry 353; P9-NOVSX-NEXT: vsldoi v2, v2, v2, 8 354; P9-NOVSX-NEXT: blr 355; 356; P8-VSX-LABEL: shufflevector: 357; P8-VSX: # %bb.0: # %entry 358; P8-VSX-NEXT: xxswapd v2, v2 359; P8-VSX-NEXT: blr 360; 361; P8-NOVSX-LABEL: shufflevector: 362; P8-NOVSX: # %bb.0: # %entry 363; P8-NOVSX-NEXT: vsldoi v2, v2, v2, 8 364; P8-NOVSX-NEXT: blr 365entry: 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> %1 370} 371