1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mcpu=pwr8 -mattr=+vsx \ 3; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s 4 5; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mattr=-power9-vector \ 6; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s 7 8; RUN: llc -verify-machineinstrs -mcpu=pwr9 -mattr=+vsx \ 9; RUN: -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s \ 10; RUN: --check-prefix=CHECK-P9 --implicit-check-not xxswapd 11 12define <2 x double> @test00(ptr %p1, ptr %p2) { 13; CHECK-LABEL: test00: 14; CHECK: # %bb.0: 15; CHECK-NEXT: lxvdsx 34, 0, 3 16; CHECK-NEXT: blr 17; 18; CHECK-P9-LABEL: test00: 19; CHECK-P9: # %bb.0: 20; CHECK-P9-NEXT: lxvdsx 34, 0, 3 21; CHECK-P9-NEXT: blr 22 %v1 = load <2 x double>, ptr %p1 23 %v2 = load <2 x double>, ptr %p2 24 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 0> 25 ret <2 x double> %v3 26} 27 28define <2 x double> @test01(ptr %p1, ptr %p2) { 29; CHECK-LABEL: test01: 30; CHECK: # %bb.0: 31; CHECK-NEXT: lxvd2x 0, 0, 3 32; CHECK-NEXT: xxswapd 34, 0 33; CHECK-NEXT: blr 34; 35; CHECK-P9-LABEL: test01: 36; CHECK-P9: # %bb.0: 37; CHECK-P9-NEXT: lxv 34, 0(3) 38; CHECK-P9-NEXT: blr 39 %v1 = load <2 x double>, ptr %p1 40 %v2 = load <2 x double>, ptr %p2 41 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 1> 42 ret <2 x double> %v3 43} 44 45define <2 x double> @test02(ptr %p1, ptr %p2) { 46; CHECK-LABEL: test02: 47; CHECK: # %bb.0: 48; CHECK-NEXT: lxvd2x 0, 0, 3 49; CHECK-NEXT: lxvd2x 1, 0, 4 50; CHECK-NEXT: xxswapd 0, 0 51; CHECK-NEXT: xxswapd 1, 1 52; CHECK-NEXT: xxmrgld 34, 1, 0 53; CHECK-NEXT: blr 54; 55; CHECK-P9-LABEL: test02: 56; CHECK-P9: # %bb.0: 57; CHECK-P9-NEXT: lxv 0, 0(3) 58; CHECK-P9-NEXT: lxv 1, 0(4) 59; CHECK-P9-NEXT: xxmrgld 34, 1, 0 60; CHECK-P9-NEXT: blr 61 %v1 = load <2 x double>, ptr %p1 62 %v2 = load <2 x double>, ptr %p2 63 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 2> 64 ret <2 x double> %v3 65} 66 67define <2 x double> @test03(ptr %p1, ptr %p2) { 68; CHECK-LABEL: test03: 69; CHECK: # %bb.0: 70; CHECK-NEXT: lxvd2x 0, 0, 3 71; CHECK-NEXT: lxvd2x 1, 0, 4 72; CHECK-NEXT: xxswapd 0, 0 73; CHECK-NEXT: xxswapd 1, 1 74; CHECK-NEXT: xxpermdi 34, 1, 0, 1 75; CHECK-NEXT: blr 76; 77; CHECK-P9-LABEL: test03: 78; CHECK-P9: # %bb.0: 79; CHECK-P9-NEXT: lxv 0, 0(3) 80; CHECK-P9-NEXT: lxv 1, 0(4) 81; CHECK-P9-NEXT: xxpermdi 34, 1, 0, 1 82; CHECK-P9-NEXT: blr 83 %v1 = load <2 x double>, ptr %p1 84 %v2 = load <2 x double>, ptr %p2 85 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 3> 86 ret <2 x double> %v3 87} 88 89define <2 x double> @test10(ptr %p1, ptr %p2) { 90; CHECK-LABEL: test10: 91; CHECK: # %bb.0: 92; CHECK-NEXT: lxvd2x 34, 0, 3 93; CHECK-NEXT: blr 94; 95; CHECK-P9-LABEL: test10: 96; CHECK-P9: # %bb.0: 97; CHECK-P9-NEXT: lxvd2x 34, 0, 3 98; CHECK-P9-NEXT: blr 99 %v1 = load <2 x double>, ptr %p1 100 %v2 = load <2 x double>, ptr %p2 101 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 0> 102 ret <2 x double> %v3 103} 104 105define <2 x double> @test11(ptr %p1, ptr %p2) { 106; CHECK-LABEL: test11: 107; CHECK: # %bb.0: 108; CHECK-NEXT: addi 3, 3, 8 109; CHECK-NEXT: lxvdsx 34, 0, 3 110; CHECK-NEXT: blr 111; 112; CHECK-P9-LABEL: test11: 113; CHECK-P9: # %bb.0: 114; CHECK-P9-NEXT: addi 3, 3, 8 115; CHECK-P9-NEXT: lxvdsx 34, 0, 3 116; CHECK-P9-NEXT: blr 117 %v1 = load <2 x double>, ptr %p1 118 %v2 = load <2 x double>, ptr %p2 119 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1> 120 ret <2 x double> %v3 121} 122 123define <2 x double> @test12(ptr %p1, ptr %p2) { 124; CHECK-LABEL: test12: 125; CHECK: # %bb.0: 126; CHECK-NEXT: lxvd2x 0, 0, 3 127; CHECK-NEXT: lxvd2x 1, 0, 4 128; CHECK-NEXT: xxswapd 0, 0 129; CHECK-NEXT: xxswapd 1, 1 130; CHECK-NEXT: xxpermdi 34, 1, 0, 2 131; CHECK-NEXT: blr 132; 133; CHECK-P9-LABEL: test12: 134; CHECK-P9: # %bb.0: 135; CHECK-P9-NEXT: lxv 0, 0(3) 136; CHECK-P9-NEXT: lxv 1, 0(4) 137; CHECK-P9-NEXT: xxpermdi 34, 1, 0, 2 138; CHECK-P9-NEXT: blr 139 %v1 = load <2 x double>, ptr %p1 140 %v2 = load <2 x double>, ptr %p2 141 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2> 142 ret <2 x double> %v3 143} 144 145define <2 x double> @test13(ptr %p1, ptr %p2) { 146; CHECK-LABEL: test13: 147; CHECK: # %bb.0: 148; CHECK-NEXT: lxvd2x 0, 0, 3 149; CHECK-NEXT: lxvd2x 1, 0, 4 150; CHECK-NEXT: xxswapd 0, 0 151; CHECK-NEXT: xxswapd 1, 1 152; CHECK-NEXT: xxmrghd 34, 1, 0 153; CHECK-NEXT: blr 154; 155; CHECK-P9-LABEL: test13: 156; CHECK-P9: # %bb.0: 157; CHECK-P9-NEXT: lxv 0, 0(3) 158; CHECK-P9-NEXT: lxv 1, 0(4) 159; CHECK-P9-NEXT: xxmrghd 34, 1, 0 160; CHECK-P9-NEXT: blr 161 %v1 = load <2 x double>, ptr %p1 162 %v2 = load <2 x double>, ptr %p2 163 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3> 164 ret <2 x double> %v3 165} 166 167define <2 x double> @test20(ptr %p1, ptr %p2) { 168; CHECK-LABEL: test20: 169; CHECK: # %bb.0: 170; CHECK-NEXT: lxvd2x 0, 0, 3 171; CHECK-NEXT: lxvd2x 1, 0, 4 172; CHECK-NEXT: xxswapd 0, 0 173; CHECK-NEXT: xxswapd 1, 1 174; CHECK-NEXT: xxmrgld 34, 0, 1 175; CHECK-NEXT: blr 176; 177; CHECK-P9-LABEL: test20: 178; CHECK-P9: # %bb.0: 179; CHECK-P9-NEXT: lxv 0, 0(3) 180; CHECK-P9-NEXT: lxv 1, 0(4) 181; CHECK-P9-NEXT: xxmrgld 34, 0, 1 182; CHECK-P9-NEXT: blr 183 %v1 = load <2 x double>, ptr %p1 184 %v2 = load <2 x double>, ptr %p2 185 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0> 186 ret <2 x double> %v3 187} 188 189define <2 x double> @test21(ptr %p1, ptr %p2) { 190; CHECK-LABEL: test21: 191; CHECK: # %bb.0: 192; CHECK-NEXT: lxvd2x 0, 0, 3 193; CHECK-NEXT: lxvd2x 1, 0, 4 194; CHECK-NEXT: xxswapd 0, 0 195; CHECK-NEXT: xxswapd 1, 1 196; CHECK-NEXT: xxpermdi 34, 0, 1, 1 197; CHECK-NEXT: blr 198; 199; CHECK-P9-LABEL: test21: 200; CHECK-P9: # %bb.0: 201; CHECK-P9-NEXT: lxv 0, 0(3) 202; CHECK-P9-NEXT: lxv 1, 0(4) 203; CHECK-P9-NEXT: xxpermdi 34, 0, 1, 1 204; CHECK-P9-NEXT: blr 205 %v1 = load <2 x double>, ptr %p1 206 %v2 = load <2 x double>, ptr %p2 207 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1> 208 ret <2 x double> %v3 209} 210 211define <2 x double> @test22(ptr %p1, ptr %p2) { 212; CHECK-LABEL: test22: 213; CHECK: # %bb.0: 214; CHECK-NEXT: lxvdsx 34, 0, 4 215; CHECK-NEXT: blr 216; 217; CHECK-P9-LABEL: test22: 218; CHECK-P9: # %bb.0: 219; CHECK-P9-NEXT: lxvdsx 34, 0, 4 220; CHECK-P9-NEXT: blr 221 %v1 = load <2 x double>, ptr %p1 222 %v2 = load <2 x double>, ptr %p2 223 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2> 224 ret <2 x double> %v3 225} 226 227define <2 x double> @test23(ptr %p1, ptr %p2) { 228; CHECK-LABEL: test23: 229; CHECK: # %bb.0: 230; CHECK-NEXT: lxvd2x 0, 0, 4 231; CHECK-NEXT: xxswapd 34, 0 232; CHECK-NEXT: blr 233; 234; CHECK-P9-LABEL: test23: 235; CHECK-P9: # %bb.0: 236; CHECK-P9-NEXT: lxv 34, 0(4) 237; CHECK-P9-NEXT: blr 238 %v1 = load <2 x double>, ptr %p1 239 %v2 = load <2 x double>, ptr %p2 240 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3> 241 ret <2 x double> %v3 242} 243 244define <2 x double> @test30(ptr %p1, ptr %p2) { 245; CHECK-LABEL: test30: 246; CHECK: # %bb.0: 247; CHECK-NEXT: lxvd2x 0, 0, 3 248; CHECK-NEXT: lxvd2x 1, 0, 4 249; CHECK-NEXT: xxswapd 0, 0 250; CHECK-NEXT: xxswapd 1, 1 251; CHECK-NEXT: xxpermdi 34, 0, 1, 2 252; CHECK-NEXT: blr 253; 254; CHECK-P9-LABEL: test30: 255; CHECK-P9: # %bb.0: 256; CHECK-P9-NEXT: lxv 0, 0(3) 257; CHECK-P9-NEXT: lxv 1, 0(4) 258; CHECK-P9-NEXT: xxpermdi 34, 0, 1, 2 259; CHECK-P9-NEXT: blr 260 %v1 = load <2 x double>, ptr %p1 261 %v2 = load <2 x double>, ptr %p2 262 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0> 263 ret <2 x double> %v3 264} 265 266define <2 x double> @test31(ptr %p1, ptr %p2) { 267; CHECK-LABEL: test31: 268; CHECK: # %bb.0: 269; CHECK-NEXT: lxvd2x 0, 0, 3 270; CHECK-NEXT: lxvd2x 1, 0, 4 271; CHECK-NEXT: xxswapd 0, 0 272; CHECK-NEXT: xxswapd 1, 1 273; CHECK-NEXT: xxmrghd 34, 0, 1 274; CHECK-NEXT: blr 275; 276; CHECK-P9-LABEL: test31: 277; CHECK-P9: # %bb.0: 278; CHECK-P9-NEXT: lxv 0, 0(3) 279; CHECK-P9-NEXT: lxv 1, 0(4) 280; CHECK-P9-NEXT: xxmrghd 34, 0, 1 281; CHECK-P9-NEXT: blr 282 %v1 = load <2 x double>, ptr %p1 283 %v2 = load <2 x double>, ptr %p2 284 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1> 285 ret <2 x double> %v3 286} 287 288define <2 x double> @test32(ptr %p1, ptr %p2) { 289; CHECK-LABEL: test32: 290; CHECK: # %bb.0: 291; CHECK-NEXT: lxvd2x 34, 0, 4 292; CHECK-NEXT: blr 293; 294; CHECK-P9-LABEL: test32: 295; CHECK-P9: # %bb.0: 296; CHECK-P9-NEXT: lxvd2x 34, 0, 4 297; CHECK-P9-NEXT: blr 298 %v1 = load <2 x double>, ptr %p1 299 %v2 = load <2 x double>, ptr %p2 300 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2> 301 ret <2 x double> %v3 302} 303 304define <2 x double> @test33(ptr %p1, ptr %p2) { 305; CHECK-LABEL: test33: 306; CHECK: # %bb.0: 307; CHECK-NEXT: addi 3, 4, 8 308; CHECK-NEXT: lxvdsx 34, 0, 3 309; CHECK-NEXT: blr 310; 311; CHECK-P9-LABEL: test33: 312; CHECK-P9: # %bb.0: 313; CHECK-P9-NEXT: addi 3, 4, 8 314; CHECK-P9-NEXT: lxvdsx 34, 0, 3 315; CHECK-P9-NEXT: blr 316 %v1 = load <2 x double>, ptr %p1 317 %v2 = load <2 x double>, ptr %p2 318 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3> 319 ret <2 x double> %v3 320} 321