1523 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=aarch64 -mattr=+sve |\3; RUN: FileCheck --check-prefixes=CHECK %s4 5define <vscale x 1 x iXLen> @lrint_v1f16(<vscale x 1 x half> %x) {6; CHECK-LABEL: lrint_v1f16:7; CHECK: // %bb.0:8; CHECK-NEXT: ptrue p0.d9; CHECK-NEXT: mov z1.h, #-1025 // =0xfffffffffffffbff10; CHECK-NEXT: mov z2.d, #0x800000000000000011; CHECK-NEXT: mov w8, #31743 // =0x7bff12; CHECK-NEXT: frintx z0.h, p0/m, z0.h13; CHECK-NEXT: fcmge p1.h, p0/z, z0.h, z1.h14; CHECK-NEXT: mov z1.h, w815; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.h16; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h17; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff18; CHECK-NEXT: fcmuo p0.h, p0/z, z0.h, z0.h19; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d20; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x021; CHECK-NEXT: ret22 %a = call <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f16(<vscale x 1 x half> %x)23 ret <vscale x 1 x iXLen> %a24}25declare <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f16(<vscale x 1 x half>)26 27define <vscale x 2 x iXLen> @lrint_v2f16(<vscale x 2 x half> %x) {28; CHECK-LABEL: lrint_v2f16:29; CHECK: // %bb.0:30; CHECK-NEXT: ptrue p0.d31; CHECK-NEXT: mov z1.h, #-1025 // =0xfffffffffffffbff32; CHECK-NEXT: mov z2.d, #0x800000000000000033; CHECK-NEXT: mov w8, #31743 // =0x7bff34; CHECK-NEXT: frintx z0.h, p0/m, z0.h35; CHECK-NEXT: fcmge p1.h, p0/z, z0.h, z1.h36; CHECK-NEXT: mov z1.h, w837; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.h38; CHECK-NEXT: fcmgt p1.h, p0/z, z0.h, z1.h39; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff40; CHECK-NEXT: fcmuo p0.h, p0/z, z0.h, z0.h41; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d42; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x043; CHECK-NEXT: ret44 %a = call <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f16(<vscale x 2 x half> %x)45 ret <vscale x 2 x iXLen> %a46}47declare <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f16(<vscale x 2 x half>)48 49define <vscale x 4 x iXLen> @lrint_v4f16(<vscale x 4 x half> %x) {50; CHECK-LABEL: lrint_v4f16:51; CHECK: // %bb.0:52; CHECK-NEXT: uunpklo z1.d, z0.s53; CHECK-NEXT: uunpkhi z0.d, z0.s54; CHECK-NEXT: mov w8, #31743 // =0x7bff55; CHECK-NEXT: ptrue p0.d56; CHECK-NEXT: mov z2.h, #-1025 // =0xfffffffffffffbff57; CHECK-NEXT: mov z3.d, #0x800000000000000058; CHECK-NEXT: mov z4.d, #0x800000000000000059; CHECK-NEXT: mov z5.d, #0x7fffffffffffffff60; CHECK-NEXT: frintx z1.h, p0/m, z1.h61; CHECK-NEXT: frintx z0.h, p0/m, z0.h62; CHECK-NEXT: fcmge p1.h, p0/z, z1.h, z2.h63; CHECK-NEXT: fcmge p2.h, p0/z, z0.h, z2.h64; CHECK-NEXT: mov z2.h, w865; CHECK-NEXT: fcmuo p3.h, p0/z, z1.h, z1.h66; CHECK-NEXT: fcvtzs z4.d, p1/m, z1.h67; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z2.h68; CHECK-NEXT: fcvtzs z3.d, p2/m, z0.h69; CHECK-NEXT: fcmgt p2.h, p0/z, z0.h, z2.h70; CHECK-NEXT: fcmuo p0.h, p0/z, z0.h, z0.h71; CHECK-NEXT: sel z0.d, p1, z5.d, z4.d72; CHECK-NEXT: sel z1.d, p2, z5.d, z3.d73; CHECK-NEXT: mov z0.d, p3/m, #0 // =0x074; CHECK-NEXT: mov z1.d, p0/m, #0 // =0x075; CHECK-NEXT: ret76 %a = call <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f16(<vscale x 4 x half> %x)77 ret <vscale x 4 x iXLen> %a78}79declare <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f16(<vscale x 4 x half>)80 81define <vscale x 8 x iXLen> @lrint_v8f16(<vscale x 8 x half> %x) {82; CHECK-LABEL: lrint_v8f16:83; CHECK: // %bb.0:84; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill85; CHECK-NEXT: addvl sp, sp, #-186; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill87; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill88; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill89; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG90; CHECK-NEXT: .cfi_offset w29, -1691; CHECK-NEXT: uunpklo z1.s, z0.h92; CHECK-NEXT: uunpkhi z0.s, z0.h93; CHECK-NEXT: mov w8, #31743 // =0x7bff94; CHECK-NEXT: ptrue p0.d95; CHECK-NEXT: mov z4.h, #-1025 // =0xfffffffffffffbff96; CHECK-NEXT: mov z5.d, #0x800000000000000097; CHECK-NEXT: mov z6.d, #0x800000000000000098; CHECK-NEXT: mov z7.d, #0x800000000000000099; CHECK-NEXT: mov z25.d, #0x7fffffffffffffff100; CHECK-NEXT: uunpklo z2.d, z1.s101; CHECK-NEXT: uunpkhi z1.d, z1.s102; CHECK-NEXT: uunpklo z3.d, z0.s103; CHECK-NEXT: uunpkhi z0.d, z0.s104; CHECK-NEXT: frintx z2.h, p0/m, z2.h105; CHECK-NEXT: frintx z1.h, p0/m, z1.h106; CHECK-NEXT: frintx z3.h, p0/m, z3.h107; CHECK-NEXT: movprfx z24, z0108; CHECK-NEXT: frintx z24.h, p0/m, z0.h109; CHECK-NEXT: mov z0.h, w8110; CHECK-NEXT: fcmge p1.h, p0/z, z2.h, z4.h111; CHECK-NEXT: fcmge p2.h, p0/z, z1.h, z4.h112; CHECK-NEXT: fcmge p3.h, p0/z, z3.h, z4.h113; CHECK-NEXT: fcmgt p4.h, p0/z, z1.h, z0.h114; CHECK-NEXT: fcvtzs z5.d, p1/m, z2.h115; CHECK-NEXT: fcmge p1.h, p0/z, z24.h, z4.h116; CHECK-NEXT: mov z4.d, #0x8000000000000000117; CHECK-NEXT: fcvtzs z6.d, p2/m, z1.h118; CHECK-NEXT: fcmgt p2.h, p0/z, z2.h, z0.h119; CHECK-NEXT: fcvtzs z7.d, p3/m, z3.h120; CHECK-NEXT: fcmgt p5.h, p0/z, z3.h, z0.h121; CHECK-NEXT: fcmgt p6.h, p0/z, z24.h, z0.h122; CHECK-NEXT: fcvtzs z4.d, p1/m, z24.h123; CHECK-NEXT: fcmuo p3.h, p0/z, z2.h, z2.h124; CHECK-NEXT: sel z0.d, p2, z25.d, z5.d125; CHECK-NEXT: fcmuo p1.h, p0/z, z1.h, z1.h126; CHECK-NEXT: sel z1.d, p4, z25.d, z6.d127; CHECK-NEXT: sel z2.d, p5, z25.d, z7.d128; CHECK-NEXT: fcmuo p2.h, p0/z, z3.h, z3.h129; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload130; CHECK-NEXT: fcmuo p0.h, p0/z, z24.h, z24.h131; CHECK-NEXT: sel z3.d, p6, z25.d, z4.d132; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload133; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload134; CHECK-NEXT: mov z0.d, p3/m, #0 // =0x0135; CHECK-NEXT: mov z1.d, p1/m, #0 // =0x0136; CHECK-NEXT: mov z2.d, p2/m, #0 // =0x0137; CHECK-NEXT: mov z3.d, p0/m, #0 // =0x0138; CHECK-NEXT: addvl sp, sp, #1139; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload140; CHECK-NEXT: ret141 %a = call <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f16(<vscale x 8 x half> %x)142 ret <vscale x 8 x iXLen> %a143}144declare <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f16(<vscale x 8 x half>)145 146define <vscale x 16 x iXLen> @lrint_v16f16(<vscale x 16 x half> %x) {147; CHECK-LABEL: lrint_v16f16:148; CHECK: // %bb.0:149; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill150; CHECK-NEXT: addvl sp, sp, #-1151; CHECK-NEXT: str p10, [sp, #1, mul vl] // 2-byte Spill152; CHECK-NEXT: str p9, [sp, #2, mul vl] // 2-byte Spill153; CHECK-NEXT: str p8, [sp, #3, mul vl] // 2-byte Spill154; CHECK-NEXT: str p7, [sp, #4, mul vl] // 2-byte Spill155; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill156; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill157; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill158; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG159; CHECK-NEXT: .cfi_offset w29, -16160; CHECK-NEXT: uunpklo z2.s, z0.h161; CHECK-NEXT: uunpkhi z3.s, z0.h162; CHECK-NEXT: mov w8, #31743 // =0x7bff163; CHECK-NEXT: uunpklo z7.s, z1.h164; CHECK-NEXT: ptrue p0.d165; CHECK-NEXT: mov z0.h, #-1025 // =0xfffffffffffffbff166; CHECK-NEXT: uunpkhi z1.s, z1.h167; CHECK-NEXT: mov z5.d, #0x8000000000000000168; CHECK-NEXT: mov z29.h, w8169; CHECK-NEXT: mov z31.d, #0x8000000000000000170; CHECK-NEXT: uunpklo z4.d, z2.s171; CHECK-NEXT: uunpklo z24.d, z3.s172; CHECK-NEXT: uunpkhi z25.d, z3.s173; CHECK-NEXT: uunpkhi z6.d, z2.s174; CHECK-NEXT: uunpklo z26.d, z7.s175; CHECK-NEXT: uunpkhi z7.d, z7.s176; CHECK-NEXT: mov z2.d, #0x8000000000000000177; CHECK-NEXT: uunpklo z30.d, z1.s178; CHECK-NEXT: mov z3.d, #0x8000000000000000179; CHECK-NEXT: uunpkhi z1.d, z1.s180; CHECK-NEXT: movprfx z27, z4181; CHECK-NEXT: frintx z27.h, p0/m, z4.h182; CHECK-NEXT: frintx z24.h, p0/m, z24.h183; CHECK-NEXT: frintx z25.h, p0/m, z25.h184; CHECK-NEXT: movprfx z28, z6185; CHECK-NEXT: frintx z28.h, p0/m, z6.h186; CHECK-NEXT: mov z4.d, #0x8000000000000000187; CHECK-NEXT: frintx z26.h, p0/m, z26.h188; CHECK-NEXT: frintx z7.h, p0/m, z7.h189; CHECK-NEXT: mov z6.d, #0x8000000000000000190; CHECK-NEXT: fcmge p1.h, p0/z, z27.h, z0.h191; CHECK-NEXT: fcmge p3.h, p0/z, z24.h, z0.h192; CHECK-NEXT: fcmge p4.h, p0/z, z25.h, z0.h193; CHECK-NEXT: fcmge p2.h, p0/z, z28.h, z0.h194; CHECK-NEXT: fcmge p5.h, p0/z, z26.h, z0.h195; CHECK-NEXT: fcvtzs z2.d, p1/m, z27.h196; CHECK-NEXT: fcvtzs z4.d, p3/m, z24.h197; CHECK-NEXT: fcvtzs z5.d, p4/m, z25.h198; CHECK-NEXT: fcmgt p3.h, p0/z, z27.h, z29.h199; CHECK-NEXT: fcvtzs z3.d, p2/m, z28.h200; CHECK-NEXT: fcmge p4.h, p0/z, z7.h, z0.h201; CHECK-NEXT: fcvtzs z6.d, p5/m, z26.h202; CHECK-NEXT: fcmuo p1.h, p0/z, z27.h, z27.h203; CHECK-NEXT: movprfx z27, z30204; CHECK-NEXT: frintx z27.h, p0/m, z30.h205; CHECK-NEXT: movprfx z30, z1206; CHECK-NEXT: frintx z30.h, p0/m, z1.h207; CHECK-NEXT: fcmgt p5.h, p0/z, z28.h, z29.h208; CHECK-NEXT: fcmuo p2.h, p0/z, z28.h, z28.h209; CHECK-NEXT: mov z28.d, #0x8000000000000000210; CHECK-NEXT: fcvtzs z31.d, p4/m, z7.h211; CHECK-NEXT: fcmge p4.h, p0/z, z27.h, z0.h212; CHECK-NEXT: fcmgt p6.h, p0/z, z24.h, z29.h213; CHECK-NEXT: fcmuo p7.h, p0/z, z24.h, z24.h214; CHECK-NEXT: mov z24.d, #0x7fffffffffffffff215; CHECK-NEXT: fcmgt p8.h, p0/z, z25.h, z29.h216; CHECK-NEXT: fcvtzs z28.d, p4/m, z27.h217; CHECK-NEXT: fcmuo p10.h, p0/z, z25.h, z25.h218; CHECK-NEXT: mov z25.d, #0x8000000000000000219; CHECK-NEXT: sel z1.d, p5, z24.d, z3.d220; CHECK-NEXT: sel z3.d, p8, z24.d, z5.d221; CHECK-NEXT: fcmge p4.h, p0/z, z30.h, z0.h222; CHECK-NEXT: sel z0.d, p3, z24.d, z2.d223; CHECK-NEXT: sel z2.d, p6, z24.d, z4.d224; CHECK-NEXT: mov z1.d, p2/m, #0 // =0x0225; CHECK-NEXT: mov z3.d, p10/m, #0 // =0x0226; CHECK-NEXT: ldr p10, [sp, #1, mul vl] // 2-byte Reload227; CHECK-NEXT: fcmgt p9.h, p0/z, z26.h, z29.h228; CHECK-NEXT: mov z2.d, p7/m, #0 // =0x0229; CHECK-NEXT: ldr p7, [sp, #4, mul vl] // 2-byte Reload230; CHECK-NEXT: fcvtzs z25.d, p4/m, z30.h231; CHECK-NEXT: mov z0.d, p1/m, #0 // =0x0232; CHECK-NEXT: fcmgt p5.h, p0/z, z7.h, z29.h233; CHECK-NEXT: fcmgt p6.h, p0/z, z27.h, z29.h234; CHECK-NEXT: sel z4.d, p9, z24.d, z6.d235; CHECK-NEXT: fcmgt p4.h, p0/z, z30.h, z29.h236; CHECK-NEXT: fcmuo p8.h, p0/z, z7.h, z7.h237; CHECK-NEXT: sel z5.d, p5, z24.d, z31.d238; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload239; CHECK-NEXT: sel z6.d, p6, z24.d, z28.d240; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload241; CHECK-NEXT: fcmuo p9.h, p0/z, z27.h, z27.h242; CHECK-NEXT: fcmuo p3.h, p0/z, z26.h, z26.h243; CHECK-NEXT: sel z7.d, p4, z24.d, z25.d244; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload245; CHECK-NEXT: mov z5.d, p8/m, #0 // =0x0246; CHECK-NEXT: ldr p8, [sp, #3, mul vl] // 2-byte Reload247; CHECK-NEXT: fcmuo p0.h, p0/z, z30.h, z30.h248; CHECK-NEXT: mov z6.d, p9/m, #0 // =0x0249; CHECK-NEXT: ldr p9, [sp, #2, mul vl] // 2-byte Reload250; CHECK-NEXT: mov z4.d, p3/m, #0 // =0x0251; CHECK-NEXT: mov z7.d, p0/m, #0 // =0x0252; CHECK-NEXT: addvl sp, sp, #1253; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload254; CHECK-NEXT: ret255 %a = call <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f16(<vscale x 16 x half> %x)256 ret <vscale x 16 x iXLen> %a257}258declare <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f16(<vscale x 16 x half>)259 260define <vscale x 32 x iXLen> @lrint_v32f16(<vscale x 32 x half> %x) {261; CHECK-LABEL: lrint_v32f16:262; CHECK: // %bb.0:263; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill264; CHECK-NEXT: addvl sp, sp, #-18265; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill266; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill267; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill268; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill269; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill270; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill271; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill272; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill273; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill274; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill275; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill276; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill277; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill278; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill279; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill280; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill281; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill282; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill283; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill284; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill285; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill286; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill287; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill288; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill289; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill290; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x90, 0x01, 0x1e, 0x22 // sp + 16 + 144 * VG291; CHECK-NEXT: .cfi_offset w29, -16292; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16293; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 16294; CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x68, 0x1e, 0x22, 0x40, 0x1c // $d10 @ cfa - 24 * VG - 16295; CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x60, 0x1e, 0x22, 0x40, 0x1c // $d11 @ cfa - 32 * VG - 16296; CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x58, 0x1e, 0x22, 0x40, 0x1c // $d12 @ cfa - 40 * VG - 16297; CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x50, 0x1e, 0x22, 0x40, 0x1c // $d13 @ cfa - 48 * VG - 16298; CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x48, 0x1e, 0x22, 0x40, 0x1c // $d14 @ cfa - 56 * VG - 16299; CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x40, 0x1e, 0x22, 0x40, 0x1c // $d15 @ cfa - 64 * VG - 16300; CHECK-NEXT: uunpklo z4.s, z0.h301; CHECK-NEXT: uunpkhi z0.s, z0.h302; CHECK-NEXT: mov w9, #31743 // =0x7bff303; CHECK-NEXT: uunpklo z5.s, z1.h304; CHECK-NEXT: ptrue p0.d305; CHECK-NEXT: mov z28.h, #-1025 // =0xfffffffffffffbff306; CHECK-NEXT: uunpkhi z29.s, z1.h307; CHECK-NEXT: mov z7.d, #0x8000000000000000308; CHECK-NEXT: uunpklo z13.s, z2.h309; CHECK-NEXT: mov z9.d, #0x8000000000000000310; CHECK-NEXT: uunpkhi z14.s, z2.h311; CHECK-NEXT: uunpkhi z17.s, z3.h312; CHECK-NEXT: uunpklo z6.d, z4.s313; CHECK-NEXT: uunpkhi z4.d, z4.s314; CHECK-NEXT: uunpklo z27.d, z0.s315; CHECK-NEXT: uunpklo z31.d, z5.s316; CHECK-NEXT: uunpkhi z8.d, z5.s317; CHECK-NEXT: uunpkhi z30.d, z0.s318; CHECK-NEXT: uunpkhi z11.d, z29.s319; CHECK-NEXT: uunpklo z10.d, z29.s320; CHECK-NEXT: uunpklo z15.s, z3.h321; CHECK-NEXT: uunpklo z16.d, z14.s322; CHECK-NEXT: uunpkhi z14.d, z14.s323; CHECK-NEXT: mov z24.d, #0x8000000000000000324; CHECK-NEXT: movprfx z5, z27325; CHECK-NEXT: frintx z5.h, p0/m, z27.h326; CHECK-NEXT: movprfx z1, z6327; CHECK-NEXT: frintx z1.h, p0/m, z6.h328; CHECK-NEXT: frintx z4.h, p0/m, z4.h329; CHECK-NEXT: movprfx z12, z31330; CHECK-NEXT: frintx z12.h, p0/m, z31.h331; CHECK-NEXT: movprfx z27, z8332; CHECK-NEXT: frintx z27.h, p0/m, z8.h333; CHECK-NEXT: movprfx z6, z30334; CHECK-NEXT: frintx z6.h, p0/m, z30.h335; CHECK-NEXT: movprfx z31, z10336; CHECK-NEXT: frintx z31.h, p0/m, z10.h337; CHECK-NEXT: mov z8.d, #0x8000000000000000338; CHECK-NEXT: frintx z11.h, p0/m, z11.h339; CHECK-NEXT: movprfx z3, z16340; CHECK-NEXT: frintx z3.h, p0/m, z16.h341; CHECK-NEXT: mov z30.h, w9342; CHECK-NEXT: uunpklo z10.d, z13.s343; CHECK-NEXT: uunpkhi z13.d, z13.s344; CHECK-NEXT: uunpkhi z20.d, z15.s345; CHECK-NEXT: uunpklo z16.d, z17.s346; CHECK-NEXT: mov z25.d, #0x8000000000000000347; CHECK-NEXT: mov z0.d, #0x8000000000000000348; CHECK-NEXT: mov z18.d, #0x8000000000000000349; CHECK-NEXT: uunpklo z15.d, z15.s350; CHECK-NEXT: mov z2.d, #0x8000000000000000351; CHECK-NEXT: mov z21.d, #0x8000000000000000352; CHECK-NEXT: frintx z10.h, p0/m, z10.h353; CHECK-NEXT: mov z26.d, #0x8000000000000000354; CHECK-NEXT: mov z29.d, #0x7fffffffffffffff355; CHECK-NEXT: movprfx z19, z13356; CHECK-NEXT: frintx z19.h, p0/m, z13.h357; CHECK-NEXT: movprfx z13, z14358; CHECK-NEXT: frintx z13.h, p0/m, z14.h359; CHECK-NEXT: frintx z16.h, p0/m, z16.h360; CHECK-NEXT: mov z22.d, #0x8000000000000000361; CHECK-NEXT: mov z23.d, #0x8000000000000000362; CHECK-NEXT: mov z14.d, #0x8000000000000000363; CHECK-NEXT: frintx z15.h, p0/m, z15.h364; CHECK-NEXT: fcmge p4.h, p0/z, z4.h, z28.h365; CHECK-NEXT: fcmge p2.h, p0/z, z12.h, z28.h366; CHECK-NEXT: fcmgt p9.h, p0/z, z12.h, z30.h367; CHECK-NEXT: fcmuo p8.h, p0/z, z12.h, z12.h368; CHECK-NEXT: fcvtzs z7.d, p4/m, z4.h369; CHECK-NEXT: fcvtzs z8.d, p2/m, z12.h370; CHECK-NEXT: mov z12.d, #0x8000000000000000371; CHECK-NEXT: fcmge p4.h, p0/z, z27.h, z28.h372; CHECK-NEXT: fcmuo p10.h, p0/z, z11.h, z11.h373; CHECK-NEXT: fcmge p3.h, p0/z, z5.h, z28.h374; CHECK-NEXT: mov z8.d, p9/m, z29.d375; CHECK-NEXT: fcvtzs z9.d, p4/m, z27.h376; CHECK-NEXT: fcmge p4.h, p0/z, z11.h, z28.h377; CHECK-NEXT: fcvtzs z24.d, p3/m, z5.h378; CHECK-NEXT: mov z8.d, p8/m, #0 // =0x0379; CHECK-NEXT: fcmge p1.h, p0/z, z6.h, z28.h380; CHECK-NEXT: fcmge p5.h, p0/z, z1.h, z28.h381; CHECK-NEXT: str z8, [x8, #4, mul vl]382; CHECK-NEXT: fcvtzs z12.d, p4/m, z11.h383; CHECK-NEXT: fcmgt p4.h, p0/z, z11.h, z30.h384; CHECK-NEXT: uunpkhi z11.d, z17.s385; CHECK-NEXT: movprfx z17, z20386; CHECK-NEXT: frintx z17.h, p0/m, z20.h387; CHECK-NEXT: fcvtzs z25.d, p1/m, z6.h388; CHECK-NEXT: mov z20.d, #0x8000000000000000389; CHECK-NEXT: fcvtzs z0.d, p5/m, z1.h390; CHECK-NEXT: fcmge p6.h, p0/z, z10.h, z28.h391; CHECK-NEXT: frintx z11.h, p0/m, z11.h392; CHECK-NEXT: fcmge p3.h, p0/z, z31.h, z28.h393; CHECK-NEXT: fcmge p1.h, p0/z, z13.h, z28.h394; CHECK-NEXT: fcvtzs z18.d, p6/m, z10.h395; CHECK-NEXT: fcmgt p11.h, p0/z, z10.h, z30.h396; CHECK-NEXT: fcmge p5.h, p0/z, z11.h, z28.h397; CHECK-NEXT: fcvtzs z2.d, p3/m, z31.h398; CHECK-NEXT: fcvtzs z21.d, p1/m, z13.h399; CHECK-NEXT: fcmge p2.h, p0/z, z17.h, z28.h400; CHECK-NEXT: fcmge p3.h, p0/z, z16.h, z28.h401; CHECK-NEXT: fcmuo p1.h, p0/z, z10.h, z10.h402; CHECK-NEXT: sel z10.d, p4, z29.d, z12.d403; CHECK-NEXT: sel z12.d, p11, z29.d, z18.d404; CHECK-NEXT: fcvtzs z26.d, p5/m, z11.h405; CHECK-NEXT: fcvtzs z22.d, p2/m, z17.h406; CHECK-NEXT: fcmgt p4.h, p0/z, z11.h, z30.h407; CHECK-NEXT: fcvtzs z23.d, p3/m, z16.h408; CHECK-NEXT: mov z10.d, p10/m, #0 // =0x0409; CHECK-NEXT: mov z12.d, p1/m, #0 // =0x0410; CHECK-NEXT: fcmge p6.h, p0/z, z19.h, z28.h411; CHECK-NEXT: str z10, [x8, #7, mul vl]412; CHECK-NEXT: fcmge p7.h, p0/z, z3.h, z28.h413; CHECK-NEXT: str z12, [x8, #8, mul vl]414; CHECK-NEXT: mov z26.d, p4/m, z29.d415; CHECK-NEXT: fcmge p2.h, p0/z, z15.h, z28.h416; CHECK-NEXT: mov z28.d, #0x8000000000000000417; CHECK-NEXT: fcvtzs z14.d, p6/m, z19.h418; CHECK-NEXT: fcmgt p5.h, p0/z, z16.h, z30.h419; CHECK-NEXT: fcmgt p3.h, p0/z, z17.h, z30.h420; CHECK-NEXT: fcvtzs z20.d, p7/m, z3.h421; CHECK-NEXT: fcvtzs z28.d, p2/m, z15.h422; CHECK-NEXT: fcmuo p1.h, p0/z, z11.h, z11.h423; CHECK-NEXT: fcmuo p2.h, p0/z, z16.h, z16.h424; CHECK-NEXT: sel z11.d, p5, z29.d, z23.d425; CHECK-NEXT: sel z16.d, p3, z29.d, z22.d426; CHECK-NEXT: fcmgt p4.h, p0/z, z19.h, z30.h427; CHECK-NEXT: fcmgt p3.h, p0/z, z15.h, z30.h428; CHECK-NEXT: mov z26.d, p1/m, #0 // =0x0429; CHECK-NEXT: mov z11.d, p2/m, #0 // =0x0430; CHECK-NEXT: fcmgt p1.h, p0/z, z13.h, z30.h431; CHECK-NEXT: fcmuo p6.h, p0/z, z17.h, z17.h432; CHECK-NEXT: str z26, [x8, #15, mul vl]433; CHECK-NEXT: sel z26.d, p4, z29.d, z14.d434; CHECK-NEXT: str z11, [x8, #14, mul vl]435; CHECK-NEXT: mov z28.d, p3/m, z29.d436; CHECK-NEXT: fcmgt p2.h, p0/z, z3.h, z30.h437; CHECK-NEXT: fcmuo p4.h, p0/z, z13.h, z13.h438; CHECK-NEXT: fcmuo p3.h, p0/z, z3.h, z3.h439; CHECK-NEXT: sel z3.d, p1, z29.d, z21.d440; CHECK-NEXT: mov z16.d, p6/m, #0 // =0x0441; CHECK-NEXT: fcmgt p12.h, p0/z, z27.h, z30.h442; CHECK-NEXT: sel z11.d, p2, z29.d, z20.d443; CHECK-NEXT: str z16, [x8, #13, mul vl]444; CHECK-NEXT: mov z3.d, p4/m, #0 // =0x0445; CHECK-NEXT: fcmuo p6.h, p0/z, z15.h, z15.h446; CHECK-NEXT: fcmgt p1.h, p0/z, z4.h, z30.h447; CHECK-NEXT: mov z11.d, p3/m, #0 // =0x0448; CHECK-NEXT: mov z9.d, p12/m, z29.d449; CHECK-NEXT: str z3, [x8, #11, mul vl]450; CHECK-NEXT: fcmuo p5.h, p0/z, z19.h, z19.h451; CHECK-NEXT: fcmgt p2.h, p0/z, z5.h, z30.h452; CHECK-NEXT: str z11, [x8, #10, mul vl]453; CHECK-NEXT: mov z28.d, p6/m, #0 // =0x0454; CHECK-NEXT: sel z3.d, p1, z29.d, z7.d455; CHECK-NEXT: fcmgt p4.h, p0/z, z6.h, z30.h456; CHECK-NEXT: fcmuo p3.h, p0/z, z27.h, z27.h457; CHECK-NEXT: str z28, [x8, #12, mul vl]458; CHECK-NEXT: mov z26.d, p5/m, #0 // =0x0459; CHECK-NEXT: sel z7.d, p2, z29.d, z24.d460; CHECK-NEXT: fcmgt p6.h, p0/z, z31.h, z30.h461; CHECK-NEXT: fcmgt p1.h, p0/z, z1.h, z30.h462; CHECK-NEXT: str z26, [x8, #9, mul vl]463; CHECK-NEXT: sel z24.d, p4, z29.d, z25.d464; CHECK-NEXT: mov z9.d, p3/m, #0 // =0x0465; CHECK-NEXT: fcmuo p5.h, p0/z, z31.h, z31.h466; CHECK-NEXT: fcmuo p2.h, p0/z, z6.h, z6.h467; CHECK-NEXT: mov z2.d, p6/m, z29.d468; CHECK-NEXT: str z9, [x8, #5, mul vl]469; CHECK-NEXT: mov z0.d, p1/m, z29.d470; CHECK-NEXT: fcmuo p3.h, p0/z, z5.h, z5.h471; CHECK-NEXT: fcmuo p4.h, p0/z, z4.h, z4.h472; CHECK-NEXT: mov z2.d, p5/m, #0 // =0x0473; CHECK-NEXT: mov z24.d, p2/m, #0 // =0x0474; CHECK-NEXT: fcmuo p0.h, p0/z, z1.h, z1.h475; CHECK-NEXT: mov z7.d, p3/m, #0 // =0x0476; CHECK-NEXT: str z2, [x8, #6, mul vl]477; CHECK-NEXT: mov z3.d, p4/m, #0 // =0x0478; CHECK-NEXT: str z24, [x8, #3, mul vl]479; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0480; CHECK-NEXT: str z7, [x8, #2, mul vl]481; CHECK-NEXT: str z3, [x8, #1, mul vl]482; CHECK-NEXT: str z0, [x8]483; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload484; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload485; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload486; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload487; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload488; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload489; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload490; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload491; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload492; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload493; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload494; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload495; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload496; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload497; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload498; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload499; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload500; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload501; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload502; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload503; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload504; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload505; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload506; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload507; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload508; CHECK-NEXT: addvl sp, sp, #18509; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload510; CHECK-NEXT: ret511 %a = call <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv32f16(<vscale x 32 x half> %x)512 ret <vscale x 32 x iXLen> %a513}514declare <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv32f16(<vscale x 32 x half>)515 516define <vscale x 1 x iXLen> @lrint_v1f32(<vscale x 1 x float> %x) {517; CHECK-LABEL: lrint_v1f32:518; CHECK: // %bb.0:519; CHECK-NEXT: ptrue p0.d520; CHECK-NEXT: mov w8, #-553648128 // =0xdf000000521; CHECK-NEXT: mov z2.d, #0x8000000000000000522; CHECK-NEXT: mov z1.s, w8523; CHECK-NEXT: mov w8, #1593835519 // =0x5effffff524; CHECK-NEXT: frintx z0.s, p0/m, z0.s525; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s526; CHECK-NEXT: mov z1.s, w8527; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.s528; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s529; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff530; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z0.s531; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d532; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0533; CHECK-NEXT: ret534 %a = call <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f32(<vscale x 1 x float> %x)535 ret <vscale x 1 x iXLen> %a536}537declare <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f32(<vscale x 1 x float>)538 539define <vscale x 2 x iXLen> @lrint_v2f32(<vscale x 2 x float> %x) {540; CHECK-LABEL: lrint_v2f32:541; CHECK: // %bb.0:542; CHECK-NEXT: ptrue p0.d543; CHECK-NEXT: mov w8, #-553648128 // =0xdf000000544; CHECK-NEXT: mov z2.d, #0x8000000000000000545; CHECK-NEXT: mov z1.s, w8546; CHECK-NEXT: mov w8, #1593835519 // =0x5effffff547; CHECK-NEXT: frintx z0.s, p0/m, z0.s548; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z1.s549; CHECK-NEXT: mov z1.s, w8550; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.s551; CHECK-NEXT: fcmgt p1.s, p0/z, z0.s, z1.s552; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff553; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z0.s554; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d555; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x0556; CHECK-NEXT: ret557 %a = call <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f32(<vscale x 2 x float> %x)558 ret <vscale x 2 x iXLen> %a559}560declare <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f32(<vscale x 2 x float>)561 562define <vscale x 4 x iXLen> @lrint_v4f32(<vscale x 4 x float> %x) {563; CHECK-LABEL: lrint_v4f32:564; CHECK: // %bb.0:565; CHECK-NEXT: uunpklo z1.d, z0.s566; CHECK-NEXT: uunpkhi z0.d, z0.s567; CHECK-NEXT: mov w8, #-553648128 // =0xdf000000568; CHECK-NEXT: ptrue p0.d569; CHECK-NEXT: mov z2.s, w8570; CHECK-NEXT: mov w8, #1593835519 // =0x5effffff571; CHECK-NEXT: mov z3.d, #0x8000000000000000572; CHECK-NEXT: mov z4.d, #0x8000000000000000573; CHECK-NEXT: mov z5.d, #0x7fffffffffffffff574; CHECK-NEXT: frintx z1.s, p0/m, z1.s575; CHECK-NEXT: frintx z0.s, p0/m, z0.s576; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z2.s577; CHECK-NEXT: fcmge p2.s, p0/z, z0.s, z2.s578; CHECK-NEXT: mov z2.s, w8579; CHECK-NEXT: fcmuo p3.s, p0/z, z1.s, z1.s580; CHECK-NEXT: fcvtzs z4.d, p1/m, z1.s581; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z2.s582; CHECK-NEXT: fcvtzs z3.d, p2/m, z0.s583; CHECK-NEXT: fcmgt p2.s, p0/z, z0.s, z2.s584; CHECK-NEXT: fcmuo p0.s, p0/z, z0.s, z0.s585; CHECK-NEXT: sel z0.d, p1, z5.d, z4.d586; CHECK-NEXT: sel z1.d, p2, z5.d, z3.d587; CHECK-NEXT: mov z0.d, p3/m, #0 // =0x0588; CHECK-NEXT: mov z1.d, p0/m, #0 // =0x0589; CHECK-NEXT: ret590 %a = call <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f32(<vscale x 4 x float> %x)591 ret <vscale x 4 x iXLen> %a592}593declare <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f32(<vscale x 4 x float>)594 595define <vscale x 8 x iXLen> @lrint_v8f32(<vscale x 8 x float> %x) {596; CHECK-LABEL: lrint_v8f32:597; CHECK: // %bb.0:598; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill599; CHECK-NEXT: addvl sp, sp, #-1600; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill601; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill602; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill603; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG604; CHECK-NEXT: .cfi_offset w29, -16605; CHECK-NEXT: uunpklo z2.d, z0.s606; CHECK-NEXT: ptrue p0.d607; CHECK-NEXT: mov w8, #-553648128 // =0xdf000000608; CHECK-NEXT: uunpkhi z0.d, z0.s609; CHECK-NEXT: uunpklo z3.d, z1.s610; CHECK-NEXT: uunpkhi z1.d, z1.s611; CHECK-NEXT: mov z4.s, w8612; CHECK-NEXT: mov w8, #1593835519 // =0x5effffff613; CHECK-NEXT: mov z5.d, #0x8000000000000000614; CHECK-NEXT: mov z7.d, #0x8000000000000000615; CHECK-NEXT: mov z24.d, #0x8000000000000000616; CHECK-NEXT: mov z25.s, w8617; CHECK-NEXT: frintx z2.s, p0/m, z2.s618; CHECK-NEXT: mov z26.d, #0x8000000000000000619; CHECK-NEXT: movprfx z6, z0620; CHECK-NEXT: frintx z6.s, p0/m, z0.s621; CHECK-NEXT: frintx z3.s, p0/m, z3.s622; CHECK-NEXT: frintx z1.s, p0/m, z1.s623; CHECK-NEXT: fcmge p1.s, p0/z, z2.s, z4.s624; CHECK-NEXT: fcmge p2.s, p0/z, z6.s, z4.s625; CHECK-NEXT: fcmge p3.s, p0/z, z3.s, z4.s626; CHECK-NEXT: fcmgt p4.s, p0/z, z2.s, z25.s627; CHECK-NEXT: fcvtzs z5.d, p1/m, z2.s628; CHECK-NEXT: fcmge p1.s, p0/z, z1.s, z4.s629; CHECK-NEXT: mov z4.d, #0x7fffffffffffffff630; CHECK-NEXT: fcvtzs z7.d, p2/m, z6.s631; CHECK-NEXT: fcvtzs z24.d, p3/m, z3.s632; CHECK-NEXT: fcmgt p3.s, p0/z, z6.s, z25.s633; CHECK-NEXT: fcmgt p5.s, p0/z, z3.s, z25.s634; CHECK-NEXT: fcvtzs z26.d, p1/m, z1.s635; CHECK-NEXT: sel z0.d, p4, z4.d, z5.d636; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z25.s637; CHECK-NEXT: fcmuo p4.s, p0/z, z6.s, z6.s638; CHECK-NEXT: fcmuo p6.s, p0/z, z3.s, z3.s639; CHECK-NEXT: fcmuo p2.s, p0/z, z2.s, z2.s640; CHECK-NEXT: sel z2.d, p5, z4.d, z24.d641; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload642; CHECK-NEXT: fcmuo p0.s, p0/z, z1.s, z1.s643; CHECK-NEXT: sel z1.d, p3, z4.d, z7.d644; CHECK-NEXT: sel z3.d, p1, z4.d, z26.d645; CHECK-NEXT: mov z2.d, p6/m, #0 // =0x0646; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload647; CHECK-NEXT: mov z1.d, p4/m, #0 // =0x0648; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload649; CHECK-NEXT: mov z0.d, p2/m, #0 // =0x0650; CHECK-NEXT: mov z3.d, p0/m, #0 // =0x0651; CHECK-NEXT: addvl sp, sp, #1652; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload653; CHECK-NEXT: ret654 %a = call <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f32(<vscale x 8 x float> %x)655 ret <vscale x 8 x iXLen> %a656}657declare <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f32(<vscale x 8 x float>)658 659define <vscale x 16 x iXLen> @lrint_v16f32(<vscale x 16 x float> %x) {660; CHECK-LABEL: lrint_v16f32:661; CHECK: // %bb.0:662; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill663; CHECK-NEXT: addvl sp, sp, #-3664; CHECK-NEXT: str p10, [sp, #1, mul vl] // 2-byte Spill665; CHECK-NEXT: str p9, [sp, #2, mul vl] // 2-byte Spill666; CHECK-NEXT: str p8, [sp, #3, mul vl] // 2-byte Spill667; CHECK-NEXT: str p7, [sp, #4, mul vl] // 2-byte Spill668; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill669; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill670; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill671; CHECK-NEXT: str z9, [sp, #1, mul vl] // 16-byte Folded Spill672; CHECK-NEXT: str z8, [sp, #2, mul vl] // 16-byte Folded Spill673; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG674; CHECK-NEXT: .cfi_offset w29, -16675; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16676; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 16677; CHECK-NEXT: uunpklo z4.d, z0.s678; CHECK-NEXT: uunpkhi z5.d, z0.s679; CHECK-NEXT: mov w8, #-553648128 // =0xdf000000680; CHECK-NEXT: uunpkhi z7.d, z1.s681; CHECK-NEXT: uunpklo z24.d, z2.s682; CHECK-NEXT: ptrue p0.d683; CHECK-NEXT: uunpklo z6.d, z1.s684; CHECK-NEXT: uunpkhi z2.d, z2.s685; CHECK-NEXT: mov z0.d, #0x8000000000000000686; CHECK-NEXT: mov z1.d, #0x8000000000000000687; CHECK-NEXT: mov z27.d, #0x8000000000000000688; CHECK-NEXT: mov z28.d, #0x8000000000000000689; CHECK-NEXT: movprfx z25, z4690; CHECK-NEXT: frintx z25.s, p0/m, z4.s691; CHECK-NEXT: frintx z5.s, p0/m, z5.s692; CHECK-NEXT: mov z4.s, w8693; CHECK-NEXT: mov w8, #1593835519 // =0x5effffff694; CHECK-NEXT: frintx z7.s, p0/m, z7.s695; CHECK-NEXT: frintx z24.s, p0/m, z24.s696; CHECK-NEXT: movprfx z30, z2697; CHECK-NEXT: frintx z30.s, p0/m, z2.s698; CHECK-NEXT: frintx z6.s, p0/m, z6.s699; CHECK-NEXT: uunpklo z2.d, z3.s700; CHECK-NEXT: mov z29.s, w8701; CHECK-NEXT: mov z26.d, #0x8000000000000000702; CHECK-NEXT: mov z31.d, #0x8000000000000000703; CHECK-NEXT: mov z8.d, #0x8000000000000000704; CHECK-NEXT: mov z9.d, #0x7fffffffffffffff705; CHECK-NEXT: fcmge p5.s, p0/z, z25.s, z4.s706; CHECK-NEXT: fcmge p1.s, p0/z, z5.s, z4.s707; CHECK-NEXT: fcmge p3.s, p0/z, z7.s, z4.s708; CHECK-NEXT: fcmge p4.s, p0/z, z24.s, z4.s709; CHECK-NEXT: fcvtzs z0.d, p5/m, z25.s710; CHECK-NEXT: fcvtzs z1.d, p1/m, z5.s711; CHECK-NEXT: fcvtzs z27.d, p3/m, z7.s712; CHECK-NEXT: fcmge p2.s, p0/z, z6.s, z4.s713; CHECK-NEXT: fcvtzs z28.d, p4/m, z24.s714; CHECK-NEXT: fcmgt p3.s, p0/z, z25.s, z29.s715; CHECK-NEXT: fcmge p4.s, p0/z, z30.s, z4.s716; CHECK-NEXT: fcmuo p1.s, p0/z, z25.s, z25.s717; CHECK-NEXT: movprfx z25, z2718; CHECK-NEXT: frintx z25.s, p0/m, z2.s719; CHECK-NEXT: uunpkhi z2.d, z3.s720; CHECK-NEXT: fcvtzs z26.d, p2/m, z6.s721; CHECK-NEXT: mov z0.d, p3/m, z9.d722; CHECK-NEXT: fcmgt p5.s, p0/z, z5.s, z29.s723; CHECK-NEXT: fcvtzs z31.d, p4/m, z30.s724; CHECK-NEXT: fcmuo p2.s, p0/z, z5.s, z5.s725; CHECK-NEXT: movprfx z5, z2726; CHECK-NEXT: frintx z5.s, p0/m, z2.s727; CHECK-NEXT: mov z0.d, p1/m, #0 // =0x0728; CHECK-NEXT: fcmge p4.s, p0/z, z25.s, z4.s729; CHECK-NEXT: fcmgt p6.s, p0/z, z6.s, z29.s730; CHECK-NEXT: mov z1.d, p5/m, z9.d731; CHECK-NEXT: fcmgt p8.s, p0/z, z7.s, z29.s732; CHECK-NEXT: fcmuo p10.s, p0/z, z7.s, z7.s733; CHECK-NEXT: mov z7.d, #0x8000000000000000734; CHECK-NEXT: fcvtzs z8.d, p4/m, z25.s735; CHECK-NEXT: mov z1.d, p2/m, #0 // =0x0736; CHECK-NEXT: sel z2.d, p6, z9.d, z26.d737; CHECK-NEXT: sel z3.d, p8, z9.d, z27.d738; CHECK-NEXT: fcmge p4.s, p0/z, z5.s, z4.s739; CHECK-NEXT: fcmgt p9.s, p0/z, z24.s, z29.s740; CHECK-NEXT: fcmgt p5.s, p0/z, z30.s, z29.s741; CHECK-NEXT: mov z3.d, p10/m, #0 // =0x0742; CHECK-NEXT: ldr p10, [sp, #1, mul vl] // 2-byte Reload743; CHECK-NEXT: fcmgt p6.s, p0/z, z25.s, z29.s744; CHECK-NEXT: fcvtzs z7.d, p4/m, z5.s745; CHECK-NEXT: fcmgt p4.s, p0/z, z5.s, z29.s746; CHECK-NEXT: sel z4.d, p9, z9.d, z28.d747; CHECK-NEXT: fcmuo p7.s, p0/z, z6.s, z6.s748; CHECK-NEXT: sel z6.d, p6, z9.d, z8.d749; CHECK-NEXT: ldr z8, [sp, #2, mul vl] // 16-byte Folded Reload750; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload751; CHECK-NEXT: fcmuo p8.s, p0/z, z30.s, z30.s752; CHECK-NEXT: fcmuo p9.s, p0/z, z25.s, z25.s753; CHECK-NEXT: mov z7.d, p4/m, z9.d754; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload755; CHECK-NEXT: mov z2.d, p7/m, #0 // =0x0756; CHECK-NEXT: ldr p7, [sp, #4, mul vl] // 2-byte Reload757; CHECK-NEXT: fcmuo p3.s, p0/z, z24.s, z24.s758; CHECK-NEXT: fcmuo p0.s, p0/z, z5.s, z5.s759; CHECK-NEXT: sel z5.d, p5, z9.d, z31.d760; CHECK-NEXT: ldr z9, [sp, #1, mul vl] // 16-byte Folded Reload761; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload762; CHECK-NEXT: mov z6.d, p9/m, #0 // =0x0763; CHECK-NEXT: ldr p9, [sp, #2, mul vl] // 2-byte Reload764; CHECK-NEXT: mov z5.d, p8/m, #0 // =0x0765; CHECK-NEXT: ldr p8, [sp, #3, mul vl] // 2-byte Reload766; CHECK-NEXT: mov z4.d, p3/m, #0 // =0x0767; CHECK-NEXT: mov z7.d, p0/m, #0 // =0x0768; CHECK-NEXT: addvl sp, sp, #3769; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload770; CHECK-NEXT: ret771 %a = call <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f32(<vscale x 16 x float> %x)772 ret <vscale x 16 x iXLen> %a773}774declare <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f32(<vscale x 16 x float>)775 776define <vscale x 32 x iXLen> @lrint_v32f32(<vscale x 32 x float> %x) {777; CHECK-LABEL: lrint_v32f32:778; CHECK: // %bb.0:779; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill780; CHECK-NEXT: addvl sp, sp, #-18781; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill782; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill783; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill784; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill785; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill786; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill787; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill788; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill789; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill790; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill791; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill792; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill793; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill794; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill795; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill796; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill797; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill798; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill799; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill800; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill801; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill802; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill803; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill804; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill805; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill806; CHECK-NEXT: addvl sp, sp, #-1807; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x98, 0x01, 0x1e, 0x22 // sp + 16 + 152 * VG808; CHECK-NEXT: .cfi_offset w29, -16809; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 16810; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 16811; CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x68, 0x1e, 0x22, 0x40, 0x1c // $d10 @ cfa - 24 * VG - 16812; CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x60, 0x1e, 0x22, 0x40, 0x1c // $d11 @ cfa - 32 * VG - 16813; CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x58, 0x1e, 0x22, 0x40, 0x1c // $d12 @ cfa - 40 * VG - 16814; CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x50, 0x1e, 0x22, 0x40, 0x1c // $d13 @ cfa - 48 * VG - 16815; CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x48, 0x1e, 0x22, 0x40, 0x1c // $d14 @ cfa - 56 * VG - 16816; CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x40, 0x1e, 0x22, 0x40, 0x1c // $d15 @ cfa - 64 * VG - 16817; CHECK-NEXT: uunpklo z24.d, z0.s818; CHECK-NEXT: uunpklo z26.d, z1.s819; CHECK-NEXT: mov w9, #-553648128 // =0xdf000000820; CHECK-NEXT: uunpklo z28.d, z2.s821; CHECK-NEXT: uunpkhi z30.d, z2.s822; CHECK-NEXT: ptrue p0.d823; CHECK-NEXT: uunpkhi z25.d, z0.s824; CHECK-NEXT: uunpkhi z13.d, z3.s825; CHECK-NEXT: uunpklo z14.d, z4.s826; CHECK-NEXT: uunpkhi z27.d, z1.s827; CHECK-NEXT: uunpklo z9.d, z3.s828; CHECK-NEXT: mov z29.s, w9829; CHECK-NEXT: movprfx z0, z24830; CHECK-NEXT: frintx z0.s, p0/m, z24.s831; CHECK-NEXT: movprfx z24, z26832; CHECK-NEXT: frintx z24.s, p0/m, z26.s833; CHECK-NEXT: mov w9, #1593835519 // =0x5effffff834; CHECK-NEXT: movprfx z10, z28835; CHECK-NEXT: frintx z10.s, p0/m, z28.s836; CHECK-NEXT: frintx z30.s, p0/m, z30.s837; CHECK-NEXT: uunpklo z17.d, z5.s838; CHECK-NEXT: movprfx z1, z25839; CHECK-NEXT: frintx z1.s, p0/m, z25.s840; CHECK-NEXT: movprfx z15, z13841; CHECK-NEXT: frintx z15.s, p0/m, z13.s842; CHECK-NEXT: movprfx z13, z14843; CHECK-NEXT: frintx z13.s, p0/m, z14.s844; CHECK-NEXT: uunpkhi z14.d, z4.s845; CHECK-NEXT: uunpkhi z18.d, z5.s846; CHECK-NEXT: uunpkhi z19.d, z6.s847; CHECK-NEXT: movprfx z25, z27848; CHECK-NEXT: frintx z25.s, p0/m, z27.s849; CHECK-NEXT: mov z27.d, #0x8000000000000000850; CHECK-NEXT: mov z11.d, #0x8000000000000000851; CHECK-NEXT: fcmge p3.s, p0/z, z24.s, z29.s852; CHECK-NEXT: str z0, [sp] // 16-byte Folded Spill853; CHECK-NEXT: mov z12.d, #0x8000000000000000854; CHECK-NEXT: fcmge p5.s, p0/z, z10.s, z29.s855; CHECK-NEXT: frintx z9.s, p0/m, z9.s856; CHECK-NEXT: uunpklo z20.d, z7.s857; CHECK-NEXT: movprfx z5, z14858; CHECK-NEXT: frintx z5.s, p0/m, z14.s859; CHECK-NEXT: movprfx z14, z17860; CHECK-NEXT: frintx z14.s, p0/m, z17.s861; CHECK-NEXT: movprfx z17, z18862; CHECK-NEXT: frintx z17.s, p0/m, z18.s863; CHECK-NEXT: fcmge p6.s, p0/z, z30.s, z29.s864; CHECK-NEXT: movprfx z18, z19865; CHECK-NEXT: frintx z18.s, p0/m, z19.s866; CHECK-NEXT: uunpkhi z7.d, z7.s867; CHECK-NEXT: mov z31.s, w9868; CHECK-NEXT: mov z2.d, #0x8000000000000000869; CHECK-NEXT: mov z26.d, #0x8000000000000000870; CHECK-NEXT: uunpklo z6.d, z6.s871; CHECK-NEXT: mov z28.d, #0x8000000000000000872; CHECK-NEXT: fcvtzs z27.d, p3/m, z24.s873; CHECK-NEXT: fcvtzs z11.d, p5/m, z10.s874; CHECK-NEXT: mov z4.d, #0x8000000000000000875; CHECK-NEXT: mov z16.d, #0x8000000000000000876; CHECK-NEXT: movprfx z22, z7877; CHECK-NEXT: frintx z22.s, p0/m, z7.s878; CHECK-NEXT: fcvtzs z12.d, p6/m, z30.s879; CHECK-NEXT: frintx z20.s, p0/m, z20.s880; CHECK-NEXT: mov z21.d, #0x8000000000000000881; CHECK-NEXT: mov z23.d, #0x8000000000000000882; CHECK-NEXT: mov z8.d, #0x8000000000000000883; CHECK-NEXT: frintx z6.s, p0/m, z6.s884; CHECK-NEXT: mov z3.d, #0x7fffffffffffffff885; CHECK-NEXT: mov z19.d, #0x8000000000000000886; CHECK-NEXT: fcmge p1.s, p0/z, z0.s, z29.s887; CHECK-NEXT: fcmge p2.s, p0/z, z1.s, z29.s888; CHECK-NEXT: fcmge p4.s, p0/z, z25.s, z29.s889; CHECK-NEXT: fcmgt p9.s, p0/z, z10.s, z31.s890; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.s891; CHECK-NEXT: mov z0.d, #0x8000000000000000892; CHECK-NEXT: fcvtzs z26.d, p2/m, z1.s893; CHECK-NEXT: fcvtzs z28.d, p4/m, z25.s894; CHECK-NEXT: mov z11.d, p9/m, z3.d895; CHECK-NEXT: fcmuo p8.s, p0/z, z10.s, z10.s896; CHECK-NEXT: mov z10.d, #0x8000000000000000897; CHECK-NEXT: fcmge p5.s, p0/z, z9.s, z29.s898; CHECK-NEXT: fcmge p3.s, p0/z, z15.s, z29.s899; CHECK-NEXT: fcmge p6.s, p0/z, z13.s, z29.s900; CHECK-NEXT: mov z11.d, p8/m, #0 // =0x0901; CHECK-NEXT: fcvtzs z10.d, p5/m, z9.s902; CHECK-NEXT: fcvtzs z4.d, p3/m, z15.s903; CHECK-NEXT: fcvtzs z16.d, p6/m, z13.s904; CHECK-NEXT: fcmge p1.s, p0/z, z17.s, z29.s905; CHECK-NEXT: fcmge p2.s, p0/z, z18.s, z29.s906; CHECK-NEXT: fcmgt p12.s, p0/z, z30.s, z31.s907; CHECK-NEXT: fcmgt p5.s, p0/z, z15.s, z31.s908; CHECK-NEXT: fcmge p3.s, p0/z, z20.s, z29.s909; CHECK-NEXT: fcvtzs z21.d, p1/m, z17.s910; CHECK-NEXT: fcvtzs z23.d, p2/m, z18.s911; CHECK-NEXT: fcmgt p11.s, p0/z, z13.s, z31.s912; CHECK-NEXT: sel z7.d, p12, z3.d, z12.d913; CHECK-NEXT: mov z4.d, p5/m, z3.d914; CHECK-NEXT: fcmge p4.s, p0/z, z22.s, z29.s915; CHECK-NEXT: fcvtzs z0.d, p3/m, z20.s916; CHECK-NEXT: fcmge p6.s, p0/z, z5.s, z29.s917; CHECK-NEXT: sel z12.d, p11, z3.d, z16.d918; CHECK-NEXT: fcmge p7.s, p0/z, z14.s, z29.s919; CHECK-NEXT: fcmuo p1.s, p0/z, z13.s, z13.s920; CHECK-NEXT: fcvtzs z8.d, p4/m, z22.s921; CHECK-NEXT: fcmge p2.s, p0/z, z6.s, z29.s922; CHECK-NEXT: mov z29.d, #0x8000000000000000923; CHECK-NEXT: fcmuo p10.s, p0/z, z15.s, z15.s924; CHECK-NEXT: mov z15.d, #0x8000000000000000925; CHECK-NEXT: fcvtzs z19.d, p7/m, z14.s926; CHECK-NEXT: mov z12.d, p1/m, #0 // =0x0927; CHECK-NEXT: fcvtzs z29.d, p2/m, z6.s928; CHECK-NEXT: fcmgt p4.s, p0/z, z22.s, z31.s929; CHECK-NEXT: fcvtzs z15.d, p6/m, z5.s930; CHECK-NEXT: mov z4.d, p10/m, #0 // =0x0931; CHECK-NEXT: str z12, [x8, #8, mul vl]932; CHECK-NEXT: fcmgt p5.s, p0/z, z20.s, z31.s933; CHECK-NEXT: fcmgt p3.s, p0/z, z18.s, z31.s934; CHECK-NEXT: str z4, [x8, #7, mul vl]935; CHECK-NEXT: fcmuo p1.s, p0/z, z22.s, z22.s936; CHECK-NEXT: mov z8.d, p4/m, z3.d937; CHECK-NEXT: fcmuo p2.s, p0/z, z20.s, z20.s938; CHECK-NEXT: mov z0.d, p5/m, z3.d939; CHECK-NEXT: fcmuo p6.s, p0/z, z18.s, z18.s940; CHECK-NEXT: fcmgt p4.s, p0/z, z5.s, z31.s941; CHECK-NEXT: mov z8.d, p1/m, #0 // =0x0942; CHECK-NEXT: mov z0.d, p2/m, #0 // =0x0943; CHECK-NEXT: fcmuo p5.s, p0/z, z5.s, z5.s944; CHECK-NEXT: sel z5.d, p3, z3.d, z23.d945; CHECK-NEXT: str z8, [x8, #15, mul vl]946; CHECK-NEXT: fcmgt p3.s, p0/z, z6.s, z31.s947; CHECK-NEXT: str z0, [x8, #14, mul vl]948; CHECK-NEXT: fcmgt p1.s, p0/z, z17.s, z31.s949; CHECK-NEXT: mov z5.d, p6/m, #0 // =0x0950; CHECK-NEXT: fcmgt p2.s, p0/z, z14.s, z31.s951; CHECK-NEXT: fcmuo p6.s, p0/z, z6.s, z6.s952; CHECK-NEXT: sel z6.d, p4, z3.d, z15.d953; CHECK-NEXT: str z5, [x8, #13, mul vl]954; CHECK-NEXT: sel z0.d, p3, z3.d, z29.d955; CHECK-NEXT: fcmuo p4.s, p0/z, z17.s, z17.s956; CHECK-NEXT: sel z5.d, p1, z3.d, z21.d957; CHECK-NEXT: sel z29.d, p2, z3.d, z19.d958; CHECK-NEXT: mov z6.d, p5/m, #0 // =0x0959; CHECK-NEXT: mov z0.d, p6/m, #0 // =0x0960; CHECK-NEXT: fcmuo p3.s, p0/z, z14.s, z14.s961; CHECK-NEXT: mov z5.d, p4/m, #0 // =0x0962; CHECK-NEXT: str z6, [x8, #9, mul vl]963; CHECK-NEXT: fcmgt p1.s, p0/z, z1.s, z31.s964; CHECK-NEXT: str z0, [x8, #12, mul vl]965; CHECK-NEXT: fcmgt p2.s, p0/z, z24.s, z31.s966; CHECK-NEXT: mov z29.d, p3/m, #0 // =0x0967; CHECK-NEXT: str z5, [x8, #11, mul vl]968; CHECK-NEXT: fcmgt p4.s, p0/z, z25.s, z31.s969; CHECK-NEXT: fcmuo p3.s, p0/z, z30.s, z30.s970; CHECK-NEXT: sel z5.d, p1, z3.d, z26.d971; CHECK-NEXT: str z29, [x8, #10, mul vl]972; CHECK-NEXT: sel z26.d, p2, z3.d, z27.d973; CHECK-NEXT: ldr z4, [sp] // 16-byte Folded Reload974; CHECK-NEXT: str z11, [x8, #4, mul vl]975; CHECK-NEXT: fcmgt p6.s, p0/z, z9.s, z31.s976; CHECK-NEXT: sel z6.d, p4, z3.d, z28.d977; CHECK-NEXT: fcmuo p5.s, p0/z, z9.s, z9.s978; CHECK-NEXT: mov z7.d, p3/m, #0 // =0x0979; CHECK-NEXT: fcmgt p1.s, p0/z, z4.s, z31.s980; CHECK-NEXT: fcmuo p2.s, p0/z, z25.s, z25.s981; CHECK-NEXT: fcmuo p3.s, p0/z, z24.s, z24.s982; CHECK-NEXT: sel z0.d, p6, z3.d, z10.d983; CHECK-NEXT: str z7, [x8, #5, mul vl]984; CHECK-NEXT: fcmuo p4.s, p0/z, z1.s, z1.s985; CHECK-NEXT: fcmuo p0.s, p0/z, z4.s, z4.s986; CHECK-NEXT: sel z1.d, p1, z3.d, z2.d987; CHECK-NEXT: mov z0.d, p5/m, #0 // =0x0988; CHECK-NEXT: mov z6.d, p2/m, #0 // =0x0989; CHECK-NEXT: mov z26.d, p3/m, #0 // =0x0990; CHECK-NEXT: mov z5.d, p4/m, #0 // =0x0991; CHECK-NEXT: mov z1.d, p0/m, #0 // =0x0992; CHECK-NEXT: str z0, [x8, #6, mul vl]993; CHECK-NEXT: str z6, [x8, #3, mul vl]994; CHECK-NEXT: str z26, [x8, #2, mul vl]995; CHECK-NEXT: str z5, [x8, #1, mul vl]996; CHECK-NEXT: str z1, [x8]997; CHECK-NEXT: addvl sp, sp, #1998; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload999; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload1000; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload1001; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload1002; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload1003; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload1004; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload1005; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload1006; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload1007; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload1008; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload1009; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload1010; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload1011; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload1012; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload1013; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload1014; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload1015; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload1016; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload1017; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload1018; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload1019; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload1020; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload1021; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload1022; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload1023; CHECK-NEXT: addvl sp, sp, #181024; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1025; CHECK-NEXT: ret1026 %a = call <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv32f32(<vscale x 32 x float> %x)1027 ret <vscale x 32 x iXLen> %a1028}1029declare <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv32f32(<vscale x 32 x float>)1030 1031define <vscale x 1 x iXLen> @lrint_v1f64(<vscale x 1 x double> %x) {1032; CHECK-LABEL: lrint_v1f64:1033; CHECK: // %bb.0:1034; CHECK-NEXT: ptrue p0.d1035; CHECK-NEXT: mov x8, #-4332462841530417152 // =0xc3e00000000000001036; CHECK-NEXT: mov z2.d, #0x80000000000000001037; CHECK-NEXT: mov z1.d, x81038; CHECK-NEXT: mov x8, #4890909195324358655 // =0x43dfffffffffffff1039; CHECK-NEXT: frintx z0.d, p0/m, z0.d1040; CHECK-NEXT: fcmge p1.d, p0/z, z0.d, z1.d1041; CHECK-NEXT: mov z1.d, x81042; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.d1043; CHECK-NEXT: fcmgt p1.d, p0/z, z0.d, z1.d1044; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff1045; CHECK-NEXT: fcmuo p0.d, p0/z, z0.d, z0.d1046; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d1047; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x01048; CHECK-NEXT: ret1049 %a = call <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f64(<vscale x 1 x double> %x)1050 ret <vscale x 1 x iXLen> %a1051}1052declare <vscale x 1 x iXLen> @llvm.lrint.nxv1iXLen.nxv1f64(<vscale x 1 x double>)1053 1054define <vscale x 2 x iXLen> @lrint_v2f64(<vscale x 2 x double> %x) {1055; CHECK-LABEL: lrint_v2f64:1056; CHECK: // %bb.0:1057; CHECK-NEXT: ptrue p0.d1058; CHECK-NEXT: mov x8, #-4332462841530417152 // =0xc3e00000000000001059; CHECK-NEXT: mov z2.d, #0x80000000000000001060; CHECK-NEXT: mov z1.d, x81061; CHECK-NEXT: mov x8, #4890909195324358655 // =0x43dfffffffffffff1062; CHECK-NEXT: frintx z0.d, p0/m, z0.d1063; CHECK-NEXT: fcmge p1.d, p0/z, z0.d, z1.d1064; CHECK-NEXT: mov z1.d, x81065; CHECK-NEXT: fcvtzs z2.d, p1/m, z0.d1066; CHECK-NEXT: fcmgt p1.d, p0/z, z0.d, z1.d1067; CHECK-NEXT: mov z1.d, #0x7fffffffffffffff1068; CHECK-NEXT: fcmuo p0.d, p0/z, z0.d, z0.d1069; CHECK-NEXT: sel z0.d, p1, z1.d, z2.d1070; CHECK-NEXT: mov z0.d, p0/m, #0 // =0x01071; CHECK-NEXT: ret1072 %a = call <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f64(<vscale x 2 x double> %x)1073 ret <vscale x 2 x iXLen> %a1074}1075declare <vscale x 2 x iXLen> @llvm.lrint.nxv2iXLen.nxv2f64(<vscale x 2 x double>)1076 1077define <vscale x 4 x iXLen> @lrint_v4f64(<vscale x 4 x double> %x) {1078; CHECK-LABEL: lrint_v4f64:1079; CHECK: // %bb.0:1080; CHECK-NEXT: ptrue p0.d1081; CHECK-NEXT: mov x8, #-4332462841530417152 // =0xc3e00000000000001082; CHECK-NEXT: mov z3.d, #0x80000000000000001083; CHECK-NEXT: mov z2.d, x81084; CHECK-NEXT: mov z4.d, #0x80000000000000001085; CHECK-NEXT: mov x8, #4890909195324358655 // =0x43dfffffffffffff1086; CHECK-NEXT: frintx z0.d, p0/m, z0.d1087; CHECK-NEXT: frintx z1.d, p0/m, z1.d1088; CHECK-NEXT: mov z5.d, #0x7fffffffffffffff1089; CHECK-NEXT: fcmge p1.d, p0/z, z0.d, z2.d1090; CHECK-NEXT: fcmge p2.d, p0/z, z1.d, z2.d1091; CHECK-NEXT: mov z2.d, x81092; CHECK-NEXT: fcmuo p3.d, p0/z, z0.d, z0.d1093; CHECK-NEXT: fcvtzs z4.d, p1/m, z0.d1094; CHECK-NEXT: fcmgt p1.d, p0/z, z0.d, z2.d1095; CHECK-NEXT: fcvtzs z3.d, p2/m, z1.d1096; CHECK-NEXT: fcmgt p2.d, p0/z, z1.d, z2.d1097; CHECK-NEXT: fcmuo p0.d, p0/z, z1.d, z1.d1098; CHECK-NEXT: sel z0.d, p1, z5.d, z4.d1099; CHECK-NEXT: sel z1.d, p2, z5.d, z3.d1100; CHECK-NEXT: mov z0.d, p3/m, #0 // =0x01101; CHECK-NEXT: mov z1.d, p0/m, #0 // =0x01102; CHECK-NEXT: ret1103 %a = call <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f64(<vscale x 4 x double> %x)1104 ret <vscale x 4 x iXLen> %a1105}1106declare <vscale x 4 x iXLen> @llvm.lrint.nxv4iXLen.nxv4f64(<vscale x 4 x double>)1107 1108define <vscale x 8 x iXLen> @lrint_v8f64(<vscale x 8 x double> %x) {1109; CHECK-LABEL: lrint_v8f64:1110; CHECK: // %bb.0:1111; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1112; CHECK-NEXT: addvl sp, sp, #-11113; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill1114; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill1115; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill1116; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x38, 0x1e, 0x22 // sp + 16 + 8 * VG1117; CHECK-NEXT: .cfi_offset w29, -161118; CHECK-NEXT: ptrue p0.d1119; CHECK-NEXT: mov x8, #-4332462841530417152 // =0xc3e00000000000001120; CHECK-NEXT: mov z4.d, #0x80000000000000001121; CHECK-NEXT: mov z5.d, x81122; CHECK-NEXT: mov x8, #4890909195324358655 // =0x43dfffffffffffff1123; CHECK-NEXT: mov z6.d, #0x80000000000000001124; CHECK-NEXT: frintx z0.d, p0/m, z0.d1125; CHECK-NEXT: frintx z1.d, p0/m, z1.d1126; CHECK-NEXT: frintx z2.d, p0/m, z2.d1127; CHECK-NEXT: mov z24.d, x81128; CHECK-NEXT: frintx z3.d, p0/m, z3.d1129; CHECK-NEXT: mov z7.d, #0x80000000000000001130; CHECK-NEXT: mov z25.d, #0x7fffffffffffffff1131; CHECK-NEXT: fcmge p1.d, p0/z, z0.d, z5.d1132; CHECK-NEXT: fcmge p2.d, p0/z, z1.d, z5.d1133; CHECK-NEXT: fcmge p3.d, p0/z, z2.d, z5.d1134; CHECK-NEXT: fcmgt p4.d, p0/z, z0.d, z24.d1135; CHECK-NEXT: fcvtzs z4.d, p1/m, z0.d1136; CHECK-NEXT: fcmge p1.d, p0/z, z3.d, z5.d1137; CHECK-NEXT: mov z5.d, #0x80000000000000001138; CHECK-NEXT: fcvtzs z6.d, p2/m, z1.d1139; CHECK-NEXT: fcvtzs z7.d, p3/m, z2.d1140; CHECK-NEXT: fcmuo p2.d, p0/z, z0.d, z0.d1141; CHECK-NEXT: fcmgt p3.d, p0/z, z1.d, z24.d1142; CHECK-NEXT: sel z0.d, p4, z25.d, z4.d1143; CHECK-NEXT: fcmgt p4.d, p0/z, z2.d, z24.d1144; CHECK-NEXT: fcvtzs z5.d, p1/m, z3.d1145; CHECK-NEXT: fcmgt p1.d, p0/z, z3.d, z24.d1146; CHECK-NEXT: fcmuo p5.d, p0/z, z1.d, z1.d1147; CHECK-NEXT: mov z0.d, p2/m, #0 // =0x01148; CHECK-NEXT: sel z1.d, p3, z25.d, z6.d1149; CHECK-NEXT: fcmuo p6.d, p0/z, z2.d, z2.d1150; CHECK-NEXT: sel z2.d, p4, z25.d, z7.d1151; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload1152; CHECK-NEXT: fcmuo p0.d, p0/z, z3.d, z3.d1153; CHECK-NEXT: sel z3.d, p1, z25.d, z5.d1154; CHECK-NEXT: mov z1.d, p5/m, #0 // =0x01155; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload1156; CHECK-NEXT: mov z2.d, p6/m, #0 // =0x01157; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload1158; CHECK-NEXT: mov z3.d, p0/m, #0 // =0x01159; CHECK-NEXT: addvl sp, sp, #11160; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1161; CHECK-NEXT: ret1162 %a = call <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f64(<vscale x 8 x double> %x)1163 ret <vscale x 8 x iXLen> %a1164}1165declare <vscale x 8 x iXLen> @llvm.lrint.nxv8iXLen.nxv8f64(<vscale x 8 x double>)1166 1167define <vscale x 16 x iXLen> @lrint_v16f64(<vscale x 16 x double> %x) {1168; CHECK-LABEL: lrint_v16f64:1169; CHECK: // %bb.0:1170; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1171; CHECK-NEXT: addvl sp, sp, #-31172; CHECK-NEXT: str p10, [sp, #1, mul vl] // 2-byte Spill1173; CHECK-NEXT: str p9, [sp, #2, mul vl] // 2-byte Spill1174; CHECK-NEXT: str p8, [sp, #3, mul vl] // 2-byte Spill1175; CHECK-NEXT: str p7, [sp, #4, mul vl] // 2-byte Spill1176; CHECK-NEXT: str p6, [sp, #5, mul vl] // 2-byte Spill1177; CHECK-NEXT: str p5, [sp, #6, mul vl] // 2-byte Spill1178; CHECK-NEXT: str p4, [sp, #7, mul vl] // 2-byte Spill1179; CHECK-NEXT: str z9, [sp, #1, mul vl] // 16-byte Folded Spill1180; CHECK-NEXT: str z8, [sp, #2, mul vl] // 16-byte Folded Spill1181; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x48, 0x1e, 0x22 // sp + 16 + 24 * VG1182; CHECK-NEXT: .cfi_offset w29, -161183; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 161184; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 161185; CHECK-NEXT: ptrue p0.d1186; CHECK-NEXT: mov x8, #-4332462841530417152 // =0xc3e00000000000001187; CHECK-NEXT: mov z25.d, #0x80000000000000001188; CHECK-NEXT: mov z28.d, #0x80000000000000001189; CHECK-NEXT: mov z26.d, #0x80000000000000001190; CHECK-NEXT: mov z27.d, #0x80000000000000001191; CHECK-NEXT: movprfx z24, z01192; CHECK-NEXT: frintx z24.d, p0/m, z0.d1193; CHECK-NEXT: frintx z3.d, p0/m, z3.d1194; CHECK-NEXT: mov z0.d, x81195; CHECK-NEXT: frintx z1.d, p0/m, z1.d1196; CHECK-NEXT: mov x8, #4890909195324358655 // =0x43dfffffffffffff1197; CHECK-NEXT: frintx z2.d, p0/m, z2.d1198; CHECK-NEXT: frintx z4.d, p0/m, z4.d1199; CHECK-NEXT: frintx z6.d, p0/m, z6.d1200; CHECK-NEXT: mov z30.d, x81201; CHECK-NEXT: mov z29.d, #0x80000000000000001202; CHECK-NEXT: frintx z5.d, p0/m, z5.d1203; CHECK-NEXT: frintx z7.d, p0/m, z7.d1204; CHECK-NEXT: mov z31.d, #0x80000000000000001205; CHECK-NEXT: mov z8.d, #0x7fffffffffffffff1206; CHECK-NEXT: mov z9.d, #0x80000000000000001207; CHECK-NEXT: fcmge p1.d, p0/z, z24.d, z0.d1208; CHECK-NEXT: fcmge p4.d, p0/z, z3.d, z0.d1209; CHECK-NEXT: fcmge p2.d, p0/z, z1.d, z0.d1210; CHECK-NEXT: fcmge p3.d, p0/z, z2.d, z0.d1211; CHECK-NEXT: fcvtzs z25.d, p1/m, z24.d1212; CHECK-NEXT: fcvtzs z28.d, p4/m, z3.d1213; CHECK-NEXT: fcvtzs z26.d, p2/m, z1.d1214; CHECK-NEXT: fcmge p5.d, p0/z, z4.d, z0.d1215; CHECK-NEXT: fcvtzs z27.d, p3/m, z2.d1216; CHECK-NEXT: fcmgt p4.d, p0/z, z24.d, z30.d1217; CHECK-NEXT: fcmuo p1.d, p0/z, z24.d, z24.d1218; CHECK-NEXT: mov z24.d, #0x80000000000000001219; CHECK-NEXT: fcmge p7.d, p0/z, z6.d, z0.d1220; CHECK-NEXT: fcvtzs z29.d, p5/m, z4.d1221; CHECK-NEXT: fcmge p3.d, p0/z, z5.d, z0.d1222; CHECK-NEXT: fcmgt p5.d, p0/z, z1.d, z30.d1223; CHECK-NEXT: fcvtzs z24.d, p7/m, z6.d1224; CHECK-NEXT: fcmgt p6.d, p0/z, z2.d, z30.d1225; CHECK-NEXT: fcmge p7.d, p0/z, z7.d, z0.d1226; CHECK-NEXT: fcvtzs z31.d, p3/m, z5.d1227; CHECK-NEXT: sel z0.d, p4, z8.d, z25.d1228; CHECK-NEXT: fcmgt p8.d, p0/z, z3.d, z30.d1229; CHECK-NEXT: fcmgt p9.d, p0/z, z4.d, z30.d1230; CHECK-NEXT: mov z0.d, p1/m, #0 // =0x01231; CHECK-NEXT: fcvtzs z9.d, p7/m, z7.d1232; CHECK-NEXT: fcmuo p2.d, p0/z, z1.d, z1.d1233; CHECK-NEXT: sel z1.d, p5, z8.d, z26.d1234; CHECK-NEXT: fcmuo p3.d, p0/z, z2.d, z2.d1235; CHECK-NEXT: sel z2.d, p6, z8.d, z27.d1236; CHECK-NEXT: fcmgt p5.d, p0/z, z5.d, z30.d1237; CHECK-NEXT: fcmgt p6.d, p0/z, z6.d, z30.d1238; CHECK-NEXT: mov z1.d, p2/m, #0 // =0x01239; CHECK-NEXT: mov z2.d, p3/m, #0 // =0x01240; CHECK-NEXT: fcmgt p7.d, p0/z, z7.d, z30.d1241; CHECK-NEXT: fcmuo p10.d, p0/z, z3.d, z3.d1242; CHECK-NEXT: sel z3.d, p8, z8.d, z28.d1243; CHECK-NEXT: fcmuo p4.d, p0/z, z4.d, z4.d1244; CHECK-NEXT: sel z4.d, p9, z8.d, z29.d1245; CHECK-NEXT: fcmuo p8.d, p0/z, z5.d, z5.d1246; CHECK-NEXT: sel z5.d, p5, z8.d, z31.d1247; CHECK-NEXT: ldr p5, [sp, #6, mul vl] // 2-byte Reload1248; CHECK-NEXT: fcmuo p9.d, p0/z, z6.d, z6.d1249; CHECK-NEXT: sel z6.d, p6, z8.d, z24.d1250; CHECK-NEXT: ldr p6, [sp, #5, mul vl] // 2-byte Reload1251; CHECK-NEXT: mov z3.d, p10/m, #0 // =0x01252; CHECK-NEXT: ldr p10, [sp, #1, mul vl] // 2-byte Reload1253; CHECK-NEXT: mov z4.d, p4/m, #0 // =0x01254; CHECK-NEXT: ldr p4, [sp, #7, mul vl] // 2-byte Reload1255; CHECK-NEXT: mov z5.d, p8/m, #0 // =0x01256; CHECK-NEXT: ldr p8, [sp, #3, mul vl] // 2-byte Reload1257; CHECK-NEXT: mov z6.d, p9/m, #0 // =0x01258; CHECK-NEXT: ldr p9, [sp, #2, mul vl] // 2-byte Reload1259; CHECK-NEXT: fcmuo p0.d, p0/z, z7.d, z7.d1260; CHECK-NEXT: sel z7.d, p7, z8.d, z9.d1261; CHECK-NEXT: ldr z9, [sp, #1, mul vl] // 16-byte Folded Reload1262; CHECK-NEXT: ldr z8, [sp, #2, mul vl] // 16-byte Folded Reload1263; CHECK-NEXT: ldr p7, [sp, #4, mul vl] // 2-byte Reload1264; CHECK-NEXT: mov z7.d, p0/m, #0 // =0x01265; CHECK-NEXT: addvl sp, sp, #31266; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1267; CHECK-NEXT: ret1268 %a = call <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f64(<vscale x 16 x double> %x)1269 ret <vscale x 16 x iXLen> %a1270}1271declare <vscale x 16 x iXLen> @llvm.lrint.nxv16iXLen.nxv16f64(<vscale x 16 x double>)1272 1273define <vscale x 32 x iXLen> @lrint_v32f64(<vscale x 32 x double> %x) {1274; CHECK-LABEL: lrint_v32f64:1275; CHECK: // %bb.0:1276; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill1277; CHECK-NEXT: addvl sp, sp, #-181278; CHECK-NEXT: str p12, [sp, #7, mul vl] // 2-byte Spill1279; CHECK-NEXT: str p11, [sp, #8, mul vl] // 2-byte Spill1280; CHECK-NEXT: str p10, [sp, #9, mul vl] // 2-byte Spill1281; CHECK-NEXT: str p9, [sp, #10, mul vl] // 2-byte Spill1282; CHECK-NEXT: str p8, [sp, #11, mul vl] // 2-byte Spill1283; CHECK-NEXT: str p7, [sp, #12, mul vl] // 2-byte Spill1284; CHECK-NEXT: str p6, [sp, #13, mul vl] // 2-byte Spill1285; CHECK-NEXT: str p5, [sp, #14, mul vl] // 2-byte Spill1286; CHECK-NEXT: str p4, [sp, #15, mul vl] // 2-byte Spill1287; CHECK-NEXT: str z23, [sp, #2, mul vl] // 16-byte Folded Spill1288; CHECK-NEXT: str z22, [sp, #3, mul vl] // 16-byte Folded Spill1289; CHECK-NEXT: str z21, [sp, #4, mul vl] // 16-byte Folded Spill1290; CHECK-NEXT: str z20, [sp, #5, mul vl] // 16-byte Folded Spill1291; CHECK-NEXT: str z19, [sp, #6, mul vl] // 16-byte Folded Spill1292; CHECK-NEXT: str z18, [sp, #7, mul vl] // 16-byte Folded Spill1293; CHECK-NEXT: str z17, [sp, #8, mul vl] // 16-byte Folded Spill1294; CHECK-NEXT: str z16, [sp, #9, mul vl] // 16-byte Folded Spill1295; CHECK-NEXT: str z15, [sp, #10, mul vl] // 16-byte Folded Spill1296; CHECK-NEXT: str z14, [sp, #11, mul vl] // 16-byte Folded Spill1297; CHECK-NEXT: str z13, [sp, #12, mul vl] // 16-byte Folded Spill1298; CHECK-NEXT: str z12, [sp, #13, mul vl] // 16-byte Folded Spill1299; CHECK-NEXT: str z11, [sp, #14, mul vl] // 16-byte Folded Spill1300; CHECK-NEXT: str z10, [sp, #15, mul vl] // 16-byte Folded Spill1301; CHECK-NEXT: str z9, [sp, #16, mul vl] // 16-byte Folded Spill1302; CHECK-NEXT: str z8, [sp, #17, mul vl] // 16-byte Folded Spill1303; CHECK-NEXT: addvl sp, sp, #-11304; CHECK-NEXT: .cfi_escape 0x0f, 0x0a, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x98, 0x01, 0x1e, 0x22 // sp + 16 + 152 * VG1305; CHECK-NEXT: .cfi_offset w29, -161306; CHECK-NEXT: .cfi_escape 0x10, 0x48, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x78, 0x1e, 0x22, 0x40, 0x1c // $d8 @ cfa - 8 * VG - 161307; CHECK-NEXT: .cfi_escape 0x10, 0x49, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x70, 0x1e, 0x22, 0x40, 0x1c // $d9 @ cfa - 16 * VG - 161308; CHECK-NEXT: .cfi_escape 0x10, 0x4a, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x68, 0x1e, 0x22, 0x40, 0x1c // $d10 @ cfa - 24 * VG - 161309; CHECK-NEXT: .cfi_escape 0x10, 0x4b, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x60, 0x1e, 0x22, 0x40, 0x1c // $d11 @ cfa - 32 * VG - 161310; CHECK-NEXT: .cfi_escape 0x10, 0x4c, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x58, 0x1e, 0x22, 0x40, 0x1c // $d12 @ cfa - 40 * VG - 161311; CHECK-NEXT: .cfi_escape 0x10, 0x4d, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x50, 0x1e, 0x22, 0x40, 0x1c // $d13 @ cfa - 48 * VG - 161312; CHECK-NEXT: .cfi_escape 0x10, 0x4e, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x48, 0x1e, 0x22, 0x40, 0x1c // $d14 @ cfa - 56 * VG - 161313; CHECK-NEXT: .cfi_escape 0x10, 0x4f, 0x09, 0x92, 0x2e, 0x00, 0x11, 0x40, 0x1e, 0x22, 0x40, 0x1c // $d15 @ cfa - 64 * VG - 161314; CHECK-NEXT: ldr z0, [x0]1315; CHECK-NEXT: ptrue p0.d1316; CHECK-NEXT: mov x9, #-4332462841530417152 // =0xc3e00000000000001317; CHECK-NEXT: mov z25.d, x91318; CHECK-NEXT: ldr z7, [x0, #3, mul vl]1319; CHECK-NEXT: ldr z27, [x0, #4, mul vl]1320; CHECK-NEXT: ldr z4, [x0, #2, mul vl]1321; CHECK-NEXT: ldr z2, [x0, #1, mul vl]1322; CHECK-NEXT: ldr z9, [x0, #15, mul vl]1323; CHECK-NEXT: movprfx z5, z01324; CHECK-NEXT: frintx z5.d, p0/m, z0.d1325; CHECK-NEXT: mov z0.d, #0x80000000000000001326; CHECK-NEXT: ldr z10, [x0, #14, mul vl]1327; CHECK-NEXT: frintx z7.d, p0/m, z7.d1328; CHECK-NEXT: movprfx z14, z271329; CHECK-NEXT: frintx z14.d, p0/m, z27.d1330; CHECK-NEXT: ldr z11, [x0, #13, mul vl]1331; CHECK-NEXT: frintx z4.d, p0/m, z4.d1332; CHECK-NEXT: ldr z8, [x0, #12, mul vl]1333; CHECK-NEXT: ldr z27, [x0, #5, mul vl]1334; CHECK-NEXT: ldr z18, [x0, #11, mul vl]1335; CHECK-NEXT: ldr z13, [x0, #10, mul vl]1336; CHECK-NEXT: ldr z29, [x0, #6, mul vl]1337; CHECK-NEXT: fcmge p1.d, p0/z, z5.d, z25.d1338; CHECK-NEXT: mov x9, #4890909195324358655 // =0x43dfffffffffffff1339; CHECK-NEXT: mov z24.d, #0x80000000000000001340; CHECK-NEXT: mov z30.d, #0x80000000000000001341; CHECK-NEXT: movprfx z28, z271342; CHECK-NEXT: frintx z28.d, p0/m, z27.d1343; CHECK-NEXT: mov z1.d, x91344; CHECK-NEXT: fcmge p2.d, p0/z, z7.d, z25.d1345; CHECK-NEXT: frintx z29.d, p0/m, z29.d1346; CHECK-NEXT: movprfx z3, z21347; CHECK-NEXT: frintx z3.d, p0/m, z2.d1348; CHECK-NEXT: fcmge p3.d, p0/z, z14.d, z25.d1349; CHECK-NEXT: mov z6.d, #0x80000000000000001350; CHECK-NEXT: mov z12.d, #0x80000000000000001351; CHECK-NEXT: fcvtzs z0.d, p1/m, z5.d1352; CHECK-NEXT: frintx z18.d, p0/m, z18.d1353; CHECK-NEXT: mov z2.d, #0x80000000000000001354; CHECK-NEXT: fcmge p5.d, p0/z, z4.d, z25.d1355; CHECK-NEXT: mov z16.d, #0x80000000000000001356; CHECK-NEXT: mov z17.d, #0x80000000000000001357; CHECK-NEXT: fcvtzs z24.d, p2/m, z7.d1358; CHECK-NEXT: frintx z10.d, p0/m, z10.d1359; CHECK-NEXT: frintx z9.d, p0/m, z9.d1360; CHECK-NEXT: fcvtzs z30.d, p3/m, z14.d1361; CHECK-NEXT: frintx z13.d, p0/m, z13.d1362; CHECK-NEXT: mov z21.d, #0x80000000000000001363; CHECK-NEXT: str z0, [sp] // 16-byte Folded Spill1364; CHECK-NEXT: mov z22.d, #0x80000000000000001365; CHECK-NEXT: movprfx z0, z81366; CHECK-NEXT: frintx z0.d, p0/m, z8.d1367; CHECK-NEXT: ldr z31, [x0, #7, mul vl]1368; CHECK-NEXT: ldr z15, [x0, #8, mul vl]1369; CHECK-NEXT: ldr z19, [x0, #9, mul vl]1370; CHECK-NEXT: fcmge p1.d, p0/z, z28.d, z25.d1371; CHECK-NEXT: fcvtzs z6.d, p5/m, z4.d1372; CHECK-NEXT: mov z26.d, #0x80000000000000001373; CHECK-NEXT: fcmgt p10.d, p0/z, z14.d, z1.d1374; CHECK-NEXT: mov z27.d, #0x7fffffffffffffff1375; CHECK-NEXT: mov z23.d, #0x80000000000000001376; CHECK-NEXT: movprfx z20, z311377; CHECK-NEXT: frintx z20.d, p0/m, z31.d1378; CHECK-NEXT: frintx z15.d, p0/m, z15.d1379; CHECK-NEXT: mov z31.d, #0x80000000000000001380; CHECK-NEXT: fcmge p2.d, p0/z, z29.d, z25.d1381; CHECK-NEXT: fcmuo p8.d, p0/z, z14.d, z14.d1382; CHECK-NEXT: movprfx z14, z191383; CHECK-NEXT: frintx z14.d, p0/m, z19.d1384; CHECK-NEXT: movprfx z19, z111385; CHECK-NEXT: frintx z19.d, p0/m, z11.d1386; CHECK-NEXT: fcmge p4.d, p0/z, z3.d, z25.d1387; CHECK-NEXT: fcvtzs z12.d, p1/m, z28.d1388; CHECK-NEXT: mov z11.d, #0x80000000000000001389; CHECK-NEXT: mov z30.d, p10/m, z27.d1390; CHECK-NEXT: fcvtzs z31.d, p2/m, z29.d1391; CHECK-NEXT: fcmge p5.d, p0/z, z20.d, z25.d1392; CHECK-NEXT: fcmge p6.d, p0/z, z15.d, z25.d1393; CHECK-NEXT: fcvtzs z2.d, p4/m, z3.d1394; CHECK-NEXT: mov z30.d, p8/m, #0 // =0x01395; CHECK-NEXT: fcmge p1.d, p0/z, z18.d, z25.d1396; CHECK-NEXT: fcmge p2.d, p0/z, z19.d, z25.d1397; CHECK-NEXT: fcvtzs z16.d, p5/m, z20.d1398; CHECK-NEXT: fcvtzs z17.d, p6/m, z15.d1399; CHECK-NEXT: fcmgt p12.d, p0/z, z28.d, z1.d1400; CHECK-NEXT: fcvtzs z21.d, p1/m, z18.d1401; CHECK-NEXT: fcvtzs z22.d, p2/m, z19.d1402; CHECK-NEXT: fcmgt p5.d, p0/z, z20.d, z1.d1403; CHECK-NEXT: fcmge p3.d, p0/z, z10.d, z25.d1404; CHECK-NEXT: fcmgt p11.d, p0/z, z15.d, z1.d1405; CHECK-NEXT: sel z8.d, p12, z27.d, z12.d1406; CHECK-NEXT: fcmge p4.d, p0/z, z9.d, z25.d1407; CHECK-NEXT: sel z12.d, p5, z27.d, z16.d1408; CHECK-NEXT: fcmge p6.d, p0/z, z14.d, z25.d1409; CHECK-NEXT: fcvtzs z23.d, p3/m, z10.d1410; CHECK-NEXT: fcmge p7.d, p0/z, z13.d, z25.d1411; CHECK-NEXT: fcvtzs z26.d, p4/m, z9.d1412; CHECK-NEXT: fcmuo p1.d, p0/z, z15.d, z15.d1413; CHECK-NEXT: sel z15.d, p11, z27.d, z17.d1414; CHECK-NEXT: fcvtzs z11.d, p6/m, z14.d1415; CHECK-NEXT: fcmge p2.d, p0/z, z0.d, z25.d1416; CHECK-NEXT: mov z25.d, #0x80000000000000001417; CHECK-NEXT: fcmgt p4.d, p0/z, z9.d, z1.d1418; CHECK-NEXT: mov z15.d, p1/m, #0 // =0x01419; CHECK-NEXT: fcmgt p5.d, p0/z, z10.d, z1.d1420; CHECK-NEXT: fcmgt p3.d, p0/z, z19.d, z1.d1421; CHECK-NEXT: fcvtzs z25.d, p2/m, z0.d1422; CHECK-NEXT: str z15, [x8, #8, mul vl]1423; CHECK-NEXT: mov z26.d, p4/m, z27.d1424; CHECK-NEXT: fcmuo p9.d, p0/z, z20.d, z20.d1425; CHECK-NEXT: mov z20.d, #0x80000000000000001426; CHECK-NEXT: fcmuo p1.d, p0/z, z9.d, z9.d1427; CHECK-NEXT: sel z9.d, p5, z27.d, z23.d1428; CHECK-NEXT: fcmuo p2.d, p0/z, z10.d, z10.d1429; CHECK-NEXT: sel z10.d, p3, z27.d, z22.d1430; CHECK-NEXT: fcmuo p6.d, p0/z, z19.d, z19.d1431; CHECK-NEXT: fcvtzs z20.d, p7/m, z13.d1432; CHECK-NEXT: mov z12.d, p9/m, #0 // =0x01433; CHECK-NEXT: mov z26.d, p1/m, #0 // =0x01434; CHECK-NEXT: mov z9.d, p2/m, #0 // =0x01435; CHECK-NEXT: str z12, [x8, #7, mul vl]1436; CHECK-NEXT: mov z10.d, p6/m, #0 // =0x01437; CHECK-NEXT: fcmgt p4.d, p0/z, z14.d, z1.d1438; CHECK-NEXT: str z26, [x8, #15, mul vl]1439; CHECK-NEXT: fcmgt p3.d, p0/z, z0.d, z1.d1440; CHECK-NEXT: str z9, [x8, #14, mul vl]1441; CHECK-NEXT: fcmgt p1.d, p0/z, z18.d, z1.d1442; CHECK-NEXT: str z10, [x8, #13, mul vl]1443; CHECK-NEXT: fcmgt p2.d, p0/z, z13.d, z1.d1444; CHECK-NEXT: fcmuo p5.d, p0/z, z14.d, z14.d1445; CHECK-NEXT: fcmuo p6.d, p0/z, z0.d, z0.d1446; CHECK-NEXT: sel z0.d, p4, z27.d, z11.d1447; CHECK-NEXT: mov z25.d, p3/m, z27.d1448; CHECK-NEXT: sel z26.d, p1, z27.d, z21.d1449; CHECK-NEXT: sel z9.d, p2, z27.d, z20.d1450; CHECK-NEXT: fcmuo p4.d, p0/z, z18.d, z18.d1451; CHECK-NEXT: mov z0.d, p5/m, #0 // =0x01452; CHECK-NEXT: mov z25.d, p6/m, #0 // =0x01453; CHECK-NEXT: fcmuo p3.d, p0/z, z13.d, z13.d1454; CHECK-NEXT: fcmgt p1.d, p0/z, z3.d, z1.d1455; CHECK-NEXT: str z0, [x8, #9, mul vl]1456; CHECK-NEXT: mov z26.d, p4/m, #0 // =0x01457; CHECK-NEXT: str z25, [x8, #12, mul vl]1458; CHECK-NEXT: fcmgt p2.d, p0/z, z4.d, z1.d1459; CHECK-NEXT: mov z9.d, p3/m, #0 // =0x01460; CHECK-NEXT: fcmgt p4.d, p0/z, z7.d, z1.d1461; CHECK-NEXT: str z26, [x8, #11, mul vl]1462; CHECK-NEXT: mov z2.d, p1/m, z27.d1463; CHECK-NEXT: fcmuo p3.d, p0/z, z28.d, z28.d1464; CHECK-NEXT: fcmgt p6.d, p0/z, z29.d, z1.d1465; CHECK-NEXT: str z9, [x8, #10, mul vl]1466; CHECK-NEXT: mov z6.d, p2/m, z27.d1467; CHECK-NEXT: fcmgt p1.d, p0/z, z5.d, z1.d1468; CHECK-NEXT: ldr z1, [sp] // 16-byte Folded Reload1469; CHECK-NEXT: str z30, [x8, #4, mul vl]1470; CHECK-NEXT: fcmuo p5.d, p0/z, z29.d, z29.d1471; CHECK-NEXT: sel z0.d, p4, z27.d, z24.d1472; CHECK-NEXT: mov z8.d, p3/m, #0 // =0x01473; CHECK-NEXT: fcmuo p2.d, p0/z, z7.d, z7.d1474; CHECK-NEXT: sel z25.d, p6, z27.d, z31.d1475; CHECK-NEXT: mov z1.d, p1/m, z27.d1476; CHECK-NEXT: fcmuo p3.d, p0/z, z4.d, z4.d1477; CHECK-NEXT: str z8, [x8, #5, mul vl]1478; CHECK-NEXT: fcmuo p4.d, p0/z, z3.d, z3.d1479; CHECK-NEXT: mov z25.d, p5/m, #0 // =0x01480; CHECK-NEXT: mov z0.d, p2/m, #0 // =0x01481; CHECK-NEXT: fcmuo p0.d, p0/z, z5.d, z5.d1482; CHECK-NEXT: mov z6.d, p3/m, #0 // =0x01483; CHECK-NEXT: str z25, [x8, #6, mul vl]1484; CHECK-NEXT: mov z2.d, p4/m, #0 // =0x01485; CHECK-NEXT: str z0, [x8, #3, mul vl]1486; CHECK-NEXT: mov z1.d, p0/m, #0 // =0x01487; CHECK-NEXT: str z6, [x8, #2, mul vl]1488; CHECK-NEXT: str z2, [x8, #1, mul vl]1489; CHECK-NEXT: str z1, [x8]1490; CHECK-NEXT: addvl sp, sp, #11491; CHECK-NEXT: ldr z23, [sp, #2, mul vl] // 16-byte Folded Reload1492; CHECK-NEXT: ldr z22, [sp, #3, mul vl] // 16-byte Folded Reload1493; CHECK-NEXT: ldr z21, [sp, #4, mul vl] // 16-byte Folded Reload1494; CHECK-NEXT: ldr z20, [sp, #5, mul vl] // 16-byte Folded Reload1495; CHECK-NEXT: ldr z19, [sp, #6, mul vl] // 16-byte Folded Reload1496; CHECK-NEXT: ldr z18, [sp, #7, mul vl] // 16-byte Folded Reload1497; CHECK-NEXT: ldr z17, [sp, #8, mul vl] // 16-byte Folded Reload1498; CHECK-NEXT: ldr z16, [sp, #9, mul vl] // 16-byte Folded Reload1499; CHECK-NEXT: ldr z15, [sp, #10, mul vl] // 16-byte Folded Reload1500; CHECK-NEXT: ldr z14, [sp, #11, mul vl] // 16-byte Folded Reload1501; CHECK-NEXT: ldr z13, [sp, #12, mul vl] // 16-byte Folded Reload1502; CHECK-NEXT: ldr z12, [sp, #13, mul vl] // 16-byte Folded Reload1503; CHECK-NEXT: ldr z11, [sp, #14, mul vl] // 16-byte Folded Reload1504; CHECK-NEXT: ldr z10, [sp, #15, mul vl] // 16-byte Folded Reload1505; CHECK-NEXT: ldr z9, [sp, #16, mul vl] // 16-byte Folded Reload1506; CHECK-NEXT: ldr z8, [sp, #17, mul vl] // 16-byte Folded Reload1507; CHECK-NEXT: ldr p12, [sp, #7, mul vl] // 2-byte Reload1508; CHECK-NEXT: ldr p11, [sp, #8, mul vl] // 2-byte Reload1509; CHECK-NEXT: ldr p10, [sp, #9, mul vl] // 2-byte Reload1510; CHECK-NEXT: ldr p9, [sp, #10, mul vl] // 2-byte Reload1511; CHECK-NEXT: ldr p8, [sp, #11, mul vl] // 2-byte Reload1512; CHECK-NEXT: ldr p7, [sp, #12, mul vl] // 2-byte Reload1513; CHECK-NEXT: ldr p6, [sp, #13, mul vl] // 2-byte Reload1514; CHECK-NEXT: ldr p5, [sp, #14, mul vl] // 2-byte Reload1515; CHECK-NEXT: ldr p4, [sp, #15, mul vl] // 2-byte Reload1516; CHECK-NEXT: addvl sp, sp, #181517; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload1518; CHECK-NEXT: ret1519 %a = call <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv16f64(<vscale x 32 x double> %x)1520 ret <vscale x 32 x iXLen> %a1521}1522declare <vscale x 32 x iXLen> @llvm.lrint.nxv32iXLen.nxv32f64(<vscale x 32 x double>)1523