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-linux-gnu -mattr=+sse3 | FileCheck %s --check-prefix=SSE 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Test ADDSUB ISel patterns. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; Functions below are obtained from the following source: 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker; typedef double double2 __attribute__((ext_vector_type(2))); 11*9880d681SAndroid Build Coastguard Worker; typedef double double4 __attribute__((ext_vector_type(4))); 12*9880d681SAndroid Build Coastguard Worker; typedef float float4 __attribute__((ext_vector_type(4))); 13*9880d681SAndroid Build Coastguard Worker; typedef float float8 __attribute__((ext_vector_type(8))); 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; float4 test1(float4 A, float4 B) { 16*9880d681SAndroid Build Coastguard Worker; float4 X = A - B; 17*9880d681SAndroid Build Coastguard Worker; float4 Y = A + B; 18*9880d681SAndroid Build Coastguard Worker; return (float4){X[0], Y[1], X[2], Y[3]}; 19*9880d681SAndroid Build Coastguard Worker; } 20*9880d681SAndroid Build Coastguard Worker; 21*9880d681SAndroid Build Coastguard Worker; float8 test2(float8 A, float8 B) { 22*9880d681SAndroid Build Coastguard Worker; float8 X = A - B; 23*9880d681SAndroid Build Coastguard Worker; float8 Y = A + B; 24*9880d681SAndroid Build Coastguard Worker; return (float8){X[0], Y[1], X[2], Y[3], X[4], Y[5], X[6], Y[7]}; 25*9880d681SAndroid Build Coastguard Worker; } 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker; double4 test3(double4 A, double4 B) { 28*9880d681SAndroid Build Coastguard Worker; double4 X = A - B; 29*9880d681SAndroid Build Coastguard Worker; double4 Y = A + B; 30*9880d681SAndroid Build Coastguard Worker; return (double4){X[0], Y[1], X[2], Y[3]}; 31*9880d681SAndroid Build Coastguard Worker; } 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker; double2 test4(double2 A, double2 B) { 34*9880d681SAndroid Build Coastguard Worker; double2 X = A - B; 35*9880d681SAndroid Build Coastguard Worker; double2 Y = A + B; 36*9880d681SAndroid Build Coastguard Worker; return (double2){X[0], Y[1]}; 37*9880d681SAndroid Build Coastguard Worker; } 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1(<4 x float> %A, <4 x float> %B) { 40*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1: 41*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 42*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm1, %xmm0 43*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 44*9880d681SAndroid Build Coastguard Worker; 45*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1: 46*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 47*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps %xmm1, %xmm0, %xmm0 48*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 49*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x float> %A, %B 50*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x float> %A, %B 51*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 52*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vecinit6 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2(<8 x float> %A, <8 x float> %B) { 56*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2: 57*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 58*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm2, %xmm0 59*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm3, %xmm1 60*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 61*9880d681SAndroid Build Coastguard Worker; 62*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2: 63*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 64*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps %ymm1, %ymm0, %ymm0 65*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 66*9880d681SAndroid Build Coastguard Worker %sub = fsub <8 x float> %A, %B 67*9880d681SAndroid Build Coastguard Worker %add = fadd <8 x float> %A, %B 68*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15> 69*9880d681SAndroid Build Coastguard Worker ret <8 x float> %vecinit14 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3(<4 x double> %A, <4 x double> %B) { 73*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3: 74*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 75*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm2, %xmm0 76*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm3, %xmm1 77*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 78*9880d681SAndroid Build Coastguard Worker; 79*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3: 80*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 81*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd %ymm1, %ymm0, %ymm0 82*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 83*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x double> %A, %B 84*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x double> %A, %B 85*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 86*9880d681SAndroid Build Coastguard Worker ret <4 x double> %vecinit6 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4(<2 x double> %A, <2 x double> %B) #0 { 90*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4: 91*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 92*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm1, %xmm0 93*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 94*9880d681SAndroid Build Coastguard Worker; 95*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4: 96*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 97*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd %xmm1, %xmm0, %xmm0 98*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 99*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x double> %A, %B 100*9880d681SAndroid Build Coastguard Worker %sub = fsub <2 x double> %A, %B 101*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> <i32 0, i32 3> 102*9880d681SAndroid Build Coastguard Worker ret <2 x double> %vecinit2 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine <16 x float> @test5(<16 x float> %A, <16 x float> %B) { 106*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test5: 107*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 108*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm4, %xmm0 109*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm5, %xmm1 110*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm6, %xmm2 111*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps %xmm7, %xmm3 112*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: test5: 115*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 116*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vaddsubps %ymm2, %ymm0, %ymm0 117*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vaddsubps %ymm3, %ymm1, %ymm1 118*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 119*9880d681SAndroid Build Coastguard Worker; 120*9880d681SAndroid Build Coastguard Worker; AVX512-LABEL: test5: 121*9880d681SAndroid Build Coastguard Worker; AVX512: # BB#0: 122*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vaddps %zmm1, %zmm0, %zmm2 123*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vsubps %zmm1, %zmm0, %zmm0 124*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vshufps {{.*#+}} zmm0 = zmm0[0,2],zmm2[1,3],zmm0[4,6],zmm2[5,7],zmm0[8,10],zmm2[9,11],zmm0[12,14],zmm2[13,15] 125*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vpermilps {{.*#+}} zmm0 = zmm0[0,2,1,3,4,6,5,7,8,10,9,11,12,14,13,15] 126*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: retq 127*9880d681SAndroid Build Coastguard Worker %add = fadd <16 x float> %A, %B 128*9880d681SAndroid Build Coastguard Worker %sub = fsub <16 x float> %A, %B 129*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <16 x float> %sub, <16 x float> %add, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31> 130*9880d681SAndroid Build Coastguard Worker ret <16 x float> %vecinit2 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <8 x double> @test6(<8 x double> %A, <8 x double> %B) { 134*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test6: 135*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 136*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm4, %xmm0 137*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm5, %xmm1 138*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm6, %xmm2 139*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd %xmm7, %xmm3 140*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 141*9880d681SAndroid Build Coastguard Worker; 142*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: test6: 143*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 144*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vaddsubpd %ymm2, %ymm0, %ymm0 145*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vaddsubpd %ymm3, %ymm1, %ymm1 146*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 147*9880d681SAndroid Build Coastguard Worker; 148*9880d681SAndroid Build Coastguard Worker; AVX512-LABEL: test6: 149*9880d681SAndroid Build Coastguard Worker; AVX512: # BB#0: 150*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vaddpd %zmm1, %zmm0, %zmm2 151*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vsubpd %zmm1, %zmm0, %zmm0 152*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: vshufpd {{.*#+}} zmm0 = zmm0[0],zmm2[1],zmm0[2],zmm2[3],zmm0[4],zmm2[5],zmm0[6],zmm2[7] 153*9880d681SAndroid Build Coastguard Worker; AVX512-NEXT: retq 154*9880d681SAndroid Build Coastguard Worker %add = fadd <8 x double> %A, %B 155*9880d681SAndroid Build Coastguard Worker %sub = fsub <8 x double> %A, %B 156*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <8 x double> %sub, <8 x double> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15> 157*9880d681SAndroid Build Coastguard Worker ret <8 x double> %vecinit2 158*9880d681SAndroid Build Coastguard Worker} 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1b(<4 x float> %A, <4 x float>* %B) { 161*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1b: 162*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 163*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps (%rdi), %xmm0 164*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 165*9880d681SAndroid Build Coastguard Worker; 166*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1b: 167*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 168*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps (%rdi), %xmm0, %xmm0 169*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 170*9880d681SAndroid Build Coastguard Worker %1 = load <4 x float>, <4 x float>* %B 171*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x float> %A, %1 172*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x float> %A, %1 173*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x float> %sub, <4 x float> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 174*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vecinit6 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2b(<8 x float> %A, <8 x float>* %B) { 178*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2b: 179*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 180*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps (%rdi), %xmm0 181*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps 16(%rdi), %xmm1 182*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 183*9880d681SAndroid Build Coastguard Worker; 184*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2b: 185*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 186*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps (%rdi), %ymm0, %ymm0 187*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 188*9880d681SAndroid Build Coastguard Worker %1 = load <8 x float>, <8 x float>* %B 189*9880d681SAndroid Build Coastguard Worker %add = fadd <8 x float> %A, %1 190*9880d681SAndroid Build Coastguard Worker %sub = fsub <8 x float> %A, %1 191*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x float> %sub, <8 x float> %add, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15> 192*9880d681SAndroid Build Coastguard Worker ret <8 x float> %vecinit14 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3b(<4 x double> %A, <4 x double>* %B) { 196*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3b: 197*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 198*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd (%rdi), %xmm0 199*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd 16(%rdi), %xmm1 200*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 201*9880d681SAndroid Build Coastguard Worker; 202*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3b: 203*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 204*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd (%rdi), %ymm0, %ymm0 205*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 206*9880d681SAndroid Build Coastguard Worker %1 = load <4 x double>, <4 x double>* %B 207*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x double> %A, %1 208*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x double> %A, %1 209*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x double> %sub, <4 x double> %add, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 210*9880d681SAndroid Build Coastguard Worker ret <4 x double> %vecinit6 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4b(<2 x double> %A, <2 x double>* %B) { 214*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4b: 215*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 216*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd (%rdi), %xmm0 217*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 218*9880d681SAndroid Build Coastguard Worker; 219*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4b: 220*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 221*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd (%rdi), %xmm0, %xmm0 222*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 223*9880d681SAndroid Build Coastguard Worker %1 = load <2 x double>, <2 x double>* %B 224*9880d681SAndroid Build Coastguard Worker %sub = fsub <2 x double> %A, %1 225*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x double> %A, %1 226*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <2 x double> %sub, <2 x double> %add, <2 x i32> <i32 0, i32 3> 227*9880d681SAndroid Build Coastguard Worker ret <2 x double> %vecinit2 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1c(<4 x float> %A, <4 x float>* %B) { 231*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test1c: 232*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 233*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps (%rdi), %xmm0 234*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 235*9880d681SAndroid Build Coastguard Worker; 236*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1c: 237*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 238*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps (%rdi), %xmm0, %xmm0 239*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 240*9880d681SAndroid Build Coastguard Worker %1 = load <4 x float>, <4 x float>* %B 241*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x float> %A, %1 242*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x float> %A, %1 243*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x float> %add, <4 x float> %sub, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 244*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vecinit6 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @test2c(<8 x float> %A, <8 x float>* %B) { 248*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test2c: 249*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 250*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps (%rdi), %xmm0 251*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubps 16(%rdi), %xmm1 252*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 253*9880d681SAndroid Build Coastguard Worker; 254*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2c: 255*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 256*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubps (%rdi), %ymm0, %ymm0 257*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 258*9880d681SAndroid Build Coastguard Worker %1 = load <8 x float>, <8 x float>* %B 259*9880d681SAndroid Build Coastguard Worker %add = fadd <8 x float> %A, %1 260*9880d681SAndroid Build Coastguard Worker %sub = fsub <8 x float> %A, %1 261*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x float> %add, <8 x float> %sub, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7> 262*9880d681SAndroid Build Coastguard Worker ret <8 x float> %vecinit14 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdefine <4 x double> @test3c(<4 x double> %A, <4 x double>* %B) { 266*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test3c: 267*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 268*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd (%rdi), %xmm0 269*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd 16(%rdi), %xmm1 270*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 271*9880d681SAndroid Build Coastguard Worker; 272*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3c: 273*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 274*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd (%rdi), %ymm0, %ymm0 275*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 276*9880d681SAndroid Build Coastguard Worker %1 = load <4 x double>, <4 x double>* %B 277*9880d681SAndroid Build Coastguard Worker %add = fadd <4 x double> %A, %1 278*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x double> %A, %1 279*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x double> %add, <4 x double> %sub, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 280*9880d681SAndroid Build Coastguard Worker ret <4 x double> %vecinit6 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test4c(<2 x double> %A, <2 x double>* %B) { 284*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: test4c: 285*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 286*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addsubpd (%rdi), %xmm0 287*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 288*9880d681SAndroid Build Coastguard Worker; 289*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4c: 290*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 291*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddsubpd (%rdi), %xmm0, %xmm0 292*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 293*9880d681SAndroid Build Coastguard Worker %1 = load <2 x double>, <2 x double>* %B 294*9880d681SAndroid Build Coastguard Worker %sub = fsub <2 x double> %A, %1 295*9880d681SAndroid Build Coastguard Worker %add = fadd <2 x double> %A, %1 296*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <2 x double> %add, <2 x double> %sub, <2 x i32> <i32 2, i32 1> 297*9880d681SAndroid Build Coastguard Worker ret <2 x double> %vecinit2 298*9880d681SAndroid Build Coastguard Worker} 299