1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=sse2 < %s | FileCheck %s --check-prefix=SSE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=avx2 < %s | FileCheck %s --check-prefix=AVX 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Verify that 128-bit vector logical ops are reassociated. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @reassociate_and_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 7*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_and_v4i32: 8*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 9*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: paddd %xmm1, %xmm0 10*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pand %xmm3, %xmm2 11*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pand %xmm2, %xmm0 12*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_and_v4i32: 15*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 16*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 17*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %xmm3, %xmm2, %xmm1 18*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 19*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker %t0 = add <4 x i32> %x0, %x1 22*9880d681SAndroid Build Coastguard Worker %t1 = and <4 x i32> %x2, %t0 23*9880d681SAndroid Build Coastguard Worker %t2 = and <4 x i32> %x3, %t1 24*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %t2 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @reassociate_or_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 28*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_or_v4i32: 29*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 30*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: paddd %xmm1, %xmm0 31*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: por %xmm3, %xmm2 32*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: por %xmm2, %xmm0 33*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 34*9880d681SAndroid Build Coastguard Worker; 35*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_or_v4i32: 36*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 38*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %xmm3, %xmm2, %xmm1 39*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 40*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker %t0 = add <4 x i32> %x0, %x1 43*9880d681SAndroid Build Coastguard Worker %t1 = or <4 x i32> %x2, %t0 44*9880d681SAndroid Build Coastguard Worker %t2 = or <4 x i32> %x3, %t1 45*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %t2 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @reassociate_xor_v4i32(<4 x i32> %x0, <4 x i32> %x1, <4 x i32> %x2, <4 x i32> %x3) { 49*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: reassociate_xor_v4i32: 50*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 51*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: paddd %xmm1, %xmm0 52*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pxor %xmm3, %xmm2 53*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pxor %xmm2, %xmm0 54*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 55*9880d681SAndroid Build Coastguard Worker; 56*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_xor_v4i32: 57*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 58*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %xmm1, %xmm0, %xmm0 59*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm1 60*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 61*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker %t0 = add <4 x i32> %x0, %x1 64*9880d681SAndroid Build Coastguard Worker %t1 = xor <4 x i32> %x2, %t0 65*9880d681SAndroid Build Coastguard Worker %t2 = xor <4 x i32> %x3, %t1 66*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %t2 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; Verify that 256-bit vector logical ops are reassociated. 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @reassociate_and_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 72*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_and_v8i32: 73*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 74*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 75*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %ymm3, %ymm2, %ymm1 76*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %ymm1, %ymm0, %ymm0 77*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker %t0 = add <8 x i32> %x0, %x1 80*9880d681SAndroid Build Coastguard Worker %t1 = and <8 x i32> %x2, %t0 81*9880d681SAndroid Build Coastguard Worker %t2 = and <8 x i32> %x3, %t1 82*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %t2 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @reassociate_or_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 86*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_or_v8i32: 87*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 88*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 89*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %ymm3, %ymm2, %ymm1 90*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %ymm1, %ymm0, %ymm0 91*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker %t0 = add <8 x i32> %x0, %x1 94*9880d681SAndroid Build Coastguard Worker %t1 = or <8 x i32> %x2, %t0 95*9880d681SAndroid Build Coastguard Worker %t2 = or <8 x i32> %x3, %t1 96*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %t2 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @reassociate_xor_v8i32(<8 x i32> %x0, <8 x i32> %x1, <8 x i32> %x2, <8 x i32> %x3) { 100*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: reassociate_xor_v8i32: 101*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 102*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 103*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %ymm3, %ymm2, %ymm1 104*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %ymm1, %ymm0, %ymm0 105*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker %t0 = add <8 x i32> %x0, %x1 108*9880d681SAndroid Build Coastguard Worker %t1 = xor <8 x i32> %x2, %t0 109*9880d681SAndroid Build Coastguard Worker %t2 = xor <8 x i32> %x3, %t1 110*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %t2 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113