1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse3 | FileCheck %s --check-prefix=SSE3 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @haddpd1(<2 x double> %x, <2 x double> %y) { 6*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddpd1: 7*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 8*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddpd %xmm1, %xmm0 9*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddpd1: 12*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 13*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddpd %xmm1, %xmm0, %xmm0 14*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 15*9880d681SAndroid Build Coastguard Worker %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> <i32 0, i32 2> 16*9880d681SAndroid Build Coastguard Worker %b = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> <i32 1, i32 3> 17*9880d681SAndroid Build Coastguard Worker %r = fadd <2 x double> %a, %b 18*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @haddpd2(<2 x double> %x, <2 x double> %y) { 22*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddpd2: 23*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 24*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddpd %xmm1, %xmm0 25*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddpd2: 28*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 29*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddpd %xmm1, %xmm0, %xmm0 30*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 31*9880d681SAndroid Build Coastguard Worker %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> <i32 1, i32 2> 32*9880d681SAndroid Build Coastguard Worker %b = shufflevector <2 x double> %y, <2 x double> %x, <2 x i32> <i32 2, i32 1> 33*9880d681SAndroid Build Coastguard Worker %r = fadd <2 x double> %a, %b 34*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @haddpd3(<2 x double> %x) { 38*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddpd3: 39*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 40*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddpd %xmm0, %xmm0 41*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddpd3: 44*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 45*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddpd %xmm0, %xmm0, %xmm0 46*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 47*9880d681SAndroid Build Coastguard Worker %a = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> <i32 0, i32 undef> 48*9880d681SAndroid Build Coastguard Worker %b = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> <i32 1, i32 undef> 49*9880d681SAndroid Build Coastguard Worker %r = fadd <2 x double> %a, %b 50*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps1(<4 x float> %x, <4 x float> %y) { 54*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps1: 55*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 56*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm1, %xmm0 57*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 58*9880d681SAndroid Build Coastguard Worker; 59*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps1: 60*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 61*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm1, %xmm0, %xmm0 62*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 63*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 64*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 65*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 66*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps2(<4 x float> %x, <4 x float> %y) { 70*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps2: 71*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 72*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm1, %xmm0 73*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 74*9880d681SAndroid Build Coastguard Worker; 75*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps2: 76*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 77*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm1, %xmm0, %xmm0 78*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 79*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> <i32 1, i32 2, i32 5, i32 6> 80*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %y, <4 x float> %x, <4 x i32> <i32 4, i32 7, i32 0, i32 3> 81*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 82*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps3(<4 x float> %x) { 86*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps3: 87*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 88*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 89*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps3: 92*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 93*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 94*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 95*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6> 96*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7> 97*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 98*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps4(<4 x float> %x) { 102*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps4: 103*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 104*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 105*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 106*9880d681SAndroid Build Coastguard Worker; 107*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps4: 108*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 109*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 110*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 111*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef> 112*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef> 113*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 114*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps5(<4 x float> %x) { 118*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps5: 119*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 120*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 121*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 122*9880d681SAndroid Build Coastguard Worker; 123*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps5: 124*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 125*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 126*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 127*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 undef, i32 undef> 128*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 undef, i32 undef> 129*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 130*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps6(<4 x float> %x) { 134*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps6: 135*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 136*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 137*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 138*9880d681SAndroid Build Coastguard Worker; 139*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps6: 140*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 141*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 142*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 143*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef> 144*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> 145*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 146*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @haddps7(<4 x float> %x) { 150*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps7: 151*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 152*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 153*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 154*9880d681SAndroid Build Coastguard Worker; 155*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps7: 156*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 157*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 158*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 159*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 undef, i32 undef> 160*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 undef, i32 undef> 161*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x float> %a, %b 162*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @hsubpd1(<2 x double> %x, <2 x double> %y) { 166*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubpd1: 167*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 168*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubpd %xmm1, %xmm0 169*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 170*9880d681SAndroid Build Coastguard Worker; 171*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubpd1: 172*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 173*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubpd %xmm1, %xmm0, %xmm0 174*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 175*9880d681SAndroid Build Coastguard Worker %a = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> <i32 0, i32 2> 176*9880d681SAndroid Build Coastguard Worker %b = shufflevector <2 x double> %x, <2 x double> %y, <2 x i32> <i32 1, i32 3> 177*9880d681SAndroid Build Coastguard Worker %r = fsub <2 x double> %a, %b 178*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @hsubpd2(<2 x double> %x) { 182*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubpd2: 183*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 184*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubpd %xmm0, %xmm0 185*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 186*9880d681SAndroid Build Coastguard Worker; 187*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubpd2: 188*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 189*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubpd %xmm0, %xmm0, %xmm0 190*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 191*9880d681SAndroid Build Coastguard Worker %a = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> <i32 0, i32 undef> 192*9880d681SAndroid Build Coastguard Worker %b = shufflevector <2 x double> %x, <2 x double> undef, <2 x i32> <i32 1, i32 undef> 193*9880d681SAndroid Build Coastguard Worker %r = fsub <2 x double> %a, %b 194*9880d681SAndroid Build Coastguard Worker ret <2 x double> %r 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @hsubps1(<4 x float> %x, <4 x float> %y) { 198*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubps1: 199*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 200*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm1, %xmm0 201*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 202*9880d681SAndroid Build Coastguard Worker; 203*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubps1: 204*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 205*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %xmm1, %xmm0, %xmm0 206*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 207*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> <i32 0, i32 2, i32 4, i32 6> 208*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> %y, <4 x i32> <i32 1, i32 3, i32 5, i32 7> 209*9880d681SAndroid Build Coastguard Worker %r = fsub <4 x float> %a, %b 210*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @hsubps2(<4 x float> %x) { 214*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubps2: 215*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 216*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm0, %xmm0 217*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 218*9880d681SAndroid Build Coastguard Worker; 219*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubps2: 220*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 221*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0 222*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 223*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 2, i32 4, i32 6> 224*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 undef, i32 3, i32 5, i32 7> 225*9880d681SAndroid Build Coastguard Worker %r = fsub <4 x float> %a, %b 226*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @hsubps3(<4 x float> %x) { 230*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubps3: 231*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 232*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm0, %xmm0 233*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 234*9880d681SAndroid Build Coastguard Worker; 235*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubps3: 236*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 237*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0 238*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 239*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 undef, i32 undef> 240*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 undef, i32 undef> 241*9880d681SAndroid Build Coastguard Worker %r = fsub <4 x float> %a, %b 242*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @hsubps4(<4 x float> %x) { 246*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: hsubps4: 247*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 248*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm0, %xmm0 249*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 250*9880d681SAndroid Build Coastguard Worker; 251*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: hsubps4: 252*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 253*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %xmm0, %xmm0, %xmm0 254*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 255*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef> 256*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x float> %x, <4 x float> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> 257*9880d681SAndroid Build Coastguard Worker %r = fsub <4 x float> %a, %b 258*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vhaddps1(<8 x float> %x, <8 x float> %y) { 262*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhaddps1: 263*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 264*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm2, %xmm0 265*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm3, %xmm1 266*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 267*9880d681SAndroid Build Coastguard Worker; 268*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhaddps1: 269*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 270*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %ymm1, %ymm0, %ymm0 271*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 272*9880d681SAndroid Build Coastguard Worker %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14> 273*9880d681SAndroid Build Coastguard Worker %b = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15> 274*9880d681SAndroid Build Coastguard Worker %r = fadd <8 x float> %a, %b 275*9880d681SAndroid Build Coastguard Worker ret <8 x float> %r 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vhaddps2(<8 x float> %x, <8 x float> %y) { 279*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhaddps2: 280*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 281*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm2, %xmm0 282*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm3, %xmm1 283*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 284*9880d681SAndroid Build Coastguard Worker; 285*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhaddps2: 286*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 287*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %ymm1, %ymm0, %ymm0 288*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 289*9880d681SAndroid Build Coastguard Worker %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> <i32 1, i32 2, i32 9, i32 10, i32 5, i32 6, i32 13, i32 14> 290*9880d681SAndroid Build Coastguard Worker %b = shufflevector <8 x float> %y, <8 x float> %x, <8 x i32> <i32 8, i32 11, i32 0, i32 3, i32 12, i32 15, i32 4, i32 7> 291*9880d681SAndroid Build Coastguard Worker %r = fadd <8 x float> %a, %b 292*9880d681SAndroid Build Coastguard Worker ret <8 x float> %r 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vhaddps3(<8 x float> %x) { 296*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhaddps3: 297*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 298*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 299*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm1, %xmm1 300*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 301*9880d681SAndroid Build Coastguard Worker; 302*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhaddps3: 303*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 304*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %ymm0, %ymm0, %ymm0 305*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 306*9880d681SAndroid Build Coastguard Worker %a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 undef, i32 2, i32 8, i32 10, i32 4, i32 6, i32 undef, i32 14> 307*9880d681SAndroid Build Coastguard Worker %b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 9, i32 undef, i32 5, i32 7, i32 13, i32 15> 308*9880d681SAndroid Build Coastguard Worker %r = fadd <8 x float> %a, %b 309*9880d681SAndroid Build Coastguard Worker ret <8 x float> %r 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vhsubps1(<8 x float> %x, <8 x float> %y) { 313*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhsubps1: 314*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 315*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm2, %xmm0 316*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm3, %xmm1 317*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 318*9880d681SAndroid Build Coastguard Worker; 319*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhsubps1: 320*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 321*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %ymm1, %ymm0, %ymm0 322*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 323*9880d681SAndroid Build Coastguard Worker %a = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14> 324*9880d681SAndroid Build Coastguard Worker %b = shufflevector <8 x float> %x, <8 x float> %y, <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15> 325*9880d681SAndroid Build Coastguard Worker %r = fsub <8 x float> %a, %b 326*9880d681SAndroid Build Coastguard Worker ret <8 x float> %r 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vhsubps3(<8 x float> %x) { 330*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhsubps3: 331*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 332*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm0, %xmm0 333*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubps %xmm1, %xmm1 334*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 335*9880d681SAndroid Build Coastguard Worker; 336*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhsubps3: 337*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 338*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubps %ymm0, %ymm0, %ymm0 339*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 340*9880d681SAndroid Build Coastguard Worker %a = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 undef, i32 2, i32 8, i32 10, i32 4, i32 6, i32 undef, i32 14> 341*9880d681SAndroid Build Coastguard Worker %b = shufflevector <8 x float> %x, <8 x float> undef, <8 x i32> <i32 1, i32 3, i32 9, i32 undef, i32 5, i32 7, i32 13, i32 15> 342*9880d681SAndroid Build Coastguard Worker %r = fsub <8 x float> %a, %b 343*9880d681SAndroid Build Coastguard Worker ret <8 x float> %r 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @vhaddpd1(<4 x double> %x, <4 x double> %y) { 347*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhaddpd1: 348*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 349*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddpd %xmm2, %xmm0 350*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddpd %xmm3, %xmm1 351*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 352*9880d681SAndroid Build Coastguard Worker; 353*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhaddpd1: 354*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 355*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddpd %ymm1, %ymm0, %ymm0 356*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 357*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> <i32 0, i32 4, i32 2, i32 6> 358*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> <i32 1, i32 5, i32 3, i32 7> 359*9880d681SAndroid Build Coastguard Worker %r = fadd <4 x double> %a, %b 360*9880d681SAndroid Build Coastguard Worker ret <4 x double> %r 361*9880d681SAndroid Build Coastguard Worker} 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @vhsubpd1(<4 x double> %x, <4 x double> %y) { 364*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: vhsubpd1: 365*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 366*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubpd %xmm2, %xmm0 367*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: hsubpd %xmm3, %xmm1 368*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 369*9880d681SAndroid Build Coastguard Worker; 370*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: vhsubpd1: 371*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 372*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhsubpd %ymm1, %ymm0, %ymm0 373*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 374*9880d681SAndroid Build Coastguard Worker %a = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> <i32 0, i32 4, i32 2, i32 6> 375*9880d681SAndroid Build Coastguard Worker %b = shufflevector <4 x double> %x, <4 x double> %y, <4 x i32> <i32 1, i32 5, i32 3, i32 7> 376*9880d681SAndroid Build Coastguard Worker %r = fsub <4 x double> %a, %b 377*9880d681SAndroid Build Coastguard Worker ret <4 x double> %r 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @haddps_v2f32(<4 x float> %v0) { 381*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: haddps_v2f32: 382*9880d681SAndroid Build Coastguard Worker; SSE3: # BB#0: 383*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: haddps %xmm0, %xmm0 384*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT: retq 385*9880d681SAndroid Build Coastguard Worker; 386*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: haddps_v2f32: 387*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 388*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vhaddps %xmm0, %xmm0, %xmm0 389*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 390*9880d681SAndroid Build Coastguard Worker %v0.0 = extractelement <4 x float> %v0, i32 0 391*9880d681SAndroid Build Coastguard Worker %v0.1 = extractelement <4 x float> %v0, i32 1 392*9880d681SAndroid Build Coastguard Worker %v0.2 = extractelement <4 x float> %v0, i32 2 393*9880d681SAndroid Build Coastguard Worker %v0.3 = extractelement <4 x float> %v0, i32 3 394*9880d681SAndroid Build Coastguard Worker %op0 = fadd float %v0.0, %v0.1 395*9880d681SAndroid Build Coastguard Worker %op1 = fadd float %v0.2, %v0.3 396*9880d681SAndroid Build Coastguard Worker %res0 = insertelement <2 x float> undef, float %op0, i32 0 397*9880d681SAndroid Build Coastguard Worker %res1 = insertelement <2 x float> %res0, float %op1, i32 1 398*9880d681SAndroid Build Coastguard Worker ret <2 x float> %res1 399*9880d681SAndroid Build Coastguard Worker} 400