1; RUN: llc -mcpu=pwr8 -mattr=+vsx -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s 2 3define <2 x double> @test00(<2 x double>* %p1, <2 x double>* %p2) { 4 %v1 = load <2 x double>, <2 x double>* %p1 5 %v2 = load <2 x double>, <2 x double>* %p2 6 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 0> 7 ret <2 x double> %v3 8 9; CHECK-LABEL: test00 10; CHECK: lxvd2x 0, 0, 3 11; CHECK: xxpermdi 0, 0, 0, 2 12; CHECK: xxpermdi 34, 0, 0, 3 13} 14 15define <2 x double> @test01(<2 x double>* %p1, <2 x double>* %p2) { 16 %v1 = load <2 x double>, <2 x double>* %p1 17 %v2 = load <2 x double>, <2 x double>* %p2 18 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 0, i32 1> 19 ret <2 x double> %v3 20 21; CHECK-LABEL: test01 22; CHECK: lxvd2x 0, 0, 3 23; CHECK: xxpermdi 34, 0, 0, 2 24} 25 26define <2 x double> @test02(<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 2> 30 ret <2 x double> %v3 31 32; CHECK-LABEL: @test02 33; CHECK: lxvd2x 0, 0, 3 34; CHECK: lxvd2x 1, 0, 4 35; CHECK: xxpermdi 0, 0, 0, 2 36; CHECK: xxpermdi 1, 1, 1, 2 37; CHECK: xxpermdi 34, 1, 0, 3 38} 39 40define <2 x double> @test03(<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 3> 44 ret <2 x double> %v3 45 46; CHECK-LABEL: @test03 47; CHECK: lxvd2x 0, 0, 3 48; CHECK: lxvd2x 1, 0, 4 49; CHECK: xxpermdi 0, 0, 0, 2 50; CHECK: xxpermdi 1, 1, 1, 2 51; CHECK: xxpermdi 34, 1, 0, 1 52} 53 54define <2 x double> @test10(<2 x double>* %p1, <2 x double>* %p2) { 55 %v1 = load <2 x double>, <2 x double>* %p1 56 %v2 = load <2 x double>, <2 x double>* %p2 57 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 0> 58 ret <2 x double> %v3 59 60; CHECK-LABEL: @test10 61; CHECK: lxvd2x 0, 0, 3 62; CHECK: xxpermdi 0, 0, 0, 2 63; CHECK: xxpermdi 34, 0, 0, 2 64} 65 66define <2 x double> @test11(<2 x double>* %p1, <2 x double>* %p2) { 67 %v1 = load <2 x double>, <2 x double>* %p1 68 %v2 = load <2 x double>, <2 x double>* %p2 69 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 1, i32 1> 70 ret <2 x double> %v3 71 72; CHECK-LABEL: @test11 73; CHECK: lxvd2x 0, 0, 3 74; CHECK: xxpermdi 0, 0, 0, 2 75; CHECK: xxpermdi 34, 0, 0, 0 76} 77 78define <2 x double> @test12(<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 2> 82 ret <2 x double> %v3 83 84; CHECK-LABEL: @test12 85; CHECK: lxvd2x 0, 0, 3 86; CHECK: lxvd2x 1, 0, 4 87; CHECK: xxpermdi 0, 0, 0, 2 88; CHECK: xxpermdi 1, 1, 1, 2 89; CHECK: xxpermdi 34, 1, 0, 2 90} 91 92define <2 x double> @test13(<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 3> 96 ret <2 x double> %v3 97 98; CHECK-LABEL: @test13 99; CHECK: lxvd2x 0, 0, 3 100; CHECK: lxvd2x 1, 0, 4 101; CHECK: xxpermdi 0, 0, 0, 2 102; CHECK: xxpermdi 1, 1, 1, 2 103; CHECK: xxpermdi 34, 1, 0, 0 104} 105 106define <2 x double> @test20(<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 2, i32 0> 110 ret <2 x double> %v3 111 112; CHECK-LABEL: @test20 113; CHECK: lxvd2x 0, 0, 3 114; CHECK: lxvd2x 1, 0, 4 115; CHECK: xxpermdi 0, 0, 0, 2 116; CHECK: xxpermdi 1, 1, 1, 2 117; CHECK: xxpermdi 34, 0, 1, 3 118} 119 120define <2 x double> @test21(<2 x double>* %p1, <2 x double>* %p2) { 121 %v1 = load <2 x double>, <2 x double>* %p1 122 %v2 = load <2 x double>, <2 x double>* %p2 123 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 1> 124 ret <2 x double> %v3 125 126; CHECK-LABEL: @test21 127; CHECK: lxvd2x 0, 0, 3 128; CHECK: lxvd2x 1, 0, 4 129; CHECK: xxpermdi 0, 0, 0, 2 130; CHECK: xxpermdi 1, 1, 1, 2 131; CHECK: xxpermdi 34, 0, 1, 1 132} 133 134define <2 x double> @test22(<2 x double>* %p1, <2 x double>* %p2) { 135 %v1 = load <2 x double>, <2 x double>* %p1 136 %v2 = load <2 x double>, <2 x double>* %p2 137 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 2> 138 ret <2 x double> %v3 139 140; CHECK-LABEL: @test22 141; CHECK: lxvd2x 0, 0, 4 142; CHECK: xxpermdi 0, 0, 0, 2 143; CHECK: xxpermdi 34, 0, 0, 3 144} 145 146define <2 x double> @test23(<2 x double>* %p1, <2 x double>* %p2) { 147 %v1 = load <2 x double>, <2 x double>* %p1 148 %v2 = load <2 x double>, <2 x double>* %p2 149 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 2, i32 3> 150 ret <2 x double> %v3 151 152; CHECK-LABEL: @test23 153; CHECK: lxvd2x 0, 0, 4 154; CHECK: xxpermdi 34, 0, 0, 2 155} 156 157define <2 x double> @test30(<2 x double>* %p1, <2 x double>* %p2) { 158 %v1 = load <2 x double>, <2 x double>* %p1 159 %v2 = load <2 x double>, <2 x double>* %p2 160 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 0> 161 ret <2 x double> %v3 162 163; CHECK-LABEL: @test30 164; CHECK: lxvd2x 0, 0, 3 165; CHECK: lxvd2x 1, 0, 4 166; CHECK: xxpermdi 0, 0, 0, 2 167; CHECK: xxpermdi 1, 1, 1, 2 168; CHECK: xxpermdi 34, 0, 1, 2 169} 170 171define <2 x double> @test31(<2 x double>* %p1, <2 x double>* %p2) { 172 %v1 = load <2 x double>, <2 x double>* %p1 173 %v2 = load <2 x double>, <2 x double>* %p2 174 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 1> 175 ret <2 x double> %v3 176 177; CHECK-LABEL: @test31 178; CHECK: lxvd2x 0, 0, 3 179; CHECK: lxvd2x 1, 0, 4 180; CHECK: xxpermdi 0, 0, 0, 2 181; CHECK: xxpermdi 1, 1, 1, 2 182; CHECK: xxpermdi 34, 0, 1, 0 183} 184 185define <2 x double> @test32(<2 x double>* %p1, <2 x double>* %p2) { 186 %v1 = load <2 x double>, <2 x double>* %p1 187 %v2 = load <2 x double>, <2 x double>* %p2 188 %v3 = shufflevector <2 x double> %v1, <2 x double> %v2, <2 x i32> < i32 3, i32 2> 189 ret <2 x double> %v3 190 191; CHECK-LABEL: @test32 192; CHECK: lxvd2x 0, 0, 4 193; CHECK: xxpermdi 0, 0, 0, 2 194; CHECK: xxpermdi 34, 0, 0, 2 195} 196 197define <2 x double> @test33(<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 3, i32 3> 201 ret <2 x double> %v3 202 203; CHECK-LABEL: @test33 204; CHECK: lxvd2x 0, 0, 4 205; CHECK: xxpermdi 0, 0, 0, 2 206; CHECK: xxpermdi 34, 0, 0, 0 207} 208