; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel | FileCheck %s define <8 x i8> @vuzpi8(<8 x i8> %A, <8 x i8> %B) nounwind { ; CHECK-LABEL: vuzpi8: ; CHECK: // %bb.0: ; CHECK-NEXT: addp.8b v0, v0, v1 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i8> %A, <8 x i8> %B, <8 x i32> %tmp4 = shufflevector <8 x i8> %A, <8 x i8> %B, <8 x i32> %tmp5 = add <8 x i8> %tmp3, %tmp4 ret <8 x i8> %tmp5 } define <4 x i16> @vuzpi16(<4 x i16> %A, <4 x i16> %B) nounwind { ; CHECK-LABEL: vuzpi16: ; CHECK: // %bb.0: ; CHECK-NEXT: addp.4h v0, v0, v1 ; CHECK-NEXT: ret %tmp3 = shufflevector <4 x i16> %A, <4 x i16> %B, <4 x i32> %tmp4 = shufflevector <4 x i16> %A, <4 x i16> %B, <4 x i32> %tmp5 = add <4 x i16> %tmp3, %tmp4 ret <4 x i16> %tmp5 } define <16 x i8> @vuzpQi8(<16 x i8> %A, <16 x i8> %B) nounwind { ; CHECK-LABEL: vuzpQi8: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.16b v2, v0, v1 ; CHECK-NEXT: uzp2.16b v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> %tmp4 = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> %tmp5 = xor <16 x i8> %tmp3, %tmp4 ret <16 x i8> %tmp5 } define <8 x i16> @vuzpQi16(<8 x i16> %A, <8 x i16> %B) nounwind { ; CHECK-LABEL: vuzpQi16: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.8h v2, v0, v1 ; CHECK-NEXT: uzp2.8h v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp4 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp5 = xor <8 x i16> %tmp3, %tmp4 ret <8 x i16> %tmp5 } define <4 x i32> @vuzpQi32(<4 x i32> %A, <4 x i32> %B) nounwind { ; CHECK-LABEL: vuzpQi32: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.4s v2, v0, v1 ; CHECK-NEXT: uzp2.4s v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> %tmp4 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> %tmp5 = xor <4 x i32> %tmp3, %tmp4 ret <4 x i32> %tmp5 } define <4 x float> @vuzpQf(<4 x float> %A, <4 x float> %B) nounwind { ; CHECK-LABEL: vuzpQf: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.4s v2, v0, v1 ; CHECK-NEXT: uzp2.4s v0, v0, v1 ; CHECK-NEXT: fsub.4s v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> %tmp4 = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> %tmp5 = fsub <4 x float> %tmp3, %tmp4 ret <4 x float> %tmp5 } ; Undef shuffle indices should not prevent matching to VUZP: define <8 x i8> @vuzpi8_undef(<8 x i8> %A, <8 x i8> %B) nounwind { ; CHECK-LABEL: vuzpi8_undef: ; CHECK: // %bb.0: ; CHECK-NEXT: addp.8b v0, v0, v1 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i8> %A, <8 x i8> %B, <8 x i32> %tmp4 = shufflevector <8 x i8> %A, <8 x i8> %B, <8 x i32> %tmp5 = add <8 x i8> %tmp3, %tmp4 ret <8 x i8> %tmp5 } define <8 x i16> @vuzpQi16_undef1(<8 x i16> %A, <8 x i16> %B) nounwind { ; CHECK-LABEL: vuzpQi16_undef1: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.8h v2, v0, v1 ; CHECK-NEXT: uzp2.8h v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp4 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp5 = xor <8 x i16> %tmp3, %tmp4 ret <8 x i16> %tmp5 } define <8 x i16> @vuzpQi16_undef0(<8 x i16> %A, <8 x i16> %B) nounwind { ; CHECK-LABEL: vuzpQi16_undef0: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.8h v2, v0, v1 ; CHECK-NEXT: uzp2.8h v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp4 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp5 = xor <8 x i16> %tmp3, %tmp4 ret <8 x i16> %tmp5 } define <8 x i16> @vuzpQi16_undef01(<8 x i16> %A, <8 x i16> %B) nounwind { ; CHECK-LABEL: vuzpQi16_undef01: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.8h v2, v0, v1 ; CHECK-NEXT: uzp2.8h v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp4 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp5 = xor <8 x i16> %tmp3, %tmp4 ret <8 x i16> %tmp5 } define <8 x i16> @vuzpQi16_undef012(<8 x i16> %A, <8 x i16> %B) nounwind { ; CHECK-LABEL: vuzpQi16_undef012: ; CHECK: // %bb.0: ; CHECK-NEXT: uzp1.8h v2, v0, v1 ; CHECK-NEXT: uzp2.8h v0, v0, v1 ; CHECK-NEXT: eor.16b v0, v2, v0 ; CHECK-NEXT: ret %tmp3 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp4 = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> %tmp5 = xor <8 x i16> %tmp3, %tmp4 ret <8 x i16> %tmp5 }