; 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 ; FRINTA define { , } @multi_vec_frinta_x2_f32( %unused, %zn1, %zn2) { ; CHECK-LABEL: multi_vec_frinta_x2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z3.d, z2.d ; CHECK-NEXT: mov z2.d, z1.d ; CHECK-NEXT: frinta { z0.s, z1.s }, { z2.s, z3.s } ; CHECK-NEXT: ret %res = call { , } @llvm.aarch64.sve.frinta.x2.nxv4f32( %zn1, %zn2) ret { , } %res } define { , , , } @multi_vec_frinta_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) { ; CHECK-LABEL: multi_vec_frinta_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: frinta { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.frinta.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } ; FRINTM define { , } @multi_vec_frintm_x2_f32( %unused, %zn1, %zn2) { ; CHECK-LABEL: multi_vec_frintm_x2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z3.d, z2.d ; CHECK-NEXT: mov z2.d, z1.d ; CHECK-NEXT: frintm { z0.s, z1.s }, { z2.s, z3.s } ; CHECK-NEXT: ret %res = call { , } @llvm.aarch64.sve.frintm.x2.nxv4f32( %zn1, %zn2) ret { , } %res } define { , , , } @multi_vec_frintm_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) { ; CHECK-LABEL: multi_vec_frintm_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: frintm { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.frintm.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } ; FRINTN define { , } @multi_vec_frintn_x2_f32( %unused, %zn1, %zn2) { ; CHECK-LABEL: multi_vec_frintn_x2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z3.d, z2.d ; CHECK-NEXT: mov z2.d, z1.d ; CHECK-NEXT: frintn { z0.s, z1.s }, { z2.s, z3.s } ; CHECK-NEXT: ret %res = call { , } @llvm.aarch64.sve.frintn.x2.nxv4f32( %zn1, %zn2) ret { , } %res } define { , , , } @multi_vec_frintn_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) { ; CHECK-LABEL: multi_vec_frintn_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: frintn { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.frintn.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } ; FRINTP define { , } @multi_vec_frintp_x2_f32( %unused, %zn1, %zn2) { ; CHECK-LABEL: multi_vec_frintp_x2_f32: ; CHECK: // %bb.0: ; CHECK-NEXT: mov z3.d, z2.d ; CHECK-NEXT: mov z2.d, z1.d ; CHECK-NEXT: frintp { z0.s, z1.s }, { z2.s, z3.s } ; CHECK-NEXT: ret %res = call { , } @llvm.aarch64.sve.frintp.x2.nxv4f32( %zn1, %zn2) ret { , } %res } define { , , , } @multi_vec_frintp_x4_f32( %unused, %zn1, %zn2, %zn3, %zn4) { ; CHECK-LABEL: multi_vec_frintp_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: frintp { z0.s - z3.s }, { z4.s - z7.s } ; CHECK-NEXT: ret %res = call { , , , } @llvm.aarch64.sve.frintp.x4.nxv4f32( %zn1, %zn2, %zn3, %zn4) ret { , , , } %res } declare { , } @llvm.aarch64.sve.frinta.x2.nxv4f32(, ) declare { , , , } @llvm.aarch64.sve.frinta.x4.nxv4f32(, , , ) declare { , } @llvm.aarch64.sve.frintm.x2.nxv4f32(, ) declare { , , , } @llvm.aarch64.sve.frintm.x4.nxv4f32(, , , ) declare { , } @llvm.aarch64.sve.frintn.x2.nxv4f32(, ) declare { , , , } @llvm.aarch64.sve.frintn.x4.nxv4f32(, , , ) declare { , } @llvm.aarch64.sve.frintp.x2.nxv4f32(, ) declare { , , , } @llvm.aarch64.sve.frintp.x4.nxv4f32(, , , )