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: lxv 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: lxv 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: lxv 0, 0(3) 55; CHECK-P9: lxv 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: lxv 0, 0(3) 74; CHECK-P9: lxv 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: lxvd2x 34, 0, 3 89} 90 91define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) { 92 %v1 = load <2 x double>, <2 x double>* %p1 93 %v2 = load <2 x double>, <2 x double>* %p2 94 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1> 95 ret <2 x double> %v3 96 97; CHECK-LABEL: @test11 98; CHECK: lxvd2x 0, 0, 3 99; CHECK: xxspltd 34, 0, 1 100 101; CHECK-P9-LABEL: @test11 102; CHECK-P9: lxv 0, 0(3) 103; CHECK-P9: xxspltd 34, 0, 0 104} 105 106define <2 x double> @test12(<2 x double>* %p1, <2 x double>* %p2) { 107 %v1 = load <2 x double>, <2 x double>* %p1 108 %v2 = load <2 x double>, <2 x double>* %p2 109 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 2> 110 ret <2 x double> %v3 111 112; CHECK-LABEL: @test12 113; CHECK: lxvd2x 0, 0, 3 114; CHECK: lxvd2x 1, 0, 4 115; CHECK: xxswapd 0, 0 116; CHECK: xxswapd 1, 1 117; CHECK: xxpermdi 34, 1, 0, 2 118 119; CHECK-P9-LABEL: @test12 120; CHECK-P9: lxv 0, 0(3) 121; CHECK-P9: lxv 1, 0(4) 122; CHECK-P9: xxpermdi 34, 1, 0, 2 123} 124 125define <2 x double> @test13(<2 x double>* %p1, <2 x double>* %p2) { 126 %v1 = load <2 x double>, <2 x double>* %p1 127 %v2 = load <2 x double>, <2 x double>* %p2 128 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 3> 129 ret <2 x double> %v3 130 131; CHECK-LABEL: @test13 132; CHECK: lxvd2x 0, 0, 3 133; CHECK: lxvd2x 1, 0, 4 134; CHECK: xxswapd 0, 0 135; CHECK: xxswapd 1, 1 136; CHECK: xxmrghd 34, 1, 0 137 138; CHECK-P9-LABEL: @test13 139; CHECK-P9: lxv 0, 0(3) 140; CHECK-P9: lxv 1, 0(4) 141; CHECK-P9: xxmrghd 34, 1, 0 142} 143 144define <2 x double> @test20(<2 x double>* %p1, <2 x double>* %p2) { 145 %v1 = load <2 x double>, <2 x double>* %p1 146 %v2 = load <2 x double>, <2 x double>* %p2 147 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 0> 148 ret <2 x double> %v3 149 150; CHECK-LABEL: @test20 151; CHECK: lxvd2x 0, 0, 3 152; CHECK: lxvd2x 1, 0, 4 153; CHECK: xxswapd 0, 0 154; CHECK: xxswapd 1, 1 155; CHECK: xxmrgld 34, 0, 1 156 157; CHECK-P9-LABEL: @test20 158; CHECK-P9: lxv 0, 0(3) 159; CHECK-P9: lxv 1, 0(4) 160; CHECK-P9: xxmrgld 34, 0, 1 161} 162 163define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) { 164 %v1 = load <2 x double>, <2 x double>* %p1 165 %v2 = load <2 x double>, <2 x double>* %p2 166 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1> 167 ret <2 x double> %v3 168 169; CHECK-LABEL: @test21 170; CHECK: lxvd2x 0, 0, 3 171; CHECK: lxvd2x 1, 0, 4 172; CHECK: xxswapd 0, 0 173; CHECK: xxswapd 1, 1 174; CHECK: xxpermdi 34, 0, 1, 1 175 176; CHECK-P9-LABEL: @test21 177; CHECK-P9: lxv 0, 0(3) 178; CHECK-P9: lxv 1, 0(4) 179; CHECK-P9: xxpermdi 34, 0, 1, 1 180} 181 182define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) { 183 %v1 = load <2 x double>, <2 x double>* %p1 184 %v2 = load <2 x double>, <2 x double>* %p2 185 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2> 186 ret <2 x double> %v3 187 188; CHECK-LABEL: @test22 189; CHECK: lxvd2x 0, 0, 4 190; CHECK: xxspltd 34, 0, 0 191 192; CHECK-P9-LABEL: @test22 193; CHECK-P9: lxv 0, 0(4) 194; CHECK-P9: xxspltd 34, 0, 1 195} 196 197define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) { 198 %v1 = load <2 x double>, <2 x double>* %p1 199 %v2 = load <2 x double>, <2 x double>* %p2 200 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3> 201 ret <2 x double> %v3 202 203; CHECK-LABEL: @test23 204; CHECK: lxvd2x 0, 0, 4 205; CHECK: xxswapd 34, 0 206 207; CHECK-P9-LABEL: @test23 208; CHECK-P9: lxv 34, 0(4) 209} 210 211define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) { 212 %v1 = load <2 x double>, <2 x double>* %p1 213 %v2 = load <2 x double>, <2 x double>* %p2 214 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0> 215 ret <2 x double> %v3 216 217; CHECK-LABEL: @test30 218; CHECK: lxvd2x 0, 0, 3 219; CHECK: lxvd2x 1, 0, 4 220; CHECK: xxswapd 0, 0 221; CHECK: xxswapd 1, 1 222; CHECK: xxpermdi 34, 0, 1, 2 223 224; CHECK-P9-LABEL: @test30 225; CHECK-P9: lxv 0, 0(3) 226; CHECK-P9: lxv 1, 0(4) 227; CHECK-P9: xxpermdi 34, 0, 1, 2 228} 229 230define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) { 231 %v1 = load <2 x double>, <2 x double>* %p1 232 %v2 = load <2 x double>, <2 x double>* %p2 233 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1> 234 ret <2 x double> %v3 235 236; CHECK-LABEL: @test31 237; CHECK: lxvd2x 0, 0, 3 238; CHECK: lxvd2x 1, 0, 4 239; CHECK: xxswapd 0, 0 240; CHECK: xxswapd 1, 1 241; CHECK: xxmrghd 34, 0, 1 242 243; CHECK-P9-LABEL: @test31 244; CHECK-P9: lxv 0, 0(3) 245; CHECK-P9: lxv 1, 0(4) 246; CHECK-P9: xxmrghd 34, 0, 1 247} 248 249define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) { 250 %v1 = load <2 x double>, <2 x double>* %p1 251 %v2 = load <2 x double>, <2 x double>* %p2 252 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2> 253 ret <2 x double> %v3 254 255; CHECK-LABEL: @test32 256; CHECK: lxvd2x 34, 0, 4 257 258; CHECK-P9-LABEL: @test32 259; CHECK-P9: lxvd2x 34, 0, 4 260} 261 262define <2 x double> @test33(<2 x double>* %p1, <2 x double>* %p2) { 263 %v1 = load <2 x double>, <2 x double>* %p1 264 %v2 = load <2 x double>, <2 x double>* %p2 265 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 3> 266 ret <2 x double> %v3 267 268; CHECK-LABEL: @test33 269; CHECK: lxvd2x 0, 0, 4 270; CHECK: xxspltd 34, 0, 1 271 272; CHECK-P9-LABEL: @test33 273; CHECK-P9: lxv 0, 0(4) 274; CHECK-P9: xxspltd 34, 0, 0 275} 276