; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sme2 -verify-machineinstrs < %s | FileCheck %s ; == 8 to 64-bit elements == define { , , , } @uzp_x4_i8( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.b - z3.b }, { z4.b - z7.b } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv16i8( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_i16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.h - z3.h }, { z4.h - z7.h } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv8i16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_f16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.h - z3.h }, { z4.h - z7.h } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv8f16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_bf16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.h - z3.h }, { z4.h - z7.h } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv8bf16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_i32( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv4i32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_i64( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.d - z3.d }, { z4.d - z7.d } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv2i64( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @uzp_x4_f64( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: uzp_x4_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z27.d, z5.d ; CHECK-NEXT: mov z26.d, z4.d ; CHECK-NEXT: mov z25.d, z3.d ; CHECK-NEXT: mov z24.d, z2.d ; CHECK-NEXT: uzp { z0.d - z3.d }, { z24.d - z27.d } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzp.x4.nxv2f64( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } ; == 128-bit elements == define { , , , } @zipq_x4_i8( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_i8: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv16i8( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_i16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_i16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8i16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_f16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_f16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8f16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_bf16( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8bf16( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_i32( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_i32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv4i32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_i64( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z7.d, z4.d ; CHECK-NEXT: mov z6.d, z3.d ; CHECK-NEXT: mov z5.d, z2.d ; CHECK-NEXT: mov z4.d, z1.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z4.q - z7.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv2i64( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } define { , , , } @zipq_x4_f64( %unused, %zn1, %zn2, %zn3, %zn4) nounwind { ; CHECK-LABEL: zipq_x4_f64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z27.d, z5.d ; CHECK-NEXT: mov z26.d, z4.d ; CHECK-NEXT: mov z25.d, z3.d ; CHECK-NEXT: mov z24.d, z2.d ; CHECK-NEXT: uzp { z0.q - z3.q }, { z24.q - z27.q } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.uzpq.x4.nxv2f64( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } ; == 8 to 64-bit elements == declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv16i8( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv8i16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv4i32( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv2i64( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv8f16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv8bf16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzp.x4.nxv2f64( %zn1, %zn2, %zn3, %zn4) ; == 128-bit elements == declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv16i8( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8i16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv4i32( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv2i64( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8f16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv8bf16( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) declare { , , , } @llvm.aarch64.sve.uzpq.x4.nxv2f64( %zn1, %zn2, %zn3, %zn4)