1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-NOFP16 3; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD,CHECK-SD-FP16 4; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-NOFP16 5; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI,CHECK-GI-FP16 6 7define double @ceil_f64(double %a) { 8; CHECK-LABEL: ceil_f64: 9; CHECK: // %bb.0: // %entry 10; CHECK-NEXT: frintp d0, d0 11; CHECK-NEXT: ret 12entry: 13 %c = call double @llvm.ceil.f64(double %a) 14 ret double %c 15} 16 17define float @ceil_f32(float %a) { 18; CHECK-LABEL: ceil_f32: 19; CHECK: // %bb.0: // %entry 20; CHECK-NEXT: frintp s0, s0 21; CHECK-NEXT: ret 22entry: 23 %c = call float @llvm.ceil.f32(float %a) 24 ret float %c 25} 26 27define half @ceil_f16(half %a) { 28; CHECK-SD-NOFP16-LABEL: ceil_f16: 29; CHECK-SD-NOFP16: // %bb.0: // %entry 30; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 31; CHECK-SD-NOFP16-NEXT: frintp s0, s0 32; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 33; CHECK-SD-NOFP16-NEXT: ret 34; 35; CHECK-SD-FP16-LABEL: ceil_f16: 36; CHECK-SD-FP16: // %bb.0: // %entry 37; CHECK-SD-FP16-NEXT: frintp h0, h0 38; CHECK-SD-FP16-NEXT: ret 39; 40; CHECK-GI-NOFP16-LABEL: ceil_f16: 41; CHECK-GI-NOFP16: // %bb.0: // %entry 42; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 43; CHECK-GI-NOFP16-NEXT: frintp s0, s0 44; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 45; CHECK-GI-NOFP16-NEXT: ret 46; 47; CHECK-GI-FP16-LABEL: ceil_f16: 48; CHECK-GI-FP16: // %bb.0: // %entry 49; CHECK-GI-FP16-NEXT: frintp h0, h0 50; CHECK-GI-FP16-NEXT: ret 51entry: 52 %c = call half @llvm.ceil.f16(half %a) 53 ret half %c 54} 55 56define <2 x double> @ceil_v2f64(<2 x double> %a) { 57; CHECK-LABEL: ceil_v2f64: 58; CHECK: // %bb.0: // %entry 59; CHECK-NEXT: frintp v0.2d, v0.2d 60; CHECK-NEXT: ret 61entry: 62 %c = call <2 x double> @llvm.ceil.v2f64(<2 x double> %a) 63 ret <2 x double> %c 64} 65 66define <3 x double> @ceil_v3f64(<3 x double> %a) { 67; CHECK-SD-LABEL: ceil_v3f64: 68; CHECK-SD: // %bb.0: // %entry 69; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 70; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 71; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 72; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 73; CHECK-SD-NEXT: frintp v2.2d, v2.2d 74; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 75; CHECK-SD-NEXT: frintp v0.2d, v0.2d 76; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 77; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 78; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 79; CHECK-SD-NEXT: ret 80; 81; CHECK-GI-LABEL: ceil_v3f64: 82; CHECK-GI: // %bb.0: // %entry 83; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 84; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 85; CHECK-GI-NEXT: frintp d2, d2 86; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 87; CHECK-GI-NEXT: frintp v0.2d, v0.2d 88; CHECK-GI-NEXT: mov d1, v0.d[1] 89; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 90; CHECK-GI-NEXT: ret 91entry: 92 %c = call <3 x double> @llvm.ceil.v3f64(<3 x double> %a) 93 ret <3 x double> %c 94} 95 96define <4 x double> @ceil_v4f64(<4 x double> %a) { 97; CHECK-LABEL: ceil_v4f64: 98; CHECK: // %bb.0: // %entry 99; CHECK-NEXT: frintp v0.2d, v0.2d 100; CHECK-NEXT: frintp v1.2d, v1.2d 101; CHECK-NEXT: ret 102entry: 103 %c = call <4 x double> @llvm.ceil.v4f64(<4 x double> %a) 104 ret <4 x double> %c 105} 106 107define <2 x float> @ceil_v2f32(<2 x float> %a) { 108; CHECK-LABEL: ceil_v2f32: 109; CHECK: // %bb.0: // %entry 110; CHECK-NEXT: frintp v0.2s, v0.2s 111; CHECK-NEXT: ret 112entry: 113 %c = call <2 x float> @llvm.ceil.v2f32(<2 x float> %a) 114 ret <2 x float> %c 115} 116 117define <3 x float> @ceil_v3f32(<3 x float> %a) { 118; CHECK-LABEL: ceil_v3f32: 119; CHECK: // %bb.0: // %entry 120; CHECK-NEXT: frintp v0.4s, v0.4s 121; CHECK-NEXT: ret 122entry: 123 %c = call <3 x float> @llvm.ceil.v3f32(<3 x float> %a) 124 ret <3 x float> %c 125} 126 127define <4 x float> @ceil_v4f32(<4 x float> %a) { 128; CHECK-LABEL: ceil_v4f32: 129; CHECK: // %bb.0: // %entry 130; CHECK-NEXT: frintp v0.4s, v0.4s 131; CHECK-NEXT: ret 132entry: 133 %c = call <4 x float> @llvm.ceil.v4f32(<4 x float> %a) 134 ret <4 x float> %c 135} 136 137define <8 x float> @ceil_v8f32(<8 x float> %a) { 138; CHECK-LABEL: ceil_v8f32: 139; CHECK: // %bb.0: // %entry 140; CHECK-NEXT: frintp v0.4s, v0.4s 141; CHECK-NEXT: frintp v1.4s, v1.4s 142; CHECK-NEXT: ret 143entry: 144 %c = call <8 x float> @llvm.ceil.v8f32(<8 x float> %a) 145 ret <8 x float> %c 146} 147 148define <7 x half> @ceil_v7f16(<7 x half> %a) { 149; CHECK-SD-NOFP16-LABEL: ceil_v7f16: 150; CHECK-SD-NOFP16: // %bb.0: // %entry 151; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 152; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 153; CHECK-SD-NOFP16-NEXT: frintp v1.4s, v1.4s 154; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 155; CHECK-SD-NOFP16-NEXT: frintp v1.4s, v2.4s 156; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 157; CHECK-SD-NOFP16-NEXT: ret 158; 159; CHECK-SD-FP16-LABEL: ceil_v7f16: 160; CHECK-SD-FP16: // %bb.0: // %entry 161; CHECK-SD-FP16-NEXT: frintp v0.8h, v0.8h 162; CHECK-SD-FP16-NEXT: ret 163; 164; CHECK-GI-NOFP16-LABEL: ceil_v7f16: 165; CHECK-GI-NOFP16: // %bb.0: // %entry 166; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 167; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 168; CHECK-GI-NOFP16-NEXT: frintp v1.4s, v1.4s 169; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 170; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 171; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 172; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 173; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 174; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 175; CHECK-GI-NOFP16-NEXT: frintp v2.4s, v2.4s 176; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 177; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 178; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 179; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 180; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 181; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 182; CHECK-GI-NOFP16-NEXT: ret 183; 184; CHECK-GI-FP16-LABEL: ceil_v7f16: 185; CHECK-GI-FP16: // %bb.0: // %entry 186; CHECK-GI-FP16-NEXT: frintp v0.8h, v0.8h 187; CHECK-GI-FP16-NEXT: ret 188entry: 189 %c = call <7 x half> @llvm.ceil.v7f16(<7 x half> %a) 190 ret <7 x half> %c 191} 192 193define <4 x half> @ceil_v4f16(<4 x half> %a) { 194; CHECK-SD-NOFP16-LABEL: ceil_v4f16: 195; CHECK-SD-NOFP16: // %bb.0: // %entry 196; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 197; CHECK-SD-NOFP16-NEXT: frintp v0.4s, v0.4s 198; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 199; CHECK-SD-NOFP16-NEXT: ret 200; 201; CHECK-SD-FP16-LABEL: ceil_v4f16: 202; CHECK-SD-FP16: // %bb.0: // %entry 203; CHECK-SD-FP16-NEXT: frintp v0.4h, v0.4h 204; CHECK-SD-FP16-NEXT: ret 205; 206; CHECK-GI-NOFP16-LABEL: ceil_v4f16: 207; CHECK-GI-NOFP16: // %bb.0: // %entry 208; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 209; CHECK-GI-NOFP16-NEXT: frintp v0.4s, v0.4s 210; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 211; CHECK-GI-NOFP16-NEXT: ret 212; 213; CHECK-GI-FP16-LABEL: ceil_v4f16: 214; CHECK-GI-FP16: // %bb.0: // %entry 215; CHECK-GI-FP16-NEXT: frintp v0.4h, v0.4h 216; CHECK-GI-FP16-NEXT: ret 217entry: 218 %c = call <4 x half> @llvm.ceil.v4f16(<4 x half> %a) 219 ret <4 x half> %c 220} 221 222define <8 x half> @ceil_v8f16(<8 x half> %a) { 223; CHECK-SD-NOFP16-LABEL: ceil_v8f16: 224; CHECK-SD-NOFP16: // %bb.0: // %entry 225; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 226; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 227; CHECK-SD-NOFP16-NEXT: frintp v1.4s, v1.4s 228; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 229; CHECK-SD-NOFP16-NEXT: frintp v1.4s, v2.4s 230; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 231; CHECK-SD-NOFP16-NEXT: ret 232; 233; CHECK-SD-FP16-LABEL: ceil_v8f16: 234; CHECK-SD-FP16: // %bb.0: // %entry 235; CHECK-SD-FP16-NEXT: frintp v0.8h, v0.8h 236; CHECK-SD-FP16-NEXT: ret 237; 238; CHECK-GI-NOFP16-LABEL: ceil_v8f16: 239; CHECK-GI-NOFP16: // %bb.0: // %entry 240; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 241; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 242; CHECK-GI-NOFP16-NEXT: frintp v1.4s, v1.4s 243; CHECK-GI-NOFP16-NEXT: frintp v2.4s, v0.4s 244; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 245; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 246; CHECK-GI-NOFP16-NEXT: ret 247; 248; CHECK-GI-FP16-LABEL: ceil_v8f16: 249; CHECK-GI-FP16: // %bb.0: // %entry 250; CHECK-GI-FP16-NEXT: frintp v0.8h, v0.8h 251; CHECK-GI-FP16-NEXT: ret 252entry: 253 %c = call <8 x half> @llvm.ceil.v8f16(<8 x half> %a) 254 ret <8 x half> %c 255} 256 257define <16 x half> @ceil_v16f16(<16 x half> %a) { 258; CHECK-SD-NOFP16-LABEL: ceil_v16f16: 259; CHECK-SD-NOFP16: // %bb.0: // %entry 260; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 261; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 262; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 263; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 264; CHECK-SD-NOFP16-NEXT: frintp v2.4s, v2.4s 265; CHECK-SD-NOFP16-NEXT: frintp v1.4s, v3.4s 266; CHECK-SD-NOFP16-NEXT: frintp v3.4s, v5.4s 267; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 268; CHECK-SD-NOFP16-NEXT: frintp v2.4s, v4.4s 269; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 270; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 271; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 272; CHECK-SD-NOFP16-NEXT: ret 273; 274; CHECK-SD-FP16-LABEL: ceil_v16f16: 275; CHECK-SD-FP16: // %bb.0: // %entry 276; CHECK-SD-FP16-NEXT: frintp v0.8h, v0.8h 277; CHECK-SD-FP16-NEXT: frintp v1.8h, v1.8h 278; CHECK-SD-FP16-NEXT: ret 279; 280; CHECK-GI-NOFP16-LABEL: ceil_v16f16: 281; CHECK-GI-NOFP16: // %bb.0: // %entry 282; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 283; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 284; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 285; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 286; CHECK-GI-NOFP16-NEXT: frintp v2.4s, v2.4s 287; CHECK-GI-NOFP16-NEXT: frintp v3.4s, v3.4s 288; CHECK-GI-NOFP16-NEXT: frintp v4.4s, v0.4s 289; CHECK-GI-NOFP16-NEXT: frintp v5.4s, v1.4s 290; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 291; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 292; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 293; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 294; CHECK-GI-NOFP16-NEXT: ret 295; 296; CHECK-GI-FP16-LABEL: ceil_v16f16: 297; CHECK-GI-FP16: // %bb.0: // %entry 298; CHECK-GI-FP16-NEXT: frintp v0.8h, v0.8h 299; CHECK-GI-FP16-NEXT: frintp v1.8h, v1.8h 300; CHECK-GI-FP16-NEXT: ret 301entry: 302 %c = call <16 x half> @llvm.ceil.v16f16(<16 x half> %a) 303 ret <16 x half> %c 304} 305 306define double @floor_f64(double %a) { 307; CHECK-LABEL: floor_f64: 308; CHECK: // %bb.0: // %entry 309; CHECK-NEXT: frintm d0, d0 310; CHECK-NEXT: ret 311entry: 312 %c = call double @llvm.floor.f64(double %a) 313 ret double %c 314} 315 316define float @floor_f32(float %a) { 317; CHECK-LABEL: floor_f32: 318; CHECK: // %bb.0: // %entry 319; CHECK-NEXT: frintm s0, s0 320; CHECK-NEXT: ret 321entry: 322 %c = call float @llvm.floor.f32(float %a) 323 ret float %c 324} 325 326define half @floor_f16(half %a) { 327; CHECK-SD-NOFP16-LABEL: floor_f16: 328; CHECK-SD-NOFP16: // %bb.0: // %entry 329; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 330; CHECK-SD-NOFP16-NEXT: frintm s0, s0 331; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 332; CHECK-SD-NOFP16-NEXT: ret 333; 334; CHECK-SD-FP16-LABEL: floor_f16: 335; CHECK-SD-FP16: // %bb.0: // %entry 336; CHECK-SD-FP16-NEXT: frintm h0, h0 337; CHECK-SD-FP16-NEXT: ret 338; 339; CHECK-GI-NOFP16-LABEL: floor_f16: 340; CHECK-GI-NOFP16: // %bb.0: // %entry 341; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 342; CHECK-GI-NOFP16-NEXT: frintm s0, s0 343; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 344; CHECK-GI-NOFP16-NEXT: ret 345; 346; CHECK-GI-FP16-LABEL: floor_f16: 347; CHECK-GI-FP16: // %bb.0: // %entry 348; CHECK-GI-FP16-NEXT: frintm h0, h0 349; CHECK-GI-FP16-NEXT: ret 350entry: 351 %c = call half @llvm.floor.f16(half %a) 352 ret half %c 353} 354 355define <2 x double> @floor_v2f64(<2 x double> %a) { 356; CHECK-LABEL: floor_v2f64: 357; CHECK: // %bb.0: // %entry 358; CHECK-NEXT: frintm v0.2d, v0.2d 359; CHECK-NEXT: ret 360entry: 361 %c = call <2 x double> @llvm.floor.v2f64(<2 x double> %a) 362 ret <2 x double> %c 363} 364 365define <3 x double> @floor_v3f64(<3 x double> %a) { 366; CHECK-SD-LABEL: floor_v3f64: 367; CHECK-SD: // %bb.0: // %entry 368; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 369; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 370; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 371; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 372; CHECK-SD-NEXT: frintm v2.2d, v2.2d 373; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 374; CHECK-SD-NEXT: frintm v0.2d, v0.2d 375; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 376; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 377; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 378; CHECK-SD-NEXT: ret 379; 380; CHECK-GI-LABEL: floor_v3f64: 381; CHECK-GI: // %bb.0: // %entry 382; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 383; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 384; CHECK-GI-NEXT: frintm d2, d2 385; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 386; CHECK-GI-NEXT: frintm v0.2d, v0.2d 387; CHECK-GI-NEXT: mov d1, v0.d[1] 388; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 389; CHECK-GI-NEXT: ret 390entry: 391 %c = call <3 x double> @llvm.floor.v3f64(<3 x double> %a) 392 ret <3 x double> %c 393} 394 395define <4 x double> @floor_v4f64(<4 x double> %a) { 396; CHECK-LABEL: floor_v4f64: 397; CHECK: // %bb.0: // %entry 398; CHECK-NEXT: frintm v0.2d, v0.2d 399; CHECK-NEXT: frintm v1.2d, v1.2d 400; CHECK-NEXT: ret 401entry: 402 %c = call <4 x double> @llvm.floor.v4f64(<4 x double> %a) 403 ret <4 x double> %c 404} 405 406define <2 x float> @floor_v2f32(<2 x float> %a) { 407; CHECK-LABEL: floor_v2f32: 408; CHECK: // %bb.0: // %entry 409; CHECK-NEXT: frintm v0.2s, v0.2s 410; CHECK-NEXT: ret 411entry: 412 %c = call <2 x float> @llvm.floor.v2f32(<2 x float> %a) 413 ret <2 x float> %c 414} 415 416define <3 x float> @floor_v3f32(<3 x float> %a) { 417; CHECK-LABEL: floor_v3f32: 418; CHECK: // %bb.0: // %entry 419; CHECK-NEXT: frintm v0.4s, v0.4s 420; CHECK-NEXT: ret 421entry: 422 %c = call <3 x float> @llvm.floor.v3f32(<3 x float> %a) 423 ret <3 x float> %c 424} 425 426define <4 x float> @floor_v4f32(<4 x float> %a) { 427; CHECK-LABEL: floor_v4f32: 428; CHECK: // %bb.0: // %entry 429; CHECK-NEXT: frintm v0.4s, v0.4s 430; CHECK-NEXT: ret 431entry: 432 %c = call <4 x float> @llvm.floor.v4f32(<4 x float> %a) 433 ret <4 x float> %c 434} 435 436define <8 x float> @floor_v8f32(<8 x float> %a) { 437; CHECK-LABEL: floor_v8f32: 438; CHECK: // %bb.0: // %entry 439; CHECK-NEXT: frintm v0.4s, v0.4s 440; CHECK-NEXT: frintm v1.4s, v1.4s 441; CHECK-NEXT: ret 442entry: 443 %c = call <8 x float> @llvm.floor.v8f32(<8 x float> %a) 444 ret <8 x float> %c 445} 446 447define <7 x half> @floor_v7f16(<7 x half> %a) { 448; CHECK-SD-NOFP16-LABEL: floor_v7f16: 449; CHECK-SD-NOFP16: // %bb.0: // %entry 450; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 451; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 452; CHECK-SD-NOFP16-NEXT: frintm v1.4s, v1.4s 453; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 454; CHECK-SD-NOFP16-NEXT: frintm v1.4s, v2.4s 455; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 456; CHECK-SD-NOFP16-NEXT: ret 457; 458; CHECK-SD-FP16-LABEL: floor_v7f16: 459; CHECK-SD-FP16: // %bb.0: // %entry 460; CHECK-SD-FP16-NEXT: frintm v0.8h, v0.8h 461; CHECK-SD-FP16-NEXT: ret 462; 463; CHECK-GI-NOFP16-LABEL: floor_v7f16: 464; CHECK-GI-NOFP16: // %bb.0: // %entry 465; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 466; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 467; CHECK-GI-NOFP16-NEXT: frintm v1.4s, v1.4s 468; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 469; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 470; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 471; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 472; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 473; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 474; CHECK-GI-NOFP16-NEXT: frintm v2.4s, v2.4s 475; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 476; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 477; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 478; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 479; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 480; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 481; CHECK-GI-NOFP16-NEXT: ret 482; 483; CHECK-GI-FP16-LABEL: floor_v7f16: 484; CHECK-GI-FP16: // %bb.0: // %entry 485; CHECK-GI-FP16-NEXT: frintm v0.8h, v0.8h 486; CHECK-GI-FP16-NEXT: ret 487entry: 488 %c = call <7 x half> @llvm.floor.v7f16(<7 x half> %a) 489 ret <7 x half> %c 490} 491 492define <4 x half> @floor_v4f16(<4 x half> %a) { 493; CHECK-SD-NOFP16-LABEL: floor_v4f16: 494; CHECK-SD-NOFP16: // %bb.0: // %entry 495; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 496; CHECK-SD-NOFP16-NEXT: frintm v0.4s, v0.4s 497; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 498; CHECK-SD-NOFP16-NEXT: ret 499; 500; CHECK-SD-FP16-LABEL: floor_v4f16: 501; CHECK-SD-FP16: // %bb.0: // %entry 502; CHECK-SD-FP16-NEXT: frintm v0.4h, v0.4h 503; CHECK-SD-FP16-NEXT: ret 504; 505; CHECK-GI-NOFP16-LABEL: floor_v4f16: 506; CHECK-GI-NOFP16: // %bb.0: // %entry 507; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 508; CHECK-GI-NOFP16-NEXT: frintm v0.4s, v0.4s 509; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 510; CHECK-GI-NOFP16-NEXT: ret 511; 512; CHECK-GI-FP16-LABEL: floor_v4f16: 513; CHECK-GI-FP16: // %bb.0: // %entry 514; CHECK-GI-FP16-NEXT: frintm v0.4h, v0.4h 515; CHECK-GI-FP16-NEXT: ret 516entry: 517 %c = call <4 x half> @llvm.floor.v4f16(<4 x half> %a) 518 ret <4 x half> %c 519} 520 521define <8 x half> @floor_v8f16(<8 x half> %a) { 522; CHECK-SD-NOFP16-LABEL: floor_v8f16: 523; CHECK-SD-NOFP16: // %bb.0: // %entry 524; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 525; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 526; CHECK-SD-NOFP16-NEXT: frintm v1.4s, v1.4s 527; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 528; CHECK-SD-NOFP16-NEXT: frintm v1.4s, v2.4s 529; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 530; CHECK-SD-NOFP16-NEXT: ret 531; 532; CHECK-SD-FP16-LABEL: floor_v8f16: 533; CHECK-SD-FP16: // %bb.0: // %entry 534; CHECK-SD-FP16-NEXT: frintm v0.8h, v0.8h 535; CHECK-SD-FP16-NEXT: ret 536; 537; CHECK-GI-NOFP16-LABEL: floor_v8f16: 538; CHECK-GI-NOFP16: // %bb.0: // %entry 539; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 540; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 541; CHECK-GI-NOFP16-NEXT: frintm v1.4s, v1.4s 542; CHECK-GI-NOFP16-NEXT: frintm v2.4s, v0.4s 543; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 544; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 545; CHECK-GI-NOFP16-NEXT: ret 546; 547; CHECK-GI-FP16-LABEL: floor_v8f16: 548; CHECK-GI-FP16: // %bb.0: // %entry 549; CHECK-GI-FP16-NEXT: frintm v0.8h, v0.8h 550; CHECK-GI-FP16-NEXT: ret 551entry: 552 %c = call <8 x half> @llvm.floor.v8f16(<8 x half> %a) 553 ret <8 x half> %c 554} 555 556define <16 x half> @floor_v16f16(<16 x half> %a) { 557; CHECK-SD-NOFP16-LABEL: floor_v16f16: 558; CHECK-SD-NOFP16: // %bb.0: // %entry 559; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 560; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 561; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 562; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 563; CHECK-SD-NOFP16-NEXT: frintm v2.4s, v2.4s 564; CHECK-SD-NOFP16-NEXT: frintm v1.4s, v3.4s 565; CHECK-SD-NOFP16-NEXT: frintm v3.4s, v5.4s 566; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 567; CHECK-SD-NOFP16-NEXT: frintm v2.4s, v4.4s 568; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 569; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 570; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 571; CHECK-SD-NOFP16-NEXT: ret 572; 573; CHECK-SD-FP16-LABEL: floor_v16f16: 574; CHECK-SD-FP16: // %bb.0: // %entry 575; CHECK-SD-FP16-NEXT: frintm v0.8h, v0.8h 576; CHECK-SD-FP16-NEXT: frintm v1.8h, v1.8h 577; CHECK-SD-FP16-NEXT: ret 578; 579; CHECK-GI-NOFP16-LABEL: floor_v16f16: 580; CHECK-GI-NOFP16: // %bb.0: // %entry 581; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 582; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 583; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 584; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 585; CHECK-GI-NOFP16-NEXT: frintm v2.4s, v2.4s 586; CHECK-GI-NOFP16-NEXT: frintm v3.4s, v3.4s 587; CHECK-GI-NOFP16-NEXT: frintm v4.4s, v0.4s 588; CHECK-GI-NOFP16-NEXT: frintm v5.4s, v1.4s 589; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 590; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 591; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 592; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 593; CHECK-GI-NOFP16-NEXT: ret 594; 595; CHECK-GI-FP16-LABEL: floor_v16f16: 596; CHECK-GI-FP16: // %bb.0: // %entry 597; CHECK-GI-FP16-NEXT: frintm v0.8h, v0.8h 598; CHECK-GI-FP16-NEXT: frintm v1.8h, v1.8h 599; CHECK-GI-FP16-NEXT: ret 600entry: 601 %c = call <16 x half> @llvm.floor.v16f16(<16 x half> %a) 602 ret <16 x half> %c 603} 604 605define double @nearbyint_f64(double %a) { 606; CHECK-LABEL: nearbyint_f64: 607; CHECK: // %bb.0: // %entry 608; CHECK-NEXT: frinti d0, d0 609; CHECK-NEXT: ret 610entry: 611 %c = call double @llvm.nearbyint.f64(double %a) 612 ret double %c 613} 614 615define float @nearbyint_f32(float %a) { 616; CHECK-LABEL: nearbyint_f32: 617; CHECK: // %bb.0: // %entry 618; CHECK-NEXT: frinti s0, s0 619; CHECK-NEXT: ret 620entry: 621 %c = call float @llvm.nearbyint.f32(float %a) 622 ret float %c 623} 624 625define half @nearbyint_f16(half %a) { 626; CHECK-SD-NOFP16-LABEL: nearbyint_f16: 627; CHECK-SD-NOFP16: // %bb.0: // %entry 628; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 629; CHECK-SD-NOFP16-NEXT: frinti s0, s0 630; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 631; CHECK-SD-NOFP16-NEXT: ret 632; 633; CHECK-SD-FP16-LABEL: nearbyint_f16: 634; CHECK-SD-FP16: // %bb.0: // %entry 635; CHECK-SD-FP16-NEXT: frinti h0, h0 636; CHECK-SD-FP16-NEXT: ret 637; 638; CHECK-GI-NOFP16-LABEL: nearbyint_f16: 639; CHECK-GI-NOFP16: // %bb.0: // %entry 640; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 641; CHECK-GI-NOFP16-NEXT: frinti s0, s0 642; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 643; CHECK-GI-NOFP16-NEXT: ret 644; 645; CHECK-GI-FP16-LABEL: nearbyint_f16: 646; CHECK-GI-FP16: // %bb.0: // %entry 647; CHECK-GI-FP16-NEXT: frinti h0, h0 648; CHECK-GI-FP16-NEXT: ret 649entry: 650 %c = call half @llvm.nearbyint.f16(half %a) 651 ret half %c 652} 653 654define <2 x double> @nearbyint_v2f64(<2 x double> %a) { 655; CHECK-LABEL: nearbyint_v2f64: 656; CHECK: // %bb.0: // %entry 657; CHECK-NEXT: frinti v0.2d, v0.2d 658; CHECK-NEXT: ret 659entry: 660 %c = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %a) 661 ret <2 x double> %c 662} 663 664define <3 x double> @nearbyint_v3f64(<3 x double> %a) { 665; CHECK-SD-LABEL: nearbyint_v3f64: 666; CHECK-SD: // %bb.0: // %entry 667; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 668; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 669; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 670; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 671; CHECK-SD-NEXT: frinti v2.2d, v2.2d 672; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 673; CHECK-SD-NEXT: frinti v0.2d, v0.2d 674; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 675; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 676; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 677; CHECK-SD-NEXT: ret 678; 679; CHECK-GI-LABEL: nearbyint_v3f64: 680; CHECK-GI: // %bb.0: // %entry 681; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 682; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 683; CHECK-GI-NEXT: frinti d2, d2 684; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 685; CHECK-GI-NEXT: frinti v0.2d, v0.2d 686; CHECK-GI-NEXT: mov d1, v0.d[1] 687; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 688; CHECK-GI-NEXT: ret 689entry: 690 %c = call <3 x double> @llvm.nearbyint.v3f64(<3 x double> %a) 691 ret <3 x double> %c 692} 693 694define <4 x double> @nearbyint_v4f64(<4 x double> %a) { 695; CHECK-LABEL: nearbyint_v4f64: 696; CHECK: // %bb.0: // %entry 697; CHECK-NEXT: frinti v0.2d, v0.2d 698; CHECK-NEXT: frinti v1.2d, v1.2d 699; CHECK-NEXT: ret 700entry: 701 %c = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %a) 702 ret <4 x double> %c 703} 704 705define <2 x float> @nearbyint_v2f32(<2 x float> %a) { 706; CHECK-LABEL: nearbyint_v2f32: 707; CHECK: // %bb.0: // %entry 708; CHECK-NEXT: frinti v0.2s, v0.2s 709; CHECK-NEXT: ret 710entry: 711 %c = call <2 x float> @llvm.nearbyint.v2f32(<2 x float> %a) 712 ret <2 x float> %c 713} 714 715define <3 x float> @nearbyint_v3f32(<3 x float> %a) { 716; CHECK-LABEL: nearbyint_v3f32: 717; CHECK: // %bb.0: // %entry 718; CHECK-NEXT: frinti v0.4s, v0.4s 719; CHECK-NEXT: ret 720entry: 721 %c = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %a) 722 ret <3 x float> %c 723} 724 725define <4 x float> @nearbyint_v4f32(<4 x float> %a) { 726; CHECK-LABEL: nearbyint_v4f32: 727; CHECK: // %bb.0: // %entry 728; CHECK-NEXT: frinti v0.4s, v0.4s 729; CHECK-NEXT: ret 730entry: 731 %c = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %a) 732 ret <4 x float> %c 733} 734 735define <8 x float> @nearbyint_v8f32(<8 x float> %a) { 736; CHECK-LABEL: nearbyint_v8f32: 737; CHECK: // %bb.0: // %entry 738; CHECK-NEXT: frinti v0.4s, v0.4s 739; CHECK-NEXT: frinti v1.4s, v1.4s 740; CHECK-NEXT: ret 741entry: 742 %c = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %a) 743 ret <8 x float> %c 744} 745 746define <7 x half> @nearbyint_v7f16(<7 x half> %a) { 747; CHECK-SD-NOFP16-LABEL: nearbyint_v7f16: 748; CHECK-SD-NOFP16: // %bb.0: // %entry 749; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 750; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 751; CHECK-SD-NOFP16-NEXT: frinti v1.4s, v1.4s 752; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 753; CHECK-SD-NOFP16-NEXT: frinti v1.4s, v2.4s 754; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 755; CHECK-SD-NOFP16-NEXT: ret 756; 757; CHECK-SD-FP16-LABEL: nearbyint_v7f16: 758; CHECK-SD-FP16: // %bb.0: // %entry 759; CHECK-SD-FP16-NEXT: frinti v0.8h, v0.8h 760; CHECK-SD-FP16-NEXT: ret 761; 762; CHECK-GI-NOFP16-LABEL: nearbyint_v7f16: 763; CHECK-GI-NOFP16: // %bb.0: // %entry 764; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 765; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 766; CHECK-GI-NOFP16-NEXT: frinti v1.4s, v1.4s 767; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 768; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 769; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 770; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 771; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 772; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 773; CHECK-GI-NOFP16-NEXT: frinti v2.4s, v2.4s 774; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 775; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 776; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 777; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 778; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 779; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 780; CHECK-GI-NOFP16-NEXT: ret 781; 782; CHECK-GI-FP16-LABEL: nearbyint_v7f16: 783; CHECK-GI-FP16: // %bb.0: // %entry 784; CHECK-GI-FP16-NEXT: frinti v0.8h, v0.8h 785; CHECK-GI-FP16-NEXT: ret 786entry: 787 %c = call <7 x half> @llvm.nearbyint.v7f16(<7 x half> %a) 788 ret <7 x half> %c 789} 790 791define <4 x half> @nearbyint_v4f16(<4 x half> %a) { 792; CHECK-SD-NOFP16-LABEL: nearbyint_v4f16: 793; CHECK-SD-NOFP16: // %bb.0: // %entry 794; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 795; CHECK-SD-NOFP16-NEXT: frinti v0.4s, v0.4s 796; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 797; CHECK-SD-NOFP16-NEXT: ret 798; 799; CHECK-SD-FP16-LABEL: nearbyint_v4f16: 800; CHECK-SD-FP16: // %bb.0: // %entry 801; CHECK-SD-FP16-NEXT: frinti v0.4h, v0.4h 802; CHECK-SD-FP16-NEXT: ret 803; 804; CHECK-GI-NOFP16-LABEL: nearbyint_v4f16: 805; CHECK-GI-NOFP16: // %bb.0: // %entry 806; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 807; CHECK-GI-NOFP16-NEXT: frinti v0.4s, v0.4s 808; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 809; CHECK-GI-NOFP16-NEXT: ret 810; 811; CHECK-GI-FP16-LABEL: nearbyint_v4f16: 812; CHECK-GI-FP16: // %bb.0: // %entry 813; CHECK-GI-FP16-NEXT: frinti v0.4h, v0.4h 814; CHECK-GI-FP16-NEXT: ret 815entry: 816 %c = call <4 x half> @llvm.nearbyint.v4f16(<4 x half> %a) 817 ret <4 x half> %c 818} 819 820define <8 x half> @nearbyint_v8f16(<8 x half> %a) { 821; CHECK-SD-NOFP16-LABEL: nearbyint_v8f16: 822; CHECK-SD-NOFP16: // %bb.0: // %entry 823; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 824; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 825; CHECK-SD-NOFP16-NEXT: frinti v1.4s, v1.4s 826; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 827; CHECK-SD-NOFP16-NEXT: frinti v1.4s, v2.4s 828; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 829; CHECK-SD-NOFP16-NEXT: ret 830; 831; CHECK-SD-FP16-LABEL: nearbyint_v8f16: 832; CHECK-SD-FP16: // %bb.0: // %entry 833; CHECK-SD-FP16-NEXT: frinti v0.8h, v0.8h 834; CHECK-SD-FP16-NEXT: ret 835; 836; CHECK-GI-NOFP16-LABEL: nearbyint_v8f16: 837; CHECK-GI-NOFP16: // %bb.0: // %entry 838; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 839; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 840; CHECK-GI-NOFP16-NEXT: frinti v1.4s, v1.4s 841; CHECK-GI-NOFP16-NEXT: frinti v2.4s, v0.4s 842; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 843; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 844; CHECK-GI-NOFP16-NEXT: ret 845; 846; CHECK-GI-FP16-LABEL: nearbyint_v8f16: 847; CHECK-GI-FP16: // %bb.0: // %entry 848; CHECK-GI-FP16-NEXT: frinti v0.8h, v0.8h 849; CHECK-GI-FP16-NEXT: ret 850entry: 851 %c = call <8 x half> @llvm.nearbyint.v8f16(<8 x half> %a) 852 ret <8 x half> %c 853} 854 855define <16 x half> @nearbyint_v16f16(<16 x half> %a) { 856; CHECK-SD-NOFP16-LABEL: nearbyint_v16f16: 857; CHECK-SD-NOFP16: // %bb.0: // %entry 858; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 859; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 860; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 861; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 862; CHECK-SD-NOFP16-NEXT: frinti v2.4s, v2.4s 863; CHECK-SD-NOFP16-NEXT: frinti v1.4s, v3.4s 864; CHECK-SD-NOFP16-NEXT: frinti v3.4s, v5.4s 865; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 866; CHECK-SD-NOFP16-NEXT: frinti v2.4s, v4.4s 867; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 868; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 869; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 870; CHECK-SD-NOFP16-NEXT: ret 871; 872; CHECK-SD-FP16-LABEL: nearbyint_v16f16: 873; CHECK-SD-FP16: // %bb.0: // %entry 874; CHECK-SD-FP16-NEXT: frinti v0.8h, v0.8h 875; CHECK-SD-FP16-NEXT: frinti v1.8h, v1.8h 876; CHECK-SD-FP16-NEXT: ret 877; 878; CHECK-GI-NOFP16-LABEL: nearbyint_v16f16: 879; CHECK-GI-NOFP16: // %bb.0: // %entry 880; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 881; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 882; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 883; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 884; CHECK-GI-NOFP16-NEXT: frinti v2.4s, v2.4s 885; CHECK-GI-NOFP16-NEXT: frinti v3.4s, v3.4s 886; CHECK-GI-NOFP16-NEXT: frinti v4.4s, v0.4s 887; CHECK-GI-NOFP16-NEXT: frinti v5.4s, v1.4s 888; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 889; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 890; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 891; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 892; CHECK-GI-NOFP16-NEXT: ret 893; 894; CHECK-GI-FP16-LABEL: nearbyint_v16f16: 895; CHECK-GI-FP16: // %bb.0: // %entry 896; CHECK-GI-FP16-NEXT: frinti v0.8h, v0.8h 897; CHECK-GI-FP16-NEXT: frinti v1.8h, v1.8h 898; CHECK-GI-FP16-NEXT: ret 899entry: 900 %c = call <16 x half> @llvm.nearbyint.v16f16(<16 x half> %a) 901 ret <16 x half> %c 902} 903 904define double @roundeven_f64(double %a) { 905; CHECK-LABEL: roundeven_f64: 906; CHECK: // %bb.0: // %entry 907; CHECK-NEXT: frintn d0, d0 908; CHECK-NEXT: ret 909entry: 910 %c = call double @llvm.roundeven.f64(double %a) 911 ret double %c 912} 913 914define float @roundeven_f32(float %a) { 915; CHECK-LABEL: roundeven_f32: 916; CHECK: // %bb.0: // %entry 917; CHECK-NEXT: frintn s0, s0 918; CHECK-NEXT: ret 919entry: 920 %c = call float @llvm.roundeven.f32(float %a) 921 ret float %c 922} 923 924define half @roundeven_f16(half %a) { 925; CHECK-SD-NOFP16-LABEL: roundeven_f16: 926; CHECK-SD-NOFP16: // %bb.0: // %entry 927; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 928; CHECK-SD-NOFP16-NEXT: frintn s0, s0 929; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 930; CHECK-SD-NOFP16-NEXT: ret 931; 932; CHECK-SD-FP16-LABEL: roundeven_f16: 933; CHECK-SD-FP16: // %bb.0: // %entry 934; CHECK-SD-FP16-NEXT: frintn h0, h0 935; CHECK-SD-FP16-NEXT: ret 936; 937; CHECK-GI-NOFP16-LABEL: roundeven_f16: 938; CHECK-GI-NOFP16: // %bb.0: // %entry 939; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 940; CHECK-GI-NOFP16-NEXT: frintn s0, s0 941; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 942; CHECK-GI-NOFP16-NEXT: ret 943; 944; CHECK-GI-FP16-LABEL: roundeven_f16: 945; CHECK-GI-FP16: // %bb.0: // %entry 946; CHECK-GI-FP16-NEXT: frintn h0, h0 947; CHECK-GI-FP16-NEXT: ret 948entry: 949 %c = call half @llvm.roundeven.f16(half %a) 950 ret half %c 951} 952 953define <2 x double> @roundeven_v2f64(<2 x double> %a) { 954; CHECK-LABEL: roundeven_v2f64: 955; CHECK: // %bb.0: // %entry 956; CHECK-NEXT: frintn v0.2d, v0.2d 957; CHECK-NEXT: ret 958entry: 959 %c = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %a) 960 ret <2 x double> %c 961} 962 963define <3 x double> @roundeven_v3f64(<3 x double> %a) { 964; CHECK-SD-LABEL: roundeven_v3f64: 965; CHECK-SD: // %bb.0: // %entry 966; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 967; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 968; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 969; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 970; CHECK-SD-NEXT: frintn v2.2d, v2.2d 971; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 972; CHECK-SD-NEXT: frintn v0.2d, v0.2d 973; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 974; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 975; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 976; CHECK-SD-NEXT: ret 977; 978; CHECK-GI-LABEL: roundeven_v3f64: 979; CHECK-GI: // %bb.0: // %entry 980; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 981; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 982; CHECK-GI-NEXT: frintn d2, d2 983; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 984; CHECK-GI-NEXT: frintn v0.2d, v0.2d 985; CHECK-GI-NEXT: mov d1, v0.d[1] 986; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 987; CHECK-GI-NEXT: ret 988entry: 989 %c = call <3 x double> @llvm.roundeven.v3f64(<3 x double> %a) 990 ret <3 x double> %c 991} 992 993define <4 x double> @roundeven_v4f64(<4 x double> %a) { 994; CHECK-LABEL: roundeven_v4f64: 995; CHECK: // %bb.0: // %entry 996; CHECK-NEXT: frintn v0.2d, v0.2d 997; CHECK-NEXT: frintn v1.2d, v1.2d 998; CHECK-NEXT: ret 999entry: 1000 %c = call <4 x double> @llvm.roundeven.v4f64(<4 x double> %a) 1001 ret <4 x double> %c 1002} 1003 1004define <2 x float> @roundeven_v2f32(<2 x float> %a) { 1005; CHECK-LABEL: roundeven_v2f32: 1006; CHECK: // %bb.0: // %entry 1007; CHECK-NEXT: frintn v0.2s, v0.2s 1008; CHECK-NEXT: ret 1009entry: 1010 %c = call <2 x float> @llvm.roundeven.v2f32(<2 x float> %a) 1011 ret <2 x float> %c 1012} 1013 1014define <3 x float> @roundeven_v3f32(<3 x float> %a) { 1015; CHECK-LABEL: roundeven_v3f32: 1016; CHECK: // %bb.0: // %entry 1017; CHECK-NEXT: frintn v0.4s, v0.4s 1018; CHECK-NEXT: ret 1019entry: 1020 %c = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %a) 1021 ret <3 x float> %c 1022} 1023 1024define <4 x float> @roundeven_v4f32(<4 x float> %a) { 1025; CHECK-LABEL: roundeven_v4f32: 1026; CHECK: // %bb.0: // %entry 1027; CHECK-NEXT: frintn v0.4s, v0.4s 1028; CHECK-NEXT: ret 1029entry: 1030 %c = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %a) 1031 ret <4 x float> %c 1032} 1033 1034define <8 x float> @roundeven_v8f32(<8 x float> %a) { 1035; CHECK-LABEL: roundeven_v8f32: 1036; CHECK: // %bb.0: // %entry 1037; CHECK-NEXT: frintn v0.4s, v0.4s 1038; CHECK-NEXT: frintn v1.4s, v1.4s 1039; CHECK-NEXT: ret 1040entry: 1041 %c = call <8 x float> @llvm.roundeven.v8f32(<8 x float> %a) 1042 ret <8 x float> %c 1043} 1044 1045define <7 x half> @roundeven_v7f16(<7 x half> %a) { 1046; CHECK-SD-NOFP16-LABEL: roundeven_v7f16: 1047; CHECK-SD-NOFP16: // %bb.0: // %entry 1048; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1049; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1050; CHECK-SD-NOFP16-NEXT: frintn v1.4s, v1.4s 1051; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1052; CHECK-SD-NOFP16-NEXT: frintn v1.4s, v2.4s 1053; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1054; CHECK-SD-NOFP16-NEXT: ret 1055; 1056; CHECK-SD-FP16-LABEL: roundeven_v7f16: 1057; CHECK-SD-FP16: // %bb.0: // %entry 1058; CHECK-SD-FP16-NEXT: frintn v0.8h, v0.8h 1059; CHECK-SD-FP16-NEXT: ret 1060; 1061; CHECK-GI-NOFP16-LABEL: roundeven_v7f16: 1062; CHECK-GI-NOFP16: // %bb.0: // %entry 1063; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1064; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 1065; CHECK-GI-NOFP16-NEXT: frintn v1.4s, v1.4s 1066; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 1067; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1068; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 1069; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 1070; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 1071; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 1072; CHECK-GI-NOFP16-NEXT: frintn v2.4s, v2.4s 1073; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 1074; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 1075; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 1076; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 1077; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 1078; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 1079; CHECK-GI-NOFP16-NEXT: ret 1080; 1081; CHECK-GI-FP16-LABEL: roundeven_v7f16: 1082; CHECK-GI-FP16: // %bb.0: // %entry 1083; CHECK-GI-FP16-NEXT: frintn v0.8h, v0.8h 1084; CHECK-GI-FP16-NEXT: ret 1085entry: 1086 %c = call <7 x half> @llvm.roundeven.v7f16(<7 x half> %a) 1087 ret <7 x half> %c 1088} 1089 1090define <4 x half> @roundeven_v4f16(<4 x half> %a) { 1091; CHECK-SD-NOFP16-LABEL: roundeven_v4f16: 1092; CHECK-SD-NOFP16: // %bb.0: // %entry 1093; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1094; CHECK-SD-NOFP16-NEXT: frintn v0.4s, v0.4s 1095; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1096; CHECK-SD-NOFP16-NEXT: ret 1097; 1098; CHECK-SD-FP16-LABEL: roundeven_v4f16: 1099; CHECK-SD-FP16: // %bb.0: // %entry 1100; CHECK-SD-FP16-NEXT: frintn v0.4h, v0.4h 1101; CHECK-SD-FP16-NEXT: ret 1102; 1103; CHECK-GI-NOFP16-LABEL: roundeven_v4f16: 1104; CHECK-GI-NOFP16: // %bb.0: // %entry 1105; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1106; CHECK-GI-NOFP16-NEXT: frintn v0.4s, v0.4s 1107; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1108; CHECK-GI-NOFP16-NEXT: ret 1109; 1110; CHECK-GI-FP16-LABEL: roundeven_v4f16: 1111; CHECK-GI-FP16: // %bb.0: // %entry 1112; CHECK-GI-FP16-NEXT: frintn v0.4h, v0.4h 1113; CHECK-GI-FP16-NEXT: ret 1114entry: 1115 %c = call <4 x half> @llvm.roundeven.v4f16(<4 x half> %a) 1116 ret <4 x half> %c 1117} 1118 1119define <8 x half> @roundeven_v8f16(<8 x half> %a) { 1120; CHECK-SD-NOFP16-LABEL: roundeven_v8f16: 1121; CHECK-SD-NOFP16: // %bb.0: // %entry 1122; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1123; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1124; CHECK-SD-NOFP16-NEXT: frintn v1.4s, v1.4s 1125; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1126; CHECK-SD-NOFP16-NEXT: frintn v1.4s, v2.4s 1127; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1128; CHECK-SD-NOFP16-NEXT: ret 1129; 1130; CHECK-SD-FP16-LABEL: roundeven_v8f16: 1131; CHECK-SD-FP16: // %bb.0: // %entry 1132; CHECK-SD-FP16-NEXT: frintn v0.8h, v0.8h 1133; CHECK-SD-FP16-NEXT: ret 1134; 1135; CHECK-GI-NOFP16-LABEL: roundeven_v8f16: 1136; CHECK-GI-NOFP16: // %bb.0: // %entry 1137; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1138; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1139; CHECK-GI-NOFP16-NEXT: frintn v1.4s, v1.4s 1140; CHECK-GI-NOFP16-NEXT: frintn v2.4s, v0.4s 1141; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1142; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1143; CHECK-GI-NOFP16-NEXT: ret 1144; 1145; CHECK-GI-FP16-LABEL: roundeven_v8f16: 1146; CHECK-GI-FP16: // %bb.0: // %entry 1147; CHECK-GI-FP16-NEXT: frintn v0.8h, v0.8h 1148; CHECK-GI-FP16-NEXT: ret 1149entry: 1150 %c = call <8 x half> @llvm.roundeven.v8f16(<8 x half> %a) 1151 ret <8 x half> %c 1152} 1153 1154define <16 x half> @roundeven_v16f16(<16 x half> %a) { 1155; CHECK-SD-NOFP16-LABEL: roundeven_v16f16: 1156; CHECK-SD-NOFP16: // %bb.0: // %entry 1157; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1158; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1159; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 1160; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 1161; CHECK-SD-NOFP16-NEXT: frintn v2.4s, v2.4s 1162; CHECK-SD-NOFP16-NEXT: frintn v1.4s, v3.4s 1163; CHECK-SD-NOFP16-NEXT: frintn v3.4s, v5.4s 1164; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1165; CHECK-SD-NOFP16-NEXT: frintn v2.4s, v4.4s 1166; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1167; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1168; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 1169; CHECK-SD-NOFP16-NEXT: ret 1170; 1171; CHECK-SD-FP16-LABEL: roundeven_v16f16: 1172; CHECK-SD-FP16: // %bb.0: // %entry 1173; CHECK-SD-FP16-NEXT: frintn v0.8h, v0.8h 1174; CHECK-SD-FP16-NEXT: frintn v1.8h, v1.8h 1175; CHECK-SD-FP16-NEXT: ret 1176; 1177; CHECK-GI-NOFP16-LABEL: roundeven_v16f16: 1178; CHECK-GI-NOFP16: // %bb.0: // %entry 1179; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1180; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1181; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1182; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 1183; CHECK-GI-NOFP16-NEXT: frintn v2.4s, v2.4s 1184; CHECK-GI-NOFP16-NEXT: frintn v3.4s, v3.4s 1185; CHECK-GI-NOFP16-NEXT: frintn v4.4s, v0.4s 1186; CHECK-GI-NOFP16-NEXT: frintn v5.4s, v1.4s 1187; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1188; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 1189; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 1190; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 1191; CHECK-GI-NOFP16-NEXT: ret 1192; 1193; CHECK-GI-FP16-LABEL: roundeven_v16f16: 1194; CHECK-GI-FP16: // %bb.0: // %entry 1195; CHECK-GI-FP16-NEXT: frintn v0.8h, v0.8h 1196; CHECK-GI-FP16-NEXT: frintn v1.8h, v1.8h 1197; CHECK-GI-FP16-NEXT: ret 1198entry: 1199 %c = call <16 x half> @llvm.roundeven.v16f16(<16 x half> %a) 1200 ret <16 x half> %c 1201} 1202 1203define double @rint_f64(double %a) { 1204; CHECK-LABEL: rint_f64: 1205; CHECK: // %bb.0: // %entry 1206; CHECK-NEXT: frintx d0, d0 1207; CHECK-NEXT: ret 1208entry: 1209 %c = call double @llvm.rint.f64(double %a) 1210 ret double %c 1211} 1212 1213define float @rint_f32(float %a) { 1214; CHECK-LABEL: rint_f32: 1215; CHECK: // %bb.0: // %entry 1216; CHECK-NEXT: frintx s0, s0 1217; CHECK-NEXT: ret 1218entry: 1219 %c = call float @llvm.rint.f32(float %a) 1220 ret float %c 1221} 1222 1223define half @rint_f16(half %a) { 1224; CHECK-SD-NOFP16-LABEL: rint_f16: 1225; CHECK-SD-NOFP16: // %bb.0: // %entry 1226; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 1227; CHECK-SD-NOFP16-NEXT: frintx s0, s0 1228; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 1229; CHECK-SD-NOFP16-NEXT: ret 1230; 1231; CHECK-SD-FP16-LABEL: rint_f16: 1232; CHECK-SD-FP16: // %bb.0: // %entry 1233; CHECK-SD-FP16-NEXT: frintx h0, h0 1234; CHECK-SD-FP16-NEXT: ret 1235; 1236; CHECK-GI-NOFP16-LABEL: rint_f16: 1237; CHECK-GI-NOFP16: // %bb.0: // %entry 1238; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 1239; CHECK-GI-NOFP16-NEXT: frintx s0, s0 1240; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 1241; CHECK-GI-NOFP16-NEXT: ret 1242; 1243; CHECK-GI-FP16-LABEL: rint_f16: 1244; CHECK-GI-FP16: // %bb.0: // %entry 1245; CHECK-GI-FP16-NEXT: frintx h0, h0 1246; CHECK-GI-FP16-NEXT: ret 1247entry: 1248 %c = call half @llvm.rint.f16(half %a) 1249 ret half %c 1250} 1251 1252define <2 x double> @rint_v2f64(<2 x double> %a) { 1253; CHECK-LABEL: rint_v2f64: 1254; CHECK: // %bb.0: // %entry 1255; CHECK-NEXT: frintx v0.2d, v0.2d 1256; CHECK-NEXT: ret 1257entry: 1258 %c = call <2 x double> @llvm.rint.v2f64(<2 x double> %a) 1259 ret <2 x double> %c 1260} 1261 1262define <3 x double> @rint_v3f64(<3 x double> %a) { 1263; CHECK-SD-LABEL: rint_v3f64: 1264; CHECK-SD: // %bb.0: // %entry 1265; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1266; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1267; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1268; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1269; CHECK-SD-NEXT: frintx v2.2d, v2.2d 1270; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 1271; CHECK-SD-NEXT: frintx v0.2d, v0.2d 1272; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1273; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1274; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1275; CHECK-SD-NEXT: ret 1276; 1277; CHECK-GI-LABEL: rint_v3f64: 1278; CHECK-GI: // %bb.0: // %entry 1279; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1280; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1281; CHECK-GI-NEXT: frintx d2, d2 1282; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1283; CHECK-GI-NEXT: frintx v0.2d, v0.2d 1284; CHECK-GI-NEXT: mov d1, v0.d[1] 1285; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1286; CHECK-GI-NEXT: ret 1287entry: 1288 %c = call <3 x double> @llvm.rint.v3f64(<3 x double> %a) 1289 ret <3 x double> %c 1290} 1291 1292define <4 x double> @rint_v4f64(<4 x double> %a) { 1293; CHECK-LABEL: rint_v4f64: 1294; CHECK: // %bb.0: // %entry 1295; CHECK-NEXT: frintx v0.2d, v0.2d 1296; CHECK-NEXT: frintx v1.2d, v1.2d 1297; CHECK-NEXT: ret 1298entry: 1299 %c = call <4 x double> @llvm.rint.v4f64(<4 x double> %a) 1300 ret <4 x double> %c 1301} 1302 1303define <2 x float> @rint_v2f32(<2 x float> %a) { 1304; CHECK-LABEL: rint_v2f32: 1305; CHECK: // %bb.0: // %entry 1306; CHECK-NEXT: frintx v0.2s, v0.2s 1307; CHECK-NEXT: ret 1308entry: 1309 %c = call <2 x float> @llvm.rint.v2f32(<2 x float> %a) 1310 ret <2 x float> %c 1311} 1312 1313define <3 x float> @rint_v3f32(<3 x float> %a) { 1314; CHECK-LABEL: rint_v3f32: 1315; CHECK: // %bb.0: // %entry 1316; CHECK-NEXT: frintx v0.4s, v0.4s 1317; CHECK-NEXT: ret 1318entry: 1319 %c = call <3 x float> @llvm.rint.v3f32(<3 x float> %a) 1320 ret <3 x float> %c 1321} 1322 1323define <4 x float> @rint_v4f32(<4 x float> %a) { 1324; CHECK-LABEL: rint_v4f32: 1325; CHECK: // %bb.0: // %entry 1326; CHECK-NEXT: frintx v0.4s, v0.4s 1327; CHECK-NEXT: ret 1328entry: 1329 %c = call <4 x float> @llvm.rint.v4f32(<4 x float> %a) 1330 ret <4 x float> %c 1331} 1332 1333define <8 x float> @rint_v8f32(<8 x float> %a) { 1334; CHECK-LABEL: rint_v8f32: 1335; CHECK: // %bb.0: // %entry 1336; CHECK-NEXT: frintx v0.4s, v0.4s 1337; CHECK-NEXT: frintx v1.4s, v1.4s 1338; CHECK-NEXT: ret 1339entry: 1340 %c = call <8 x float> @llvm.rint.v8f32(<8 x float> %a) 1341 ret <8 x float> %c 1342} 1343 1344define <7 x half> @rint_v7f16(<7 x half> %a) { 1345; CHECK-SD-NOFP16-LABEL: rint_v7f16: 1346; CHECK-SD-NOFP16: // %bb.0: // %entry 1347; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1348; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1349; CHECK-SD-NOFP16-NEXT: frintx v1.4s, v1.4s 1350; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1351; CHECK-SD-NOFP16-NEXT: frintx v1.4s, v2.4s 1352; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1353; CHECK-SD-NOFP16-NEXT: ret 1354; 1355; CHECK-SD-FP16-LABEL: rint_v7f16: 1356; CHECK-SD-FP16: // %bb.0: // %entry 1357; CHECK-SD-FP16-NEXT: frintx v0.8h, v0.8h 1358; CHECK-SD-FP16-NEXT: ret 1359; 1360; CHECK-GI-NOFP16-LABEL: rint_v7f16: 1361; CHECK-GI-NOFP16: // %bb.0: // %entry 1362; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1363; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 1364; CHECK-GI-NOFP16-NEXT: frintx v1.4s, v1.4s 1365; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 1366; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1367; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 1368; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 1369; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 1370; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 1371; CHECK-GI-NOFP16-NEXT: frintx v2.4s, v2.4s 1372; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 1373; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 1374; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 1375; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 1376; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 1377; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 1378; CHECK-GI-NOFP16-NEXT: ret 1379; 1380; CHECK-GI-FP16-LABEL: rint_v7f16: 1381; CHECK-GI-FP16: // %bb.0: // %entry 1382; CHECK-GI-FP16-NEXT: frintx v0.8h, v0.8h 1383; CHECK-GI-FP16-NEXT: ret 1384entry: 1385 %c = call <7 x half> @llvm.rint.v7f16(<7 x half> %a) 1386 ret <7 x half> %c 1387} 1388 1389define <4 x half> @rint_v4f16(<4 x half> %a) { 1390; CHECK-SD-NOFP16-LABEL: rint_v4f16: 1391; CHECK-SD-NOFP16: // %bb.0: // %entry 1392; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1393; CHECK-SD-NOFP16-NEXT: frintx v0.4s, v0.4s 1394; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1395; CHECK-SD-NOFP16-NEXT: ret 1396; 1397; CHECK-SD-FP16-LABEL: rint_v4f16: 1398; CHECK-SD-FP16: // %bb.0: // %entry 1399; CHECK-SD-FP16-NEXT: frintx v0.4h, v0.4h 1400; CHECK-SD-FP16-NEXT: ret 1401; 1402; CHECK-GI-NOFP16-LABEL: rint_v4f16: 1403; CHECK-GI-NOFP16: // %bb.0: // %entry 1404; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1405; CHECK-GI-NOFP16-NEXT: frintx v0.4s, v0.4s 1406; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1407; CHECK-GI-NOFP16-NEXT: ret 1408; 1409; CHECK-GI-FP16-LABEL: rint_v4f16: 1410; CHECK-GI-FP16: // %bb.0: // %entry 1411; CHECK-GI-FP16-NEXT: frintx v0.4h, v0.4h 1412; CHECK-GI-FP16-NEXT: ret 1413entry: 1414 %c = call <4 x half> @llvm.rint.v4f16(<4 x half> %a) 1415 ret <4 x half> %c 1416} 1417 1418define <8 x half> @rint_v8f16(<8 x half> %a) { 1419; CHECK-SD-NOFP16-LABEL: rint_v8f16: 1420; CHECK-SD-NOFP16: // %bb.0: // %entry 1421; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1422; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1423; CHECK-SD-NOFP16-NEXT: frintx v1.4s, v1.4s 1424; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1425; CHECK-SD-NOFP16-NEXT: frintx v1.4s, v2.4s 1426; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1427; CHECK-SD-NOFP16-NEXT: ret 1428; 1429; CHECK-SD-FP16-LABEL: rint_v8f16: 1430; CHECK-SD-FP16: // %bb.0: // %entry 1431; CHECK-SD-FP16-NEXT: frintx v0.8h, v0.8h 1432; CHECK-SD-FP16-NEXT: ret 1433; 1434; CHECK-GI-NOFP16-LABEL: rint_v8f16: 1435; CHECK-GI-NOFP16: // %bb.0: // %entry 1436; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1437; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1438; CHECK-GI-NOFP16-NEXT: frintx v1.4s, v1.4s 1439; CHECK-GI-NOFP16-NEXT: frintx v2.4s, v0.4s 1440; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1441; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1442; CHECK-GI-NOFP16-NEXT: ret 1443; 1444; CHECK-GI-FP16-LABEL: rint_v8f16: 1445; CHECK-GI-FP16: // %bb.0: // %entry 1446; CHECK-GI-FP16-NEXT: frintx v0.8h, v0.8h 1447; CHECK-GI-FP16-NEXT: ret 1448entry: 1449 %c = call <8 x half> @llvm.rint.v8f16(<8 x half> %a) 1450 ret <8 x half> %c 1451} 1452 1453define <16 x half> @rint_v16f16(<16 x half> %a) { 1454; CHECK-SD-NOFP16-LABEL: rint_v16f16: 1455; CHECK-SD-NOFP16: // %bb.0: // %entry 1456; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1457; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1458; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 1459; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 1460; CHECK-SD-NOFP16-NEXT: frintx v2.4s, v2.4s 1461; CHECK-SD-NOFP16-NEXT: frintx v1.4s, v3.4s 1462; CHECK-SD-NOFP16-NEXT: frintx v3.4s, v5.4s 1463; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1464; CHECK-SD-NOFP16-NEXT: frintx v2.4s, v4.4s 1465; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1466; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1467; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 1468; CHECK-SD-NOFP16-NEXT: ret 1469; 1470; CHECK-SD-FP16-LABEL: rint_v16f16: 1471; CHECK-SD-FP16: // %bb.0: // %entry 1472; CHECK-SD-FP16-NEXT: frintx v0.8h, v0.8h 1473; CHECK-SD-FP16-NEXT: frintx v1.8h, v1.8h 1474; CHECK-SD-FP16-NEXT: ret 1475; 1476; CHECK-GI-NOFP16-LABEL: rint_v16f16: 1477; CHECK-GI-NOFP16: // %bb.0: // %entry 1478; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1479; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1480; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1481; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 1482; CHECK-GI-NOFP16-NEXT: frintx v2.4s, v2.4s 1483; CHECK-GI-NOFP16-NEXT: frintx v3.4s, v3.4s 1484; CHECK-GI-NOFP16-NEXT: frintx v4.4s, v0.4s 1485; CHECK-GI-NOFP16-NEXT: frintx v5.4s, v1.4s 1486; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1487; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 1488; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 1489; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 1490; CHECK-GI-NOFP16-NEXT: ret 1491; 1492; CHECK-GI-FP16-LABEL: rint_v16f16: 1493; CHECK-GI-FP16: // %bb.0: // %entry 1494; CHECK-GI-FP16-NEXT: frintx v0.8h, v0.8h 1495; CHECK-GI-FP16-NEXT: frintx v1.8h, v1.8h 1496; CHECK-GI-FP16-NEXT: ret 1497entry: 1498 %c = call <16 x half> @llvm.rint.v16f16(<16 x half> %a) 1499 ret <16 x half> %c 1500} 1501 1502define double @round_f64(double %a) { 1503; CHECK-LABEL: round_f64: 1504; CHECK: // %bb.0: // %entry 1505; CHECK-NEXT: frinta d0, d0 1506; CHECK-NEXT: ret 1507entry: 1508 %c = call double @llvm.round.f64(double %a) 1509 ret double %c 1510} 1511 1512define float @round_f32(float %a) { 1513; CHECK-LABEL: round_f32: 1514; CHECK: // %bb.0: // %entry 1515; CHECK-NEXT: frinta s0, s0 1516; CHECK-NEXT: ret 1517entry: 1518 %c = call float @llvm.round.f32(float %a) 1519 ret float %c 1520} 1521 1522define half @round_f16(half %a) { 1523; CHECK-SD-NOFP16-LABEL: round_f16: 1524; CHECK-SD-NOFP16: // %bb.0: // %entry 1525; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 1526; CHECK-SD-NOFP16-NEXT: frinta s0, s0 1527; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 1528; CHECK-SD-NOFP16-NEXT: ret 1529; 1530; CHECK-SD-FP16-LABEL: round_f16: 1531; CHECK-SD-FP16: // %bb.0: // %entry 1532; CHECK-SD-FP16-NEXT: frinta h0, h0 1533; CHECK-SD-FP16-NEXT: ret 1534; 1535; CHECK-GI-NOFP16-LABEL: round_f16: 1536; CHECK-GI-NOFP16: // %bb.0: // %entry 1537; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 1538; CHECK-GI-NOFP16-NEXT: frinta s0, s0 1539; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 1540; CHECK-GI-NOFP16-NEXT: ret 1541; 1542; CHECK-GI-FP16-LABEL: round_f16: 1543; CHECK-GI-FP16: // %bb.0: // %entry 1544; CHECK-GI-FP16-NEXT: frinta h0, h0 1545; CHECK-GI-FP16-NEXT: ret 1546entry: 1547 %c = call half @llvm.round.f16(half %a) 1548 ret half %c 1549} 1550 1551define <2 x double> @round_v2f64(<2 x double> %a) { 1552; CHECK-LABEL: round_v2f64: 1553; CHECK: // %bb.0: // %entry 1554; CHECK-NEXT: frinta v0.2d, v0.2d 1555; CHECK-NEXT: ret 1556entry: 1557 %c = call <2 x double> @llvm.round.v2f64(<2 x double> %a) 1558 ret <2 x double> %c 1559} 1560 1561define <3 x double> @round_v3f64(<3 x double> %a) { 1562; CHECK-SD-LABEL: round_v3f64: 1563; CHECK-SD: // %bb.0: // %entry 1564; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1565; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1566; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1567; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1568; CHECK-SD-NEXT: frinta v2.2d, v2.2d 1569; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 1570; CHECK-SD-NEXT: frinta v0.2d, v0.2d 1571; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1572; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1573; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1574; CHECK-SD-NEXT: ret 1575; 1576; CHECK-GI-LABEL: round_v3f64: 1577; CHECK-GI: // %bb.0: // %entry 1578; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1579; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1580; CHECK-GI-NEXT: frinta d2, d2 1581; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1582; CHECK-GI-NEXT: frinta v0.2d, v0.2d 1583; CHECK-GI-NEXT: mov d1, v0.d[1] 1584; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1585; CHECK-GI-NEXT: ret 1586entry: 1587 %c = call <3 x double> @llvm.round.v3f64(<3 x double> %a) 1588 ret <3 x double> %c 1589} 1590 1591define <4 x double> @round_v4f64(<4 x double> %a) { 1592; CHECK-LABEL: round_v4f64: 1593; CHECK: // %bb.0: // %entry 1594; CHECK-NEXT: frinta v0.2d, v0.2d 1595; CHECK-NEXT: frinta v1.2d, v1.2d 1596; CHECK-NEXT: ret 1597entry: 1598 %c = call <4 x double> @llvm.round.v4f64(<4 x double> %a) 1599 ret <4 x double> %c 1600} 1601 1602define <2 x float> @round_v2f32(<2 x float> %a) { 1603; CHECK-LABEL: round_v2f32: 1604; CHECK: // %bb.0: // %entry 1605; CHECK-NEXT: frinta v0.2s, v0.2s 1606; CHECK-NEXT: ret 1607entry: 1608 %c = call <2 x float> @llvm.round.v2f32(<2 x float> %a) 1609 ret <2 x float> %c 1610} 1611 1612define <3 x float> @round_v3f32(<3 x float> %a) { 1613; CHECK-LABEL: round_v3f32: 1614; CHECK: // %bb.0: // %entry 1615; CHECK-NEXT: frinta v0.4s, v0.4s 1616; CHECK-NEXT: ret 1617entry: 1618 %c = call <3 x float> @llvm.round.v3f32(<3 x float> %a) 1619 ret <3 x float> %c 1620} 1621 1622define <4 x float> @round_v4f32(<4 x float> %a) { 1623; CHECK-LABEL: round_v4f32: 1624; CHECK: // %bb.0: // %entry 1625; CHECK-NEXT: frinta v0.4s, v0.4s 1626; CHECK-NEXT: ret 1627entry: 1628 %c = call <4 x float> @llvm.round.v4f32(<4 x float> %a) 1629 ret <4 x float> %c 1630} 1631 1632define <8 x float> @round_v8f32(<8 x float> %a) { 1633; CHECK-LABEL: round_v8f32: 1634; CHECK: // %bb.0: // %entry 1635; CHECK-NEXT: frinta v0.4s, v0.4s 1636; CHECK-NEXT: frinta v1.4s, v1.4s 1637; CHECK-NEXT: ret 1638entry: 1639 %c = call <8 x float> @llvm.round.v8f32(<8 x float> %a) 1640 ret <8 x float> %c 1641} 1642 1643define <7 x half> @round_v7f16(<7 x half> %a) { 1644; CHECK-SD-NOFP16-LABEL: round_v7f16: 1645; CHECK-SD-NOFP16: // %bb.0: // %entry 1646; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1647; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1648; CHECK-SD-NOFP16-NEXT: frinta v1.4s, v1.4s 1649; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1650; CHECK-SD-NOFP16-NEXT: frinta v1.4s, v2.4s 1651; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1652; CHECK-SD-NOFP16-NEXT: ret 1653; 1654; CHECK-SD-FP16-LABEL: round_v7f16: 1655; CHECK-SD-FP16: // %bb.0: // %entry 1656; CHECK-SD-FP16-NEXT: frinta v0.8h, v0.8h 1657; CHECK-SD-FP16-NEXT: ret 1658; 1659; CHECK-GI-NOFP16-LABEL: round_v7f16: 1660; CHECK-GI-NOFP16: // %bb.0: // %entry 1661; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1662; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 1663; CHECK-GI-NOFP16-NEXT: frinta v1.4s, v1.4s 1664; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 1665; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1666; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 1667; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 1668; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 1669; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 1670; CHECK-GI-NOFP16-NEXT: frinta v2.4s, v2.4s 1671; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 1672; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 1673; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 1674; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 1675; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 1676; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 1677; CHECK-GI-NOFP16-NEXT: ret 1678; 1679; CHECK-GI-FP16-LABEL: round_v7f16: 1680; CHECK-GI-FP16: // %bb.0: // %entry 1681; CHECK-GI-FP16-NEXT: frinta v0.8h, v0.8h 1682; CHECK-GI-FP16-NEXT: ret 1683entry: 1684 %c = call <7 x half> @llvm.round.v7f16(<7 x half> %a) 1685 ret <7 x half> %c 1686} 1687 1688define <4 x half> @round_v4f16(<4 x half> %a) { 1689; CHECK-SD-NOFP16-LABEL: round_v4f16: 1690; CHECK-SD-NOFP16: // %bb.0: // %entry 1691; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1692; CHECK-SD-NOFP16-NEXT: frinta v0.4s, v0.4s 1693; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1694; CHECK-SD-NOFP16-NEXT: ret 1695; 1696; CHECK-SD-FP16-LABEL: round_v4f16: 1697; CHECK-SD-FP16: // %bb.0: // %entry 1698; CHECK-SD-FP16-NEXT: frinta v0.4h, v0.4h 1699; CHECK-SD-FP16-NEXT: ret 1700; 1701; CHECK-GI-NOFP16-LABEL: round_v4f16: 1702; CHECK-GI-NOFP16: // %bb.0: // %entry 1703; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1704; CHECK-GI-NOFP16-NEXT: frinta v0.4s, v0.4s 1705; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1706; CHECK-GI-NOFP16-NEXT: ret 1707; 1708; CHECK-GI-FP16-LABEL: round_v4f16: 1709; CHECK-GI-FP16: // %bb.0: // %entry 1710; CHECK-GI-FP16-NEXT: frinta v0.4h, v0.4h 1711; CHECK-GI-FP16-NEXT: ret 1712entry: 1713 %c = call <4 x half> @llvm.round.v4f16(<4 x half> %a) 1714 ret <4 x half> %c 1715} 1716 1717define <8 x half> @round_v8f16(<8 x half> %a) { 1718; CHECK-SD-NOFP16-LABEL: round_v8f16: 1719; CHECK-SD-NOFP16: // %bb.0: // %entry 1720; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1721; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1722; CHECK-SD-NOFP16-NEXT: frinta v1.4s, v1.4s 1723; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1724; CHECK-SD-NOFP16-NEXT: frinta v1.4s, v2.4s 1725; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1726; CHECK-SD-NOFP16-NEXT: ret 1727; 1728; CHECK-SD-FP16-LABEL: round_v8f16: 1729; CHECK-SD-FP16: // %bb.0: // %entry 1730; CHECK-SD-FP16-NEXT: frinta v0.8h, v0.8h 1731; CHECK-SD-FP16-NEXT: ret 1732; 1733; CHECK-GI-NOFP16-LABEL: round_v8f16: 1734; CHECK-GI-NOFP16: // %bb.0: // %entry 1735; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1736; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1737; CHECK-GI-NOFP16-NEXT: frinta v1.4s, v1.4s 1738; CHECK-GI-NOFP16-NEXT: frinta v2.4s, v0.4s 1739; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1740; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1741; CHECK-GI-NOFP16-NEXT: ret 1742; 1743; CHECK-GI-FP16-LABEL: round_v8f16: 1744; CHECK-GI-FP16: // %bb.0: // %entry 1745; CHECK-GI-FP16-NEXT: frinta v0.8h, v0.8h 1746; CHECK-GI-FP16-NEXT: ret 1747entry: 1748 %c = call <8 x half> @llvm.round.v8f16(<8 x half> %a) 1749 ret <8 x half> %c 1750} 1751 1752define <16 x half> @round_v16f16(<16 x half> %a) { 1753; CHECK-SD-NOFP16-LABEL: round_v16f16: 1754; CHECK-SD-NOFP16: // %bb.0: // %entry 1755; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1756; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1757; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 1758; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 1759; CHECK-SD-NOFP16-NEXT: frinta v2.4s, v2.4s 1760; CHECK-SD-NOFP16-NEXT: frinta v1.4s, v3.4s 1761; CHECK-SD-NOFP16-NEXT: frinta v3.4s, v5.4s 1762; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1763; CHECK-SD-NOFP16-NEXT: frinta v2.4s, v4.4s 1764; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1765; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 1766; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 1767; CHECK-SD-NOFP16-NEXT: ret 1768; 1769; CHECK-SD-FP16-LABEL: round_v16f16: 1770; CHECK-SD-FP16: // %bb.0: // %entry 1771; CHECK-SD-FP16-NEXT: frinta v0.8h, v0.8h 1772; CHECK-SD-FP16-NEXT: frinta v1.8h, v1.8h 1773; CHECK-SD-FP16-NEXT: ret 1774; 1775; CHECK-GI-NOFP16-LABEL: round_v16f16: 1776; CHECK-GI-NOFP16: // %bb.0: // %entry 1777; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 1778; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 1779; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 1780; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 1781; CHECK-GI-NOFP16-NEXT: frinta v2.4s, v2.4s 1782; CHECK-GI-NOFP16-NEXT: frinta v3.4s, v3.4s 1783; CHECK-GI-NOFP16-NEXT: frinta v4.4s, v0.4s 1784; CHECK-GI-NOFP16-NEXT: frinta v5.4s, v1.4s 1785; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 1786; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 1787; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 1788; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 1789; CHECK-GI-NOFP16-NEXT: ret 1790; 1791; CHECK-GI-FP16-LABEL: round_v16f16: 1792; CHECK-GI-FP16: // %bb.0: // %entry 1793; CHECK-GI-FP16-NEXT: frinta v0.8h, v0.8h 1794; CHECK-GI-FP16-NEXT: frinta v1.8h, v1.8h 1795; CHECK-GI-FP16-NEXT: ret 1796entry: 1797 %c = call <16 x half> @llvm.round.v16f16(<16 x half> %a) 1798 ret <16 x half> %c 1799} 1800 1801define double @trunc_f64(double %a) { 1802; CHECK-LABEL: trunc_f64: 1803; CHECK: // %bb.0: // %entry 1804; CHECK-NEXT: frintz d0, d0 1805; CHECK-NEXT: ret 1806entry: 1807 %c = call double @llvm.trunc.f64(double %a) 1808 ret double %c 1809} 1810 1811define float @trunc_f32(float %a) { 1812; CHECK-LABEL: trunc_f32: 1813; CHECK: // %bb.0: // %entry 1814; CHECK-NEXT: frintz s0, s0 1815; CHECK-NEXT: ret 1816entry: 1817 %c = call float @llvm.trunc.f32(float %a) 1818 ret float %c 1819} 1820 1821define half @trunc_f16(half %a) { 1822; CHECK-SD-NOFP16-LABEL: trunc_f16: 1823; CHECK-SD-NOFP16: // %bb.0: // %entry 1824; CHECK-SD-NOFP16-NEXT: fcvt s0, h0 1825; CHECK-SD-NOFP16-NEXT: frintz s0, s0 1826; CHECK-SD-NOFP16-NEXT: fcvt h0, s0 1827; CHECK-SD-NOFP16-NEXT: ret 1828; 1829; CHECK-SD-FP16-LABEL: trunc_f16: 1830; CHECK-SD-FP16: // %bb.0: // %entry 1831; CHECK-SD-FP16-NEXT: frintz h0, h0 1832; CHECK-SD-FP16-NEXT: ret 1833; 1834; CHECK-GI-NOFP16-LABEL: trunc_f16: 1835; CHECK-GI-NOFP16: // %bb.0: // %entry 1836; CHECK-GI-NOFP16-NEXT: fcvt s0, h0 1837; CHECK-GI-NOFP16-NEXT: frintz s0, s0 1838; CHECK-GI-NOFP16-NEXT: fcvt h0, s0 1839; CHECK-GI-NOFP16-NEXT: ret 1840; 1841; CHECK-GI-FP16-LABEL: trunc_f16: 1842; CHECK-GI-FP16: // %bb.0: // %entry 1843; CHECK-GI-FP16-NEXT: frintz h0, h0 1844; CHECK-GI-FP16-NEXT: ret 1845entry: 1846 %c = call half @llvm.trunc.f16(half %a) 1847 ret half %c 1848} 1849 1850define <2 x double> @trunc_v2f64(<2 x double> %a) { 1851; CHECK-LABEL: trunc_v2f64: 1852; CHECK: // %bb.0: // %entry 1853; CHECK-NEXT: frintz v0.2d, v0.2d 1854; CHECK-NEXT: ret 1855entry: 1856 %c = call <2 x double> @llvm.trunc.v2f64(<2 x double> %a) 1857 ret <2 x double> %c 1858} 1859 1860define <3 x double> @trunc_v3f64(<3 x double> %a) { 1861; CHECK-SD-LABEL: trunc_v3f64: 1862; CHECK-SD: // %bb.0: // %entry 1863; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 1864; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 1865; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 1866; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 1867; CHECK-SD-NEXT: frintz v2.2d, v2.2d 1868; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 1869; CHECK-SD-NEXT: frintz v0.2d, v0.2d 1870; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 1871; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 1872; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 1873; CHECK-SD-NEXT: ret 1874; 1875; CHECK-GI-LABEL: trunc_v3f64: 1876; CHECK-GI: // %bb.0: // %entry 1877; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 1878; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 1879; CHECK-GI-NEXT: frintz d2, d2 1880; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] 1881; CHECK-GI-NEXT: frintz v0.2d, v0.2d 1882; CHECK-GI-NEXT: mov d1, v0.d[1] 1883; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 1884; CHECK-GI-NEXT: ret 1885entry: 1886 %c = call <3 x double> @llvm.trunc.v3f64(<3 x double> %a) 1887 ret <3 x double> %c 1888} 1889 1890define <4 x double> @trunc_v4f64(<4 x double> %a) { 1891; CHECK-LABEL: trunc_v4f64: 1892; CHECK: // %bb.0: // %entry 1893; CHECK-NEXT: frintz v0.2d, v0.2d 1894; CHECK-NEXT: frintz v1.2d, v1.2d 1895; CHECK-NEXT: ret 1896entry: 1897 %c = call <4 x double> @llvm.trunc.v4f64(<4 x double> %a) 1898 ret <4 x double> %c 1899} 1900 1901define <2 x float> @trunc_v2f32(<2 x float> %a) { 1902; CHECK-LABEL: trunc_v2f32: 1903; CHECK: // %bb.0: // %entry 1904; CHECK-NEXT: frintz v0.2s, v0.2s 1905; CHECK-NEXT: ret 1906entry: 1907 %c = call <2 x float> @llvm.trunc.v2f32(<2 x float> %a) 1908 ret <2 x float> %c 1909} 1910 1911define <3 x float> @trunc_v3f32(<3 x float> %a) { 1912; CHECK-LABEL: trunc_v3f32: 1913; CHECK: // %bb.0: // %entry 1914; CHECK-NEXT: frintz v0.4s, v0.4s 1915; CHECK-NEXT: ret 1916entry: 1917 %c = call <3 x float> @llvm.trunc.v3f32(<3 x float> %a) 1918 ret <3 x float> %c 1919} 1920 1921define <4 x float> @trunc_v4f32(<4 x float> %a) { 1922; CHECK-LABEL: trunc_v4f32: 1923; CHECK: // %bb.0: // %entry 1924; CHECK-NEXT: frintz v0.4s, v0.4s 1925; CHECK-NEXT: ret 1926entry: 1927 %c = call <4 x float> @llvm.trunc.v4f32(<4 x float> %a) 1928 ret <4 x float> %c 1929} 1930 1931define <8 x float> @trunc_v8f32(<8 x float> %a) { 1932; CHECK-LABEL: trunc_v8f32: 1933; CHECK: // %bb.0: // %entry 1934; CHECK-NEXT: frintz v0.4s, v0.4s 1935; CHECK-NEXT: frintz v1.4s, v1.4s 1936; CHECK-NEXT: ret 1937entry: 1938 %c = call <8 x float> @llvm.trunc.v8f32(<8 x float> %a) 1939 ret <8 x float> %c 1940} 1941 1942define <7 x half> @trunc_v7f16(<7 x half> %a) { 1943; CHECK-SD-NOFP16-LABEL: trunc_v7f16: 1944; CHECK-SD-NOFP16: // %bb.0: // %entry 1945; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1946; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 1947; CHECK-SD-NOFP16-NEXT: frintz v1.4s, v1.4s 1948; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 1949; CHECK-SD-NOFP16-NEXT: frintz v1.4s, v2.4s 1950; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 1951; CHECK-SD-NOFP16-NEXT: ret 1952; 1953; CHECK-SD-FP16-LABEL: trunc_v7f16: 1954; CHECK-SD-FP16: // %bb.0: // %entry 1955; CHECK-SD-FP16-NEXT: frintz v0.8h, v0.8h 1956; CHECK-SD-FP16-NEXT: ret 1957; 1958; CHECK-GI-NOFP16-LABEL: trunc_v7f16: 1959; CHECK-GI-NOFP16: // %bb.0: // %entry 1960; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 1961; CHECK-GI-NOFP16-NEXT: mov v2.h[0], v0.h[4] 1962; CHECK-GI-NOFP16-NEXT: frintz v1.4s, v1.4s 1963; CHECK-GI-NOFP16-NEXT: mov v2.h[1], v0.h[5] 1964; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v1.4s 1965; CHECK-GI-NOFP16-NEXT: mov v2.h[2], v0.h[6] 1966; CHECK-GI-NOFP16-NEXT: mov v0.h[0], v1.h[0] 1967; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v2.4h 1968; CHECK-GI-NOFP16-NEXT: mov v0.h[1], v1.h[1] 1969; CHECK-GI-NOFP16-NEXT: frintz v2.4s, v2.4s 1970; CHECK-GI-NOFP16-NEXT: mov v0.h[2], v1.h[2] 1971; CHECK-GI-NOFP16-NEXT: fcvtn v2.4h, v2.4s 1972; CHECK-GI-NOFP16-NEXT: mov v0.h[3], v1.h[3] 1973; CHECK-GI-NOFP16-NEXT: mov v0.h[4], v2.h[0] 1974; CHECK-GI-NOFP16-NEXT: mov v0.h[5], v2.h[1] 1975; CHECK-GI-NOFP16-NEXT: mov v0.h[6], v2.h[2] 1976; CHECK-GI-NOFP16-NEXT: ret 1977; 1978; CHECK-GI-FP16-LABEL: trunc_v7f16: 1979; CHECK-GI-FP16: // %bb.0: // %entry 1980; CHECK-GI-FP16-NEXT: frintz v0.8h, v0.8h 1981; CHECK-GI-FP16-NEXT: ret 1982entry: 1983 %c = call <7 x half> @llvm.trunc.v7f16(<7 x half> %a) 1984 ret <7 x half> %c 1985} 1986 1987define <4 x half> @trunc_v4f16(<4 x half> %a) { 1988; CHECK-SD-NOFP16-LABEL: trunc_v4f16: 1989; CHECK-SD-NOFP16: // %bb.0: // %entry 1990; CHECK-SD-NOFP16-NEXT: fcvtl v0.4s, v0.4h 1991; CHECK-SD-NOFP16-NEXT: frintz v0.4s, v0.4s 1992; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v0.4s 1993; CHECK-SD-NOFP16-NEXT: ret 1994; 1995; CHECK-SD-FP16-LABEL: trunc_v4f16: 1996; CHECK-SD-FP16: // %bb.0: // %entry 1997; CHECK-SD-FP16-NEXT: frintz v0.4h, v0.4h 1998; CHECK-SD-FP16-NEXT: ret 1999; 2000; CHECK-GI-NOFP16-LABEL: trunc_v4f16: 2001; CHECK-GI-NOFP16: // %bb.0: // %entry 2002; CHECK-GI-NOFP16-NEXT: fcvtl v0.4s, v0.4h 2003; CHECK-GI-NOFP16-NEXT: frintz v0.4s, v0.4s 2004; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v0.4s 2005; CHECK-GI-NOFP16-NEXT: ret 2006; 2007; CHECK-GI-FP16-LABEL: trunc_v4f16: 2008; CHECK-GI-FP16: // %bb.0: // %entry 2009; CHECK-GI-FP16-NEXT: frintz v0.4h, v0.4h 2010; CHECK-GI-FP16-NEXT: ret 2011entry: 2012 %c = call <4 x half> @llvm.trunc.v4f16(<4 x half> %a) 2013 ret <4 x half> %c 2014} 2015 2016define <8 x half> @trunc_v8f16(<8 x half> %a) { 2017; CHECK-SD-NOFP16-LABEL: trunc_v8f16: 2018; CHECK-SD-NOFP16: // %bb.0: // %entry 2019; CHECK-SD-NOFP16-NEXT: fcvtl v1.4s, v0.4h 2020; CHECK-SD-NOFP16-NEXT: fcvtl2 v2.4s, v0.8h 2021; CHECK-SD-NOFP16-NEXT: frintz v1.4s, v1.4s 2022; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v1.4s 2023; CHECK-SD-NOFP16-NEXT: frintz v1.4s, v2.4s 2024; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v1.4s 2025; CHECK-SD-NOFP16-NEXT: ret 2026; 2027; CHECK-SD-FP16-LABEL: trunc_v8f16: 2028; CHECK-SD-FP16: // %bb.0: // %entry 2029; CHECK-SD-FP16-NEXT: frintz v0.8h, v0.8h 2030; CHECK-SD-FP16-NEXT: ret 2031; 2032; CHECK-GI-NOFP16-LABEL: trunc_v8f16: 2033; CHECK-GI-NOFP16: // %bb.0: // %entry 2034; CHECK-GI-NOFP16-NEXT: fcvtl v1.4s, v0.4h 2035; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 2036; CHECK-GI-NOFP16-NEXT: frintz v1.4s, v1.4s 2037; CHECK-GI-NOFP16-NEXT: frintz v2.4s, v0.4s 2038; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v1.4s 2039; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 2040; CHECK-GI-NOFP16-NEXT: ret 2041; 2042; CHECK-GI-FP16-LABEL: trunc_v8f16: 2043; CHECK-GI-FP16: // %bb.0: // %entry 2044; CHECK-GI-FP16-NEXT: frintz v0.8h, v0.8h 2045; CHECK-GI-FP16-NEXT: ret 2046entry: 2047 %c = call <8 x half> @llvm.trunc.v8f16(<8 x half> %a) 2048 ret <8 x half> %c 2049} 2050 2051define <16 x half> @trunc_v16f16(<16 x half> %a) { 2052; CHECK-SD-NOFP16-LABEL: trunc_v16f16: 2053; CHECK-SD-NOFP16: // %bb.0: // %entry 2054; CHECK-SD-NOFP16-NEXT: fcvtl v2.4s, v0.4h 2055; CHECK-SD-NOFP16-NEXT: fcvtl v3.4s, v1.4h 2056; CHECK-SD-NOFP16-NEXT: fcvtl2 v4.4s, v0.8h 2057; CHECK-SD-NOFP16-NEXT: fcvtl2 v5.4s, v1.8h 2058; CHECK-SD-NOFP16-NEXT: frintz v2.4s, v2.4s 2059; CHECK-SD-NOFP16-NEXT: frintz v1.4s, v3.4s 2060; CHECK-SD-NOFP16-NEXT: frintz v3.4s, v5.4s 2061; CHECK-SD-NOFP16-NEXT: fcvtn v0.4h, v2.4s 2062; CHECK-SD-NOFP16-NEXT: frintz v2.4s, v4.4s 2063; CHECK-SD-NOFP16-NEXT: fcvtn v1.4h, v1.4s 2064; CHECK-SD-NOFP16-NEXT: fcvtn2 v0.8h, v2.4s 2065; CHECK-SD-NOFP16-NEXT: fcvtn2 v1.8h, v3.4s 2066; CHECK-SD-NOFP16-NEXT: ret 2067; 2068; CHECK-SD-FP16-LABEL: trunc_v16f16: 2069; CHECK-SD-FP16: // %bb.0: // %entry 2070; CHECK-SD-FP16-NEXT: frintz v0.8h, v0.8h 2071; CHECK-SD-FP16-NEXT: frintz v1.8h, v1.8h 2072; CHECK-SD-FP16-NEXT: ret 2073; 2074; CHECK-GI-NOFP16-LABEL: trunc_v16f16: 2075; CHECK-GI-NOFP16: // %bb.0: // %entry 2076; CHECK-GI-NOFP16-NEXT: fcvtl v2.4s, v0.4h 2077; CHECK-GI-NOFP16-NEXT: fcvtl v3.4s, v1.4h 2078; CHECK-GI-NOFP16-NEXT: fcvtl2 v0.4s, v0.8h 2079; CHECK-GI-NOFP16-NEXT: fcvtl2 v1.4s, v1.8h 2080; CHECK-GI-NOFP16-NEXT: frintz v2.4s, v2.4s 2081; CHECK-GI-NOFP16-NEXT: frintz v3.4s, v3.4s 2082; CHECK-GI-NOFP16-NEXT: frintz v4.4s, v0.4s 2083; CHECK-GI-NOFP16-NEXT: frintz v5.4s, v1.4s 2084; CHECK-GI-NOFP16-NEXT: fcvtn v0.4h, v2.4s 2085; CHECK-GI-NOFP16-NEXT: fcvtn v1.4h, v3.4s 2086; CHECK-GI-NOFP16-NEXT: fcvtn2 v0.8h, v4.4s 2087; CHECK-GI-NOFP16-NEXT: fcvtn2 v1.8h, v5.4s 2088; CHECK-GI-NOFP16-NEXT: ret 2089; 2090; CHECK-GI-FP16-LABEL: trunc_v16f16: 2091; CHECK-GI-FP16: // %bb.0: // %entry 2092; CHECK-GI-FP16-NEXT: frintz v0.8h, v0.8h 2093; CHECK-GI-FP16-NEXT: frintz v1.8h, v1.8h 2094; CHECK-GI-FP16-NEXT: ret 2095entry: 2096 %c = call <16 x half> @llvm.trunc.v16f16(<16 x half> %a) 2097 ret <16 x half> %c 2098} 2099 2100declare <16 x half> @llvm.ceil.v16f16(<16 x half>) 2101declare <16 x half> @llvm.floor.v16f16(<16 x half>) 2102declare <16 x half> @llvm.nearbyint.v16f16(<16 x half>) 2103declare <16 x half> @llvm.rint.v16f16(<16 x half>) 2104declare <16 x half> @llvm.round.v16f16(<16 x half>) 2105declare <16 x half> @llvm.roundeven.v16f16(<16 x half>) 2106declare <16 x half> @llvm.trunc.v16f16(<16 x half>) 2107declare <2 x double> @llvm.ceil.v2f64(<2 x double>) 2108declare <2 x double> @llvm.floor.v2f64(<2 x double>) 2109declare <2 x double> @llvm.nearbyint.v2f64(<2 x double>) 2110declare <2 x double> @llvm.rint.v2f64(<2 x double>) 2111declare <2 x double> @llvm.round.v2f64(<2 x double>) 2112declare <2 x double> @llvm.roundeven.v2f64(<2 x double>) 2113declare <2 x double> @llvm.trunc.v2f64(<2 x double>) 2114declare <2 x float> @llvm.ceil.v2f32(<2 x float>) 2115declare <2 x float> @llvm.floor.v2f32(<2 x float>) 2116declare <2 x float> @llvm.nearbyint.v2f32(<2 x float>) 2117declare <2 x float> @llvm.rint.v2f32(<2 x float>) 2118declare <2 x float> @llvm.round.v2f32(<2 x float>) 2119declare <2 x float> @llvm.roundeven.v2f32(<2 x float>) 2120declare <2 x float> @llvm.trunc.v2f32(<2 x float>) 2121declare <3 x double> @llvm.ceil.v3f64(<3 x double>) 2122declare <3 x double> @llvm.floor.v3f64(<3 x double>) 2123declare <3 x double> @llvm.nearbyint.v3f64(<3 x double>) 2124declare <3 x double> @llvm.rint.v3f64(<3 x double>) 2125declare <3 x double> @llvm.round.v3f64(<3 x double>) 2126declare <3 x double> @llvm.roundeven.v3f64(<3 x double>) 2127declare <3 x double> @llvm.trunc.v3f64(<3 x double>) 2128declare <3 x float> @llvm.ceil.v3f32(<3 x float>) 2129declare <3 x float> @llvm.floor.v3f32(<3 x float>) 2130declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>) 2131declare <3 x float> @llvm.rint.v3f32(<3 x float>) 2132declare <3 x float> @llvm.round.v3f32(<3 x float>) 2133declare <3 x float> @llvm.roundeven.v3f32(<3 x float>) 2134declare <3 x float> @llvm.trunc.v3f32(<3 x float>) 2135declare <4 x double> @llvm.ceil.v4f64(<4 x double>) 2136declare <4 x double> @llvm.floor.v4f64(<4 x double>) 2137declare <4 x double> @llvm.nearbyint.v4f64(<4 x double>) 2138declare <4 x double> @llvm.rint.v4f64(<4 x double>) 2139declare <4 x double> @llvm.round.v4f64(<4 x double>) 2140declare <4 x double> @llvm.roundeven.v4f64(<4 x double>) 2141declare <4 x double> @llvm.trunc.v4f64(<4 x double>) 2142declare <4 x float> @llvm.ceil.v4f32(<4 x float>) 2143declare <4 x float> @llvm.floor.v4f32(<4 x float>) 2144declare <4 x float> @llvm.nearbyint.v4f32(<4 x float>) 2145declare <4 x float> @llvm.rint.v4f32(<4 x float>) 2146declare <4 x float> @llvm.round.v4f32(<4 x float>) 2147declare <4 x float> @llvm.roundeven.v4f32(<4 x float>) 2148declare <4 x float> @llvm.trunc.v4f32(<4 x float>) 2149declare <4 x half> @llvm.ceil.v4f16(<4 x half>) 2150declare <4 x half> @llvm.floor.v4f16(<4 x half>) 2151declare <4 x half> @llvm.nearbyint.v4f16(<4 x half>) 2152declare <4 x half> @llvm.rint.v4f16(<4 x half>) 2153declare <4 x half> @llvm.round.v4f16(<4 x half>) 2154declare <4 x half> @llvm.roundeven.v4f16(<4 x half>) 2155declare <4 x half> @llvm.trunc.v4f16(<4 x half>) 2156declare <7 x half> @llvm.ceil.v7f16(<7 x half>) 2157declare <7 x half> @llvm.floor.v7f16(<7 x half>) 2158declare <7 x half> @llvm.nearbyint.v7f16(<7 x half>) 2159declare <7 x half> @llvm.rint.v7f16(<7 x half>) 2160declare <7 x half> @llvm.round.v7f16(<7 x half>) 2161declare <7 x half> @llvm.roundeven.v7f16(<7 x half>) 2162declare <7 x half> @llvm.trunc.v7f16(<7 x half>) 2163declare <8 x float> @llvm.ceil.v8f32(<8 x float>) 2164declare <8 x float> @llvm.floor.v8f32(<8 x float>) 2165declare <8 x float> @llvm.nearbyint.v8f32(<8 x float>) 2166declare <8 x float> @llvm.rint.v8f32(<8 x float>) 2167declare <8 x float> @llvm.round.v8f32(<8 x float>) 2168declare <8 x float> @llvm.roundeven.v8f32(<8 x float>) 2169declare <8 x float> @llvm.trunc.v8f32(<8 x float>) 2170declare <8 x half> @llvm.ceil.v8f16(<8 x half>) 2171declare <8 x half> @llvm.floor.v8f16(<8 x half>) 2172declare <8 x half> @llvm.nearbyint.v8f16(<8 x half>) 2173declare <8 x half> @llvm.rint.v8f16(<8 x half>) 2174declare <8 x half> @llvm.round.v8f16(<8 x half>) 2175declare <8 x half> @llvm.roundeven.v8f16(<8 x half>) 2176declare <8 x half> @llvm.trunc.v8f16(<8 x half>) 2177declare double @llvm.ceil.f64(double) 2178declare double @llvm.floor.f64(double) 2179declare double @llvm.nearbyint.f64(double) 2180declare double @llvm.rint.f64(double) 2181declare double @llvm.round.f64(double) 2182declare double @llvm.roundeven.f64(double) 2183declare double @llvm.trunc.f64(double) 2184declare float @llvm.ceil.f32(float) 2185declare float @llvm.floor.f32(float) 2186declare float @llvm.nearbyint.f32(float) 2187declare float @llvm.rint.f32(float) 2188declare float @llvm.round.f32(float) 2189declare float @llvm.roundeven.f32(float) 2190declare float @llvm.trunc.f32(float) 2191declare half @llvm.ceil.f16(half) 2192declare half @llvm.floor.f16(half) 2193declare half @llvm.nearbyint.f16(half) 2194declare half @llvm.rint.f16(half) 2195declare half @llvm.round.f16(half) 2196declare half @llvm.roundeven.f16(half) 2197declare half @llvm.trunc.f16(half) 2198