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