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