1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; 9; CEIL -> FRINTP 10; 11 12define <2 x half> @frintp_v2f16(<2 x half> %op) { 13; CHECK-LABEL: frintp_v2f16: 14; CHECK: // %bb.0: 15; CHECK-NEXT: ptrue p0.h, vl4 16; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 17; CHECK-NEXT: frintp z0.h, p0/m, z0.h 18; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 19; CHECK-NEXT: ret 20; 21; NONEON-NOSVE-LABEL: frintp_v2f16: 22; NONEON-NOSVE: // %bb.0: 23; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 24; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 25; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 26; NONEON-NOSVE-NEXT: fcvt s0, h0 27; NONEON-NOSVE-NEXT: frintp s0, s0 28; NONEON-NOSVE-NEXT: fcvt h0, s0 29; NONEON-NOSVE-NEXT: str h0, [sp, #14] 30; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 31; NONEON-NOSVE-NEXT: fcvt s0, h0 32; NONEON-NOSVE-NEXT: frintp s0, s0 33; NONEON-NOSVE-NEXT: fcvt h0, s0 34; NONEON-NOSVE-NEXT: str h0, [sp, #12] 35; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 36; NONEON-NOSVE-NEXT: fcvt s0, h0 37; NONEON-NOSVE-NEXT: frintp s0, s0 38; NONEON-NOSVE-NEXT: fcvt h0, s0 39; NONEON-NOSVE-NEXT: str h0, [sp, #10] 40; NONEON-NOSVE-NEXT: ldr h0, [sp] 41; NONEON-NOSVE-NEXT: fcvt s0, h0 42; NONEON-NOSVE-NEXT: frintp s0, s0 43; NONEON-NOSVE-NEXT: fcvt h0, s0 44; NONEON-NOSVE-NEXT: str h0, [sp, #8] 45; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 46; NONEON-NOSVE-NEXT: add sp, sp, #16 47; NONEON-NOSVE-NEXT: ret 48 %res = call <2 x half> @llvm.ceil.v2f16(<2 x half> %op) 49 ret <2 x half> %res 50} 51 52define <4 x half> @frintp_v4f16(<4 x half> %op) { 53; CHECK-LABEL: frintp_v4f16: 54; CHECK: // %bb.0: 55; CHECK-NEXT: ptrue p0.h, vl4 56; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 57; CHECK-NEXT: frintp z0.h, p0/m, z0.h 58; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 59; CHECK-NEXT: ret 60; 61; NONEON-NOSVE-LABEL: frintp_v4f16: 62; NONEON-NOSVE: // %bb.0: 63; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 64; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 65; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 66; NONEON-NOSVE-NEXT: fcvt s0, h0 67; NONEON-NOSVE-NEXT: frintp s0, s0 68; NONEON-NOSVE-NEXT: fcvt h0, s0 69; NONEON-NOSVE-NEXT: str h0, [sp, #14] 70; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 71; NONEON-NOSVE-NEXT: fcvt s0, h0 72; NONEON-NOSVE-NEXT: frintp s0, s0 73; NONEON-NOSVE-NEXT: fcvt h0, s0 74; NONEON-NOSVE-NEXT: str h0, [sp, #12] 75; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 76; NONEON-NOSVE-NEXT: fcvt s0, h0 77; NONEON-NOSVE-NEXT: frintp s0, s0 78; NONEON-NOSVE-NEXT: fcvt h0, s0 79; NONEON-NOSVE-NEXT: str h0, [sp, #10] 80; NONEON-NOSVE-NEXT: ldr h0, [sp] 81; NONEON-NOSVE-NEXT: fcvt s0, h0 82; NONEON-NOSVE-NEXT: frintp s0, s0 83; NONEON-NOSVE-NEXT: fcvt h0, s0 84; NONEON-NOSVE-NEXT: str h0, [sp, #8] 85; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 86; NONEON-NOSVE-NEXT: add sp, sp, #16 87; NONEON-NOSVE-NEXT: ret 88 %res = call <4 x half> @llvm.ceil.v4f16(<4 x half> %op) 89 ret <4 x half> %res 90} 91 92define <8 x half> @frintp_v8f16(<8 x half> %op) { 93; CHECK-LABEL: frintp_v8f16: 94; CHECK: // %bb.0: 95; CHECK-NEXT: ptrue p0.h, vl8 96; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 97; CHECK-NEXT: frintp z0.h, p0/m, z0.h 98; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 99; CHECK-NEXT: ret 100; 101; NONEON-NOSVE-LABEL: frintp_v8f16: 102; NONEON-NOSVE: // %bb.0: 103; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 104; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 105; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 106; NONEON-NOSVE-NEXT: fcvt s0, h0 107; NONEON-NOSVE-NEXT: frintp s0, s0 108; NONEON-NOSVE-NEXT: fcvt h0, s0 109; NONEON-NOSVE-NEXT: str h0, [sp, #30] 110; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 111; NONEON-NOSVE-NEXT: fcvt s0, h0 112; NONEON-NOSVE-NEXT: frintp s0, s0 113; NONEON-NOSVE-NEXT: fcvt h0, s0 114; NONEON-NOSVE-NEXT: str h0, [sp, #28] 115; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 116; NONEON-NOSVE-NEXT: fcvt s0, h0 117; NONEON-NOSVE-NEXT: frintp s0, s0 118; NONEON-NOSVE-NEXT: fcvt h0, s0 119; NONEON-NOSVE-NEXT: str h0, [sp, #26] 120; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 121; NONEON-NOSVE-NEXT: fcvt s0, h0 122; NONEON-NOSVE-NEXT: frintp s0, s0 123; NONEON-NOSVE-NEXT: fcvt h0, s0 124; NONEON-NOSVE-NEXT: str h0, [sp, #24] 125; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 126; NONEON-NOSVE-NEXT: fcvt s0, h0 127; NONEON-NOSVE-NEXT: frintp s0, s0 128; NONEON-NOSVE-NEXT: fcvt h0, s0 129; NONEON-NOSVE-NEXT: str h0, [sp, #22] 130; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 131; NONEON-NOSVE-NEXT: fcvt s0, h0 132; NONEON-NOSVE-NEXT: frintp s0, s0 133; NONEON-NOSVE-NEXT: fcvt h0, s0 134; NONEON-NOSVE-NEXT: str h0, [sp, #20] 135; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 136; NONEON-NOSVE-NEXT: fcvt s0, h0 137; NONEON-NOSVE-NEXT: frintp s0, s0 138; NONEON-NOSVE-NEXT: fcvt h0, s0 139; NONEON-NOSVE-NEXT: str h0, [sp, #18] 140; NONEON-NOSVE-NEXT: ldr h0, [sp] 141; NONEON-NOSVE-NEXT: fcvt s0, h0 142; NONEON-NOSVE-NEXT: frintp s0, s0 143; NONEON-NOSVE-NEXT: fcvt h0, s0 144; NONEON-NOSVE-NEXT: str h0, [sp, #16] 145; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 146; NONEON-NOSVE-NEXT: add sp, sp, #32 147; NONEON-NOSVE-NEXT: ret 148 %res = call <8 x half> @llvm.ceil.v8f16(<8 x half> %op) 149 ret <8 x half> %res 150} 151 152define void @frintp_v16f16(ptr %a) { 153; CHECK-LABEL: frintp_v16f16: 154; CHECK: // %bb.0: 155; CHECK-NEXT: ldp q0, q1, [x0] 156; CHECK-NEXT: ptrue p0.h, vl8 157; CHECK-NEXT: frintp z0.h, p0/m, z0.h 158; CHECK-NEXT: frintp z1.h, p0/m, z1.h 159; CHECK-NEXT: stp q0, q1, [x0] 160; CHECK-NEXT: ret 161; 162; NONEON-NOSVE-LABEL: frintp_v16f16: 163; NONEON-NOSVE: // %bb.0: 164; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 165; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 166; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 167; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 168; NONEON-NOSVE-NEXT: fcvt s0, h0 169; NONEON-NOSVE-NEXT: frintp s0, s0 170; NONEON-NOSVE-NEXT: fcvt h0, s0 171; NONEON-NOSVE-NEXT: str h0, [sp, #62] 172; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 173; NONEON-NOSVE-NEXT: fcvt s0, h0 174; NONEON-NOSVE-NEXT: frintp s0, s0 175; NONEON-NOSVE-NEXT: fcvt h0, s0 176; NONEON-NOSVE-NEXT: str h0, [sp, #60] 177; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 178; NONEON-NOSVE-NEXT: fcvt s0, h0 179; NONEON-NOSVE-NEXT: frintp s0, s0 180; NONEON-NOSVE-NEXT: fcvt h0, s0 181; NONEON-NOSVE-NEXT: str h0, [sp, #58] 182; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 183; NONEON-NOSVE-NEXT: fcvt s0, h0 184; NONEON-NOSVE-NEXT: frintp s0, s0 185; NONEON-NOSVE-NEXT: fcvt h0, s0 186; NONEON-NOSVE-NEXT: str h0, [sp, #56] 187; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 188; NONEON-NOSVE-NEXT: fcvt s0, h0 189; NONEON-NOSVE-NEXT: frintp s0, s0 190; NONEON-NOSVE-NEXT: fcvt h0, s0 191; NONEON-NOSVE-NEXT: str h0, [sp, #54] 192; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 193; NONEON-NOSVE-NEXT: fcvt s0, h0 194; NONEON-NOSVE-NEXT: frintp s0, s0 195; NONEON-NOSVE-NEXT: fcvt h0, s0 196; NONEON-NOSVE-NEXT: str h0, [sp, #52] 197; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 198; NONEON-NOSVE-NEXT: fcvt s0, h0 199; NONEON-NOSVE-NEXT: frintp s0, s0 200; NONEON-NOSVE-NEXT: fcvt h0, s0 201; NONEON-NOSVE-NEXT: str h0, [sp, #50] 202; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 203; NONEON-NOSVE-NEXT: fcvt s0, h0 204; NONEON-NOSVE-NEXT: frintp s0, s0 205; NONEON-NOSVE-NEXT: fcvt h0, s0 206; NONEON-NOSVE-NEXT: str h0, [sp, #48] 207; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 208; NONEON-NOSVE-NEXT: fcvt s0, h0 209; NONEON-NOSVE-NEXT: frintp s0, s0 210; NONEON-NOSVE-NEXT: fcvt h0, s0 211; NONEON-NOSVE-NEXT: str h0, [sp, #46] 212; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 213; NONEON-NOSVE-NEXT: fcvt s0, h0 214; NONEON-NOSVE-NEXT: frintp s0, s0 215; NONEON-NOSVE-NEXT: fcvt h0, s0 216; NONEON-NOSVE-NEXT: str h0, [sp, #44] 217; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 218; NONEON-NOSVE-NEXT: fcvt s0, h0 219; NONEON-NOSVE-NEXT: frintp s0, s0 220; NONEON-NOSVE-NEXT: fcvt h0, s0 221; NONEON-NOSVE-NEXT: str h0, [sp, #42] 222; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 223; NONEON-NOSVE-NEXT: fcvt s0, h0 224; NONEON-NOSVE-NEXT: frintp s0, s0 225; NONEON-NOSVE-NEXT: fcvt h0, s0 226; NONEON-NOSVE-NEXT: str h0, [sp, #40] 227; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 228; NONEON-NOSVE-NEXT: fcvt s0, h0 229; NONEON-NOSVE-NEXT: frintp s0, s0 230; NONEON-NOSVE-NEXT: fcvt h0, s0 231; NONEON-NOSVE-NEXT: str h0, [sp, #38] 232; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 233; NONEON-NOSVE-NEXT: fcvt s0, h0 234; NONEON-NOSVE-NEXT: frintp s0, s0 235; NONEON-NOSVE-NEXT: fcvt h0, s0 236; NONEON-NOSVE-NEXT: str h0, [sp, #36] 237; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 238; NONEON-NOSVE-NEXT: fcvt s0, h0 239; NONEON-NOSVE-NEXT: frintp s0, s0 240; NONEON-NOSVE-NEXT: fcvt h0, s0 241; NONEON-NOSVE-NEXT: str h0, [sp, #34] 242; NONEON-NOSVE-NEXT: ldr h0, [sp] 243; NONEON-NOSVE-NEXT: fcvt s0, h0 244; NONEON-NOSVE-NEXT: frintp s0, s0 245; NONEON-NOSVE-NEXT: fcvt h0, s0 246; NONEON-NOSVE-NEXT: str h0, [sp, #32] 247; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 248; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 249; NONEON-NOSVE-NEXT: add sp, sp, #64 250; NONEON-NOSVE-NEXT: ret 251 %op = load <16 x half>, ptr %a 252 %res = call <16 x half> @llvm.ceil.v16f16(<16 x half> %op) 253 store <16 x half> %res, ptr %a 254 ret void 255} 256 257define <2 x float> @frintp_v2f32(<2 x float> %op) { 258; CHECK-LABEL: frintp_v2f32: 259; CHECK: // %bb.0: 260; CHECK-NEXT: ptrue p0.s, vl2 261; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 262; CHECK-NEXT: frintp z0.s, p0/m, z0.s 263; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 264; CHECK-NEXT: ret 265; 266; NONEON-NOSVE-LABEL: frintp_v2f32: 267; NONEON-NOSVE: // %bb.0: 268; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 269; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 270; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 271; NONEON-NOSVE-NEXT: frintp s1, s0 272; NONEON-NOSVE-NEXT: ldr s0, [sp] 273; NONEON-NOSVE-NEXT: frintp s0, s0 274; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 275; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 276; NONEON-NOSVE-NEXT: add sp, sp, #16 277; NONEON-NOSVE-NEXT: ret 278 %res = call <2 x float> @llvm.ceil.v2f32(<2 x float> %op) 279 ret <2 x float> %res 280} 281 282define <4 x float> @frintp_v4f32(<4 x float> %op) { 283; CHECK-LABEL: frintp_v4f32: 284; CHECK: // %bb.0: 285; CHECK-NEXT: ptrue p0.s, vl4 286; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 287; CHECK-NEXT: frintp z0.s, p0/m, z0.s 288; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 289; CHECK-NEXT: ret 290; 291; NONEON-NOSVE-LABEL: frintp_v4f32: 292; NONEON-NOSVE: // %bb.0: 293; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 294; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 295; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 296; NONEON-NOSVE-NEXT: frintp s1, s0 297; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 298; NONEON-NOSVE-NEXT: frintp s0, s0 299; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 300; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 301; NONEON-NOSVE-NEXT: frintp s1, s0 302; NONEON-NOSVE-NEXT: ldr s0, [sp] 303; NONEON-NOSVE-NEXT: frintp s0, s0 304; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 305; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 306; NONEON-NOSVE-NEXT: add sp, sp, #32 307; NONEON-NOSVE-NEXT: ret 308 %res = call <4 x float> @llvm.ceil.v4f32(<4 x float> %op) 309 ret <4 x float> %res 310} 311 312define void @frintp_v8f32(ptr %a) { 313; CHECK-LABEL: frintp_v8f32: 314; CHECK: // %bb.0: 315; CHECK-NEXT: ldp q0, q1, [x0] 316; CHECK-NEXT: ptrue p0.s, vl4 317; CHECK-NEXT: frintp z0.s, p0/m, z0.s 318; CHECK-NEXT: frintp z1.s, p0/m, z1.s 319; CHECK-NEXT: stp q0, q1, [x0] 320; CHECK-NEXT: ret 321; 322; NONEON-NOSVE-LABEL: frintp_v8f32: 323; NONEON-NOSVE: // %bb.0: 324; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 325; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 326; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 327; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 328; NONEON-NOSVE-NEXT: frintp s1, s0 329; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 330; NONEON-NOSVE-NEXT: frintp s0, s0 331; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 332; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 333; NONEON-NOSVE-NEXT: frintp s1, s0 334; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 335; NONEON-NOSVE-NEXT: frintp s0, s0 336; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 337; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 338; NONEON-NOSVE-NEXT: frintp s1, s0 339; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 340; NONEON-NOSVE-NEXT: frintp s0, s0 341; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 342; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 343; NONEON-NOSVE-NEXT: frintp s1, s0 344; NONEON-NOSVE-NEXT: ldr s0, [sp] 345; NONEON-NOSVE-NEXT: frintp s0, s0 346; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 347; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 348; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 349; NONEON-NOSVE-NEXT: add sp, sp, #64 350; NONEON-NOSVE-NEXT: ret 351 %op = load <8 x float>, ptr %a 352 %res = call <8 x float> @llvm.ceil.v8f32(<8 x float> %op) 353 store <8 x float> %res, ptr %a 354 ret void 355} 356 357define <1 x double> @frintp_v1f64(<1 x double> %op) { 358; CHECK-LABEL: frintp_v1f64: 359; CHECK: // %bb.0: 360; CHECK-NEXT: frintp d0, d0 361; CHECK-NEXT: ret 362; 363; NONEON-NOSVE-LABEL: frintp_v1f64: 364; NONEON-NOSVE: // %bb.0: 365; NONEON-NOSVE-NEXT: sub sp, sp, #16 366; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 367; NONEON-NOSVE-NEXT: frintp d0, d0 368; NONEON-NOSVE-NEXT: str d0, [sp, #8] 369; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 370; NONEON-NOSVE-NEXT: add sp, sp, #16 371; NONEON-NOSVE-NEXT: ret 372 %res = call <1 x double> @llvm.ceil.v1f64(<1 x double> %op) 373 ret <1 x double> %res 374} 375 376define <2 x double> @frintp_v2f64(<2 x double> %op) { 377; CHECK-LABEL: frintp_v2f64: 378; CHECK: // %bb.0: 379; CHECK-NEXT: ptrue p0.d, vl2 380; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 381; CHECK-NEXT: frintp z0.d, p0/m, z0.d 382; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 383; CHECK-NEXT: ret 384; 385; NONEON-NOSVE-LABEL: frintp_v2f64: 386; NONEON-NOSVE: // %bb.0: 387; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 388; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 389; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 390; NONEON-NOSVE-NEXT: frintp d1, d0 391; NONEON-NOSVE-NEXT: ldr d0, [sp] 392; NONEON-NOSVE-NEXT: frintp d0, d0 393; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 394; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 395; NONEON-NOSVE-NEXT: add sp, sp, #32 396; NONEON-NOSVE-NEXT: ret 397 %res = call <2 x double> @llvm.ceil.v2f64(<2 x double> %op) 398 ret <2 x double> %res 399} 400 401define void @frintp_v4f64(ptr %a) { 402; CHECK-LABEL: frintp_v4f64: 403; CHECK: // %bb.0: 404; CHECK-NEXT: ldp q0, q1, [x0] 405; CHECK-NEXT: ptrue p0.d, vl2 406; CHECK-NEXT: frintp z0.d, p0/m, z0.d 407; CHECK-NEXT: frintp z1.d, p0/m, z1.d 408; CHECK-NEXT: stp q0, q1, [x0] 409; CHECK-NEXT: ret 410; 411; NONEON-NOSVE-LABEL: frintp_v4f64: 412; NONEON-NOSVE: // %bb.0: 413; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 414; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 415; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 416; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 417; NONEON-NOSVE-NEXT: frintp d1, d0 418; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 419; NONEON-NOSVE-NEXT: frintp d0, d0 420; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 421; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 422; NONEON-NOSVE-NEXT: frintp d1, d0 423; NONEON-NOSVE-NEXT: ldr d0, [sp] 424; NONEON-NOSVE-NEXT: frintp d0, d0 425; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 426; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 427; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 428; NONEON-NOSVE-NEXT: add sp, sp, #64 429; NONEON-NOSVE-NEXT: ret 430 %op = load <4 x double>, ptr %a 431 %res = call <4 x double> @llvm.ceil.v4f64(<4 x double> %op) 432 store <4 x double> %res, ptr %a 433 ret void 434} 435 436; 437; FLOOR -> FRINTM 438; 439 440define <2 x half> @frintm_v2f16(<2 x half> %op) { 441; CHECK-LABEL: frintm_v2f16: 442; CHECK: // %bb.0: 443; CHECK-NEXT: ptrue p0.h, vl4 444; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 445; CHECK-NEXT: frintm z0.h, p0/m, z0.h 446; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 447; CHECK-NEXT: ret 448; 449; NONEON-NOSVE-LABEL: frintm_v2f16: 450; NONEON-NOSVE: // %bb.0: 451; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 452; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 453; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 454; NONEON-NOSVE-NEXT: fcvt s0, h0 455; NONEON-NOSVE-NEXT: frintm s0, s0 456; NONEON-NOSVE-NEXT: fcvt h0, s0 457; NONEON-NOSVE-NEXT: str h0, [sp, #14] 458; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 459; NONEON-NOSVE-NEXT: fcvt s0, h0 460; NONEON-NOSVE-NEXT: frintm s0, s0 461; NONEON-NOSVE-NEXT: fcvt h0, s0 462; NONEON-NOSVE-NEXT: str h0, [sp, #12] 463; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 464; NONEON-NOSVE-NEXT: fcvt s0, h0 465; NONEON-NOSVE-NEXT: frintm s0, s0 466; NONEON-NOSVE-NEXT: fcvt h0, s0 467; NONEON-NOSVE-NEXT: str h0, [sp, #10] 468; NONEON-NOSVE-NEXT: ldr h0, [sp] 469; NONEON-NOSVE-NEXT: fcvt s0, h0 470; NONEON-NOSVE-NEXT: frintm s0, s0 471; NONEON-NOSVE-NEXT: fcvt h0, s0 472; NONEON-NOSVE-NEXT: str h0, [sp, #8] 473; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 474; NONEON-NOSVE-NEXT: add sp, sp, #16 475; NONEON-NOSVE-NEXT: ret 476 %res = call <2 x half> @llvm.floor.v2f16(<2 x half> %op) 477 ret <2 x half> %res 478} 479 480define <4 x half> @frintm_v4f16(<4 x half> %op) { 481; CHECK-LABEL: frintm_v4f16: 482; CHECK: // %bb.0: 483; CHECK-NEXT: ptrue p0.h, vl4 484; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 485; CHECK-NEXT: frintm z0.h, p0/m, z0.h 486; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 487; CHECK-NEXT: ret 488; 489; NONEON-NOSVE-LABEL: frintm_v4f16: 490; NONEON-NOSVE: // %bb.0: 491; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 492; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 493; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 494; NONEON-NOSVE-NEXT: fcvt s0, h0 495; NONEON-NOSVE-NEXT: frintm s0, s0 496; NONEON-NOSVE-NEXT: fcvt h0, s0 497; NONEON-NOSVE-NEXT: str h0, [sp, #14] 498; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 499; NONEON-NOSVE-NEXT: fcvt s0, h0 500; NONEON-NOSVE-NEXT: frintm s0, s0 501; NONEON-NOSVE-NEXT: fcvt h0, s0 502; NONEON-NOSVE-NEXT: str h0, [sp, #12] 503; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 504; NONEON-NOSVE-NEXT: fcvt s0, h0 505; NONEON-NOSVE-NEXT: frintm s0, s0 506; NONEON-NOSVE-NEXT: fcvt h0, s0 507; NONEON-NOSVE-NEXT: str h0, [sp, #10] 508; NONEON-NOSVE-NEXT: ldr h0, [sp] 509; NONEON-NOSVE-NEXT: fcvt s0, h0 510; NONEON-NOSVE-NEXT: frintm s0, s0 511; NONEON-NOSVE-NEXT: fcvt h0, s0 512; NONEON-NOSVE-NEXT: str h0, [sp, #8] 513; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 514; NONEON-NOSVE-NEXT: add sp, sp, #16 515; NONEON-NOSVE-NEXT: ret 516 %res = call <4 x half> @llvm.floor.v4f16(<4 x half> %op) 517 ret <4 x half> %res 518} 519 520define <8 x half> @frintm_v8f16(<8 x half> %op) { 521; CHECK-LABEL: frintm_v8f16: 522; CHECK: // %bb.0: 523; CHECK-NEXT: ptrue p0.h, vl8 524; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 525; CHECK-NEXT: frintm z0.h, p0/m, z0.h 526; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 527; CHECK-NEXT: ret 528; 529; NONEON-NOSVE-LABEL: frintm_v8f16: 530; NONEON-NOSVE: // %bb.0: 531; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 532; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 533; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 534; NONEON-NOSVE-NEXT: fcvt s0, h0 535; NONEON-NOSVE-NEXT: frintm s0, s0 536; NONEON-NOSVE-NEXT: fcvt h0, s0 537; NONEON-NOSVE-NEXT: str h0, [sp, #30] 538; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 539; NONEON-NOSVE-NEXT: fcvt s0, h0 540; NONEON-NOSVE-NEXT: frintm s0, s0 541; NONEON-NOSVE-NEXT: fcvt h0, s0 542; NONEON-NOSVE-NEXT: str h0, [sp, #28] 543; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 544; NONEON-NOSVE-NEXT: fcvt s0, h0 545; NONEON-NOSVE-NEXT: frintm s0, s0 546; NONEON-NOSVE-NEXT: fcvt h0, s0 547; NONEON-NOSVE-NEXT: str h0, [sp, #26] 548; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 549; NONEON-NOSVE-NEXT: fcvt s0, h0 550; NONEON-NOSVE-NEXT: frintm s0, s0 551; NONEON-NOSVE-NEXT: fcvt h0, s0 552; NONEON-NOSVE-NEXT: str h0, [sp, #24] 553; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 554; NONEON-NOSVE-NEXT: fcvt s0, h0 555; NONEON-NOSVE-NEXT: frintm s0, s0 556; NONEON-NOSVE-NEXT: fcvt h0, s0 557; NONEON-NOSVE-NEXT: str h0, [sp, #22] 558; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 559; NONEON-NOSVE-NEXT: fcvt s0, h0 560; NONEON-NOSVE-NEXT: frintm s0, s0 561; NONEON-NOSVE-NEXT: fcvt h0, s0 562; NONEON-NOSVE-NEXT: str h0, [sp, #20] 563; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 564; NONEON-NOSVE-NEXT: fcvt s0, h0 565; NONEON-NOSVE-NEXT: frintm s0, s0 566; NONEON-NOSVE-NEXT: fcvt h0, s0 567; NONEON-NOSVE-NEXT: str h0, [sp, #18] 568; NONEON-NOSVE-NEXT: ldr h0, [sp] 569; NONEON-NOSVE-NEXT: fcvt s0, h0 570; NONEON-NOSVE-NEXT: frintm s0, s0 571; NONEON-NOSVE-NEXT: fcvt h0, s0 572; NONEON-NOSVE-NEXT: str h0, [sp, #16] 573; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 574; NONEON-NOSVE-NEXT: add sp, sp, #32 575; NONEON-NOSVE-NEXT: ret 576 %res = call <8 x half> @llvm.floor.v8f16(<8 x half> %op) 577 ret <8 x half> %res 578} 579 580define void @frintm_v16f16(ptr %a) { 581; CHECK-LABEL: frintm_v16f16: 582; CHECK: // %bb.0: 583; CHECK-NEXT: ldp q0, q1, [x0] 584; CHECK-NEXT: ptrue p0.h, vl8 585; CHECK-NEXT: frintm z0.h, p0/m, z0.h 586; CHECK-NEXT: frintm z1.h, p0/m, z1.h 587; CHECK-NEXT: stp q0, q1, [x0] 588; CHECK-NEXT: ret 589; 590; NONEON-NOSVE-LABEL: frintm_v16f16: 591; NONEON-NOSVE: // %bb.0: 592; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 593; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 594; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 595; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 596; NONEON-NOSVE-NEXT: fcvt s0, h0 597; NONEON-NOSVE-NEXT: frintm s0, s0 598; NONEON-NOSVE-NEXT: fcvt h0, s0 599; NONEON-NOSVE-NEXT: str h0, [sp, #62] 600; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 601; NONEON-NOSVE-NEXT: fcvt s0, h0 602; NONEON-NOSVE-NEXT: frintm s0, s0 603; NONEON-NOSVE-NEXT: fcvt h0, s0 604; NONEON-NOSVE-NEXT: str h0, [sp, #60] 605; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 606; NONEON-NOSVE-NEXT: fcvt s0, h0 607; NONEON-NOSVE-NEXT: frintm s0, s0 608; NONEON-NOSVE-NEXT: fcvt h0, s0 609; NONEON-NOSVE-NEXT: str h0, [sp, #58] 610; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 611; NONEON-NOSVE-NEXT: fcvt s0, h0 612; NONEON-NOSVE-NEXT: frintm s0, s0 613; NONEON-NOSVE-NEXT: fcvt h0, s0 614; NONEON-NOSVE-NEXT: str h0, [sp, #56] 615; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 616; NONEON-NOSVE-NEXT: fcvt s0, h0 617; NONEON-NOSVE-NEXT: frintm s0, s0 618; NONEON-NOSVE-NEXT: fcvt h0, s0 619; NONEON-NOSVE-NEXT: str h0, [sp, #54] 620; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 621; NONEON-NOSVE-NEXT: fcvt s0, h0 622; NONEON-NOSVE-NEXT: frintm s0, s0 623; NONEON-NOSVE-NEXT: fcvt h0, s0 624; NONEON-NOSVE-NEXT: str h0, [sp, #52] 625; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 626; NONEON-NOSVE-NEXT: fcvt s0, h0 627; NONEON-NOSVE-NEXT: frintm s0, s0 628; NONEON-NOSVE-NEXT: fcvt h0, s0 629; NONEON-NOSVE-NEXT: str h0, [sp, #50] 630; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 631; NONEON-NOSVE-NEXT: fcvt s0, h0 632; NONEON-NOSVE-NEXT: frintm s0, s0 633; NONEON-NOSVE-NEXT: fcvt h0, s0 634; NONEON-NOSVE-NEXT: str h0, [sp, #48] 635; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 636; NONEON-NOSVE-NEXT: fcvt s0, h0 637; NONEON-NOSVE-NEXT: frintm s0, s0 638; NONEON-NOSVE-NEXT: fcvt h0, s0 639; NONEON-NOSVE-NEXT: str h0, [sp, #46] 640; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 641; NONEON-NOSVE-NEXT: fcvt s0, h0 642; NONEON-NOSVE-NEXT: frintm s0, s0 643; NONEON-NOSVE-NEXT: fcvt h0, s0 644; NONEON-NOSVE-NEXT: str h0, [sp, #44] 645; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 646; NONEON-NOSVE-NEXT: fcvt s0, h0 647; NONEON-NOSVE-NEXT: frintm s0, s0 648; NONEON-NOSVE-NEXT: fcvt h0, s0 649; NONEON-NOSVE-NEXT: str h0, [sp, #42] 650; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 651; NONEON-NOSVE-NEXT: fcvt s0, h0 652; NONEON-NOSVE-NEXT: frintm s0, s0 653; NONEON-NOSVE-NEXT: fcvt h0, s0 654; NONEON-NOSVE-NEXT: str h0, [sp, #40] 655; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 656; NONEON-NOSVE-NEXT: fcvt s0, h0 657; NONEON-NOSVE-NEXT: frintm s0, s0 658; NONEON-NOSVE-NEXT: fcvt h0, s0 659; NONEON-NOSVE-NEXT: str h0, [sp, #38] 660; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 661; NONEON-NOSVE-NEXT: fcvt s0, h0 662; NONEON-NOSVE-NEXT: frintm s0, s0 663; NONEON-NOSVE-NEXT: fcvt h0, s0 664; NONEON-NOSVE-NEXT: str h0, [sp, #36] 665; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 666; NONEON-NOSVE-NEXT: fcvt s0, h0 667; NONEON-NOSVE-NEXT: frintm s0, s0 668; NONEON-NOSVE-NEXT: fcvt h0, s0 669; NONEON-NOSVE-NEXT: str h0, [sp, #34] 670; NONEON-NOSVE-NEXT: ldr h0, [sp] 671; NONEON-NOSVE-NEXT: fcvt s0, h0 672; NONEON-NOSVE-NEXT: frintm s0, s0 673; NONEON-NOSVE-NEXT: fcvt h0, s0 674; NONEON-NOSVE-NEXT: str h0, [sp, #32] 675; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 676; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 677; NONEON-NOSVE-NEXT: add sp, sp, #64 678; NONEON-NOSVE-NEXT: ret 679 %op = load <16 x half>, ptr %a 680 %res = call <16 x half> @llvm.floor.v16f16(<16 x half> %op) 681 store <16 x half> %res, ptr %a 682 ret void 683} 684 685define <2 x float> @frintm_v2f32(<2 x float> %op) { 686; CHECK-LABEL: frintm_v2f32: 687; CHECK: // %bb.0: 688; CHECK-NEXT: ptrue p0.s, vl2 689; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 690; CHECK-NEXT: frintm z0.s, p0/m, z0.s 691; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 692; CHECK-NEXT: ret 693; 694; NONEON-NOSVE-LABEL: frintm_v2f32: 695; NONEON-NOSVE: // %bb.0: 696; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 697; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 698; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 699; NONEON-NOSVE-NEXT: frintm s1, s0 700; NONEON-NOSVE-NEXT: ldr s0, [sp] 701; NONEON-NOSVE-NEXT: frintm s0, s0 702; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 703; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 704; NONEON-NOSVE-NEXT: add sp, sp, #16 705; NONEON-NOSVE-NEXT: ret 706 %res = call <2 x float> @llvm.floor.v2f32(<2 x float> %op) 707 ret <2 x float> %res 708} 709 710define <4 x float> @frintm_v4f32(<4 x float> %op) { 711; CHECK-LABEL: frintm_v4f32: 712; CHECK: // %bb.0: 713; CHECK-NEXT: ptrue p0.s, vl4 714; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 715; CHECK-NEXT: frintm z0.s, p0/m, z0.s 716; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 717; CHECK-NEXT: ret 718; 719; NONEON-NOSVE-LABEL: frintm_v4f32: 720; NONEON-NOSVE: // %bb.0: 721; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 722; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 723; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 724; NONEON-NOSVE-NEXT: frintm s1, s0 725; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 726; NONEON-NOSVE-NEXT: frintm s0, s0 727; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 728; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 729; NONEON-NOSVE-NEXT: frintm s1, s0 730; NONEON-NOSVE-NEXT: ldr s0, [sp] 731; NONEON-NOSVE-NEXT: frintm s0, s0 732; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 733; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 734; NONEON-NOSVE-NEXT: add sp, sp, #32 735; NONEON-NOSVE-NEXT: ret 736 %res = call <4 x float> @llvm.floor.v4f32(<4 x float> %op) 737 ret <4 x float> %res 738} 739 740define void @frintm_v8f32(ptr %a) { 741; CHECK-LABEL: frintm_v8f32: 742; CHECK: // %bb.0: 743; CHECK-NEXT: ldp q0, q1, [x0] 744; CHECK-NEXT: ptrue p0.s, vl4 745; CHECK-NEXT: frintm z0.s, p0/m, z0.s 746; CHECK-NEXT: frintm z1.s, p0/m, z1.s 747; CHECK-NEXT: stp q0, q1, [x0] 748; CHECK-NEXT: ret 749; 750; NONEON-NOSVE-LABEL: frintm_v8f32: 751; NONEON-NOSVE: // %bb.0: 752; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 753; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 754; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 755; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 756; NONEON-NOSVE-NEXT: frintm s1, s0 757; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 758; NONEON-NOSVE-NEXT: frintm s0, s0 759; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 760; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 761; NONEON-NOSVE-NEXT: frintm s1, s0 762; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 763; NONEON-NOSVE-NEXT: frintm s0, s0 764; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 765; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 766; NONEON-NOSVE-NEXT: frintm s1, s0 767; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 768; NONEON-NOSVE-NEXT: frintm s0, s0 769; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 770; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 771; NONEON-NOSVE-NEXT: frintm s1, s0 772; NONEON-NOSVE-NEXT: ldr s0, [sp] 773; NONEON-NOSVE-NEXT: frintm s0, s0 774; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 775; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 776; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 777; NONEON-NOSVE-NEXT: add sp, sp, #64 778; NONEON-NOSVE-NEXT: ret 779 %op = load <8 x float>, ptr %a 780 %res = call <8 x float> @llvm.floor.v8f32(<8 x float> %op) 781 store <8 x float> %res, ptr %a 782 ret void 783} 784 785define <1 x double> @frintm_v1f64(<1 x double> %op) { 786; CHECK-LABEL: frintm_v1f64: 787; CHECK: // %bb.0: 788; CHECK-NEXT: frintm d0, d0 789; CHECK-NEXT: ret 790; 791; NONEON-NOSVE-LABEL: frintm_v1f64: 792; NONEON-NOSVE: // %bb.0: 793; NONEON-NOSVE-NEXT: sub sp, sp, #16 794; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 795; NONEON-NOSVE-NEXT: frintm d0, d0 796; NONEON-NOSVE-NEXT: str d0, [sp, #8] 797; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 798; NONEON-NOSVE-NEXT: add sp, sp, #16 799; NONEON-NOSVE-NEXT: ret 800 %res = call <1 x double> @llvm.floor.v1f64(<1 x double> %op) 801 ret <1 x double> %res 802} 803 804define <2 x double> @frintm_v2f64(<2 x double> %op) { 805; CHECK-LABEL: frintm_v2f64: 806; CHECK: // %bb.0: 807; CHECK-NEXT: ptrue p0.d, vl2 808; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 809; CHECK-NEXT: frintm z0.d, p0/m, z0.d 810; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 811; CHECK-NEXT: ret 812; 813; NONEON-NOSVE-LABEL: frintm_v2f64: 814; NONEON-NOSVE: // %bb.0: 815; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 816; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 817; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 818; NONEON-NOSVE-NEXT: frintm d1, d0 819; NONEON-NOSVE-NEXT: ldr d0, [sp] 820; NONEON-NOSVE-NEXT: frintm d0, d0 821; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 822; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 823; NONEON-NOSVE-NEXT: add sp, sp, #32 824; NONEON-NOSVE-NEXT: ret 825 %res = call <2 x double> @llvm.floor.v2f64(<2 x double> %op) 826 ret <2 x double> %res 827} 828 829define void @frintm_v4f64(ptr %a) { 830; CHECK-LABEL: frintm_v4f64: 831; CHECK: // %bb.0: 832; CHECK-NEXT: ldp q0, q1, [x0] 833; CHECK-NEXT: ptrue p0.d, vl2 834; CHECK-NEXT: frintm z0.d, p0/m, z0.d 835; CHECK-NEXT: frintm z1.d, p0/m, z1.d 836; CHECK-NEXT: stp q0, q1, [x0] 837; CHECK-NEXT: ret 838; 839; NONEON-NOSVE-LABEL: frintm_v4f64: 840; NONEON-NOSVE: // %bb.0: 841; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 842; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 843; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 844; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 845; NONEON-NOSVE-NEXT: frintm d1, d0 846; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 847; NONEON-NOSVE-NEXT: frintm d0, d0 848; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 849; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 850; NONEON-NOSVE-NEXT: frintm d1, d0 851; NONEON-NOSVE-NEXT: ldr d0, [sp] 852; NONEON-NOSVE-NEXT: frintm d0, d0 853; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 854; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 855; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 856; NONEON-NOSVE-NEXT: add sp, sp, #64 857; NONEON-NOSVE-NEXT: ret 858 %op = load <4 x double>, ptr %a 859 %res = call <4 x double> @llvm.floor.v4f64(<4 x double> %op) 860 store <4 x double> %res, ptr %a 861 ret void 862} 863 864; 865; FNEARBYINT -> FRINTI 866; 867 868define <2 x half> @frinti_v2f16(<2 x half> %op) { 869; CHECK-LABEL: frinti_v2f16: 870; CHECK: // %bb.0: 871; CHECK-NEXT: ptrue p0.h, vl4 872; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 873; CHECK-NEXT: frinti z0.h, p0/m, z0.h 874; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 875; CHECK-NEXT: ret 876; 877; NONEON-NOSVE-LABEL: frinti_v2f16: 878; NONEON-NOSVE: // %bb.0: 879; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 880; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 881; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 882; NONEON-NOSVE-NEXT: fcvt s0, h0 883; NONEON-NOSVE-NEXT: frinti s0, s0 884; NONEON-NOSVE-NEXT: fcvt h0, s0 885; NONEON-NOSVE-NEXT: str h0, [sp, #14] 886; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 887; NONEON-NOSVE-NEXT: fcvt s0, h0 888; NONEON-NOSVE-NEXT: frinti s0, s0 889; NONEON-NOSVE-NEXT: fcvt h0, s0 890; NONEON-NOSVE-NEXT: str h0, [sp, #12] 891; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 892; NONEON-NOSVE-NEXT: fcvt s0, h0 893; NONEON-NOSVE-NEXT: frinti s0, s0 894; NONEON-NOSVE-NEXT: fcvt h0, s0 895; NONEON-NOSVE-NEXT: str h0, [sp, #10] 896; NONEON-NOSVE-NEXT: ldr h0, [sp] 897; NONEON-NOSVE-NEXT: fcvt s0, h0 898; NONEON-NOSVE-NEXT: frinti s0, s0 899; NONEON-NOSVE-NEXT: fcvt h0, s0 900; NONEON-NOSVE-NEXT: str h0, [sp, #8] 901; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 902; NONEON-NOSVE-NEXT: add sp, sp, #16 903; NONEON-NOSVE-NEXT: ret 904 %res = call <2 x half> @llvm.nearbyint.v2f16(<2 x half> %op) 905 ret <2 x half> %res 906} 907 908define <4 x half> @frinti_v4f16(<4 x half> %op) { 909; CHECK-LABEL: frinti_v4f16: 910; CHECK: // %bb.0: 911; CHECK-NEXT: ptrue p0.h, vl4 912; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 913; CHECK-NEXT: frinti z0.h, p0/m, z0.h 914; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 915; CHECK-NEXT: ret 916; 917; NONEON-NOSVE-LABEL: frinti_v4f16: 918; NONEON-NOSVE: // %bb.0: 919; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 920; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 921; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 922; NONEON-NOSVE-NEXT: fcvt s0, h0 923; NONEON-NOSVE-NEXT: frinti s0, s0 924; NONEON-NOSVE-NEXT: fcvt h0, s0 925; NONEON-NOSVE-NEXT: str h0, [sp, #14] 926; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 927; NONEON-NOSVE-NEXT: fcvt s0, h0 928; NONEON-NOSVE-NEXT: frinti s0, s0 929; NONEON-NOSVE-NEXT: fcvt h0, s0 930; NONEON-NOSVE-NEXT: str h0, [sp, #12] 931; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 932; NONEON-NOSVE-NEXT: fcvt s0, h0 933; NONEON-NOSVE-NEXT: frinti s0, s0 934; NONEON-NOSVE-NEXT: fcvt h0, s0 935; NONEON-NOSVE-NEXT: str h0, [sp, #10] 936; NONEON-NOSVE-NEXT: ldr h0, [sp] 937; NONEON-NOSVE-NEXT: fcvt s0, h0 938; NONEON-NOSVE-NEXT: frinti s0, s0 939; NONEON-NOSVE-NEXT: fcvt h0, s0 940; NONEON-NOSVE-NEXT: str h0, [sp, #8] 941; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 942; NONEON-NOSVE-NEXT: add sp, sp, #16 943; NONEON-NOSVE-NEXT: ret 944 %res = call <4 x half> @llvm.nearbyint.v4f16(<4 x half> %op) 945 ret <4 x half> %res 946} 947 948define <8 x half> @frinti_v8f16(<8 x half> %op) { 949; CHECK-LABEL: frinti_v8f16: 950; CHECK: // %bb.0: 951; CHECK-NEXT: ptrue p0.h, vl8 952; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 953; CHECK-NEXT: frinti z0.h, p0/m, z0.h 954; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 955; CHECK-NEXT: ret 956; 957; NONEON-NOSVE-LABEL: frinti_v8f16: 958; NONEON-NOSVE: // %bb.0: 959; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 960; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 961; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 962; NONEON-NOSVE-NEXT: fcvt s0, h0 963; NONEON-NOSVE-NEXT: frinti s0, s0 964; NONEON-NOSVE-NEXT: fcvt h0, s0 965; NONEON-NOSVE-NEXT: str h0, [sp, #30] 966; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 967; NONEON-NOSVE-NEXT: fcvt s0, h0 968; NONEON-NOSVE-NEXT: frinti s0, s0 969; NONEON-NOSVE-NEXT: fcvt h0, s0 970; NONEON-NOSVE-NEXT: str h0, [sp, #28] 971; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 972; NONEON-NOSVE-NEXT: fcvt s0, h0 973; NONEON-NOSVE-NEXT: frinti s0, s0 974; NONEON-NOSVE-NEXT: fcvt h0, s0 975; NONEON-NOSVE-NEXT: str h0, [sp, #26] 976; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 977; NONEON-NOSVE-NEXT: fcvt s0, h0 978; NONEON-NOSVE-NEXT: frinti s0, s0 979; NONEON-NOSVE-NEXT: fcvt h0, s0 980; NONEON-NOSVE-NEXT: str h0, [sp, #24] 981; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 982; NONEON-NOSVE-NEXT: fcvt s0, h0 983; NONEON-NOSVE-NEXT: frinti s0, s0 984; NONEON-NOSVE-NEXT: fcvt h0, s0 985; NONEON-NOSVE-NEXT: str h0, [sp, #22] 986; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 987; NONEON-NOSVE-NEXT: fcvt s0, h0 988; NONEON-NOSVE-NEXT: frinti s0, s0 989; NONEON-NOSVE-NEXT: fcvt h0, s0 990; NONEON-NOSVE-NEXT: str h0, [sp, #20] 991; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 992; NONEON-NOSVE-NEXT: fcvt s0, h0 993; NONEON-NOSVE-NEXT: frinti s0, s0 994; NONEON-NOSVE-NEXT: fcvt h0, s0 995; NONEON-NOSVE-NEXT: str h0, [sp, #18] 996; NONEON-NOSVE-NEXT: ldr h0, [sp] 997; NONEON-NOSVE-NEXT: fcvt s0, h0 998; NONEON-NOSVE-NEXT: frinti s0, s0 999; NONEON-NOSVE-NEXT: fcvt h0, s0 1000; NONEON-NOSVE-NEXT: str h0, [sp, #16] 1001; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1002; NONEON-NOSVE-NEXT: add sp, sp, #32 1003; NONEON-NOSVE-NEXT: ret 1004 %res = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %op) 1005 ret <8 x half> %res 1006} 1007 1008define void @frinti_v16f16(ptr %a) { 1009; CHECK-LABEL: frinti_v16f16: 1010; CHECK: // %bb.0: 1011; CHECK-NEXT: ldp q0, q1, [x0] 1012; CHECK-NEXT: ptrue p0.h, vl8 1013; CHECK-NEXT: frinti z0.h, p0/m, z0.h 1014; CHECK-NEXT: frinti z1.h, p0/m, z1.h 1015; CHECK-NEXT: stp q0, q1, [x0] 1016; CHECK-NEXT: ret 1017; 1018; NONEON-NOSVE-LABEL: frinti_v16f16: 1019; NONEON-NOSVE: // %bb.0: 1020; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1021; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1022; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1023; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 1024; NONEON-NOSVE-NEXT: fcvt s0, h0 1025; NONEON-NOSVE-NEXT: frinti s0, s0 1026; NONEON-NOSVE-NEXT: fcvt h0, s0 1027; NONEON-NOSVE-NEXT: str h0, [sp, #62] 1028; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 1029; NONEON-NOSVE-NEXT: fcvt s0, h0 1030; NONEON-NOSVE-NEXT: frinti s0, s0 1031; NONEON-NOSVE-NEXT: fcvt h0, s0 1032; NONEON-NOSVE-NEXT: str h0, [sp, #60] 1033; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 1034; NONEON-NOSVE-NEXT: fcvt s0, h0 1035; NONEON-NOSVE-NEXT: frinti s0, s0 1036; NONEON-NOSVE-NEXT: fcvt h0, s0 1037; NONEON-NOSVE-NEXT: str h0, [sp, #58] 1038; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 1039; NONEON-NOSVE-NEXT: fcvt s0, h0 1040; NONEON-NOSVE-NEXT: frinti s0, s0 1041; NONEON-NOSVE-NEXT: fcvt h0, s0 1042; NONEON-NOSVE-NEXT: str h0, [sp, #56] 1043; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 1044; NONEON-NOSVE-NEXT: fcvt s0, h0 1045; NONEON-NOSVE-NEXT: frinti s0, s0 1046; NONEON-NOSVE-NEXT: fcvt h0, s0 1047; NONEON-NOSVE-NEXT: str h0, [sp, #54] 1048; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 1049; NONEON-NOSVE-NEXT: fcvt s0, h0 1050; NONEON-NOSVE-NEXT: frinti s0, s0 1051; NONEON-NOSVE-NEXT: fcvt h0, s0 1052; NONEON-NOSVE-NEXT: str h0, [sp, #52] 1053; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 1054; NONEON-NOSVE-NEXT: fcvt s0, h0 1055; NONEON-NOSVE-NEXT: frinti s0, s0 1056; NONEON-NOSVE-NEXT: fcvt h0, s0 1057; NONEON-NOSVE-NEXT: str h0, [sp, #50] 1058; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 1059; NONEON-NOSVE-NEXT: fcvt s0, h0 1060; NONEON-NOSVE-NEXT: frinti s0, s0 1061; NONEON-NOSVE-NEXT: fcvt h0, s0 1062; NONEON-NOSVE-NEXT: str h0, [sp, #48] 1063; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1064; NONEON-NOSVE-NEXT: fcvt s0, h0 1065; NONEON-NOSVE-NEXT: frinti s0, s0 1066; NONEON-NOSVE-NEXT: fcvt h0, s0 1067; NONEON-NOSVE-NEXT: str h0, [sp, #46] 1068; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1069; NONEON-NOSVE-NEXT: fcvt s0, h0 1070; NONEON-NOSVE-NEXT: frinti s0, s0 1071; NONEON-NOSVE-NEXT: fcvt h0, s0 1072; NONEON-NOSVE-NEXT: str h0, [sp, #44] 1073; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1074; NONEON-NOSVE-NEXT: fcvt s0, h0 1075; NONEON-NOSVE-NEXT: frinti s0, s0 1076; NONEON-NOSVE-NEXT: fcvt h0, s0 1077; NONEON-NOSVE-NEXT: str h0, [sp, #42] 1078; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1079; NONEON-NOSVE-NEXT: fcvt s0, h0 1080; NONEON-NOSVE-NEXT: frinti s0, s0 1081; NONEON-NOSVE-NEXT: fcvt h0, s0 1082; NONEON-NOSVE-NEXT: str h0, [sp, #40] 1083; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1084; NONEON-NOSVE-NEXT: fcvt s0, h0 1085; NONEON-NOSVE-NEXT: frinti s0, s0 1086; NONEON-NOSVE-NEXT: fcvt h0, s0 1087; NONEON-NOSVE-NEXT: str h0, [sp, #38] 1088; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1089; NONEON-NOSVE-NEXT: fcvt s0, h0 1090; NONEON-NOSVE-NEXT: frinti s0, s0 1091; NONEON-NOSVE-NEXT: fcvt h0, s0 1092; NONEON-NOSVE-NEXT: str h0, [sp, #36] 1093; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1094; NONEON-NOSVE-NEXT: fcvt s0, h0 1095; NONEON-NOSVE-NEXT: frinti s0, s0 1096; NONEON-NOSVE-NEXT: fcvt h0, s0 1097; NONEON-NOSVE-NEXT: str h0, [sp, #34] 1098; NONEON-NOSVE-NEXT: ldr h0, [sp] 1099; NONEON-NOSVE-NEXT: fcvt s0, h0 1100; NONEON-NOSVE-NEXT: frinti s0, s0 1101; NONEON-NOSVE-NEXT: fcvt h0, s0 1102; NONEON-NOSVE-NEXT: str h0, [sp, #32] 1103; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1104; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1105; NONEON-NOSVE-NEXT: add sp, sp, #64 1106; NONEON-NOSVE-NEXT: ret 1107 %op = load <16 x half>, ptr %a 1108 %res = call <16 x half> @llvm.nearbyint.v16f16(<16 x half> %op) 1109 store <16 x half> %res, ptr %a 1110 ret void 1111} 1112 1113define <2 x float> @frinti_v2f32(<2 x float> %op) { 1114; CHECK-LABEL: frinti_v2f32: 1115; CHECK: // %bb.0: 1116; CHECK-NEXT: ptrue p0.s, vl2 1117; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1118; CHECK-NEXT: frinti z0.s, p0/m, z0.s 1119; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1120; CHECK-NEXT: ret 1121; 1122; NONEON-NOSVE-LABEL: frinti_v2f32: 1123; NONEON-NOSVE: // %bb.0: 1124; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1125; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1126; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1127; NONEON-NOSVE-NEXT: frinti s1, s0 1128; NONEON-NOSVE-NEXT: ldr s0, [sp] 1129; NONEON-NOSVE-NEXT: frinti s0, s0 1130; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 1131; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1132; NONEON-NOSVE-NEXT: add sp, sp, #16 1133; NONEON-NOSVE-NEXT: ret 1134 %res = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %op) 1135 ret <2 x float> %res 1136} 1137 1138define <4 x float> @frinti_v4f32(<4 x float> %op) { 1139; CHECK-LABEL: frinti_v4f32: 1140; CHECK: // %bb.0: 1141; CHECK-NEXT: ptrue p0.s, vl4 1142; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1143; CHECK-NEXT: frinti z0.s, p0/m, z0.s 1144; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1145; CHECK-NEXT: ret 1146; 1147; NONEON-NOSVE-LABEL: frinti_v4f32: 1148; NONEON-NOSVE: // %bb.0: 1149; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1150; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1151; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 1152; NONEON-NOSVE-NEXT: frinti s1, s0 1153; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 1154; NONEON-NOSVE-NEXT: frinti s0, s0 1155; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 1156; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1157; NONEON-NOSVE-NEXT: frinti s1, s0 1158; NONEON-NOSVE-NEXT: ldr s0, [sp] 1159; NONEON-NOSVE-NEXT: frinti s0, s0 1160; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 1161; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1162; NONEON-NOSVE-NEXT: add sp, sp, #32 1163; NONEON-NOSVE-NEXT: ret 1164 %res = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %op) 1165 ret <4 x float> %res 1166} 1167 1168define void @frinti_v8f32(ptr %a) { 1169; CHECK-LABEL: frinti_v8f32: 1170; CHECK: // %bb.0: 1171; CHECK-NEXT: ldp q0, q1, [x0] 1172; CHECK-NEXT: ptrue p0.s, vl4 1173; CHECK-NEXT: frinti z0.s, p0/m, z0.s 1174; CHECK-NEXT: frinti z1.s, p0/m, z1.s 1175; CHECK-NEXT: stp q0, q1, [x0] 1176; CHECK-NEXT: ret 1177; 1178; NONEON-NOSVE-LABEL: frinti_v8f32: 1179; NONEON-NOSVE: // %bb.0: 1180; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1181; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1182; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1183; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 1184; NONEON-NOSVE-NEXT: frinti s1, s0 1185; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 1186; NONEON-NOSVE-NEXT: frinti s0, s0 1187; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 1188; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 1189; NONEON-NOSVE-NEXT: frinti s1, s0 1190; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 1191; NONEON-NOSVE-NEXT: frinti s0, s0 1192; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 1193; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 1194; NONEON-NOSVE-NEXT: frinti s1, s0 1195; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 1196; NONEON-NOSVE-NEXT: frinti s0, s0 1197; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 1198; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1199; NONEON-NOSVE-NEXT: frinti s1, s0 1200; NONEON-NOSVE-NEXT: ldr s0, [sp] 1201; NONEON-NOSVE-NEXT: frinti s0, s0 1202; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 1203; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1204; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1205; NONEON-NOSVE-NEXT: add sp, sp, #64 1206; NONEON-NOSVE-NEXT: ret 1207 %op = load <8 x float>, ptr %a 1208 %res = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %op) 1209 store <8 x float> %res, ptr %a 1210 ret void 1211} 1212 1213define <1 x double> @frinti_v1f64(<1 x double> %op) { 1214; CHECK-LABEL: frinti_v1f64: 1215; CHECK: // %bb.0: 1216; CHECK-NEXT: frinti d0, d0 1217; CHECK-NEXT: ret 1218; 1219; NONEON-NOSVE-LABEL: frinti_v1f64: 1220; NONEON-NOSVE: // %bb.0: 1221; NONEON-NOSVE-NEXT: sub sp, sp, #16 1222; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1223; NONEON-NOSVE-NEXT: frinti d0, d0 1224; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1225; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1226; NONEON-NOSVE-NEXT: add sp, sp, #16 1227; NONEON-NOSVE-NEXT: ret 1228 %res = call <1 x double> @llvm.nearbyint.v1f64(<1 x double> %op) 1229 ret <1 x double> %res 1230} 1231 1232define <2 x double> @frinti_v2f64(<2 x double> %op) { 1233; CHECK-LABEL: frinti_v2f64: 1234; CHECK: // %bb.0: 1235; CHECK-NEXT: ptrue p0.d, vl2 1236; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1237; CHECK-NEXT: frinti z0.d, p0/m, z0.d 1238; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1239; CHECK-NEXT: ret 1240; 1241; NONEON-NOSVE-LABEL: frinti_v2f64: 1242; NONEON-NOSVE: // %bb.0: 1243; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1244; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1245; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1246; NONEON-NOSVE-NEXT: frinti d1, d0 1247; NONEON-NOSVE-NEXT: ldr d0, [sp] 1248; NONEON-NOSVE-NEXT: frinti d0, d0 1249; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1250; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1251; NONEON-NOSVE-NEXT: add sp, sp, #32 1252; NONEON-NOSVE-NEXT: ret 1253 %res = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %op) 1254 ret <2 x double> %res 1255} 1256 1257define void @frinti_v4f64(ptr %a) { 1258; CHECK-LABEL: frinti_v4f64: 1259; CHECK: // %bb.0: 1260; CHECK-NEXT: ldp q0, q1, [x0] 1261; CHECK-NEXT: ptrue p0.d, vl2 1262; CHECK-NEXT: frinti z0.d, p0/m, z0.d 1263; CHECK-NEXT: frinti z1.d, p0/m, z1.d 1264; CHECK-NEXT: stp q0, q1, [x0] 1265; CHECK-NEXT: ret 1266; 1267; NONEON-NOSVE-LABEL: frinti_v4f64: 1268; NONEON-NOSVE: // %bb.0: 1269; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1270; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1271; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1272; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1273; NONEON-NOSVE-NEXT: frinti d1, d0 1274; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 1275; NONEON-NOSVE-NEXT: frinti d0, d0 1276; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1277; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1278; NONEON-NOSVE-NEXT: frinti d1, d0 1279; NONEON-NOSVE-NEXT: ldr d0, [sp] 1280; NONEON-NOSVE-NEXT: frinti d0, d0 1281; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1282; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1283; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1284; NONEON-NOSVE-NEXT: add sp, sp, #64 1285; NONEON-NOSVE-NEXT: ret 1286 %op = load <4 x double>, ptr %a 1287 %res = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %op) 1288 store <4 x double> %res, ptr %a 1289 ret void 1290} 1291 1292; 1293; RINT -> FRINTX 1294; 1295 1296define <2 x half> @frintx_v2f16(<2 x half> %op) { 1297; CHECK-LABEL: frintx_v2f16: 1298; CHECK: // %bb.0: 1299; CHECK-NEXT: ptrue p0.h, vl4 1300; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1301; CHECK-NEXT: frintx z0.h, p0/m, z0.h 1302; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1303; CHECK-NEXT: ret 1304; 1305; NONEON-NOSVE-LABEL: frintx_v2f16: 1306; NONEON-NOSVE: // %bb.0: 1307; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1308; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1309; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1310; NONEON-NOSVE-NEXT: fcvt s0, h0 1311; NONEON-NOSVE-NEXT: frintx s0, s0 1312; NONEON-NOSVE-NEXT: fcvt h0, s0 1313; NONEON-NOSVE-NEXT: str h0, [sp, #14] 1314; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1315; NONEON-NOSVE-NEXT: fcvt s0, h0 1316; NONEON-NOSVE-NEXT: frintx s0, s0 1317; NONEON-NOSVE-NEXT: fcvt h0, s0 1318; NONEON-NOSVE-NEXT: str h0, [sp, #12] 1319; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1320; NONEON-NOSVE-NEXT: fcvt s0, h0 1321; NONEON-NOSVE-NEXT: frintx s0, s0 1322; NONEON-NOSVE-NEXT: fcvt h0, s0 1323; NONEON-NOSVE-NEXT: str h0, [sp, #10] 1324; NONEON-NOSVE-NEXT: ldr h0, [sp] 1325; NONEON-NOSVE-NEXT: fcvt s0, h0 1326; NONEON-NOSVE-NEXT: frintx s0, s0 1327; NONEON-NOSVE-NEXT: fcvt h0, s0 1328; NONEON-NOSVE-NEXT: str h0, [sp, #8] 1329; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1330; NONEON-NOSVE-NEXT: add sp, sp, #16 1331; NONEON-NOSVE-NEXT: ret 1332 %res = call <2 x half> @llvm.rint.v2f16(<2 x half> %op) 1333 ret <2 x half> %res 1334} 1335 1336define <4 x half> @frintx_v4f16(<4 x half> %op) { 1337; CHECK-LABEL: frintx_v4f16: 1338; CHECK: // %bb.0: 1339; CHECK-NEXT: ptrue p0.h, vl4 1340; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1341; CHECK-NEXT: frintx z0.h, p0/m, z0.h 1342; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1343; CHECK-NEXT: ret 1344; 1345; NONEON-NOSVE-LABEL: frintx_v4f16: 1346; NONEON-NOSVE: // %bb.0: 1347; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1348; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1349; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1350; NONEON-NOSVE-NEXT: fcvt s0, h0 1351; NONEON-NOSVE-NEXT: frintx s0, s0 1352; NONEON-NOSVE-NEXT: fcvt h0, s0 1353; NONEON-NOSVE-NEXT: str h0, [sp, #14] 1354; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1355; NONEON-NOSVE-NEXT: fcvt s0, h0 1356; NONEON-NOSVE-NEXT: frintx s0, s0 1357; NONEON-NOSVE-NEXT: fcvt h0, s0 1358; NONEON-NOSVE-NEXT: str h0, [sp, #12] 1359; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1360; NONEON-NOSVE-NEXT: fcvt s0, h0 1361; NONEON-NOSVE-NEXT: frintx s0, s0 1362; NONEON-NOSVE-NEXT: fcvt h0, s0 1363; NONEON-NOSVE-NEXT: str h0, [sp, #10] 1364; NONEON-NOSVE-NEXT: ldr h0, [sp] 1365; NONEON-NOSVE-NEXT: fcvt s0, h0 1366; NONEON-NOSVE-NEXT: frintx s0, s0 1367; NONEON-NOSVE-NEXT: fcvt h0, s0 1368; NONEON-NOSVE-NEXT: str h0, [sp, #8] 1369; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1370; NONEON-NOSVE-NEXT: add sp, sp, #16 1371; NONEON-NOSVE-NEXT: ret 1372 %res = call <4 x half> @llvm.rint.v4f16(<4 x half> %op) 1373 ret <4 x half> %res 1374} 1375 1376define <8 x half> @frintx_v8f16(<8 x half> %op) { 1377; CHECK-LABEL: frintx_v8f16: 1378; CHECK: // %bb.0: 1379; CHECK-NEXT: ptrue p0.h, vl8 1380; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1381; CHECK-NEXT: frintx z0.h, p0/m, z0.h 1382; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1383; CHECK-NEXT: ret 1384; 1385; NONEON-NOSVE-LABEL: frintx_v8f16: 1386; NONEON-NOSVE: // %bb.0: 1387; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1388; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1389; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1390; NONEON-NOSVE-NEXT: fcvt s0, h0 1391; NONEON-NOSVE-NEXT: frintx s0, s0 1392; NONEON-NOSVE-NEXT: fcvt h0, s0 1393; NONEON-NOSVE-NEXT: str h0, [sp, #30] 1394; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1395; NONEON-NOSVE-NEXT: fcvt s0, h0 1396; NONEON-NOSVE-NEXT: frintx s0, s0 1397; NONEON-NOSVE-NEXT: fcvt h0, s0 1398; NONEON-NOSVE-NEXT: str h0, [sp, #28] 1399; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1400; NONEON-NOSVE-NEXT: fcvt s0, h0 1401; NONEON-NOSVE-NEXT: frintx s0, s0 1402; NONEON-NOSVE-NEXT: fcvt h0, s0 1403; NONEON-NOSVE-NEXT: str h0, [sp, #26] 1404; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1405; NONEON-NOSVE-NEXT: fcvt s0, h0 1406; NONEON-NOSVE-NEXT: frintx s0, s0 1407; NONEON-NOSVE-NEXT: fcvt h0, s0 1408; NONEON-NOSVE-NEXT: str h0, [sp, #24] 1409; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1410; NONEON-NOSVE-NEXT: fcvt s0, h0 1411; NONEON-NOSVE-NEXT: frintx s0, s0 1412; NONEON-NOSVE-NEXT: fcvt h0, s0 1413; NONEON-NOSVE-NEXT: str h0, [sp, #22] 1414; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1415; NONEON-NOSVE-NEXT: fcvt s0, h0 1416; NONEON-NOSVE-NEXT: frintx s0, s0 1417; NONEON-NOSVE-NEXT: fcvt h0, s0 1418; NONEON-NOSVE-NEXT: str h0, [sp, #20] 1419; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1420; NONEON-NOSVE-NEXT: fcvt s0, h0 1421; NONEON-NOSVE-NEXT: frintx s0, s0 1422; NONEON-NOSVE-NEXT: fcvt h0, s0 1423; NONEON-NOSVE-NEXT: str h0, [sp, #18] 1424; NONEON-NOSVE-NEXT: ldr h0, [sp] 1425; NONEON-NOSVE-NEXT: fcvt s0, h0 1426; NONEON-NOSVE-NEXT: frintx s0, s0 1427; NONEON-NOSVE-NEXT: fcvt h0, s0 1428; NONEON-NOSVE-NEXT: str h0, [sp, #16] 1429; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1430; NONEON-NOSVE-NEXT: add sp, sp, #32 1431; NONEON-NOSVE-NEXT: ret 1432 %res = call <8 x half> @llvm.rint.v8f16(<8 x half> %op) 1433 ret <8 x half> %res 1434} 1435 1436define void @frintx_v16f16(ptr %a) { 1437; CHECK-LABEL: frintx_v16f16: 1438; CHECK: // %bb.0: 1439; CHECK-NEXT: ldp q0, q1, [x0] 1440; CHECK-NEXT: ptrue p0.h, vl8 1441; CHECK-NEXT: frintx z0.h, p0/m, z0.h 1442; CHECK-NEXT: frintx z1.h, p0/m, z1.h 1443; CHECK-NEXT: stp q0, q1, [x0] 1444; CHECK-NEXT: ret 1445; 1446; NONEON-NOSVE-LABEL: frintx_v16f16: 1447; NONEON-NOSVE: // %bb.0: 1448; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1449; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1450; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1451; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 1452; NONEON-NOSVE-NEXT: fcvt s0, h0 1453; NONEON-NOSVE-NEXT: frintx s0, s0 1454; NONEON-NOSVE-NEXT: fcvt h0, s0 1455; NONEON-NOSVE-NEXT: str h0, [sp, #62] 1456; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 1457; NONEON-NOSVE-NEXT: fcvt s0, h0 1458; NONEON-NOSVE-NEXT: frintx s0, s0 1459; NONEON-NOSVE-NEXT: fcvt h0, s0 1460; NONEON-NOSVE-NEXT: str h0, [sp, #60] 1461; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 1462; NONEON-NOSVE-NEXT: fcvt s0, h0 1463; NONEON-NOSVE-NEXT: frintx s0, s0 1464; NONEON-NOSVE-NEXT: fcvt h0, s0 1465; NONEON-NOSVE-NEXT: str h0, [sp, #58] 1466; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 1467; NONEON-NOSVE-NEXT: fcvt s0, h0 1468; NONEON-NOSVE-NEXT: frintx s0, s0 1469; NONEON-NOSVE-NEXT: fcvt h0, s0 1470; NONEON-NOSVE-NEXT: str h0, [sp, #56] 1471; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 1472; NONEON-NOSVE-NEXT: fcvt s0, h0 1473; NONEON-NOSVE-NEXT: frintx s0, s0 1474; NONEON-NOSVE-NEXT: fcvt h0, s0 1475; NONEON-NOSVE-NEXT: str h0, [sp, #54] 1476; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 1477; NONEON-NOSVE-NEXT: fcvt s0, h0 1478; NONEON-NOSVE-NEXT: frintx s0, s0 1479; NONEON-NOSVE-NEXT: fcvt h0, s0 1480; NONEON-NOSVE-NEXT: str h0, [sp, #52] 1481; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 1482; NONEON-NOSVE-NEXT: fcvt s0, h0 1483; NONEON-NOSVE-NEXT: frintx s0, s0 1484; NONEON-NOSVE-NEXT: fcvt h0, s0 1485; NONEON-NOSVE-NEXT: str h0, [sp, #50] 1486; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 1487; NONEON-NOSVE-NEXT: fcvt s0, h0 1488; NONEON-NOSVE-NEXT: frintx s0, s0 1489; NONEON-NOSVE-NEXT: fcvt h0, s0 1490; NONEON-NOSVE-NEXT: str h0, [sp, #48] 1491; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1492; NONEON-NOSVE-NEXT: fcvt s0, h0 1493; NONEON-NOSVE-NEXT: frintx s0, s0 1494; NONEON-NOSVE-NEXT: fcvt h0, s0 1495; NONEON-NOSVE-NEXT: str h0, [sp, #46] 1496; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1497; NONEON-NOSVE-NEXT: fcvt s0, h0 1498; NONEON-NOSVE-NEXT: frintx s0, s0 1499; NONEON-NOSVE-NEXT: fcvt h0, s0 1500; NONEON-NOSVE-NEXT: str h0, [sp, #44] 1501; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1502; NONEON-NOSVE-NEXT: fcvt s0, h0 1503; NONEON-NOSVE-NEXT: frintx s0, s0 1504; NONEON-NOSVE-NEXT: fcvt h0, s0 1505; NONEON-NOSVE-NEXT: str h0, [sp, #42] 1506; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1507; NONEON-NOSVE-NEXT: fcvt s0, h0 1508; NONEON-NOSVE-NEXT: frintx s0, s0 1509; NONEON-NOSVE-NEXT: fcvt h0, s0 1510; NONEON-NOSVE-NEXT: str h0, [sp, #40] 1511; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1512; NONEON-NOSVE-NEXT: fcvt s0, h0 1513; NONEON-NOSVE-NEXT: frintx s0, s0 1514; NONEON-NOSVE-NEXT: fcvt h0, s0 1515; NONEON-NOSVE-NEXT: str h0, [sp, #38] 1516; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1517; NONEON-NOSVE-NEXT: fcvt s0, h0 1518; NONEON-NOSVE-NEXT: frintx s0, s0 1519; NONEON-NOSVE-NEXT: fcvt h0, s0 1520; NONEON-NOSVE-NEXT: str h0, [sp, #36] 1521; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1522; NONEON-NOSVE-NEXT: fcvt s0, h0 1523; NONEON-NOSVE-NEXT: frintx s0, s0 1524; NONEON-NOSVE-NEXT: fcvt h0, s0 1525; NONEON-NOSVE-NEXT: str h0, [sp, #34] 1526; NONEON-NOSVE-NEXT: ldr h0, [sp] 1527; NONEON-NOSVE-NEXT: fcvt s0, h0 1528; NONEON-NOSVE-NEXT: frintx s0, s0 1529; NONEON-NOSVE-NEXT: fcvt h0, s0 1530; NONEON-NOSVE-NEXT: str h0, [sp, #32] 1531; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1532; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1533; NONEON-NOSVE-NEXT: add sp, sp, #64 1534; NONEON-NOSVE-NEXT: ret 1535 %op = load <16 x half>, ptr %a 1536 %res = call <16 x half> @llvm.rint.v16f16(<16 x half> %op) 1537 store <16 x half> %res, ptr %a 1538 ret void 1539} 1540 1541define <2 x float> @frintx_v2f32(<2 x float> %op) { 1542; CHECK-LABEL: frintx_v2f32: 1543; CHECK: // %bb.0: 1544; CHECK-NEXT: ptrue p0.s, vl2 1545; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1546; CHECK-NEXT: frintx z0.s, p0/m, z0.s 1547; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1548; CHECK-NEXT: ret 1549; 1550; NONEON-NOSVE-LABEL: frintx_v2f32: 1551; NONEON-NOSVE: // %bb.0: 1552; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1553; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1554; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1555; NONEON-NOSVE-NEXT: frintx s1, s0 1556; NONEON-NOSVE-NEXT: ldr s0, [sp] 1557; NONEON-NOSVE-NEXT: frintx s0, s0 1558; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 1559; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1560; NONEON-NOSVE-NEXT: add sp, sp, #16 1561; NONEON-NOSVE-NEXT: ret 1562 %res = call <2 x float> @llvm.rint.v2f32(<2 x float> %op) 1563 ret <2 x float> %res 1564} 1565 1566define <4 x float> @frintx_v4f32(<4 x float> %op) { 1567; CHECK-LABEL: frintx_v4f32: 1568; CHECK: // %bb.0: 1569; CHECK-NEXT: ptrue p0.s, vl4 1570; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1571; CHECK-NEXT: frintx z0.s, p0/m, z0.s 1572; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1573; CHECK-NEXT: ret 1574; 1575; NONEON-NOSVE-LABEL: frintx_v4f32: 1576; NONEON-NOSVE: // %bb.0: 1577; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1578; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1579; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 1580; NONEON-NOSVE-NEXT: frintx s1, s0 1581; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 1582; NONEON-NOSVE-NEXT: frintx s0, s0 1583; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 1584; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1585; NONEON-NOSVE-NEXT: frintx s1, s0 1586; NONEON-NOSVE-NEXT: ldr s0, [sp] 1587; NONEON-NOSVE-NEXT: frintx s0, s0 1588; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 1589; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1590; NONEON-NOSVE-NEXT: add sp, sp, #32 1591; NONEON-NOSVE-NEXT: ret 1592 %res = call <4 x float> @llvm.rint.v4f32(<4 x float> %op) 1593 ret <4 x float> %res 1594} 1595 1596define void @frintx_v8f32(ptr %a) { 1597; CHECK-LABEL: frintx_v8f32: 1598; CHECK: // %bb.0: 1599; CHECK-NEXT: ldp q0, q1, [x0] 1600; CHECK-NEXT: ptrue p0.s, vl4 1601; CHECK-NEXT: frintx z0.s, p0/m, z0.s 1602; CHECK-NEXT: frintx z1.s, p0/m, z1.s 1603; CHECK-NEXT: stp q0, q1, [x0] 1604; CHECK-NEXT: ret 1605; 1606; NONEON-NOSVE-LABEL: frintx_v8f32: 1607; NONEON-NOSVE: // %bb.0: 1608; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1609; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1610; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1611; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 1612; NONEON-NOSVE-NEXT: frintx s1, s0 1613; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 1614; NONEON-NOSVE-NEXT: frintx s0, s0 1615; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 1616; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 1617; NONEON-NOSVE-NEXT: frintx s1, s0 1618; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 1619; NONEON-NOSVE-NEXT: frintx s0, s0 1620; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 1621; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 1622; NONEON-NOSVE-NEXT: frintx s1, s0 1623; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 1624; NONEON-NOSVE-NEXT: frintx s0, s0 1625; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 1626; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1627; NONEON-NOSVE-NEXT: frintx s1, s0 1628; NONEON-NOSVE-NEXT: ldr s0, [sp] 1629; NONEON-NOSVE-NEXT: frintx s0, s0 1630; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 1631; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1632; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1633; NONEON-NOSVE-NEXT: add sp, sp, #64 1634; NONEON-NOSVE-NEXT: ret 1635 %op = load <8 x float>, ptr %a 1636 %res = call <8 x float> @llvm.rint.v8f32(<8 x float> %op) 1637 store <8 x float> %res, ptr %a 1638 ret void 1639} 1640 1641define <1 x double> @frintx_v1f64(<1 x double> %op) { 1642; CHECK-LABEL: frintx_v1f64: 1643; CHECK: // %bb.0: 1644; CHECK-NEXT: frintx d0, d0 1645; CHECK-NEXT: ret 1646; 1647; NONEON-NOSVE-LABEL: frintx_v1f64: 1648; NONEON-NOSVE: // %bb.0: 1649; NONEON-NOSVE-NEXT: sub sp, sp, #16 1650; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1651; NONEON-NOSVE-NEXT: frintx d0, d0 1652; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1653; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1654; NONEON-NOSVE-NEXT: add sp, sp, #16 1655; NONEON-NOSVE-NEXT: ret 1656 %res = call <1 x double> @llvm.rint.v1f64(<1 x double> %op) 1657 ret <1 x double> %res 1658} 1659 1660define <2 x double> @frintx_v2f64(<2 x double> %op) { 1661; CHECK-LABEL: frintx_v2f64: 1662; CHECK: // %bb.0: 1663; CHECK-NEXT: ptrue p0.d, vl2 1664; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1665; CHECK-NEXT: frintx z0.d, p0/m, z0.d 1666; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1667; CHECK-NEXT: ret 1668; 1669; NONEON-NOSVE-LABEL: frintx_v2f64: 1670; NONEON-NOSVE: // %bb.0: 1671; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1672; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1673; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1674; NONEON-NOSVE-NEXT: frintx d1, d0 1675; NONEON-NOSVE-NEXT: ldr d0, [sp] 1676; NONEON-NOSVE-NEXT: frintx d0, d0 1677; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1678; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1679; NONEON-NOSVE-NEXT: add sp, sp, #32 1680; NONEON-NOSVE-NEXT: ret 1681 %res = call <2 x double> @llvm.rint.v2f64(<2 x double> %op) 1682 ret <2 x double> %res 1683} 1684 1685define void @frintx_v4f64(ptr %a) { 1686; CHECK-LABEL: frintx_v4f64: 1687; CHECK: // %bb.0: 1688; CHECK-NEXT: ldp q0, q1, [x0] 1689; CHECK-NEXT: ptrue p0.d, vl2 1690; CHECK-NEXT: frintx z0.d, p0/m, z0.d 1691; CHECK-NEXT: frintx z1.d, p0/m, z1.d 1692; CHECK-NEXT: stp q0, q1, [x0] 1693; CHECK-NEXT: ret 1694; 1695; NONEON-NOSVE-LABEL: frintx_v4f64: 1696; NONEON-NOSVE: // %bb.0: 1697; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1698; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1699; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1700; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1701; NONEON-NOSVE-NEXT: frintx d1, d0 1702; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 1703; NONEON-NOSVE-NEXT: frintx d0, d0 1704; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 1705; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1706; NONEON-NOSVE-NEXT: frintx d1, d0 1707; NONEON-NOSVE-NEXT: ldr d0, [sp] 1708; NONEON-NOSVE-NEXT: frintx d0, d0 1709; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1710; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1711; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1712; NONEON-NOSVE-NEXT: add sp, sp, #64 1713; NONEON-NOSVE-NEXT: ret 1714 %op = load <4 x double>, ptr %a 1715 %res = call <4 x double> @llvm.rint.v4f64(<4 x double> %op) 1716 store <4 x double> %res, ptr %a 1717 ret void 1718} 1719 1720; 1721; ROUND -> FRINTA 1722; 1723 1724define <2 x half> @frinta_v2f16(<2 x half> %op) { 1725; CHECK-LABEL: frinta_v2f16: 1726; CHECK: // %bb.0: 1727; CHECK-NEXT: ptrue p0.h, vl4 1728; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1729; CHECK-NEXT: frinta z0.h, p0/m, z0.h 1730; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1731; CHECK-NEXT: ret 1732; 1733; NONEON-NOSVE-LABEL: frinta_v2f16: 1734; NONEON-NOSVE: // %bb.0: 1735; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1736; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1737; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1738; NONEON-NOSVE-NEXT: fcvt s0, h0 1739; NONEON-NOSVE-NEXT: frinta s0, s0 1740; NONEON-NOSVE-NEXT: fcvt h0, s0 1741; NONEON-NOSVE-NEXT: str h0, [sp, #14] 1742; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1743; NONEON-NOSVE-NEXT: fcvt s0, h0 1744; NONEON-NOSVE-NEXT: frinta s0, s0 1745; NONEON-NOSVE-NEXT: fcvt h0, s0 1746; NONEON-NOSVE-NEXT: str h0, [sp, #12] 1747; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1748; NONEON-NOSVE-NEXT: fcvt s0, h0 1749; NONEON-NOSVE-NEXT: frinta s0, s0 1750; NONEON-NOSVE-NEXT: fcvt h0, s0 1751; NONEON-NOSVE-NEXT: str h0, [sp, #10] 1752; NONEON-NOSVE-NEXT: ldr h0, [sp] 1753; NONEON-NOSVE-NEXT: fcvt s0, h0 1754; NONEON-NOSVE-NEXT: frinta s0, s0 1755; NONEON-NOSVE-NEXT: fcvt h0, s0 1756; NONEON-NOSVE-NEXT: str h0, [sp, #8] 1757; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1758; NONEON-NOSVE-NEXT: add sp, sp, #16 1759; NONEON-NOSVE-NEXT: ret 1760 %res = call <2 x half> @llvm.round.v2f16(<2 x half> %op) 1761 ret <2 x half> %res 1762} 1763 1764define <4 x half> @frinta_v4f16(<4 x half> %op) { 1765; CHECK-LABEL: frinta_v4f16: 1766; CHECK: // %bb.0: 1767; CHECK-NEXT: ptrue p0.h, vl4 1768; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1769; CHECK-NEXT: frinta z0.h, p0/m, z0.h 1770; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1771; CHECK-NEXT: ret 1772; 1773; NONEON-NOSVE-LABEL: frinta_v4f16: 1774; NONEON-NOSVE: // %bb.0: 1775; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1776; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1777; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1778; NONEON-NOSVE-NEXT: fcvt s0, h0 1779; NONEON-NOSVE-NEXT: frinta s0, s0 1780; NONEON-NOSVE-NEXT: fcvt h0, s0 1781; NONEON-NOSVE-NEXT: str h0, [sp, #14] 1782; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1783; NONEON-NOSVE-NEXT: fcvt s0, h0 1784; NONEON-NOSVE-NEXT: frinta s0, s0 1785; NONEON-NOSVE-NEXT: fcvt h0, s0 1786; NONEON-NOSVE-NEXT: str h0, [sp, #12] 1787; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1788; NONEON-NOSVE-NEXT: fcvt s0, h0 1789; NONEON-NOSVE-NEXT: frinta s0, s0 1790; NONEON-NOSVE-NEXT: fcvt h0, s0 1791; NONEON-NOSVE-NEXT: str h0, [sp, #10] 1792; NONEON-NOSVE-NEXT: ldr h0, [sp] 1793; NONEON-NOSVE-NEXT: fcvt s0, h0 1794; NONEON-NOSVE-NEXT: frinta s0, s0 1795; NONEON-NOSVE-NEXT: fcvt h0, s0 1796; NONEON-NOSVE-NEXT: str h0, [sp, #8] 1797; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1798; NONEON-NOSVE-NEXT: add sp, sp, #16 1799; NONEON-NOSVE-NEXT: ret 1800 %res = call <4 x half> @llvm.round.v4f16(<4 x half> %op) 1801 ret <4 x half> %res 1802} 1803 1804define <8 x half> @frinta_v8f16(<8 x half> %op) { 1805; CHECK-LABEL: frinta_v8f16: 1806; CHECK: // %bb.0: 1807; CHECK-NEXT: ptrue p0.h, vl8 1808; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1809; CHECK-NEXT: frinta z0.h, p0/m, z0.h 1810; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1811; CHECK-NEXT: ret 1812; 1813; NONEON-NOSVE-LABEL: frinta_v8f16: 1814; NONEON-NOSVE: // %bb.0: 1815; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 1816; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1817; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1818; NONEON-NOSVE-NEXT: fcvt s0, h0 1819; NONEON-NOSVE-NEXT: frinta s0, s0 1820; NONEON-NOSVE-NEXT: fcvt h0, s0 1821; NONEON-NOSVE-NEXT: str h0, [sp, #30] 1822; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1823; NONEON-NOSVE-NEXT: fcvt s0, h0 1824; NONEON-NOSVE-NEXT: frinta s0, s0 1825; NONEON-NOSVE-NEXT: fcvt h0, s0 1826; NONEON-NOSVE-NEXT: str h0, [sp, #28] 1827; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1828; NONEON-NOSVE-NEXT: fcvt s0, h0 1829; NONEON-NOSVE-NEXT: frinta s0, s0 1830; NONEON-NOSVE-NEXT: fcvt h0, s0 1831; NONEON-NOSVE-NEXT: str h0, [sp, #26] 1832; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1833; NONEON-NOSVE-NEXT: fcvt s0, h0 1834; NONEON-NOSVE-NEXT: frinta s0, s0 1835; NONEON-NOSVE-NEXT: fcvt h0, s0 1836; NONEON-NOSVE-NEXT: str h0, [sp, #24] 1837; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1838; NONEON-NOSVE-NEXT: fcvt s0, h0 1839; NONEON-NOSVE-NEXT: frinta s0, s0 1840; NONEON-NOSVE-NEXT: fcvt h0, s0 1841; NONEON-NOSVE-NEXT: str h0, [sp, #22] 1842; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1843; NONEON-NOSVE-NEXT: fcvt s0, h0 1844; NONEON-NOSVE-NEXT: frinta s0, s0 1845; NONEON-NOSVE-NEXT: fcvt h0, s0 1846; NONEON-NOSVE-NEXT: str h0, [sp, #20] 1847; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1848; NONEON-NOSVE-NEXT: fcvt s0, h0 1849; NONEON-NOSVE-NEXT: frinta s0, s0 1850; NONEON-NOSVE-NEXT: fcvt h0, s0 1851; NONEON-NOSVE-NEXT: str h0, [sp, #18] 1852; NONEON-NOSVE-NEXT: ldr h0, [sp] 1853; NONEON-NOSVE-NEXT: fcvt s0, h0 1854; NONEON-NOSVE-NEXT: frinta s0, s0 1855; NONEON-NOSVE-NEXT: fcvt h0, s0 1856; NONEON-NOSVE-NEXT: str h0, [sp, #16] 1857; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 1858; NONEON-NOSVE-NEXT: add sp, sp, #32 1859; NONEON-NOSVE-NEXT: ret 1860 %res = call <8 x half> @llvm.round.v8f16(<8 x half> %op) 1861 ret <8 x half> %res 1862} 1863 1864define void @frinta_v16f16(ptr %a) { 1865; CHECK-LABEL: frinta_v16f16: 1866; CHECK: // %bb.0: 1867; CHECK-NEXT: ldp q0, q1, [x0] 1868; CHECK-NEXT: ptrue p0.h, vl8 1869; CHECK-NEXT: frinta z0.h, p0/m, z0.h 1870; CHECK-NEXT: frinta z1.h, p0/m, z1.h 1871; CHECK-NEXT: stp q0, q1, [x0] 1872; CHECK-NEXT: ret 1873; 1874; NONEON-NOSVE-LABEL: frinta_v16f16: 1875; NONEON-NOSVE: // %bb.0: 1876; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1877; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 1878; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1879; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 1880; NONEON-NOSVE-NEXT: fcvt s0, h0 1881; NONEON-NOSVE-NEXT: frinta s0, s0 1882; NONEON-NOSVE-NEXT: fcvt h0, s0 1883; NONEON-NOSVE-NEXT: str h0, [sp, #62] 1884; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 1885; NONEON-NOSVE-NEXT: fcvt s0, h0 1886; NONEON-NOSVE-NEXT: frinta s0, s0 1887; NONEON-NOSVE-NEXT: fcvt h0, s0 1888; NONEON-NOSVE-NEXT: str h0, [sp, #60] 1889; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 1890; NONEON-NOSVE-NEXT: fcvt s0, h0 1891; NONEON-NOSVE-NEXT: frinta s0, s0 1892; NONEON-NOSVE-NEXT: fcvt h0, s0 1893; NONEON-NOSVE-NEXT: str h0, [sp, #58] 1894; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 1895; NONEON-NOSVE-NEXT: fcvt s0, h0 1896; NONEON-NOSVE-NEXT: frinta s0, s0 1897; NONEON-NOSVE-NEXT: fcvt h0, s0 1898; NONEON-NOSVE-NEXT: str h0, [sp, #56] 1899; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 1900; NONEON-NOSVE-NEXT: fcvt s0, h0 1901; NONEON-NOSVE-NEXT: frinta s0, s0 1902; NONEON-NOSVE-NEXT: fcvt h0, s0 1903; NONEON-NOSVE-NEXT: str h0, [sp, #54] 1904; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 1905; NONEON-NOSVE-NEXT: fcvt s0, h0 1906; NONEON-NOSVE-NEXT: frinta s0, s0 1907; NONEON-NOSVE-NEXT: fcvt h0, s0 1908; NONEON-NOSVE-NEXT: str h0, [sp, #52] 1909; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 1910; NONEON-NOSVE-NEXT: fcvt s0, h0 1911; NONEON-NOSVE-NEXT: frinta s0, s0 1912; NONEON-NOSVE-NEXT: fcvt h0, s0 1913; NONEON-NOSVE-NEXT: str h0, [sp, #50] 1914; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 1915; NONEON-NOSVE-NEXT: fcvt s0, h0 1916; NONEON-NOSVE-NEXT: frinta s0, s0 1917; NONEON-NOSVE-NEXT: fcvt h0, s0 1918; NONEON-NOSVE-NEXT: str h0, [sp, #48] 1919; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 1920; NONEON-NOSVE-NEXT: fcvt s0, h0 1921; NONEON-NOSVE-NEXT: frinta s0, s0 1922; NONEON-NOSVE-NEXT: fcvt h0, s0 1923; NONEON-NOSVE-NEXT: str h0, [sp, #46] 1924; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 1925; NONEON-NOSVE-NEXT: fcvt s0, h0 1926; NONEON-NOSVE-NEXT: frinta s0, s0 1927; NONEON-NOSVE-NEXT: fcvt h0, s0 1928; NONEON-NOSVE-NEXT: str h0, [sp, #44] 1929; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 1930; NONEON-NOSVE-NEXT: fcvt s0, h0 1931; NONEON-NOSVE-NEXT: frinta s0, s0 1932; NONEON-NOSVE-NEXT: fcvt h0, s0 1933; NONEON-NOSVE-NEXT: str h0, [sp, #42] 1934; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 1935; NONEON-NOSVE-NEXT: fcvt s0, h0 1936; NONEON-NOSVE-NEXT: frinta s0, s0 1937; NONEON-NOSVE-NEXT: fcvt h0, s0 1938; NONEON-NOSVE-NEXT: str h0, [sp, #40] 1939; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 1940; NONEON-NOSVE-NEXT: fcvt s0, h0 1941; NONEON-NOSVE-NEXT: frinta s0, s0 1942; NONEON-NOSVE-NEXT: fcvt h0, s0 1943; NONEON-NOSVE-NEXT: str h0, [sp, #38] 1944; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 1945; NONEON-NOSVE-NEXT: fcvt s0, h0 1946; NONEON-NOSVE-NEXT: frinta s0, s0 1947; NONEON-NOSVE-NEXT: fcvt h0, s0 1948; NONEON-NOSVE-NEXT: str h0, [sp, #36] 1949; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 1950; NONEON-NOSVE-NEXT: fcvt s0, h0 1951; NONEON-NOSVE-NEXT: frinta s0, s0 1952; NONEON-NOSVE-NEXT: fcvt h0, s0 1953; NONEON-NOSVE-NEXT: str h0, [sp, #34] 1954; NONEON-NOSVE-NEXT: ldr h0, [sp] 1955; NONEON-NOSVE-NEXT: fcvt s0, h0 1956; NONEON-NOSVE-NEXT: frinta s0, s0 1957; NONEON-NOSVE-NEXT: fcvt h0, s0 1958; NONEON-NOSVE-NEXT: str h0, [sp, #32] 1959; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1960; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1961; NONEON-NOSVE-NEXT: add sp, sp, #64 1962; NONEON-NOSVE-NEXT: ret 1963 %op = load <16 x half>, ptr %a 1964 %res = call <16 x half> @llvm.round.v16f16(<16 x half> %op) 1965 store <16 x half> %res, ptr %a 1966 ret void 1967} 1968 1969define <2 x float> @frinta_v2f32(<2 x float> %op) { 1970; CHECK-LABEL: frinta_v2f32: 1971; CHECK: // %bb.0: 1972; CHECK-NEXT: ptrue p0.s, vl2 1973; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1974; CHECK-NEXT: frinta z0.s, p0/m, z0.s 1975; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1976; CHECK-NEXT: ret 1977; 1978; NONEON-NOSVE-LABEL: frinta_v2f32: 1979; NONEON-NOSVE: // %bb.0: 1980; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 1981; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1982; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 1983; NONEON-NOSVE-NEXT: frinta s1, s0 1984; NONEON-NOSVE-NEXT: ldr s0, [sp] 1985; NONEON-NOSVE-NEXT: frinta s0, s0 1986; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 1987; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1988; NONEON-NOSVE-NEXT: add sp, sp, #16 1989; NONEON-NOSVE-NEXT: ret 1990 %res = call <2 x float> @llvm.round.v2f32(<2 x float> %op) 1991 ret <2 x float> %res 1992} 1993 1994define <4 x float> @frinta_v4f32(<4 x float> %op) { 1995; CHECK-LABEL: frinta_v4f32: 1996; CHECK: // %bb.0: 1997; CHECK-NEXT: ptrue p0.s, vl4 1998; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1999; CHECK-NEXT: frinta z0.s, p0/m, z0.s 2000; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2001; CHECK-NEXT: ret 2002; 2003; NONEON-NOSVE-LABEL: frinta_v4f32: 2004; NONEON-NOSVE: // %bb.0: 2005; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2006; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2007; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2008; NONEON-NOSVE-NEXT: frinta s1, s0 2009; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2010; NONEON-NOSVE-NEXT: frinta s0, s0 2011; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 2012; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2013; NONEON-NOSVE-NEXT: frinta s1, s0 2014; NONEON-NOSVE-NEXT: ldr s0, [sp] 2015; NONEON-NOSVE-NEXT: frinta s0, s0 2016; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 2017; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2018; NONEON-NOSVE-NEXT: add sp, sp, #32 2019; NONEON-NOSVE-NEXT: ret 2020 %res = call <4 x float> @llvm.round.v4f32(<4 x float> %op) 2021 ret <4 x float> %res 2022} 2023 2024define void @frinta_v8f32(ptr %a) { 2025; CHECK-LABEL: frinta_v8f32: 2026; CHECK: // %bb.0: 2027; CHECK-NEXT: ldp q0, q1, [x0] 2028; CHECK-NEXT: ptrue p0.s, vl4 2029; CHECK-NEXT: frinta z0.s, p0/m, z0.s 2030; CHECK-NEXT: frinta z1.s, p0/m, z1.s 2031; CHECK-NEXT: stp q0, q1, [x0] 2032; CHECK-NEXT: ret 2033; 2034; NONEON-NOSVE-LABEL: frinta_v8f32: 2035; NONEON-NOSVE: // %bb.0: 2036; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2037; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2038; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2039; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 2040; NONEON-NOSVE-NEXT: frinta s1, s0 2041; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 2042; NONEON-NOSVE-NEXT: frinta s0, s0 2043; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 2044; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 2045; NONEON-NOSVE-NEXT: frinta s1, s0 2046; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 2047; NONEON-NOSVE-NEXT: frinta s0, s0 2048; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 2049; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2050; NONEON-NOSVE-NEXT: frinta s1, s0 2051; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2052; NONEON-NOSVE-NEXT: frinta s0, s0 2053; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 2054; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2055; NONEON-NOSVE-NEXT: frinta s1, s0 2056; NONEON-NOSVE-NEXT: ldr s0, [sp] 2057; NONEON-NOSVE-NEXT: frinta s0, s0 2058; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 2059; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2060; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2061; NONEON-NOSVE-NEXT: add sp, sp, #64 2062; NONEON-NOSVE-NEXT: ret 2063 %op = load <8 x float>, ptr %a 2064 %res = call <8 x float> @llvm.round.v8f32(<8 x float> %op) 2065 store <8 x float> %res, ptr %a 2066 ret void 2067} 2068 2069define <1 x double> @frinta_v1f64(<1 x double> %op) { 2070; CHECK-LABEL: frinta_v1f64: 2071; CHECK: // %bb.0: 2072; CHECK-NEXT: frinta d0, d0 2073; CHECK-NEXT: ret 2074; 2075; NONEON-NOSVE-LABEL: frinta_v1f64: 2076; NONEON-NOSVE: // %bb.0: 2077; NONEON-NOSVE-NEXT: sub sp, sp, #16 2078; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2079; NONEON-NOSVE-NEXT: frinta d0, d0 2080; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2081; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2082; NONEON-NOSVE-NEXT: add sp, sp, #16 2083; NONEON-NOSVE-NEXT: ret 2084 %res = call <1 x double> @llvm.round.v1f64(<1 x double> %op) 2085 ret <1 x double> %res 2086} 2087 2088define <2 x double> @frinta_v2f64(<2 x double> %op) { 2089; CHECK-LABEL: frinta_v2f64: 2090; CHECK: // %bb.0: 2091; CHECK-NEXT: ptrue p0.d, vl2 2092; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2093; CHECK-NEXT: frinta z0.d, p0/m, z0.d 2094; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2095; CHECK-NEXT: ret 2096; 2097; NONEON-NOSVE-LABEL: frinta_v2f64: 2098; NONEON-NOSVE: // %bb.0: 2099; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2100; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2101; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2102; NONEON-NOSVE-NEXT: frinta d1, d0 2103; NONEON-NOSVE-NEXT: ldr d0, [sp] 2104; NONEON-NOSVE-NEXT: frinta d0, d0 2105; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2106; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2107; NONEON-NOSVE-NEXT: add sp, sp, #32 2108; NONEON-NOSVE-NEXT: ret 2109 %res = call <2 x double> @llvm.round.v2f64(<2 x double> %op) 2110 ret <2 x double> %res 2111} 2112 2113define void @frinta_v4f64(ptr %a) { 2114; CHECK-LABEL: frinta_v4f64: 2115; CHECK: // %bb.0: 2116; CHECK-NEXT: ldp q0, q1, [x0] 2117; CHECK-NEXT: ptrue p0.d, vl2 2118; CHECK-NEXT: frinta z0.d, p0/m, z0.d 2119; CHECK-NEXT: frinta z1.d, p0/m, z1.d 2120; CHECK-NEXT: stp q0, q1, [x0] 2121; CHECK-NEXT: ret 2122; 2123; NONEON-NOSVE-LABEL: frinta_v4f64: 2124; NONEON-NOSVE: // %bb.0: 2125; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2126; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2127; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2128; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2129; NONEON-NOSVE-NEXT: frinta d1, d0 2130; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 2131; NONEON-NOSVE-NEXT: frinta d0, d0 2132; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2133; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2134; NONEON-NOSVE-NEXT: frinta d1, d0 2135; NONEON-NOSVE-NEXT: ldr d0, [sp] 2136; NONEON-NOSVE-NEXT: frinta d0, d0 2137; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2138; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2139; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2140; NONEON-NOSVE-NEXT: add sp, sp, #64 2141; NONEON-NOSVE-NEXT: ret 2142 %op = load <4 x double>, ptr %a 2143 %res = call <4 x double> @llvm.round.v4f64(<4 x double> %op) 2144 store <4 x double> %res, ptr %a 2145 ret void 2146} 2147 2148; 2149; ROUNDEVEN -> FRINTN 2150; 2151 2152define <2 x half> @frintn_v2f16(<2 x half> %op) { 2153; CHECK-LABEL: frintn_v2f16: 2154; CHECK: // %bb.0: 2155; CHECK-NEXT: ptrue p0.h, vl4 2156; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2157; CHECK-NEXT: frintn z0.h, p0/m, z0.h 2158; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2159; CHECK-NEXT: ret 2160; 2161; NONEON-NOSVE-LABEL: frintn_v2f16: 2162; NONEON-NOSVE: // %bb.0: 2163; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2164; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2165; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2166; NONEON-NOSVE-NEXT: fcvt s0, h0 2167; NONEON-NOSVE-NEXT: frintn s0, s0 2168; NONEON-NOSVE-NEXT: fcvt h0, s0 2169; NONEON-NOSVE-NEXT: str h0, [sp, #14] 2170; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2171; NONEON-NOSVE-NEXT: fcvt s0, h0 2172; NONEON-NOSVE-NEXT: frintn s0, s0 2173; NONEON-NOSVE-NEXT: fcvt h0, s0 2174; NONEON-NOSVE-NEXT: str h0, [sp, #12] 2175; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2176; NONEON-NOSVE-NEXT: fcvt s0, h0 2177; NONEON-NOSVE-NEXT: frintn s0, s0 2178; NONEON-NOSVE-NEXT: fcvt h0, s0 2179; NONEON-NOSVE-NEXT: str h0, [sp, #10] 2180; NONEON-NOSVE-NEXT: ldr h0, [sp] 2181; NONEON-NOSVE-NEXT: fcvt s0, h0 2182; NONEON-NOSVE-NEXT: frintn s0, s0 2183; NONEON-NOSVE-NEXT: fcvt h0, s0 2184; NONEON-NOSVE-NEXT: str h0, [sp, #8] 2185; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2186; NONEON-NOSVE-NEXT: add sp, sp, #16 2187; NONEON-NOSVE-NEXT: ret 2188 %res = call <2 x half> @llvm.roundeven.v2f16(<2 x half> %op) 2189 ret <2 x half> %res 2190} 2191 2192define <4 x half> @frintn_v4f16(<4 x half> %op) { 2193; CHECK-LABEL: frintn_v4f16: 2194; CHECK: // %bb.0: 2195; CHECK-NEXT: ptrue p0.h, vl4 2196; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2197; CHECK-NEXT: frintn z0.h, p0/m, z0.h 2198; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2199; CHECK-NEXT: ret 2200; 2201; NONEON-NOSVE-LABEL: frintn_v4f16: 2202; NONEON-NOSVE: // %bb.0: 2203; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2204; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2205; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2206; NONEON-NOSVE-NEXT: fcvt s0, h0 2207; NONEON-NOSVE-NEXT: frintn s0, s0 2208; NONEON-NOSVE-NEXT: fcvt h0, s0 2209; NONEON-NOSVE-NEXT: str h0, [sp, #14] 2210; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2211; NONEON-NOSVE-NEXT: fcvt s0, h0 2212; NONEON-NOSVE-NEXT: frintn s0, s0 2213; NONEON-NOSVE-NEXT: fcvt h0, s0 2214; NONEON-NOSVE-NEXT: str h0, [sp, #12] 2215; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2216; NONEON-NOSVE-NEXT: fcvt s0, h0 2217; NONEON-NOSVE-NEXT: frintn s0, s0 2218; NONEON-NOSVE-NEXT: fcvt h0, s0 2219; NONEON-NOSVE-NEXT: str h0, [sp, #10] 2220; NONEON-NOSVE-NEXT: ldr h0, [sp] 2221; NONEON-NOSVE-NEXT: fcvt s0, h0 2222; NONEON-NOSVE-NEXT: frintn s0, s0 2223; NONEON-NOSVE-NEXT: fcvt h0, s0 2224; NONEON-NOSVE-NEXT: str h0, [sp, #8] 2225; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2226; NONEON-NOSVE-NEXT: add sp, sp, #16 2227; NONEON-NOSVE-NEXT: ret 2228 %res = call <4 x half> @llvm.roundeven.v4f16(<4 x half> %op) 2229 ret <4 x half> %res 2230} 2231 2232define <8 x half> @frintn_v8f16(<8 x half> %op) { 2233; CHECK-LABEL: frintn_v8f16: 2234; CHECK: // %bb.0: 2235; CHECK-NEXT: ptrue p0.h, vl8 2236; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2237; CHECK-NEXT: frintn z0.h, p0/m, z0.h 2238; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2239; CHECK-NEXT: ret 2240; 2241; NONEON-NOSVE-LABEL: frintn_v8f16: 2242; NONEON-NOSVE: // %bb.0: 2243; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2244; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2245; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 2246; NONEON-NOSVE-NEXT: fcvt s0, h0 2247; NONEON-NOSVE-NEXT: frintn s0, s0 2248; NONEON-NOSVE-NEXT: fcvt h0, s0 2249; NONEON-NOSVE-NEXT: str h0, [sp, #30] 2250; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 2251; NONEON-NOSVE-NEXT: fcvt s0, h0 2252; NONEON-NOSVE-NEXT: frintn s0, s0 2253; NONEON-NOSVE-NEXT: fcvt h0, s0 2254; NONEON-NOSVE-NEXT: str h0, [sp, #28] 2255; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2256; NONEON-NOSVE-NEXT: fcvt s0, h0 2257; NONEON-NOSVE-NEXT: frintn s0, s0 2258; NONEON-NOSVE-NEXT: fcvt h0, s0 2259; NONEON-NOSVE-NEXT: str h0, [sp, #26] 2260; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2261; NONEON-NOSVE-NEXT: fcvt s0, h0 2262; NONEON-NOSVE-NEXT: frintn s0, s0 2263; NONEON-NOSVE-NEXT: fcvt h0, s0 2264; NONEON-NOSVE-NEXT: str h0, [sp, #24] 2265; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2266; NONEON-NOSVE-NEXT: fcvt s0, h0 2267; NONEON-NOSVE-NEXT: frintn s0, s0 2268; NONEON-NOSVE-NEXT: fcvt h0, s0 2269; NONEON-NOSVE-NEXT: str h0, [sp, #22] 2270; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2271; NONEON-NOSVE-NEXT: fcvt s0, h0 2272; NONEON-NOSVE-NEXT: frintn s0, s0 2273; NONEON-NOSVE-NEXT: fcvt h0, s0 2274; NONEON-NOSVE-NEXT: str h0, [sp, #20] 2275; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2276; NONEON-NOSVE-NEXT: fcvt s0, h0 2277; NONEON-NOSVE-NEXT: frintn s0, s0 2278; NONEON-NOSVE-NEXT: fcvt h0, s0 2279; NONEON-NOSVE-NEXT: str h0, [sp, #18] 2280; NONEON-NOSVE-NEXT: ldr h0, [sp] 2281; NONEON-NOSVE-NEXT: fcvt s0, h0 2282; NONEON-NOSVE-NEXT: frintn s0, s0 2283; NONEON-NOSVE-NEXT: fcvt h0, s0 2284; NONEON-NOSVE-NEXT: str h0, [sp, #16] 2285; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2286; NONEON-NOSVE-NEXT: add sp, sp, #32 2287; NONEON-NOSVE-NEXT: ret 2288 %res = call <8 x half> @llvm.roundeven.v8f16(<8 x half> %op) 2289 ret <8 x half> %res 2290} 2291 2292define void @frintn_v16f16(ptr %a) { 2293; CHECK-LABEL: frintn_v16f16: 2294; CHECK: // %bb.0: 2295; CHECK-NEXT: ldp q0, q1, [x0] 2296; CHECK-NEXT: ptrue p0.h, vl8 2297; CHECK-NEXT: frintn z0.h, p0/m, z0.h 2298; CHECK-NEXT: frintn z1.h, p0/m, z1.h 2299; CHECK-NEXT: stp q0, q1, [x0] 2300; CHECK-NEXT: ret 2301; 2302; NONEON-NOSVE-LABEL: frintn_v16f16: 2303; NONEON-NOSVE: // %bb.0: 2304; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2305; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2306; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2307; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 2308; NONEON-NOSVE-NEXT: fcvt s0, h0 2309; NONEON-NOSVE-NEXT: frintn s0, s0 2310; NONEON-NOSVE-NEXT: fcvt h0, s0 2311; NONEON-NOSVE-NEXT: str h0, [sp, #62] 2312; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 2313; NONEON-NOSVE-NEXT: fcvt s0, h0 2314; NONEON-NOSVE-NEXT: frintn s0, s0 2315; NONEON-NOSVE-NEXT: fcvt h0, s0 2316; NONEON-NOSVE-NEXT: str h0, [sp, #60] 2317; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 2318; NONEON-NOSVE-NEXT: fcvt s0, h0 2319; NONEON-NOSVE-NEXT: frintn s0, s0 2320; NONEON-NOSVE-NEXT: fcvt h0, s0 2321; NONEON-NOSVE-NEXT: str h0, [sp, #58] 2322; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 2323; NONEON-NOSVE-NEXT: fcvt s0, h0 2324; NONEON-NOSVE-NEXT: frintn s0, s0 2325; NONEON-NOSVE-NEXT: fcvt h0, s0 2326; NONEON-NOSVE-NEXT: str h0, [sp, #56] 2327; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 2328; NONEON-NOSVE-NEXT: fcvt s0, h0 2329; NONEON-NOSVE-NEXT: frintn s0, s0 2330; NONEON-NOSVE-NEXT: fcvt h0, s0 2331; NONEON-NOSVE-NEXT: str h0, [sp, #54] 2332; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 2333; NONEON-NOSVE-NEXT: fcvt s0, h0 2334; NONEON-NOSVE-NEXT: frintn s0, s0 2335; NONEON-NOSVE-NEXT: fcvt h0, s0 2336; NONEON-NOSVE-NEXT: str h0, [sp, #52] 2337; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 2338; NONEON-NOSVE-NEXT: fcvt s0, h0 2339; NONEON-NOSVE-NEXT: frintn s0, s0 2340; NONEON-NOSVE-NEXT: fcvt h0, s0 2341; NONEON-NOSVE-NEXT: str h0, [sp, #50] 2342; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 2343; NONEON-NOSVE-NEXT: fcvt s0, h0 2344; NONEON-NOSVE-NEXT: frintn s0, s0 2345; NONEON-NOSVE-NEXT: fcvt h0, s0 2346; NONEON-NOSVE-NEXT: str h0, [sp, #48] 2347; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 2348; NONEON-NOSVE-NEXT: fcvt s0, h0 2349; NONEON-NOSVE-NEXT: frintn s0, s0 2350; NONEON-NOSVE-NEXT: fcvt h0, s0 2351; NONEON-NOSVE-NEXT: str h0, [sp, #46] 2352; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 2353; NONEON-NOSVE-NEXT: fcvt s0, h0 2354; NONEON-NOSVE-NEXT: frintn s0, s0 2355; NONEON-NOSVE-NEXT: fcvt h0, s0 2356; NONEON-NOSVE-NEXT: str h0, [sp, #44] 2357; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2358; NONEON-NOSVE-NEXT: fcvt s0, h0 2359; NONEON-NOSVE-NEXT: frintn s0, s0 2360; NONEON-NOSVE-NEXT: fcvt h0, s0 2361; NONEON-NOSVE-NEXT: str h0, [sp, #42] 2362; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2363; NONEON-NOSVE-NEXT: fcvt s0, h0 2364; NONEON-NOSVE-NEXT: frintn s0, s0 2365; NONEON-NOSVE-NEXT: fcvt h0, s0 2366; NONEON-NOSVE-NEXT: str h0, [sp, #40] 2367; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2368; NONEON-NOSVE-NEXT: fcvt s0, h0 2369; NONEON-NOSVE-NEXT: frintn s0, s0 2370; NONEON-NOSVE-NEXT: fcvt h0, s0 2371; NONEON-NOSVE-NEXT: str h0, [sp, #38] 2372; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2373; NONEON-NOSVE-NEXT: fcvt s0, h0 2374; NONEON-NOSVE-NEXT: frintn s0, s0 2375; NONEON-NOSVE-NEXT: fcvt h0, s0 2376; NONEON-NOSVE-NEXT: str h0, [sp, #36] 2377; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2378; NONEON-NOSVE-NEXT: fcvt s0, h0 2379; NONEON-NOSVE-NEXT: frintn s0, s0 2380; NONEON-NOSVE-NEXT: fcvt h0, s0 2381; NONEON-NOSVE-NEXT: str h0, [sp, #34] 2382; NONEON-NOSVE-NEXT: ldr h0, [sp] 2383; NONEON-NOSVE-NEXT: fcvt s0, h0 2384; NONEON-NOSVE-NEXT: frintn s0, s0 2385; NONEON-NOSVE-NEXT: fcvt h0, s0 2386; NONEON-NOSVE-NEXT: str h0, [sp, #32] 2387; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2388; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2389; NONEON-NOSVE-NEXT: add sp, sp, #64 2390; NONEON-NOSVE-NEXT: ret 2391 %op = load <16 x half>, ptr %a 2392 %res = call <16 x half> @llvm.roundeven.v16f16(<16 x half> %op) 2393 store <16 x half> %res, ptr %a 2394 ret void 2395} 2396 2397define <2 x float> @frintn_v2f32(<2 x float> %op) { 2398; CHECK-LABEL: frintn_v2f32: 2399; CHECK: // %bb.0: 2400; CHECK-NEXT: ptrue p0.s, vl2 2401; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2402; CHECK-NEXT: frintn z0.s, p0/m, z0.s 2403; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2404; CHECK-NEXT: ret 2405; 2406; NONEON-NOSVE-LABEL: frintn_v2f32: 2407; NONEON-NOSVE: // %bb.0: 2408; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2409; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2410; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2411; NONEON-NOSVE-NEXT: frintn s1, s0 2412; NONEON-NOSVE-NEXT: ldr s0, [sp] 2413; NONEON-NOSVE-NEXT: frintn s0, s0 2414; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 2415; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2416; NONEON-NOSVE-NEXT: add sp, sp, #16 2417; NONEON-NOSVE-NEXT: ret 2418 %res = call <2 x float> @llvm.roundeven.v2f32(<2 x float> %op) 2419 ret <2 x float> %res 2420} 2421 2422define <4 x float> @frintn_v4f32(<4 x float> %op) { 2423; CHECK-LABEL: frintn_v4f32: 2424; CHECK: // %bb.0: 2425; CHECK-NEXT: ptrue p0.s, vl4 2426; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2427; CHECK-NEXT: frintn z0.s, p0/m, z0.s 2428; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2429; CHECK-NEXT: ret 2430; 2431; NONEON-NOSVE-LABEL: frintn_v4f32: 2432; NONEON-NOSVE: // %bb.0: 2433; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2434; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2435; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2436; NONEON-NOSVE-NEXT: frintn s1, s0 2437; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2438; NONEON-NOSVE-NEXT: frintn s0, s0 2439; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 2440; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2441; NONEON-NOSVE-NEXT: frintn s1, s0 2442; NONEON-NOSVE-NEXT: ldr s0, [sp] 2443; NONEON-NOSVE-NEXT: frintn s0, s0 2444; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 2445; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2446; NONEON-NOSVE-NEXT: add sp, sp, #32 2447; NONEON-NOSVE-NEXT: ret 2448 %res = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %op) 2449 ret <4 x float> %res 2450} 2451 2452define void @frintn_v8f32(ptr %a) { 2453; CHECK-LABEL: frintn_v8f32: 2454; CHECK: // %bb.0: 2455; CHECK-NEXT: ldp q0, q1, [x0] 2456; CHECK-NEXT: ptrue p0.s, vl4 2457; CHECK-NEXT: frintn z0.s, p0/m, z0.s 2458; CHECK-NEXT: frintn z1.s, p0/m, z1.s 2459; CHECK-NEXT: stp q0, q1, [x0] 2460; CHECK-NEXT: ret 2461; 2462; NONEON-NOSVE-LABEL: frintn_v8f32: 2463; NONEON-NOSVE: // %bb.0: 2464; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2465; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2466; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2467; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 2468; NONEON-NOSVE-NEXT: frintn s1, s0 2469; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 2470; NONEON-NOSVE-NEXT: frintn s0, s0 2471; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 2472; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 2473; NONEON-NOSVE-NEXT: frintn s1, s0 2474; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 2475; NONEON-NOSVE-NEXT: frintn s0, s0 2476; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 2477; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2478; NONEON-NOSVE-NEXT: frintn s1, s0 2479; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2480; NONEON-NOSVE-NEXT: frintn s0, s0 2481; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 2482; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2483; NONEON-NOSVE-NEXT: frintn s1, s0 2484; NONEON-NOSVE-NEXT: ldr s0, [sp] 2485; NONEON-NOSVE-NEXT: frintn s0, s0 2486; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 2487; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2488; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2489; NONEON-NOSVE-NEXT: add sp, sp, #64 2490; NONEON-NOSVE-NEXT: ret 2491 %op = load <8 x float>, ptr %a 2492 %res = call <8 x float> @llvm.roundeven.v8f32(<8 x float> %op) 2493 store <8 x float> %res, ptr %a 2494 ret void 2495} 2496 2497define <1 x double> @frintn_v1f64(<1 x double> %op) { 2498; CHECK-LABEL: frintn_v1f64: 2499; CHECK: // %bb.0: 2500; CHECK-NEXT: frintn d0, d0 2501; CHECK-NEXT: ret 2502; 2503; NONEON-NOSVE-LABEL: frintn_v1f64: 2504; NONEON-NOSVE: // %bb.0: 2505; NONEON-NOSVE-NEXT: sub sp, sp, #16 2506; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2507; NONEON-NOSVE-NEXT: frintn d0, d0 2508; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2509; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2510; NONEON-NOSVE-NEXT: add sp, sp, #16 2511; NONEON-NOSVE-NEXT: ret 2512 %res = call <1 x double> @llvm.roundeven.v1f64(<1 x double> %op) 2513 ret <1 x double> %res 2514} 2515 2516define <2 x double> @frintn_v2f64(<2 x double> %op) { 2517; CHECK-LABEL: frintn_v2f64: 2518; CHECK: // %bb.0: 2519; CHECK-NEXT: ptrue p0.d, vl2 2520; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2521; CHECK-NEXT: frintn z0.d, p0/m, z0.d 2522; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2523; CHECK-NEXT: ret 2524; 2525; NONEON-NOSVE-LABEL: frintn_v2f64: 2526; NONEON-NOSVE: // %bb.0: 2527; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2528; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2529; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2530; NONEON-NOSVE-NEXT: frintn d1, d0 2531; NONEON-NOSVE-NEXT: ldr d0, [sp] 2532; NONEON-NOSVE-NEXT: frintn d0, d0 2533; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2534; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2535; NONEON-NOSVE-NEXT: add sp, sp, #32 2536; NONEON-NOSVE-NEXT: ret 2537 %res = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %op) 2538 ret <2 x double> %res 2539} 2540 2541define void @frintn_v4f64(ptr %a) { 2542; CHECK-LABEL: frintn_v4f64: 2543; CHECK: // %bb.0: 2544; CHECK-NEXT: ldp q0, q1, [x0] 2545; CHECK-NEXT: ptrue p0.d, vl2 2546; CHECK-NEXT: frintn z0.d, p0/m, z0.d 2547; CHECK-NEXT: frintn z1.d, p0/m, z1.d 2548; CHECK-NEXT: stp q0, q1, [x0] 2549; CHECK-NEXT: ret 2550; 2551; NONEON-NOSVE-LABEL: frintn_v4f64: 2552; NONEON-NOSVE: // %bb.0: 2553; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2554; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2555; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2556; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2557; NONEON-NOSVE-NEXT: frintn d1, d0 2558; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 2559; NONEON-NOSVE-NEXT: frintn d0, d0 2560; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2561; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2562; NONEON-NOSVE-NEXT: frintn d1, d0 2563; NONEON-NOSVE-NEXT: ldr d0, [sp] 2564; NONEON-NOSVE-NEXT: frintn d0, d0 2565; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2566; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2567; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2568; NONEON-NOSVE-NEXT: add sp, sp, #64 2569; NONEON-NOSVE-NEXT: ret 2570 %op = load <4 x double>, ptr %a 2571 %res = call <4 x double> @llvm.roundeven.v4f64(<4 x double> %op) 2572 store <4 x double> %res, ptr %a 2573 ret void 2574} 2575 2576; 2577; TRUNC -> FRINTZ 2578; 2579 2580define <2 x half> @frintz_v2f16(<2 x half> %op) { 2581; CHECK-LABEL: frintz_v2f16: 2582; CHECK: // %bb.0: 2583; CHECK-NEXT: ptrue p0.h, vl4 2584; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2585; CHECK-NEXT: frintz z0.h, p0/m, z0.h 2586; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2587; CHECK-NEXT: ret 2588; 2589; NONEON-NOSVE-LABEL: frintz_v2f16: 2590; NONEON-NOSVE: // %bb.0: 2591; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2592; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2593; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2594; NONEON-NOSVE-NEXT: fcvt s0, h0 2595; NONEON-NOSVE-NEXT: frintz s0, s0 2596; NONEON-NOSVE-NEXT: fcvt h0, s0 2597; NONEON-NOSVE-NEXT: str h0, [sp, #14] 2598; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2599; NONEON-NOSVE-NEXT: fcvt s0, h0 2600; NONEON-NOSVE-NEXT: frintz s0, s0 2601; NONEON-NOSVE-NEXT: fcvt h0, s0 2602; NONEON-NOSVE-NEXT: str h0, [sp, #12] 2603; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2604; NONEON-NOSVE-NEXT: fcvt s0, h0 2605; NONEON-NOSVE-NEXT: frintz s0, s0 2606; NONEON-NOSVE-NEXT: fcvt h0, s0 2607; NONEON-NOSVE-NEXT: str h0, [sp, #10] 2608; NONEON-NOSVE-NEXT: ldr h0, [sp] 2609; NONEON-NOSVE-NEXT: fcvt s0, h0 2610; NONEON-NOSVE-NEXT: frintz s0, s0 2611; NONEON-NOSVE-NEXT: fcvt h0, s0 2612; NONEON-NOSVE-NEXT: str h0, [sp, #8] 2613; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2614; NONEON-NOSVE-NEXT: add sp, sp, #16 2615; NONEON-NOSVE-NEXT: ret 2616 %res = call <2 x half> @llvm.trunc.v2f16(<2 x half> %op) 2617 ret <2 x half> %res 2618} 2619 2620define <4 x half> @frintz_v4f16(<4 x half> %op) { 2621; CHECK-LABEL: frintz_v4f16: 2622; CHECK: // %bb.0: 2623; CHECK-NEXT: ptrue p0.h, vl4 2624; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2625; CHECK-NEXT: frintz z0.h, p0/m, z0.h 2626; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2627; CHECK-NEXT: ret 2628; 2629; NONEON-NOSVE-LABEL: frintz_v4f16: 2630; NONEON-NOSVE: // %bb.0: 2631; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2632; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2633; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2634; NONEON-NOSVE-NEXT: fcvt s0, h0 2635; NONEON-NOSVE-NEXT: frintz s0, s0 2636; NONEON-NOSVE-NEXT: fcvt h0, s0 2637; NONEON-NOSVE-NEXT: str h0, [sp, #14] 2638; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2639; NONEON-NOSVE-NEXT: fcvt s0, h0 2640; NONEON-NOSVE-NEXT: frintz s0, s0 2641; NONEON-NOSVE-NEXT: fcvt h0, s0 2642; NONEON-NOSVE-NEXT: str h0, [sp, #12] 2643; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2644; NONEON-NOSVE-NEXT: fcvt s0, h0 2645; NONEON-NOSVE-NEXT: frintz s0, s0 2646; NONEON-NOSVE-NEXT: fcvt h0, s0 2647; NONEON-NOSVE-NEXT: str h0, [sp, #10] 2648; NONEON-NOSVE-NEXT: ldr h0, [sp] 2649; NONEON-NOSVE-NEXT: fcvt s0, h0 2650; NONEON-NOSVE-NEXT: frintz s0, s0 2651; NONEON-NOSVE-NEXT: fcvt h0, s0 2652; NONEON-NOSVE-NEXT: str h0, [sp, #8] 2653; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2654; NONEON-NOSVE-NEXT: add sp, sp, #16 2655; NONEON-NOSVE-NEXT: ret 2656 %res = call <4 x half> @llvm.trunc.v4f16(<4 x half> %op) 2657 ret <4 x half> %res 2658} 2659 2660define <8 x half> @frintz_v8f16(<8 x half> %op) { 2661; CHECK-LABEL: frintz_v8f16: 2662; CHECK: // %bb.0: 2663; CHECK-NEXT: ptrue p0.h, vl8 2664; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2665; CHECK-NEXT: frintz z0.h, p0/m, z0.h 2666; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2667; CHECK-NEXT: ret 2668; 2669; NONEON-NOSVE-LABEL: frintz_v8f16: 2670; NONEON-NOSVE: // %bb.0: 2671; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2672; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2673; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 2674; NONEON-NOSVE-NEXT: fcvt s0, h0 2675; NONEON-NOSVE-NEXT: frintz s0, s0 2676; NONEON-NOSVE-NEXT: fcvt h0, s0 2677; NONEON-NOSVE-NEXT: str h0, [sp, #30] 2678; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 2679; NONEON-NOSVE-NEXT: fcvt s0, h0 2680; NONEON-NOSVE-NEXT: frintz s0, s0 2681; NONEON-NOSVE-NEXT: fcvt h0, s0 2682; NONEON-NOSVE-NEXT: str h0, [sp, #28] 2683; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2684; NONEON-NOSVE-NEXT: fcvt s0, h0 2685; NONEON-NOSVE-NEXT: frintz s0, s0 2686; NONEON-NOSVE-NEXT: fcvt h0, s0 2687; NONEON-NOSVE-NEXT: str h0, [sp, #26] 2688; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2689; NONEON-NOSVE-NEXT: fcvt s0, h0 2690; NONEON-NOSVE-NEXT: frintz s0, s0 2691; NONEON-NOSVE-NEXT: fcvt h0, s0 2692; NONEON-NOSVE-NEXT: str h0, [sp, #24] 2693; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2694; NONEON-NOSVE-NEXT: fcvt s0, h0 2695; NONEON-NOSVE-NEXT: frintz s0, s0 2696; NONEON-NOSVE-NEXT: fcvt h0, s0 2697; NONEON-NOSVE-NEXT: str h0, [sp, #22] 2698; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2699; NONEON-NOSVE-NEXT: fcvt s0, h0 2700; NONEON-NOSVE-NEXT: frintz s0, s0 2701; NONEON-NOSVE-NEXT: fcvt h0, s0 2702; NONEON-NOSVE-NEXT: str h0, [sp, #20] 2703; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2704; NONEON-NOSVE-NEXT: fcvt s0, h0 2705; NONEON-NOSVE-NEXT: frintz s0, s0 2706; NONEON-NOSVE-NEXT: fcvt h0, s0 2707; NONEON-NOSVE-NEXT: str h0, [sp, #18] 2708; NONEON-NOSVE-NEXT: ldr h0, [sp] 2709; NONEON-NOSVE-NEXT: fcvt s0, h0 2710; NONEON-NOSVE-NEXT: frintz s0, s0 2711; NONEON-NOSVE-NEXT: fcvt h0, s0 2712; NONEON-NOSVE-NEXT: str h0, [sp, #16] 2713; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2714; NONEON-NOSVE-NEXT: add sp, sp, #32 2715; NONEON-NOSVE-NEXT: ret 2716 %res = call <8 x half> @llvm.trunc.v8f16(<8 x half> %op) 2717 ret <8 x half> %res 2718} 2719 2720define void @frintz_v16f16(ptr %a) { 2721; CHECK-LABEL: frintz_v16f16: 2722; CHECK: // %bb.0: 2723; CHECK-NEXT: ldp q0, q1, [x0] 2724; CHECK-NEXT: ptrue p0.h, vl8 2725; CHECK-NEXT: frintz z0.h, p0/m, z0.h 2726; CHECK-NEXT: frintz z1.h, p0/m, z1.h 2727; CHECK-NEXT: stp q0, q1, [x0] 2728; CHECK-NEXT: ret 2729; 2730; NONEON-NOSVE-LABEL: frintz_v16f16: 2731; NONEON-NOSVE: // %bb.0: 2732; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2733; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2734; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2735; NONEON-NOSVE-NEXT: ldr h0, [sp, #30] 2736; NONEON-NOSVE-NEXT: fcvt s0, h0 2737; NONEON-NOSVE-NEXT: frintz s0, s0 2738; NONEON-NOSVE-NEXT: fcvt h0, s0 2739; NONEON-NOSVE-NEXT: str h0, [sp, #62] 2740; NONEON-NOSVE-NEXT: ldr h0, [sp, #28] 2741; NONEON-NOSVE-NEXT: fcvt s0, h0 2742; NONEON-NOSVE-NEXT: frintz s0, s0 2743; NONEON-NOSVE-NEXT: fcvt h0, s0 2744; NONEON-NOSVE-NEXT: str h0, [sp, #60] 2745; NONEON-NOSVE-NEXT: ldr h0, [sp, #26] 2746; NONEON-NOSVE-NEXT: fcvt s0, h0 2747; NONEON-NOSVE-NEXT: frintz s0, s0 2748; NONEON-NOSVE-NEXT: fcvt h0, s0 2749; NONEON-NOSVE-NEXT: str h0, [sp, #58] 2750; NONEON-NOSVE-NEXT: ldr h0, [sp, #24] 2751; NONEON-NOSVE-NEXT: fcvt s0, h0 2752; NONEON-NOSVE-NEXT: frintz s0, s0 2753; NONEON-NOSVE-NEXT: fcvt h0, s0 2754; NONEON-NOSVE-NEXT: str h0, [sp, #56] 2755; NONEON-NOSVE-NEXT: ldr h0, [sp, #22] 2756; NONEON-NOSVE-NEXT: fcvt s0, h0 2757; NONEON-NOSVE-NEXT: frintz s0, s0 2758; NONEON-NOSVE-NEXT: fcvt h0, s0 2759; NONEON-NOSVE-NEXT: str h0, [sp, #54] 2760; NONEON-NOSVE-NEXT: ldr h0, [sp, #20] 2761; NONEON-NOSVE-NEXT: fcvt s0, h0 2762; NONEON-NOSVE-NEXT: frintz s0, s0 2763; NONEON-NOSVE-NEXT: fcvt h0, s0 2764; NONEON-NOSVE-NEXT: str h0, [sp, #52] 2765; NONEON-NOSVE-NEXT: ldr h0, [sp, #18] 2766; NONEON-NOSVE-NEXT: fcvt s0, h0 2767; NONEON-NOSVE-NEXT: frintz s0, s0 2768; NONEON-NOSVE-NEXT: fcvt h0, s0 2769; NONEON-NOSVE-NEXT: str h0, [sp, #50] 2770; NONEON-NOSVE-NEXT: ldr h0, [sp, #16] 2771; NONEON-NOSVE-NEXT: fcvt s0, h0 2772; NONEON-NOSVE-NEXT: frintz s0, s0 2773; NONEON-NOSVE-NEXT: fcvt h0, s0 2774; NONEON-NOSVE-NEXT: str h0, [sp, #48] 2775; NONEON-NOSVE-NEXT: ldr h0, [sp, #14] 2776; NONEON-NOSVE-NEXT: fcvt s0, h0 2777; NONEON-NOSVE-NEXT: frintz s0, s0 2778; NONEON-NOSVE-NEXT: fcvt h0, s0 2779; NONEON-NOSVE-NEXT: str h0, [sp, #46] 2780; NONEON-NOSVE-NEXT: ldr h0, [sp, #12] 2781; NONEON-NOSVE-NEXT: fcvt s0, h0 2782; NONEON-NOSVE-NEXT: frintz s0, s0 2783; NONEON-NOSVE-NEXT: fcvt h0, s0 2784; NONEON-NOSVE-NEXT: str h0, [sp, #44] 2785; NONEON-NOSVE-NEXT: ldr h0, [sp, #10] 2786; NONEON-NOSVE-NEXT: fcvt s0, h0 2787; NONEON-NOSVE-NEXT: frintz s0, s0 2788; NONEON-NOSVE-NEXT: fcvt h0, s0 2789; NONEON-NOSVE-NEXT: str h0, [sp, #42] 2790; NONEON-NOSVE-NEXT: ldr h0, [sp, #8] 2791; NONEON-NOSVE-NEXT: fcvt s0, h0 2792; NONEON-NOSVE-NEXT: frintz s0, s0 2793; NONEON-NOSVE-NEXT: fcvt h0, s0 2794; NONEON-NOSVE-NEXT: str h0, [sp, #40] 2795; NONEON-NOSVE-NEXT: ldr h0, [sp, #6] 2796; NONEON-NOSVE-NEXT: fcvt s0, h0 2797; NONEON-NOSVE-NEXT: frintz s0, s0 2798; NONEON-NOSVE-NEXT: fcvt h0, s0 2799; NONEON-NOSVE-NEXT: str h0, [sp, #38] 2800; NONEON-NOSVE-NEXT: ldr h0, [sp, #4] 2801; NONEON-NOSVE-NEXT: fcvt s0, h0 2802; NONEON-NOSVE-NEXT: frintz s0, s0 2803; NONEON-NOSVE-NEXT: fcvt h0, s0 2804; NONEON-NOSVE-NEXT: str h0, [sp, #36] 2805; NONEON-NOSVE-NEXT: ldr h0, [sp, #2] 2806; NONEON-NOSVE-NEXT: fcvt s0, h0 2807; NONEON-NOSVE-NEXT: frintz s0, s0 2808; NONEON-NOSVE-NEXT: fcvt h0, s0 2809; NONEON-NOSVE-NEXT: str h0, [sp, #34] 2810; NONEON-NOSVE-NEXT: ldr h0, [sp] 2811; NONEON-NOSVE-NEXT: fcvt s0, h0 2812; NONEON-NOSVE-NEXT: frintz s0, s0 2813; NONEON-NOSVE-NEXT: fcvt h0, s0 2814; NONEON-NOSVE-NEXT: str h0, [sp, #32] 2815; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2816; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2817; NONEON-NOSVE-NEXT: add sp, sp, #64 2818; NONEON-NOSVE-NEXT: ret 2819 %op = load <16 x half>, ptr %a 2820 %res = call <16 x half> @llvm.trunc.v16f16(<16 x half> %op) 2821 store <16 x half> %res, ptr %a 2822 ret void 2823} 2824 2825define <2 x float> @frintz_v2f32(<2 x float> %op) { 2826; CHECK-LABEL: frintz_v2f32: 2827; CHECK: // %bb.0: 2828; CHECK-NEXT: ptrue p0.s, vl2 2829; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2830; CHECK-NEXT: frintz z0.s, p0/m, z0.s 2831; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2832; CHECK-NEXT: ret 2833; 2834; NONEON-NOSVE-LABEL: frintz_v2f32: 2835; NONEON-NOSVE: // %bb.0: 2836; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2837; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2838; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2839; NONEON-NOSVE-NEXT: frintz s1, s0 2840; NONEON-NOSVE-NEXT: ldr s0, [sp] 2841; NONEON-NOSVE-NEXT: frintz s0, s0 2842; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #8] 2843; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2844; NONEON-NOSVE-NEXT: add sp, sp, #16 2845; NONEON-NOSVE-NEXT: ret 2846 %res = call <2 x float> @llvm.trunc.v2f32(<2 x float> %op) 2847 ret <2 x float> %res 2848} 2849 2850define <4 x float> @frintz_v4f32(<4 x float> %op) { 2851; CHECK-LABEL: frintz_v4f32: 2852; CHECK: // %bb.0: 2853; CHECK-NEXT: ptrue p0.s, vl4 2854; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2855; CHECK-NEXT: frintz z0.s, p0/m, z0.s 2856; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2857; CHECK-NEXT: ret 2858; 2859; NONEON-NOSVE-LABEL: frintz_v4f32: 2860; NONEON-NOSVE: // %bb.0: 2861; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2862; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2863; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2864; NONEON-NOSVE-NEXT: frintz s1, s0 2865; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2866; NONEON-NOSVE-NEXT: frintz s0, s0 2867; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #24] 2868; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2869; NONEON-NOSVE-NEXT: frintz s1, s0 2870; NONEON-NOSVE-NEXT: ldr s0, [sp] 2871; NONEON-NOSVE-NEXT: frintz s0, s0 2872; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #16] 2873; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2874; NONEON-NOSVE-NEXT: add sp, sp, #32 2875; NONEON-NOSVE-NEXT: ret 2876 %res = call <4 x float> @llvm.trunc.v4f32(<4 x float> %op) 2877 ret <4 x float> %res 2878} 2879 2880define void @frintz_v8f32(ptr %a) { 2881; CHECK-LABEL: frintz_v8f32: 2882; CHECK: // %bb.0: 2883; CHECK-NEXT: ldp q0, q1, [x0] 2884; CHECK-NEXT: ptrue p0.s, vl4 2885; CHECK-NEXT: frintz z0.s, p0/m, z0.s 2886; CHECK-NEXT: frintz z1.s, p0/m, z1.s 2887; CHECK-NEXT: stp q0, q1, [x0] 2888; CHECK-NEXT: ret 2889; 2890; NONEON-NOSVE-LABEL: frintz_v8f32: 2891; NONEON-NOSVE: // %bb.0: 2892; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2893; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2894; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2895; NONEON-NOSVE-NEXT: ldr s0, [sp, #28] 2896; NONEON-NOSVE-NEXT: frintz s1, s0 2897; NONEON-NOSVE-NEXT: ldr s0, [sp, #24] 2898; NONEON-NOSVE-NEXT: frintz s0, s0 2899; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #56] 2900; NONEON-NOSVE-NEXT: ldr s0, [sp, #20] 2901; NONEON-NOSVE-NEXT: frintz s1, s0 2902; NONEON-NOSVE-NEXT: ldr s0, [sp, #16] 2903; NONEON-NOSVE-NEXT: frintz s0, s0 2904; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #48] 2905; NONEON-NOSVE-NEXT: ldr s0, [sp, #12] 2906; NONEON-NOSVE-NEXT: frintz s1, s0 2907; NONEON-NOSVE-NEXT: ldr s0, [sp, #8] 2908; NONEON-NOSVE-NEXT: frintz s0, s0 2909; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #40] 2910; NONEON-NOSVE-NEXT: ldr s0, [sp, #4] 2911; NONEON-NOSVE-NEXT: frintz s1, s0 2912; NONEON-NOSVE-NEXT: ldr s0, [sp] 2913; NONEON-NOSVE-NEXT: frintz s0, s0 2914; NONEON-NOSVE-NEXT: stp s0, s1, [sp, #32] 2915; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2916; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2917; NONEON-NOSVE-NEXT: add sp, sp, #64 2918; NONEON-NOSVE-NEXT: ret 2919 %op = load <8 x float>, ptr %a 2920 %res = call <8 x float> @llvm.trunc.v8f32(<8 x float> %op) 2921 store <8 x float> %res, ptr %a 2922 ret void 2923} 2924 2925define <1 x double> @frintz_v1f64(<1 x double> %op) { 2926; CHECK-LABEL: frintz_v1f64: 2927; CHECK: // %bb.0: 2928; CHECK-NEXT: frintz d0, d0 2929; CHECK-NEXT: ret 2930; 2931; NONEON-NOSVE-LABEL: frintz_v1f64: 2932; NONEON-NOSVE: // %bb.0: 2933; NONEON-NOSVE-NEXT: sub sp, sp, #16 2934; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2935; NONEON-NOSVE-NEXT: frintz d0, d0 2936; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2937; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2938; NONEON-NOSVE-NEXT: add sp, sp, #16 2939; NONEON-NOSVE-NEXT: ret 2940 %res = call <1 x double> @llvm.trunc.v1f64(<1 x double> %op) 2941 ret <1 x double> %res 2942} 2943 2944define <2 x double> @frintz_v2f64(<2 x double> %op) { 2945; CHECK-LABEL: frintz_v2f64: 2946; CHECK: // %bb.0: 2947; CHECK-NEXT: ptrue p0.d, vl2 2948; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2949; CHECK-NEXT: frintz z0.d, p0/m, z0.d 2950; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2951; CHECK-NEXT: ret 2952; 2953; NONEON-NOSVE-LABEL: frintz_v2f64: 2954; NONEON-NOSVE: // %bb.0: 2955; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2956; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2957; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2958; NONEON-NOSVE-NEXT: frintz d1, d0 2959; NONEON-NOSVE-NEXT: ldr d0, [sp] 2960; NONEON-NOSVE-NEXT: frintz d0, d0 2961; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2962; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2963; NONEON-NOSVE-NEXT: add sp, sp, #32 2964; NONEON-NOSVE-NEXT: ret 2965 %res = call <2 x double> @llvm.trunc.v2f64(<2 x double> %op) 2966 ret <2 x double> %res 2967} 2968 2969define void @frintz_v4f64(ptr %a) { 2970; CHECK-LABEL: frintz_v4f64: 2971; CHECK: // %bb.0: 2972; CHECK-NEXT: ldp q0, q1, [x0] 2973; CHECK-NEXT: ptrue p0.d, vl2 2974; CHECK-NEXT: frintz z0.d, p0/m, z0.d 2975; CHECK-NEXT: frintz z1.d, p0/m, z1.d 2976; CHECK-NEXT: stp q0, q1, [x0] 2977; CHECK-NEXT: ret 2978; 2979; NONEON-NOSVE-LABEL: frintz_v4f64: 2980; NONEON-NOSVE: // %bb.0: 2981; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2982; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2983; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2984; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2985; NONEON-NOSVE-NEXT: frintz d1, d0 2986; NONEON-NOSVE-NEXT: ldr d0, [sp, #16] 2987; NONEON-NOSVE-NEXT: frintz d0, d0 2988; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48] 2989; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2990; NONEON-NOSVE-NEXT: frintz d1, d0 2991; NONEON-NOSVE-NEXT: ldr d0, [sp] 2992; NONEON-NOSVE-NEXT: frintz d0, d0 2993; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2994; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2995; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2996; NONEON-NOSVE-NEXT: add sp, sp, #64 2997; NONEON-NOSVE-NEXT: ret 2998 %op = load <4 x double>, ptr %a 2999 %res = call <4 x double> @llvm.trunc.v4f64(<4 x double> %op) 3000 store <4 x double> %res, ptr %a 3001 ret void 3002} 3003 3004declare <2 x half> @llvm.ceil.v2f16(<2 x half>) 3005declare <4 x half> @llvm.ceil.v4f16(<4 x half>) 3006declare <8 x half> @llvm.ceil.v8f16(<8 x half>) 3007declare <16 x half> @llvm.ceil.v16f16(<16 x half>) 3008declare <32 x half> @llvm.ceil.v32f16(<32 x half>) 3009declare <64 x half> @llvm.ceil.v64f16(<64 x half>) 3010declare <128 x half> @llvm.ceil.v128f16(<128 x half>) 3011declare <2 x float> @llvm.ceil.v2f32(<2 x float>) 3012declare <4 x float> @llvm.ceil.v4f32(<4 x float>) 3013declare <8 x float> @llvm.ceil.v8f32(<8 x float>) 3014declare <16 x float> @llvm.ceil.v16f32(<16 x float>) 3015declare <32 x float> @llvm.ceil.v32f32(<32 x float>) 3016declare <64 x float> @llvm.ceil.v64f32(<64 x float>) 3017declare <1 x double> @llvm.ceil.v1f64(<1 x double>) 3018declare <2 x double> @llvm.ceil.v2f64(<2 x double>) 3019declare <4 x double> @llvm.ceil.v4f64(<4 x double>) 3020declare <8 x double> @llvm.ceil.v8f64(<8 x double>) 3021declare <16 x double> @llvm.ceil.v16f64(<16 x double>) 3022declare <32 x double> @llvm.ceil.v32f64(<32 x double>) 3023 3024declare <2 x half> @llvm.floor.v2f16(<2 x half>) 3025declare <4 x half> @llvm.floor.v4f16(<4 x half>) 3026declare <8 x half> @llvm.floor.v8f16(<8 x half>) 3027declare <16 x half> @llvm.floor.v16f16(<16 x half>) 3028declare <32 x half> @llvm.floor.v32f16(<32 x half>) 3029declare <64 x half> @llvm.floor.v64f16(<64 x half>) 3030declare <128 x half> @llvm.floor.v128f16(<128 x half>) 3031declare <2 x float> @llvm.floor.v2f32(<2 x float>) 3032declare <4 x float> @llvm.floor.v4f32(<4 x float>) 3033declare <8 x float> @llvm.floor.v8f32(<8 x float>) 3034declare <16 x float> @llvm.floor.v16f32(<16 x float>) 3035declare <32 x float> @llvm.floor.v32f32(<32 x float>) 3036declare <64 x float> @llvm.floor.v64f32(<64 x float>) 3037declare <1 x double> @llvm.floor.v1f64(<1 x double>) 3038declare <2 x double> @llvm.floor.v2f64(<2 x double>) 3039declare <4 x double> @llvm.floor.v4f64(<4 x double>) 3040declare <8 x double> @llvm.floor.v8f64(<8 x double>) 3041declare <16 x double> @llvm.floor.v16f64(<16 x double>) 3042declare <32 x double> @llvm.floor.v32f64(<32 x double>) 3043 3044declare <2 x half> @llvm.nearbyint.v2f16(<2 x half>) 3045declare <4 x half> @llvm.nearbyint.v4f16(<4 x half>) 3046declare <8 x half> @llvm.nearbyint.v8f16(<8 x half>) 3047declare <16 x half> @llvm.nearbyint.v16f16(<16 x half>) 3048declare <32 x half> @llvm.nearbyint.v32f16(<32 x half>) 3049declare <64 x half> @llvm.nearbyint.v64f16(<64 x half>) 3050declare <128 x half> @llvm.nearbyint.v128f16(<128 x half>) 3051declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>) 3052declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) 3053declare <8 x float> @llvm.nearbyint.v8f32(<8 x float>) 3054declare <16 x float> @llvm.nearbyint.v16f32(<16 x float>) 3055declare <32 x float> @llvm.nearbyint.v32f32(<32 x float>) 3056declare <64 x float> @llvm.nearbyint.v64f32(<64 x float>) 3057declare <1 x double> @llvm.nearbyint.v1f64(<1 x double>) 3058declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>) 3059declare <4 x double> @llvm.nearbyint.v4f64(<4 x double>) 3060declare <8 x double> @llvm.nearbyint.v8f64(<8 x double>) 3061declare <16 x double> @llvm.nearbyint.v16f64(<16 x double>) 3062declare <32 x double> @llvm.nearbyint.v32f64(<32 x double>) 3063 3064declare <2 x half> @llvm.rint.v2f16(<2 x half>) 3065declare <4 x half> @llvm.rint.v4f16(<4 x half>) 3066declare <8 x half> @llvm.rint.v8f16(<8 x half>) 3067declare <16 x half> @llvm.rint.v16f16(<16 x half>) 3068declare <32 x half> @llvm.rint.v32f16(<32 x half>) 3069declare <64 x half> @llvm.rint.v64f16(<64 x half>) 3070declare <128 x half> @llvm.rint.v128f16(<128 x half>) 3071declare <2 x float> @llvm.rint.v2f32(<2 x float>) 3072declare <4 x float> @llvm.rint.v4f32(<4 x float>) 3073declare <8 x float> @llvm.rint.v8f32(<8 x float>) 3074declare <16 x float> @llvm.rint.v16f32(<16 x float>) 3075declare <32 x float> @llvm.rint.v32f32(<32 x float>) 3076declare <64 x float> @llvm.rint.v64f32(<64 x float>) 3077declare <1 x double> @llvm.rint.v1f64(<1 x double>) 3078declare <2 x double> @llvm.rint.v2f64(<2 x double>) 3079declare <4 x double> @llvm.rint.v4f64(<4 x double>) 3080declare <8 x double> @llvm.rint.v8f64(<8 x double>) 3081declare <16 x double> @llvm.rint.v16f64(<16 x double>) 3082declare <32 x double> @llvm.rint.v32f64(<32 x double>) 3083 3084declare <2 x half> @llvm.round.v2f16(<2 x half>) 3085declare <4 x half> @llvm.round.v4f16(<4 x half>) 3086declare <8 x half> @llvm.round.v8f16(<8 x half>) 3087declare <16 x half> @llvm.round.v16f16(<16 x half>) 3088declare <32 x half> @llvm.round.v32f16(<32 x half>) 3089declare <64 x half> @llvm.round.v64f16(<64 x half>) 3090declare <128 x half> @llvm.round.v128f16(<128 x half>) 3091declare <2 x float> @llvm.round.v2f32(<2 x float>) 3092declare <4 x float> @llvm.round.v4f32(<4 x float>) 3093declare <8 x float> @llvm.round.v8f32(<8 x float>) 3094declare <16 x float> @llvm.round.v16f32(<16 x float>) 3095declare <32 x float> @llvm.round.v32f32(<32 x float>) 3096declare <64 x float> @llvm.round.v64f32(<64 x float>) 3097declare <1 x double> @llvm.round.v1f64(<1 x double>) 3098declare <2 x double> @llvm.round.v2f64(<2 x double>) 3099declare <4 x double> @llvm.round.v4f64(<4 x double>) 3100declare <8 x double> @llvm.round.v8f64(<8 x double>) 3101declare <16 x double> @llvm.round.v16f64(<16 x double>) 3102declare <32 x double> @llvm.round.v32f64(<32 x double>) 3103 3104declare <2 x half> @llvm.roundeven.v2f16(<2 x half>) 3105declare <4 x half> @llvm.roundeven.v4f16(<4 x half>) 3106declare <8 x half> @llvm.roundeven.v8f16(<8 x half>) 3107declare <16 x half> @llvm.roundeven.v16f16(<16 x half>) 3108declare <32 x half> @llvm.roundeven.v32f16(<32 x half>) 3109declare <64 x half> @llvm.roundeven.v64f16(<64 x half>) 3110declare <128 x half> @llvm.roundeven.v128f16(<128 x half>) 3111declare <2 x float> @llvm.roundeven.v2f32(<2 x float>) 3112declare <4 x float> @llvm.roundeven.v4f32(<4 x float>) 3113declare <8 x float> @llvm.roundeven.v8f32(<8 x float>) 3114declare <16 x float> @llvm.roundeven.v16f32(<16 x float>) 3115declare <32 x float> @llvm.roundeven.v32f32(<32 x float>) 3116declare <64 x float> @llvm.roundeven.v64f32(<64 x float>) 3117declare <1 x double> @llvm.roundeven.v1f64(<1 x double>) 3118declare <2 x double> @llvm.roundeven.v2f64(<2 x double>) 3119declare <4 x double> @llvm.roundeven.v4f64(<4 x double>) 3120declare <8 x double> @llvm.roundeven.v8f64(<8 x double>) 3121declare <16 x double> @llvm.roundeven.v16f64(<16 x double>) 3122declare <32 x double> @llvm.roundeven.v32f64(<32 x double>) 3123 3124declare <2 x half> @llvm.trunc.v2f16(<2 x half>) 3125declare <4 x half> @llvm.trunc.v4f16(<4 x half>) 3126declare <8 x half> @llvm.trunc.v8f16(<8 x half>) 3127declare <16 x half> @llvm.trunc.v16f16(<16 x half>) 3128declare <32 x half> @llvm.trunc.v32f16(<32 x half>) 3129declare <64 x half> @llvm.trunc.v64f16(<64 x half>) 3130declare <128 x half> @llvm.trunc.v128f16(<128 x half>) 3131declare <2 x float> @llvm.trunc.v2f32(<2 x float>) 3132declare <4 x float> @llvm.trunc.v4f32(<4 x float>) 3133declare <8 x float> @llvm.trunc.v8f32(<8 x float>) 3134declare <16 x float> @llvm.trunc.v16f32(<16 x float>) 3135declare <32 x float> @llvm.trunc.v32f32(<32 x float>) 3136declare <64 x float> @llvm.trunc.v64f32(<64 x float>) 3137declare <1 x double> @llvm.trunc.v1f64(<1 x double>) 3138declare <2 x double> @llvm.trunc.v2f64(<2 x double>) 3139declare <4 x double> @llvm.trunc.v4f64(<4 x double>) 3140declare <8 x double> @llvm.trunc.v8f64(<8 x double>) 3141declare <16 x double> @llvm.trunc.v16f64(<16 x double>) 3142declare <32 x double> @llvm.trunc.v32f64(<32 x double>) 3143