1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=aarch64 -mattr=-fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT 3; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefixes=CHECK,CHECK-FP16 4 5define <8 x half> @add_h(<8 x half> %a, <8 x half> %b) { 6; CHECK-CVT-LABEL: add_h: 7; CHECK-CVT: // %bb.0: // %entry 8; CHECK-CVT-NEXT: fcvtl v2.4s, v1.4h 9; CHECK-CVT-NEXT: fcvtl v3.4s, v0.4h 10; CHECK-CVT-NEXT: fcvtl2 v1.4s, v1.8h 11; CHECK-CVT-NEXT: fcvtl2 v0.4s, v0.8h 12; CHECK-CVT-NEXT: fadd v2.4s, v3.4s, v2.4s 13; CHECK-CVT-NEXT: fadd v1.4s, v0.4s, v1.4s 14; CHECK-CVT-NEXT: fcvtn v0.4h, v2.4s 15; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 16; CHECK-CVT-NEXT: ret 17; 18; CHECK-FP16-LABEL: add_h: 19; CHECK-FP16: // %bb.0: // %entry 20; CHECK-FP16-NEXT: fadd v0.8h, v0.8h, v1.8h 21; CHECK-FP16-NEXT: ret 22entry: 23 %0 = fadd <8 x half> %a, %b 24 ret <8 x half> %0 25} 26 27 28define <8 x half> @sub_h(<8 x half> %a, <8 x half> %b) { 29; CHECK-CVT-LABEL: sub_h: 30; CHECK-CVT: // %bb.0: // %entry 31; CHECK-CVT-NEXT: fcvtl v2.4s, v1.4h 32; CHECK-CVT-NEXT: fcvtl v3.4s, v0.4h 33; CHECK-CVT-NEXT: fcvtl2 v1.4s, v1.8h 34; CHECK-CVT-NEXT: fcvtl2 v0.4s, v0.8h 35; CHECK-CVT-NEXT: fsub v2.4s, v3.4s, v2.4s 36; CHECK-CVT-NEXT: fsub v1.4s, v0.4s, v1.4s 37; CHECK-CVT-NEXT: fcvtn v0.4h, v2.4s 38; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 39; CHECK-CVT-NEXT: ret 40; 41; CHECK-FP16-LABEL: sub_h: 42; CHECK-FP16: // %bb.0: // %entry 43; CHECK-FP16-NEXT: fsub v0.8h, v0.8h, v1.8h 44; CHECK-FP16-NEXT: ret 45entry: 46 %0 = fsub <8 x half> %a, %b 47 ret <8 x half> %0 48} 49 50 51define <8 x half> @mul_h(<8 x half> %a, <8 x half> %b) { 52; CHECK-CVT-LABEL: mul_h: 53; CHECK-CVT: // %bb.0: // %entry 54; CHECK-CVT-NEXT: fcvtl v2.4s, v1.4h 55; CHECK-CVT-NEXT: fcvtl v3.4s, v0.4h 56; CHECK-CVT-NEXT: fcvtl2 v1.4s, v1.8h 57; CHECK-CVT-NEXT: fcvtl2 v0.4s, v0.8h 58; CHECK-CVT-NEXT: fmul v2.4s, v3.4s, v2.4s 59; CHECK-CVT-NEXT: fmul v1.4s, v0.4s, v1.4s 60; CHECK-CVT-NEXT: fcvtn v0.4h, v2.4s 61; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 62; CHECK-CVT-NEXT: ret 63; 64; CHECK-FP16-LABEL: mul_h: 65; CHECK-FP16: // %bb.0: // %entry 66; CHECK-FP16-NEXT: fmul v0.8h, v0.8h, v1.8h 67; CHECK-FP16-NEXT: ret 68entry: 69 %0 = fmul <8 x half> %a, %b 70 ret <8 x half> %0 71} 72 73 74define <8 x half> @div_h(<8 x half> %a, <8 x half> %b) { 75; CHECK-CVT-LABEL: div_h: 76; CHECK-CVT: // %bb.0: // %entry 77; CHECK-CVT-NEXT: fcvtl v2.4s, v1.4h 78; CHECK-CVT-NEXT: fcvtl v3.4s, v0.4h 79; CHECK-CVT-NEXT: fcvtl2 v1.4s, v1.8h 80; CHECK-CVT-NEXT: fcvtl2 v0.4s, v0.8h 81; CHECK-CVT-NEXT: fdiv v2.4s, v3.4s, v2.4s 82; CHECK-CVT-NEXT: fdiv v1.4s, v0.4s, v1.4s 83; CHECK-CVT-NEXT: fcvtn v0.4h, v2.4s 84; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 85; CHECK-CVT-NEXT: ret 86; 87; CHECK-FP16-LABEL: div_h: 88; CHECK-FP16: // %bb.0: // %entry 89; CHECK-FP16-NEXT: fdiv v0.8h, v0.8h, v1.8h 90; CHECK-FP16-NEXT: ret 91entry: 92 %0 = fdiv <8 x half> %a, %b 93 ret <8 x half> %0 94} 95 96 97define <8 x half> @load_h(ptr %a) { 98; CHECK-LABEL: load_h: 99; CHECK: // %bb.0: // %entry 100; CHECK-NEXT: ldr q0, [x0] 101; CHECK-NEXT: ret 102entry: 103 %0 = load <8 x half>, ptr %a, align 4 104 ret <8 x half> %0 105} 106 107 108define void @store_h(ptr %a, <8 x half> %b) { 109; CHECK-LABEL: store_h: 110; CHECK: // %bb.0: // %entry 111; CHECK-NEXT: str q0, [x0] 112; CHECK-NEXT: ret 113entry: 114 store <8 x half> %b, ptr %a, align 4 115 ret void 116} 117 118define <8 x half> @s_to_h(<8 x float> %a) { 119; CHECK-LABEL: s_to_h: 120; CHECK: // %bb.0: 121; CHECK-NEXT: fcvtn v0.4h, v0.4s 122; CHECK-NEXT: fcvtn2 v0.8h, v1.4s 123; CHECK-NEXT: ret 124 %1 = fptrunc <8 x float> %a to <8 x half> 125 ret <8 x half> %1 126} 127 128define <8 x half> @d_to_h(<8 x double> %a) { 129; CHECK-LABEL: d_to_h: 130; CHECK: // %bb.0: 131; CHECK-NEXT: fcvtxn v0.2s, v0.2d 132; CHECK-NEXT: fcvtxn v2.2s, v2.2d 133; CHECK-NEXT: fcvtxn2 v0.4s, v1.2d 134; CHECK-NEXT: fcvtxn2 v2.4s, v3.2d 135; CHECK-NEXT: fcvtn v0.4h, v0.4s 136; CHECK-NEXT: fcvtn2 v0.8h, v2.4s 137; CHECK-NEXT: ret 138 %1 = fptrunc <8 x double> %a to <8 x half> 139 ret <8 x half> %1 140} 141 142define <8 x float> @h_to_s(<8 x half> %a) { 143; CHECK-LABEL: h_to_s: 144; CHECK: // %bb.0: 145; CHECK-NEXT: fcvtl2 v1.4s, v0.8h 146; CHECK-NEXT: fcvtl v0.4s, v0.4h 147; CHECK-NEXT: ret 148 %1 = fpext <8 x half> %a to <8 x float> 149 ret <8 x float> %1 150} 151 152define <8 x double> @h_to_d(<8 x half> %a) { 153; CHECK-LABEL: h_to_d: 154; CHECK: // %bb.0: 155; CHECK-NEXT: fcvtl v1.4s, v0.4h 156; CHECK-NEXT: fcvtl2 v2.4s, v0.8h 157; CHECK-NEXT: fcvtl v0.2d, v1.2s 158; CHECK-NEXT: fcvtl2 v3.2d, v2.4s 159; CHECK-NEXT: fcvtl2 v1.2d, v1.4s 160; CHECK-NEXT: fcvtl v2.2d, v2.2s 161; CHECK-NEXT: ret 162 %1 = fpext <8 x half> %a to <8 x double> 163 ret <8 x double> %1 164} 165 166 167define <8 x half> @bitcast_i_to_h(float, <8 x i16> %a) { 168; CHECK-LABEL: bitcast_i_to_h: 169; CHECK: // %bb.0: 170; CHECK-NEXT: mov v0.16b, v1.16b 171; CHECK-NEXT: ret 172 %2 = bitcast <8 x i16> %a to <8 x half> 173 ret <8 x half> %2 174} 175 176define <8 x i16> @bitcast_h_to_i(float, <8 x half> %a) { 177; CHECK-LABEL: bitcast_h_to_i: 178; CHECK: // %bb.0: 179; CHECK-NEXT: mov v0.16b, v1.16b 180; CHECK-NEXT: ret 181 %2 = bitcast <8 x half> %a to <8 x i16> 182 ret <8 x i16> %2 183} 184 185define <4 x half> @sitofp_v4i8(<4 x i8> %a) #0 { 186; CHECK-CVT-LABEL: sitofp_v4i8: 187; CHECK-CVT: // %bb.0: 188; CHECK-CVT-NEXT: shl v0.4h, v0.4h, #8 189; CHECK-CVT-NEXT: sshr v0.4h, v0.4h, #8 190; CHECK-CVT-NEXT: sshll v0.4s, v0.4h, #0 191; CHECK-CVT-NEXT: scvtf v0.4s, v0.4s 192; CHECK-CVT-NEXT: fcvtn v0.4h, v0.4s 193; CHECK-CVT-NEXT: ret 194; 195; CHECK-FP16-LABEL: sitofp_v4i8: 196; CHECK-FP16: // %bb.0: 197; CHECK-FP16-NEXT: shl v0.4h, v0.4h, #8 198; CHECK-FP16-NEXT: sshr v0.4h, v0.4h, #8 199; CHECK-FP16-NEXT: scvtf v0.4h, v0.4h 200; CHECK-FP16-NEXT: ret 201 %1 = sitofp <4 x i8> %a to <4 x half> 202 ret <4 x half> %1 203} 204 205define <8 x half> @sitofp_v8i8(<8 x i8> %a) #0 { 206; CHECK-CVT-LABEL: sitofp_v8i8: 207; CHECK-CVT: // %bb.0: 208; CHECK-CVT-NEXT: sshll v0.8h, v0.8b, #0 209; CHECK-CVT-NEXT: sshll v1.4s, v0.4h, #0 210; CHECK-CVT-NEXT: sshll2 v2.4s, v0.8h, #0 211; CHECK-CVT-NEXT: scvtf v1.4s, v1.4s 212; CHECK-CVT-NEXT: fcvtn v0.4h, v1.4s 213; CHECK-CVT-NEXT: scvtf v1.4s, v2.4s 214; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 215; CHECK-CVT-NEXT: ret 216; 217; CHECK-FP16-LABEL: sitofp_v8i8: 218; CHECK-FP16: // %bb.0: 219; CHECK-FP16-NEXT: sshll v0.8h, v0.8b, #0 220; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h 221; CHECK-FP16-NEXT: ret 222 %1 = sitofp <8 x i8> %a to <8 x half> 223 ret <8 x half> %1 224} 225 226define <16 x half> @sitofp_v16i8(<16 x i8> %a) #0 { 227; CHECK-CVT-LABEL: sitofp_v16i8: 228; CHECK-CVT: // %bb.0: 229; CHECK-CVT-NEXT: sshll2 v1.8h, v0.16b, #0 230; CHECK-CVT-NEXT: sshll v0.8h, v0.8b, #0 231; CHECK-CVT-NEXT: sshll v2.4s, v1.4h, #0 232; CHECK-CVT-NEXT: sshll v3.4s, v0.4h, #0 233; CHECK-CVT-NEXT: sshll2 v4.4s, v1.8h, #0 234; CHECK-CVT-NEXT: sshll2 v5.4s, v0.8h, #0 235; CHECK-CVT-NEXT: scvtf v2.4s, v2.4s 236; CHECK-CVT-NEXT: scvtf v3.4s, v3.4s 237; CHECK-CVT-NEXT: fcvtn v1.4h, v2.4s 238; CHECK-CVT-NEXT: scvtf v2.4s, v4.4s 239; CHECK-CVT-NEXT: fcvtn v0.4h, v3.4s 240; CHECK-CVT-NEXT: scvtf v3.4s, v5.4s 241; CHECK-CVT-NEXT: fcvtn2 v1.8h, v2.4s 242; CHECK-CVT-NEXT: fcvtn2 v0.8h, v3.4s 243; CHECK-CVT-NEXT: ret 244; 245; CHECK-FP16-LABEL: sitofp_v16i8: 246; CHECK-FP16: // %bb.0: 247; CHECK-FP16-NEXT: sshll2 v1.8h, v0.16b, #0 248; CHECK-FP16-NEXT: sshll v0.8h, v0.8b, #0 249; CHECK-FP16-NEXT: scvtf v1.8h, v1.8h 250; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h 251; CHECK-FP16-NEXT: ret 252 %1 = sitofp <16 x i8> %a to <16 x half> 253 ret <16 x half> %1 254} 255 256define <8 x half> @sitofp_i16(<8 x i16> %a) #0 { 257; CHECK-CVT-LABEL: sitofp_i16: 258; CHECK-CVT: // %bb.0: 259; CHECK-CVT-NEXT: sshll v1.4s, v0.4h, #0 260; CHECK-CVT-NEXT: sshll2 v2.4s, v0.8h, #0 261; CHECK-CVT-NEXT: scvtf v1.4s, v1.4s 262; CHECK-CVT-NEXT: fcvtn v0.4h, v1.4s 263; CHECK-CVT-NEXT: scvtf v1.4s, v2.4s 264; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 265; CHECK-CVT-NEXT: ret 266; 267; CHECK-FP16-LABEL: sitofp_i16: 268; CHECK-FP16: // %bb.0: 269; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h 270; CHECK-FP16-NEXT: ret 271 %1 = sitofp <8 x i16> %a to <8 x half> 272 ret <8 x half> %1 273} 274 275define <8 x half> @sitofp_i32(<8 x i32> %a) #0 { 276; CHECK-LABEL: sitofp_i32: 277; CHECK: // %bb.0: 278; CHECK-NEXT: scvtf v0.4s, v0.4s 279; CHECK-NEXT: scvtf v1.4s, v1.4s 280; CHECK-NEXT: fcvtn v0.4h, v0.4s 281; CHECK-NEXT: fcvtn2 v0.8h, v1.4s 282; CHECK-NEXT: ret 283 %1 = sitofp <8 x i32> %a to <8 x half> 284 ret <8 x half> %1 285} 286 287 288define <8 x half> @sitofp_i64(<8 x i64> %a) #0 { 289; CHECK-LABEL: sitofp_i64: 290; CHECK: // %bb.0: 291; CHECK-NEXT: scvtf v0.2d, v0.2d 292; CHECK-NEXT: scvtf v2.2d, v2.2d 293; CHECK-NEXT: scvtf v1.2d, v1.2d 294; CHECK-NEXT: scvtf v3.2d, v3.2d 295; CHECK-NEXT: fcvtn v0.2s, v0.2d 296; CHECK-NEXT: fcvtn v2.2s, v2.2d 297; CHECK-NEXT: fcvtn2 v0.4s, v1.2d 298; CHECK-NEXT: fcvtn2 v2.4s, v3.2d 299; CHECK-NEXT: fcvtn v0.4h, v0.4s 300; CHECK-NEXT: fcvtn2 v0.8h, v2.4s 301; CHECK-NEXT: ret 302 %1 = sitofp <8 x i64> %a to <8 x half> 303 ret <8 x half> %1 304} 305 306define <4 x half> @uitofp_v4i8(<4 x i8> %a) #0 { 307; CHECK-CVT-LABEL: uitofp_v4i8: 308; CHECK-CVT: // %bb.0: 309; CHECK-CVT-NEXT: bic v0.4h, #255, lsl #8 310; CHECK-CVT-NEXT: ushll v0.4s, v0.4h, #0 311; CHECK-CVT-NEXT: ucvtf v0.4s, v0.4s 312; CHECK-CVT-NEXT: fcvtn v0.4h, v0.4s 313; CHECK-CVT-NEXT: ret 314; 315; CHECK-FP16-LABEL: uitofp_v4i8: 316; CHECK-FP16: // %bb.0: 317; CHECK-FP16-NEXT: bic v0.4h, #255, lsl #8 318; CHECK-FP16-NEXT: ucvtf v0.4h, v0.4h 319; CHECK-FP16-NEXT: ret 320 %1 = uitofp <4 x i8> %a to <4 x half> 321 ret <4 x half> %1 322} 323 324define <8 x half> @uitofp_v8i8(<8 x i8> %a) #0 { 325; CHECK-CVT-LABEL: uitofp_v8i8: 326; CHECK-CVT: // %bb.0: 327; CHECK-CVT-NEXT: ushll v0.8h, v0.8b, #0 328; CHECK-CVT-NEXT: ushll v1.4s, v0.4h, #0 329; CHECK-CVT-NEXT: ushll2 v2.4s, v0.8h, #0 330; CHECK-CVT-NEXT: ucvtf v1.4s, v1.4s 331; CHECK-CVT-NEXT: fcvtn v0.4h, v1.4s 332; CHECK-CVT-NEXT: ucvtf v1.4s, v2.4s 333; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 334; CHECK-CVT-NEXT: ret 335; 336; CHECK-FP16-LABEL: uitofp_v8i8: 337; CHECK-FP16: // %bb.0: 338; CHECK-FP16-NEXT: ushll v0.8h, v0.8b, #0 339; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h 340; CHECK-FP16-NEXT: ret 341 %1 = uitofp <8 x i8> %a to <8 x half> 342 ret <8 x half> %1 343} 344 345define <16 x half> @uitofp_v16i8(<16 x i8> %a) #0 { 346; CHECK-CVT-LABEL: uitofp_v16i8: 347; CHECK-CVT: // %bb.0: 348; CHECK-CVT-NEXT: ushll2 v1.8h, v0.16b, #0 349; CHECK-CVT-NEXT: ushll v0.8h, v0.8b, #0 350; CHECK-CVT-NEXT: ushll v2.4s, v1.4h, #0 351; CHECK-CVT-NEXT: ushll v3.4s, v0.4h, #0 352; CHECK-CVT-NEXT: ushll2 v4.4s, v1.8h, #0 353; CHECK-CVT-NEXT: ushll2 v5.4s, v0.8h, #0 354; CHECK-CVT-NEXT: ucvtf v2.4s, v2.4s 355; CHECK-CVT-NEXT: ucvtf v3.4s, v3.4s 356; CHECK-CVT-NEXT: fcvtn v1.4h, v2.4s 357; CHECK-CVT-NEXT: ucvtf v2.4s, v4.4s 358; CHECK-CVT-NEXT: fcvtn v0.4h, v3.4s 359; CHECK-CVT-NEXT: ucvtf v3.4s, v5.4s 360; CHECK-CVT-NEXT: fcvtn2 v1.8h, v2.4s 361; CHECK-CVT-NEXT: fcvtn2 v0.8h, v3.4s 362; CHECK-CVT-NEXT: ret 363; 364; CHECK-FP16-LABEL: uitofp_v16i8: 365; CHECK-FP16: // %bb.0: 366; CHECK-FP16-NEXT: ushll2 v1.8h, v0.16b, #0 367; CHECK-FP16-NEXT: ushll v0.8h, v0.8b, #0 368; CHECK-FP16-NEXT: ucvtf v1.8h, v1.8h 369; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h 370; CHECK-FP16-NEXT: ret 371 %1 = uitofp <16 x i8> %a to <16 x half> 372 ret <16 x half> %1 373} 374 375 376define <8 x half> @uitofp_i16(<8 x i16> %a) #0 { 377; CHECK-CVT-LABEL: uitofp_i16: 378; CHECK-CVT: // %bb.0: 379; CHECK-CVT-NEXT: ushll v1.4s, v0.4h, #0 380; CHECK-CVT-NEXT: ushll2 v2.4s, v0.8h, #0 381; CHECK-CVT-NEXT: ucvtf v1.4s, v1.4s 382; CHECK-CVT-NEXT: fcvtn v0.4h, v1.4s 383; CHECK-CVT-NEXT: ucvtf v1.4s, v2.4s 384; CHECK-CVT-NEXT: fcvtn2 v0.8h, v1.4s 385; CHECK-CVT-NEXT: ret 386; 387; CHECK-FP16-LABEL: uitofp_i16: 388; CHECK-FP16: // %bb.0: 389; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h 390; CHECK-FP16-NEXT: ret 391 %1 = uitofp <8 x i16> %a to <8 x half> 392 ret <8 x half> %1 393} 394 395 396define <8 x half> @uitofp_i32(<8 x i32> %a) #0 { 397; CHECK-LABEL: uitofp_i32: 398; CHECK: // %bb.0: 399; CHECK-NEXT: ucvtf v0.4s, v0.4s 400; CHECK-NEXT: ucvtf v1.4s, v1.4s 401; CHECK-NEXT: fcvtn v0.4h, v0.4s 402; CHECK-NEXT: fcvtn2 v0.8h, v1.4s 403; CHECK-NEXT: ret 404 %1 = uitofp <8 x i32> %a to <8 x half> 405 ret <8 x half> %1 406} 407 408 409define <8 x half> @uitofp_i64(<8 x i64> %a) #0 { 410; CHECK-LABEL: uitofp_i64: 411; CHECK: // %bb.0: 412; CHECK-NEXT: ucvtf v0.2d, v0.2d 413; CHECK-NEXT: ucvtf v2.2d, v2.2d 414; CHECK-NEXT: ucvtf v1.2d, v1.2d 415; CHECK-NEXT: ucvtf v3.2d, v3.2d 416; CHECK-NEXT: fcvtn v0.2s, v0.2d 417; CHECK-NEXT: fcvtn v2.2s, v2.2d 418; CHECK-NEXT: fcvtn2 v0.4s, v1.2d 419; CHECK-NEXT: fcvtn2 v2.4s, v3.2d 420; CHECK-NEXT: fcvtn v0.4h, v0.4s 421; CHECK-NEXT: fcvtn2 v0.8h, v2.4s 422; CHECK-NEXT: ret 423 %1 = uitofp <8 x i64> %a to <8 x half> 424 ret <8 x half> %1 425} 426 427define void @test_insert_at_zero(half %a, ptr %b) #0 { 428; CHECK-LABEL: test_insert_at_zero: 429; CHECK: // %bb.0: 430; CHECK-NEXT: // kill: def $h0 killed $h0 def $q0 431; CHECK-NEXT: str q0, [x0] 432; CHECK-NEXT: ret 433 %1 = insertelement <8 x half> undef, half %a, i64 0 434 store <8 x half> %1, ptr %b, align 4 435 ret void 436} 437 438define <8 x i8> @fptosi_i8(<8 x half> %a) #0 { 439; CHECK-CVT-LABEL: fptosi_i8: 440; CHECK-CVT: // %bb.0: 441; CHECK-CVT-NEXT: fcvtl2 v1.4s, v0.8h 442; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h 443; CHECK-CVT-NEXT: fcvtzs v1.4s, v1.4s 444; CHECK-CVT-NEXT: fcvtzs v0.4s, v0.4s 445; CHECK-CVT-NEXT: uzp1 v0.8h, v0.8h, v1.8h 446; CHECK-CVT-NEXT: xtn v0.8b, v0.8h 447; CHECK-CVT-NEXT: ret 448; 449; CHECK-FP16-LABEL: fptosi_i8: 450; CHECK-FP16: // %bb.0: 451; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h 452; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 453; CHECK-FP16-NEXT: ret 454 %1 = fptosi<8 x half> %a to <8 x i8> 455 ret <8 x i8> %1 456} 457 458define <8 x i16> @fptosi_i16(<8 x half> %a) #0 { 459; CHECK-CVT-LABEL: fptosi_i16: 460; CHECK-CVT: // %bb.0: 461; CHECK-CVT-NEXT: fcvtl2 v1.4s, v0.8h 462; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h 463; CHECK-CVT-NEXT: fcvtzs v1.4s, v1.4s 464; CHECK-CVT-NEXT: fcvtzs v0.4s, v0.4s 465; CHECK-CVT-NEXT: uzp1 v0.8h, v0.8h, v1.8h 466; CHECK-CVT-NEXT: ret 467; 468; CHECK-FP16-LABEL: fptosi_i16: 469; CHECK-FP16: // %bb.0: 470; CHECK-FP16-NEXT: fcvtzs v0.8h, v0.8h 471; CHECK-FP16-NEXT: ret 472 %1 = fptosi<8 x half> %a to <8 x i16> 473 ret <8 x i16> %1 474} 475 476define <8 x i8> @fptoui_i8(<8 x half> %a) #0 { 477; CHECK-CVT-LABEL: fptoui_i8: 478; CHECK-CVT: // %bb.0: 479; CHECK-CVT-NEXT: fcvtl2 v1.4s, v0.8h 480; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h 481; CHECK-CVT-NEXT: fcvtzu v1.4s, v1.4s 482; CHECK-CVT-NEXT: fcvtzu v0.4s, v0.4s 483; CHECK-CVT-NEXT: uzp1 v0.8h, v0.8h, v1.8h 484; CHECK-CVT-NEXT: xtn v0.8b, v0.8h 485; CHECK-CVT-NEXT: ret 486; 487; CHECK-FP16-LABEL: fptoui_i8: 488; CHECK-FP16: // %bb.0: 489; CHECK-FP16-NEXT: fcvtzu v0.8h, v0.8h 490; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 491; CHECK-FP16-NEXT: ret 492 %1 = fptoui<8 x half> %a to <8 x i8> 493 ret <8 x i8> %1 494} 495 496define <8 x i16> @fptoui_i16(<8 x half> %a) #0 { 497; CHECK-CVT-LABEL: fptoui_i16: 498; CHECK-CVT: // %bb.0: 499; CHECK-CVT-NEXT: fcvtl2 v1.4s, v0.8h 500; CHECK-CVT-NEXT: fcvtl v0.4s, v0.4h 501; CHECK-CVT-NEXT: fcvtzu v1.4s, v1.4s 502; CHECK-CVT-NEXT: fcvtzu v0.4s, v0.4s 503; CHECK-CVT-NEXT: uzp1 v0.8h, v0.8h, v1.8h 504; CHECK-CVT-NEXT: ret 505; 506; CHECK-FP16-LABEL: fptoui_i16: 507; CHECK-FP16: // %bb.0: 508; CHECK-FP16-NEXT: fcvtzu v0.8h, v0.8h 509; CHECK-FP16-NEXT: ret 510 %1 = fptoui<8 x half> %a to <8 x i16> 511 ret <8 x i16> %1 512} 513 514define <8 x i1> @test_fcmp_une(<8 x half> %a, <8 x half> %b) #0 { 515; CHECK-CVT-LABEL: test_fcmp_une: 516; CHECK-CVT: // %bb.0: 517; CHECK-CVT-NEXT: mov h2, v1.h[1] 518; CHECK-CVT-NEXT: mov h3, v0.h[1] 519; CHECK-CVT-NEXT: fcvt s4, h1 520; CHECK-CVT-NEXT: fcvt s5, h0 521; CHECK-CVT-NEXT: mov h6, v1.h[2] 522; CHECK-CVT-NEXT: fcvt s2, h2 523; CHECK-CVT-NEXT: fcvt s3, h3 524; CHECK-CVT-NEXT: fcmp s3, s2 525; CHECK-CVT-NEXT: mov h2, v0.h[2] 526; CHECK-CVT-NEXT: mov h3, v1.h[3] 527; CHECK-CVT-NEXT: csetm w8, ne 528; CHECK-CVT-NEXT: fcmp s5, s4 529; CHECK-CVT-NEXT: fcvt s5, h6 530; CHECK-CVT-NEXT: fcvt s2, h2 531; CHECK-CVT-NEXT: mov h4, v0.h[3] 532; CHECK-CVT-NEXT: fcvt s3, h3 533; CHECK-CVT-NEXT: mov h6, v0.h[4] 534; CHECK-CVT-NEXT: csetm w9, ne 535; CHECK-CVT-NEXT: fcmp s2, s5 536; CHECK-CVT-NEXT: fmov s2, w9 537; CHECK-CVT-NEXT: fcvt s4, h4 538; CHECK-CVT-NEXT: mov h5, v1.h[4] 539; CHECK-CVT-NEXT: fcvt s6, h6 540; CHECK-CVT-NEXT: mov v2.h[1], w8 541; CHECK-CVT-NEXT: csetm w8, ne 542; CHECK-CVT-NEXT: fcmp s4, s3 543; CHECK-CVT-NEXT: mov h3, v1.h[5] 544; CHECK-CVT-NEXT: mov h4, v0.h[5] 545; CHECK-CVT-NEXT: fcvt s5, h5 546; CHECK-CVT-NEXT: mov v2.h[2], w8 547; CHECK-CVT-NEXT: csetm w8, ne 548; CHECK-CVT-NEXT: fcvt s3, h3 549; CHECK-CVT-NEXT: fcvt s4, h4 550; CHECK-CVT-NEXT: fcmp s6, s5 551; CHECK-CVT-NEXT: mov h5, v1.h[6] 552; CHECK-CVT-NEXT: mov h6, v0.h[6] 553; CHECK-CVT-NEXT: mov h1, v1.h[7] 554; CHECK-CVT-NEXT: mov h0, v0.h[7] 555; CHECK-CVT-NEXT: mov v2.h[3], w8 556; CHECK-CVT-NEXT: csetm w8, ne 557; CHECK-CVT-NEXT: fcmp s4, s3 558; CHECK-CVT-NEXT: fcvt s3, h5 559; CHECK-CVT-NEXT: fcvt s4, h6 560; CHECK-CVT-NEXT: fcvt s1, h1 561; CHECK-CVT-NEXT: fcvt s0, h0 562; CHECK-CVT-NEXT: mov v2.h[4], w8 563; CHECK-CVT-NEXT: csetm w8, ne 564; CHECK-CVT-NEXT: fcmp s4, s3 565; CHECK-CVT-NEXT: mov v2.h[5], w8 566; CHECK-CVT-NEXT: csetm w8, ne 567; CHECK-CVT-NEXT: fcmp s0, s1 568; CHECK-CVT-NEXT: mov v2.h[6], w8 569; CHECK-CVT-NEXT: csetm w8, ne 570; CHECK-CVT-NEXT: mov v2.h[7], w8 571; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 572; CHECK-CVT-NEXT: ret 573; 574; CHECK-FP16-LABEL: test_fcmp_une: 575; CHECK-FP16: // %bb.0: 576; CHECK-FP16-NEXT: fcmeq v0.8h, v0.8h, v1.8h 577; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 578; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 579; CHECK-FP16-NEXT: ret 580 %1 = fcmp une <8 x half> %a, %b 581 ret <8 x i1> %1 582} 583 584define <8 x i1> @test_fcmp_ueq(<8 x half> %a, <8 x half> %b) #0 { 585; CHECK-CVT-LABEL: test_fcmp_ueq: 586; CHECK-CVT: // %bb.0: 587; CHECK-CVT-NEXT: mov h2, v1.h[1] 588; CHECK-CVT-NEXT: mov h3, v0.h[1] 589; CHECK-CVT-NEXT: fcvt s4, h1 590; CHECK-CVT-NEXT: fcvt s6, h0 591; CHECK-CVT-NEXT: mov h5, v1.h[2] 592; CHECK-CVT-NEXT: fcvt s2, h2 593; CHECK-CVT-NEXT: fcvt s3, h3 594; CHECK-CVT-NEXT: fcmp s3, s2 595; CHECK-CVT-NEXT: mov h2, v0.h[2] 596; CHECK-CVT-NEXT: fcvt s3, h5 597; CHECK-CVT-NEXT: mov h5, v0.h[3] 598; CHECK-CVT-NEXT: csetm w8, eq 599; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 600; CHECK-CVT-NEXT: fcmp s6, s4 601; CHECK-CVT-NEXT: fcvt s2, h2 602; CHECK-CVT-NEXT: mov h4, v1.h[3] 603; CHECK-CVT-NEXT: mov h6, v1.h[4] 604; CHECK-CVT-NEXT: csetm w9, eq 605; CHECK-CVT-NEXT: csinv w9, w9, wzr, vc 606; CHECK-CVT-NEXT: fcmp s2, s3 607; CHECK-CVT-NEXT: mov h2, v0.h[4] 608; CHECK-CVT-NEXT: fcvt s3, h4 609; CHECK-CVT-NEXT: fcvt s4, h5 610; CHECK-CVT-NEXT: fmov s5, w9 611; CHECK-CVT-NEXT: fcvt s6, h6 612; CHECK-CVT-NEXT: mov v5.h[1], w8 613; CHECK-CVT-NEXT: csetm w8, eq 614; CHECK-CVT-NEXT: fcvt s2, h2 615; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 616; CHECK-CVT-NEXT: fcmp s4, s3 617; CHECK-CVT-NEXT: mov h3, v1.h[5] 618; CHECK-CVT-NEXT: mov h4, v0.h[5] 619; CHECK-CVT-NEXT: mov v5.h[2], w8 620; CHECK-CVT-NEXT: csetm w8, eq 621; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 622; CHECK-CVT-NEXT: fcmp s2, s6 623; CHECK-CVT-NEXT: fcvt s2, h3 624; CHECK-CVT-NEXT: fcvt s3, h4 625; CHECK-CVT-NEXT: mov h4, v1.h[6] 626; CHECK-CVT-NEXT: mov h6, v0.h[6] 627; CHECK-CVT-NEXT: mov h1, v1.h[7] 628; CHECK-CVT-NEXT: mov h0, v0.h[7] 629; CHECK-CVT-NEXT: mov v5.h[3], w8 630; CHECK-CVT-NEXT: csetm w8, eq 631; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 632; CHECK-CVT-NEXT: fcmp s3, s2 633; CHECK-CVT-NEXT: fcvt s2, h4 634; CHECK-CVT-NEXT: fcvt s3, h6 635; CHECK-CVT-NEXT: fcvt s1, h1 636; CHECK-CVT-NEXT: fcvt s0, h0 637; CHECK-CVT-NEXT: mov v5.h[4], w8 638; CHECK-CVT-NEXT: csetm w8, eq 639; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 640; CHECK-CVT-NEXT: fcmp s3, s2 641; CHECK-CVT-NEXT: mov v5.h[5], w8 642; CHECK-CVT-NEXT: csetm w8, eq 643; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 644; CHECK-CVT-NEXT: fcmp s0, s1 645; CHECK-CVT-NEXT: mov v5.h[6], w8 646; CHECK-CVT-NEXT: csetm w8, eq 647; CHECK-CVT-NEXT: csinv w8, w8, wzr, vc 648; CHECK-CVT-NEXT: mov v5.h[7], w8 649; CHECK-CVT-NEXT: xtn v0.8b, v5.8h 650; CHECK-CVT-NEXT: ret 651; 652; CHECK-FP16-LABEL: test_fcmp_ueq: 653; CHECK-FP16: // %bb.0: 654; CHECK-FP16-NEXT: fcmgt v2.8h, v0.8h, v1.8h 655; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 656; CHECK-FP16-NEXT: orr v0.16b, v0.16b, v2.16b 657; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 658; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 659; CHECK-FP16-NEXT: ret 660 %1 = fcmp ueq <8 x half> %a, %b 661 ret <8 x i1> %1 662} 663 664define <8 x i1> @test_fcmp_ugt(<8 x half> %a, <8 x half> %b) #0 { 665; CHECK-CVT-LABEL: test_fcmp_ugt: 666; CHECK-CVT: // %bb.0: 667; CHECK-CVT-NEXT: mov h2, v1.h[1] 668; CHECK-CVT-NEXT: mov h3, v0.h[1] 669; CHECK-CVT-NEXT: fcvt s4, h1 670; CHECK-CVT-NEXT: fcvt s5, h0 671; CHECK-CVT-NEXT: mov h6, v1.h[2] 672; CHECK-CVT-NEXT: fcvt s2, h2 673; CHECK-CVT-NEXT: fcvt s3, h3 674; CHECK-CVT-NEXT: fcmp s3, s2 675; CHECK-CVT-NEXT: mov h2, v0.h[2] 676; CHECK-CVT-NEXT: mov h3, v1.h[3] 677; CHECK-CVT-NEXT: csetm w8, hi 678; CHECK-CVT-NEXT: fcmp s5, s4 679; CHECK-CVT-NEXT: fcvt s5, h6 680; CHECK-CVT-NEXT: fcvt s2, h2 681; CHECK-CVT-NEXT: mov h4, v0.h[3] 682; CHECK-CVT-NEXT: fcvt s3, h3 683; CHECK-CVT-NEXT: mov h6, v0.h[4] 684; CHECK-CVT-NEXT: csetm w9, hi 685; CHECK-CVT-NEXT: fcmp s2, s5 686; CHECK-CVT-NEXT: fmov s2, w9 687; CHECK-CVT-NEXT: fcvt s4, h4 688; CHECK-CVT-NEXT: mov h5, v1.h[4] 689; CHECK-CVT-NEXT: fcvt s6, h6 690; CHECK-CVT-NEXT: mov v2.h[1], w8 691; CHECK-CVT-NEXT: csetm w8, hi 692; CHECK-CVT-NEXT: fcmp s4, s3 693; CHECK-CVT-NEXT: mov h3, v1.h[5] 694; CHECK-CVT-NEXT: mov h4, v0.h[5] 695; CHECK-CVT-NEXT: fcvt s5, h5 696; CHECK-CVT-NEXT: mov v2.h[2], w8 697; CHECK-CVT-NEXT: csetm w8, hi 698; CHECK-CVT-NEXT: fcvt s3, h3 699; CHECK-CVT-NEXT: fcvt s4, h4 700; CHECK-CVT-NEXT: fcmp s6, s5 701; CHECK-CVT-NEXT: mov h5, v1.h[6] 702; CHECK-CVT-NEXT: mov h6, v0.h[6] 703; CHECK-CVT-NEXT: mov h1, v1.h[7] 704; CHECK-CVT-NEXT: mov h0, v0.h[7] 705; CHECK-CVT-NEXT: mov v2.h[3], w8 706; CHECK-CVT-NEXT: csetm w8, hi 707; CHECK-CVT-NEXT: fcmp s4, s3 708; CHECK-CVT-NEXT: fcvt s3, h5 709; CHECK-CVT-NEXT: fcvt s4, h6 710; CHECK-CVT-NEXT: fcvt s1, h1 711; CHECK-CVT-NEXT: fcvt s0, h0 712; CHECK-CVT-NEXT: mov v2.h[4], w8 713; CHECK-CVT-NEXT: csetm w8, hi 714; CHECK-CVT-NEXT: fcmp s4, s3 715; CHECK-CVT-NEXT: mov v2.h[5], w8 716; CHECK-CVT-NEXT: csetm w8, hi 717; CHECK-CVT-NEXT: fcmp s0, s1 718; CHECK-CVT-NEXT: mov v2.h[6], w8 719; CHECK-CVT-NEXT: csetm w8, hi 720; CHECK-CVT-NEXT: mov v2.h[7], w8 721; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 722; CHECK-CVT-NEXT: ret 723; 724; CHECK-FP16-LABEL: test_fcmp_ugt: 725; CHECK-FP16: // %bb.0: 726; CHECK-FP16-NEXT: fcmge v0.8h, v1.8h, v0.8h 727; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 728; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 729; CHECK-FP16-NEXT: ret 730 %1 = fcmp ugt <8 x half> %a, %b 731 ret <8 x i1> %1 732} 733 734define <8 x i1> @test_fcmp_uge(<8 x half> %a, <8 x half> %b) #0 { 735; CHECK-CVT-LABEL: test_fcmp_uge: 736; CHECK-CVT: // %bb.0: 737; CHECK-CVT-NEXT: mov h2, v1.h[1] 738; CHECK-CVT-NEXT: mov h3, v0.h[1] 739; CHECK-CVT-NEXT: fcvt s4, h1 740; CHECK-CVT-NEXT: fcvt s5, h0 741; CHECK-CVT-NEXT: mov h6, v1.h[2] 742; CHECK-CVT-NEXT: fcvt s2, h2 743; CHECK-CVT-NEXT: fcvt s3, h3 744; CHECK-CVT-NEXT: fcmp s3, s2 745; CHECK-CVT-NEXT: mov h2, v0.h[2] 746; CHECK-CVT-NEXT: mov h3, v1.h[3] 747; CHECK-CVT-NEXT: csetm w8, pl 748; CHECK-CVT-NEXT: fcmp s5, s4 749; CHECK-CVT-NEXT: fcvt s5, h6 750; CHECK-CVT-NEXT: fcvt s2, h2 751; CHECK-CVT-NEXT: mov h4, v0.h[3] 752; CHECK-CVT-NEXT: fcvt s3, h3 753; CHECK-CVT-NEXT: mov h6, v0.h[4] 754; CHECK-CVT-NEXT: csetm w9, pl 755; CHECK-CVT-NEXT: fcmp s2, s5 756; CHECK-CVT-NEXT: fmov s2, w9 757; CHECK-CVT-NEXT: fcvt s4, h4 758; CHECK-CVT-NEXT: mov h5, v1.h[4] 759; CHECK-CVT-NEXT: fcvt s6, h6 760; CHECK-CVT-NEXT: mov v2.h[1], w8 761; CHECK-CVT-NEXT: csetm w8, pl 762; CHECK-CVT-NEXT: fcmp s4, s3 763; CHECK-CVT-NEXT: mov h3, v1.h[5] 764; CHECK-CVT-NEXT: mov h4, v0.h[5] 765; CHECK-CVT-NEXT: fcvt s5, h5 766; CHECK-CVT-NEXT: mov v2.h[2], w8 767; CHECK-CVT-NEXT: csetm w8, pl 768; CHECK-CVT-NEXT: fcvt s3, h3 769; CHECK-CVT-NEXT: fcvt s4, h4 770; CHECK-CVT-NEXT: fcmp s6, s5 771; CHECK-CVT-NEXT: mov h5, v1.h[6] 772; CHECK-CVT-NEXT: mov h6, v0.h[6] 773; CHECK-CVT-NEXT: mov h1, v1.h[7] 774; CHECK-CVT-NEXT: mov h0, v0.h[7] 775; CHECK-CVT-NEXT: mov v2.h[3], w8 776; CHECK-CVT-NEXT: csetm w8, pl 777; CHECK-CVT-NEXT: fcmp s4, s3 778; CHECK-CVT-NEXT: fcvt s3, h5 779; CHECK-CVT-NEXT: fcvt s4, h6 780; CHECK-CVT-NEXT: fcvt s1, h1 781; CHECK-CVT-NEXT: fcvt s0, h0 782; CHECK-CVT-NEXT: mov v2.h[4], w8 783; CHECK-CVT-NEXT: csetm w8, pl 784; CHECK-CVT-NEXT: fcmp s4, s3 785; CHECK-CVT-NEXT: mov v2.h[5], w8 786; CHECK-CVT-NEXT: csetm w8, pl 787; CHECK-CVT-NEXT: fcmp s0, s1 788; CHECK-CVT-NEXT: mov v2.h[6], w8 789; CHECK-CVT-NEXT: csetm w8, pl 790; CHECK-CVT-NEXT: mov v2.h[7], w8 791; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 792; CHECK-CVT-NEXT: ret 793; 794; CHECK-FP16-LABEL: test_fcmp_uge: 795; CHECK-FP16: // %bb.0: 796; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 797; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 798; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 799; CHECK-FP16-NEXT: ret 800 %1 = fcmp uge <8 x half> %a, %b 801 ret <8 x i1> %1 802} 803 804define <8 x i1> @test_fcmp_ult(<8 x half> %a, <8 x half> %b) #0 { 805; CHECK-CVT-LABEL: test_fcmp_ult: 806; CHECK-CVT: // %bb.0: 807; CHECK-CVT-NEXT: mov h2, v1.h[1] 808; CHECK-CVT-NEXT: mov h3, v0.h[1] 809; CHECK-CVT-NEXT: fcvt s4, h1 810; CHECK-CVT-NEXT: fcvt s5, h0 811; CHECK-CVT-NEXT: mov h6, v1.h[2] 812; CHECK-CVT-NEXT: fcvt s2, h2 813; CHECK-CVT-NEXT: fcvt s3, h3 814; CHECK-CVT-NEXT: fcmp s3, s2 815; CHECK-CVT-NEXT: mov h2, v0.h[2] 816; CHECK-CVT-NEXT: mov h3, v1.h[3] 817; CHECK-CVT-NEXT: csetm w8, lt 818; CHECK-CVT-NEXT: fcmp s5, s4 819; CHECK-CVT-NEXT: fcvt s5, h6 820; CHECK-CVT-NEXT: fcvt s2, h2 821; CHECK-CVT-NEXT: mov h4, v0.h[3] 822; CHECK-CVT-NEXT: fcvt s3, h3 823; CHECK-CVT-NEXT: mov h6, v0.h[4] 824; CHECK-CVT-NEXT: csetm w9, lt 825; CHECK-CVT-NEXT: fcmp s2, s5 826; CHECK-CVT-NEXT: fmov s2, w9 827; CHECK-CVT-NEXT: fcvt s4, h4 828; CHECK-CVT-NEXT: mov h5, v1.h[4] 829; CHECK-CVT-NEXT: fcvt s6, h6 830; CHECK-CVT-NEXT: mov v2.h[1], w8 831; CHECK-CVT-NEXT: csetm w8, lt 832; CHECK-CVT-NEXT: fcmp s4, s3 833; CHECK-CVT-NEXT: mov h3, v1.h[5] 834; CHECK-CVT-NEXT: mov h4, v0.h[5] 835; CHECK-CVT-NEXT: fcvt s5, h5 836; CHECK-CVT-NEXT: mov v2.h[2], w8 837; CHECK-CVT-NEXT: csetm w8, lt 838; CHECK-CVT-NEXT: fcvt s3, h3 839; CHECK-CVT-NEXT: fcvt s4, h4 840; CHECK-CVT-NEXT: fcmp s6, s5 841; CHECK-CVT-NEXT: mov h5, v1.h[6] 842; CHECK-CVT-NEXT: mov h6, v0.h[6] 843; CHECK-CVT-NEXT: mov h1, v1.h[7] 844; CHECK-CVT-NEXT: mov h0, v0.h[7] 845; CHECK-CVT-NEXT: mov v2.h[3], w8 846; CHECK-CVT-NEXT: csetm w8, lt 847; CHECK-CVT-NEXT: fcmp s4, s3 848; CHECK-CVT-NEXT: fcvt s3, h5 849; CHECK-CVT-NEXT: fcvt s4, h6 850; CHECK-CVT-NEXT: fcvt s1, h1 851; CHECK-CVT-NEXT: fcvt s0, h0 852; CHECK-CVT-NEXT: mov v2.h[4], w8 853; CHECK-CVT-NEXT: csetm w8, lt 854; CHECK-CVT-NEXT: fcmp s4, s3 855; CHECK-CVT-NEXT: mov v2.h[5], w8 856; CHECK-CVT-NEXT: csetm w8, lt 857; CHECK-CVT-NEXT: fcmp s0, s1 858; CHECK-CVT-NEXT: mov v2.h[6], w8 859; CHECK-CVT-NEXT: csetm w8, lt 860; CHECK-CVT-NEXT: mov v2.h[7], w8 861; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 862; CHECK-CVT-NEXT: ret 863; 864; CHECK-FP16-LABEL: test_fcmp_ult: 865; CHECK-FP16: // %bb.0: 866; CHECK-FP16-NEXT: fcmge v0.8h, v0.8h, v1.8h 867; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 868; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 869; CHECK-FP16-NEXT: ret 870 %1 = fcmp ult <8 x half> %a, %b 871 ret <8 x i1> %1 872} 873 874define <8 x i1> @test_fcmp_ule(<8 x half> %a, <8 x half> %b) #0 { 875; CHECK-CVT-LABEL: test_fcmp_ule: 876; CHECK-CVT: // %bb.0: 877; CHECK-CVT-NEXT: mov h2, v1.h[1] 878; CHECK-CVT-NEXT: mov h3, v0.h[1] 879; CHECK-CVT-NEXT: fcvt s4, h1 880; CHECK-CVT-NEXT: fcvt s5, h0 881; CHECK-CVT-NEXT: mov h6, v1.h[2] 882; CHECK-CVT-NEXT: fcvt s2, h2 883; CHECK-CVT-NEXT: fcvt s3, h3 884; CHECK-CVT-NEXT: fcmp s3, s2 885; CHECK-CVT-NEXT: mov h2, v0.h[2] 886; CHECK-CVT-NEXT: mov h3, v1.h[3] 887; CHECK-CVT-NEXT: csetm w8, le 888; CHECK-CVT-NEXT: fcmp s5, s4 889; CHECK-CVT-NEXT: fcvt s5, h6 890; CHECK-CVT-NEXT: fcvt s2, h2 891; CHECK-CVT-NEXT: mov h4, v0.h[3] 892; CHECK-CVT-NEXT: fcvt s3, h3 893; CHECK-CVT-NEXT: mov h6, v0.h[4] 894; CHECK-CVT-NEXT: csetm w9, le 895; CHECK-CVT-NEXT: fcmp s2, s5 896; CHECK-CVT-NEXT: fmov s2, w9 897; CHECK-CVT-NEXT: fcvt s4, h4 898; CHECK-CVT-NEXT: mov h5, v1.h[4] 899; CHECK-CVT-NEXT: fcvt s6, h6 900; CHECK-CVT-NEXT: mov v2.h[1], w8 901; CHECK-CVT-NEXT: csetm w8, le 902; CHECK-CVT-NEXT: fcmp s4, s3 903; CHECK-CVT-NEXT: mov h3, v1.h[5] 904; CHECK-CVT-NEXT: mov h4, v0.h[5] 905; CHECK-CVT-NEXT: fcvt s5, h5 906; CHECK-CVT-NEXT: mov v2.h[2], w8 907; CHECK-CVT-NEXT: csetm w8, le 908; CHECK-CVT-NEXT: fcvt s3, h3 909; CHECK-CVT-NEXT: fcvt s4, h4 910; CHECK-CVT-NEXT: fcmp s6, s5 911; CHECK-CVT-NEXT: mov h5, v1.h[6] 912; CHECK-CVT-NEXT: mov h6, v0.h[6] 913; CHECK-CVT-NEXT: mov h1, v1.h[7] 914; CHECK-CVT-NEXT: mov h0, v0.h[7] 915; CHECK-CVT-NEXT: mov v2.h[3], w8 916; CHECK-CVT-NEXT: csetm w8, le 917; CHECK-CVT-NEXT: fcmp s4, s3 918; CHECK-CVT-NEXT: fcvt s3, h5 919; CHECK-CVT-NEXT: fcvt s4, h6 920; CHECK-CVT-NEXT: fcvt s1, h1 921; CHECK-CVT-NEXT: fcvt s0, h0 922; CHECK-CVT-NEXT: mov v2.h[4], w8 923; CHECK-CVT-NEXT: csetm w8, le 924; CHECK-CVT-NEXT: fcmp s4, s3 925; CHECK-CVT-NEXT: mov v2.h[5], w8 926; CHECK-CVT-NEXT: csetm w8, le 927; CHECK-CVT-NEXT: fcmp s0, s1 928; CHECK-CVT-NEXT: mov v2.h[6], w8 929; CHECK-CVT-NEXT: csetm w8, le 930; CHECK-CVT-NEXT: mov v2.h[7], w8 931; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 932; CHECK-CVT-NEXT: ret 933; 934; CHECK-FP16-LABEL: test_fcmp_ule: 935; CHECK-FP16: // %bb.0: 936; CHECK-FP16-NEXT: fcmgt v0.8h, v0.8h, v1.8h 937; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 938; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 939; CHECK-FP16-NEXT: ret 940 %1 = fcmp ule <8 x half> %a, %b 941 ret <8 x i1> %1 942} 943 944define <8 x i1> @test_fcmp_uno(<8 x half> %a, <8 x half> %b) #0 { 945; CHECK-CVT-LABEL: test_fcmp_uno: 946; CHECK-CVT: // %bb.0: 947; CHECK-CVT-NEXT: mov h2, v1.h[1] 948; CHECK-CVT-NEXT: mov h3, v0.h[1] 949; CHECK-CVT-NEXT: fcvt s4, h1 950; CHECK-CVT-NEXT: fcvt s5, h0 951; CHECK-CVT-NEXT: mov h6, v1.h[2] 952; CHECK-CVT-NEXT: fcvt s2, h2 953; CHECK-CVT-NEXT: fcvt s3, h3 954; CHECK-CVT-NEXT: fcmp s3, s2 955; CHECK-CVT-NEXT: mov h2, v0.h[2] 956; CHECK-CVT-NEXT: mov h3, v1.h[3] 957; CHECK-CVT-NEXT: csetm w8, vs 958; CHECK-CVT-NEXT: fcmp s5, s4 959; CHECK-CVT-NEXT: fcvt s5, h6 960; CHECK-CVT-NEXT: fcvt s2, h2 961; CHECK-CVT-NEXT: mov h4, v0.h[3] 962; CHECK-CVT-NEXT: fcvt s3, h3 963; CHECK-CVT-NEXT: mov h6, v0.h[4] 964; CHECK-CVT-NEXT: csetm w9, vs 965; CHECK-CVT-NEXT: fcmp s2, s5 966; CHECK-CVT-NEXT: fmov s2, w9 967; CHECK-CVT-NEXT: fcvt s4, h4 968; CHECK-CVT-NEXT: mov h5, v1.h[4] 969; CHECK-CVT-NEXT: fcvt s6, h6 970; CHECK-CVT-NEXT: mov v2.h[1], w8 971; CHECK-CVT-NEXT: csetm w8, vs 972; CHECK-CVT-NEXT: fcmp s4, s3 973; CHECK-CVT-NEXT: mov h3, v1.h[5] 974; CHECK-CVT-NEXT: mov h4, v0.h[5] 975; CHECK-CVT-NEXT: fcvt s5, h5 976; CHECK-CVT-NEXT: mov v2.h[2], w8 977; CHECK-CVT-NEXT: csetm w8, vs 978; CHECK-CVT-NEXT: fcvt s3, h3 979; CHECK-CVT-NEXT: fcvt s4, h4 980; CHECK-CVT-NEXT: fcmp s6, s5 981; CHECK-CVT-NEXT: mov h5, v1.h[6] 982; CHECK-CVT-NEXT: mov h6, v0.h[6] 983; CHECK-CVT-NEXT: mov h1, v1.h[7] 984; CHECK-CVT-NEXT: mov h0, v0.h[7] 985; CHECK-CVT-NEXT: mov v2.h[3], w8 986; CHECK-CVT-NEXT: csetm w8, vs 987; CHECK-CVT-NEXT: fcmp s4, s3 988; CHECK-CVT-NEXT: fcvt s3, h5 989; CHECK-CVT-NEXT: fcvt s4, h6 990; CHECK-CVT-NEXT: fcvt s1, h1 991; CHECK-CVT-NEXT: fcvt s0, h0 992; CHECK-CVT-NEXT: mov v2.h[4], w8 993; CHECK-CVT-NEXT: csetm w8, vs 994; CHECK-CVT-NEXT: fcmp s4, s3 995; CHECK-CVT-NEXT: mov v2.h[5], w8 996; CHECK-CVT-NEXT: csetm w8, vs 997; CHECK-CVT-NEXT: fcmp s0, s1 998; CHECK-CVT-NEXT: mov v2.h[6], w8 999; CHECK-CVT-NEXT: csetm w8, vs 1000; CHECK-CVT-NEXT: mov v2.h[7], w8 1001; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1002; CHECK-CVT-NEXT: ret 1003; 1004; CHECK-FP16-LABEL: test_fcmp_uno: 1005; CHECK-FP16: // %bb.0: 1006; CHECK-FP16-NEXT: fcmge v2.8h, v0.8h, v1.8h 1007; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 1008; CHECK-FP16-NEXT: orr v0.16b, v0.16b, v2.16b 1009; CHECK-FP16-NEXT: mvn v0.16b, v0.16b 1010; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1011; CHECK-FP16-NEXT: ret 1012 %1 = fcmp uno <8 x half> %a, %b 1013 ret <8 x i1> %1 1014} 1015 1016define <8 x i1> @test_fcmp_one(<8 x half> %a, <8 x half> %b) #0 { 1017; CHECK-CVT-LABEL: test_fcmp_one: 1018; CHECK-CVT: // %bb.0: 1019; CHECK-CVT-NEXT: mov h2, v1.h[1] 1020; CHECK-CVT-NEXT: mov h3, v0.h[1] 1021; CHECK-CVT-NEXT: fcvt s4, h1 1022; CHECK-CVT-NEXT: fcvt s6, h0 1023; CHECK-CVT-NEXT: mov h5, v1.h[2] 1024; CHECK-CVT-NEXT: fcvt s2, h2 1025; CHECK-CVT-NEXT: fcvt s3, h3 1026; CHECK-CVT-NEXT: fcmp s3, s2 1027; CHECK-CVT-NEXT: mov h2, v0.h[2] 1028; CHECK-CVT-NEXT: fcvt s3, h5 1029; CHECK-CVT-NEXT: mov h5, v0.h[3] 1030; CHECK-CVT-NEXT: csetm w8, mi 1031; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1032; CHECK-CVT-NEXT: fcmp s6, s4 1033; CHECK-CVT-NEXT: fcvt s2, h2 1034; CHECK-CVT-NEXT: mov h4, v1.h[3] 1035; CHECK-CVT-NEXT: mov h6, v1.h[4] 1036; CHECK-CVT-NEXT: csetm w9, mi 1037; CHECK-CVT-NEXT: csinv w9, w9, wzr, le 1038; CHECK-CVT-NEXT: fcmp s2, s3 1039; CHECK-CVT-NEXT: mov h2, v0.h[4] 1040; CHECK-CVT-NEXT: fcvt s3, h4 1041; CHECK-CVT-NEXT: fcvt s4, h5 1042; CHECK-CVT-NEXT: fmov s5, w9 1043; CHECK-CVT-NEXT: fcvt s6, h6 1044; CHECK-CVT-NEXT: mov v5.h[1], w8 1045; CHECK-CVT-NEXT: csetm w8, mi 1046; CHECK-CVT-NEXT: fcvt s2, h2 1047; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1048; CHECK-CVT-NEXT: fcmp s4, s3 1049; CHECK-CVT-NEXT: mov h3, v1.h[5] 1050; CHECK-CVT-NEXT: mov h4, v0.h[5] 1051; CHECK-CVT-NEXT: mov v5.h[2], w8 1052; CHECK-CVT-NEXT: csetm w8, mi 1053; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1054; CHECK-CVT-NEXT: fcmp s2, s6 1055; CHECK-CVT-NEXT: fcvt s2, h3 1056; CHECK-CVT-NEXT: fcvt s3, h4 1057; CHECK-CVT-NEXT: mov h4, v1.h[6] 1058; CHECK-CVT-NEXT: mov h6, v0.h[6] 1059; CHECK-CVT-NEXT: mov h1, v1.h[7] 1060; CHECK-CVT-NEXT: mov h0, v0.h[7] 1061; CHECK-CVT-NEXT: mov v5.h[3], w8 1062; CHECK-CVT-NEXT: csetm w8, mi 1063; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1064; CHECK-CVT-NEXT: fcmp s3, s2 1065; CHECK-CVT-NEXT: fcvt s2, h4 1066; CHECK-CVT-NEXT: fcvt s3, h6 1067; CHECK-CVT-NEXT: fcvt s1, h1 1068; CHECK-CVT-NEXT: fcvt s0, h0 1069; CHECK-CVT-NEXT: mov v5.h[4], w8 1070; CHECK-CVT-NEXT: csetm w8, mi 1071; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1072; CHECK-CVT-NEXT: fcmp s3, s2 1073; CHECK-CVT-NEXT: mov v5.h[5], w8 1074; CHECK-CVT-NEXT: csetm w8, mi 1075; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1076; CHECK-CVT-NEXT: fcmp s0, s1 1077; CHECK-CVT-NEXT: mov v5.h[6], w8 1078; CHECK-CVT-NEXT: csetm w8, mi 1079; CHECK-CVT-NEXT: csinv w8, w8, wzr, le 1080; CHECK-CVT-NEXT: mov v5.h[7], w8 1081; CHECK-CVT-NEXT: xtn v0.8b, v5.8h 1082; CHECK-CVT-NEXT: ret 1083; 1084; CHECK-FP16-LABEL: test_fcmp_one: 1085; CHECK-FP16: // %bb.0: 1086; CHECK-FP16-NEXT: fcmgt v2.8h, v0.8h, v1.8h 1087; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 1088; CHECK-FP16-NEXT: orr v0.16b, v0.16b, v2.16b 1089; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1090; CHECK-FP16-NEXT: ret 1091 %1 = fcmp one <8 x half> %a, %b 1092 ret <8 x i1> %1 1093} 1094 1095define <8 x i1> @test_fcmp_oeq(<8 x half> %a, <8 x half> %b) #0 { 1096; CHECK-CVT-LABEL: test_fcmp_oeq: 1097; CHECK-CVT: // %bb.0: 1098; CHECK-CVT-NEXT: mov h2, v1.h[1] 1099; CHECK-CVT-NEXT: mov h3, v0.h[1] 1100; CHECK-CVT-NEXT: fcvt s4, h1 1101; CHECK-CVT-NEXT: fcvt s5, h0 1102; CHECK-CVT-NEXT: mov h6, v1.h[2] 1103; CHECK-CVT-NEXT: fcvt s2, h2 1104; CHECK-CVT-NEXT: fcvt s3, h3 1105; CHECK-CVT-NEXT: fcmp s3, s2 1106; CHECK-CVT-NEXT: mov h2, v0.h[2] 1107; CHECK-CVT-NEXT: mov h3, v1.h[3] 1108; CHECK-CVT-NEXT: csetm w8, eq 1109; CHECK-CVT-NEXT: fcmp s5, s4 1110; CHECK-CVT-NEXT: fcvt s5, h6 1111; CHECK-CVT-NEXT: fcvt s2, h2 1112; CHECK-CVT-NEXT: mov h4, v0.h[3] 1113; CHECK-CVT-NEXT: fcvt s3, h3 1114; CHECK-CVT-NEXT: mov h6, v0.h[4] 1115; CHECK-CVT-NEXT: csetm w9, eq 1116; CHECK-CVT-NEXT: fcmp s2, s5 1117; CHECK-CVT-NEXT: fmov s2, w9 1118; CHECK-CVT-NEXT: fcvt s4, h4 1119; CHECK-CVT-NEXT: mov h5, v1.h[4] 1120; CHECK-CVT-NEXT: fcvt s6, h6 1121; CHECK-CVT-NEXT: mov v2.h[1], w8 1122; CHECK-CVT-NEXT: csetm w8, eq 1123; CHECK-CVT-NEXT: fcmp s4, s3 1124; CHECK-CVT-NEXT: mov h3, v1.h[5] 1125; CHECK-CVT-NEXT: mov h4, v0.h[5] 1126; CHECK-CVT-NEXT: fcvt s5, h5 1127; CHECK-CVT-NEXT: mov v2.h[2], w8 1128; CHECK-CVT-NEXT: csetm w8, eq 1129; CHECK-CVT-NEXT: fcvt s3, h3 1130; CHECK-CVT-NEXT: fcvt s4, h4 1131; CHECK-CVT-NEXT: fcmp s6, s5 1132; CHECK-CVT-NEXT: mov h5, v1.h[6] 1133; CHECK-CVT-NEXT: mov h6, v0.h[6] 1134; CHECK-CVT-NEXT: mov h1, v1.h[7] 1135; CHECK-CVT-NEXT: mov h0, v0.h[7] 1136; CHECK-CVT-NEXT: mov v2.h[3], w8 1137; CHECK-CVT-NEXT: csetm w8, eq 1138; CHECK-CVT-NEXT: fcmp s4, s3 1139; CHECK-CVT-NEXT: fcvt s3, h5 1140; CHECK-CVT-NEXT: fcvt s4, h6 1141; CHECK-CVT-NEXT: fcvt s1, h1 1142; CHECK-CVT-NEXT: fcvt s0, h0 1143; CHECK-CVT-NEXT: mov v2.h[4], w8 1144; CHECK-CVT-NEXT: csetm w8, eq 1145; CHECK-CVT-NEXT: fcmp s4, s3 1146; CHECK-CVT-NEXT: mov v2.h[5], w8 1147; CHECK-CVT-NEXT: csetm w8, eq 1148; CHECK-CVT-NEXT: fcmp s0, s1 1149; CHECK-CVT-NEXT: mov v2.h[6], w8 1150; CHECK-CVT-NEXT: csetm w8, eq 1151; CHECK-CVT-NEXT: mov v2.h[7], w8 1152; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1153; CHECK-CVT-NEXT: ret 1154; 1155; CHECK-FP16-LABEL: test_fcmp_oeq: 1156; CHECK-FP16: // %bb.0: 1157; CHECK-FP16-NEXT: fcmeq v0.8h, v0.8h, v1.8h 1158; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1159; CHECK-FP16-NEXT: ret 1160 %1 = fcmp oeq <8 x half> %a, %b 1161 ret <8 x i1> %1 1162} 1163 1164define <8 x i1> @test_fcmp_ogt(<8 x half> %a, <8 x half> %b) #0 { 1165; CHECK-CVT-LABEL: test_fcmp_ogt: 1166; CHECK-CVT: // %bb.0: 1167; CHECK-CVT-NEXT: mov h2, v1.h[1] 1168; CHECK-CVT-NEXT: mov h3, v0.h[1] 1169; CHECK-CVT-NEXT: fcvt s4, h1 1170; CHECK-CVT-NEXT: fcvt s5, h0 1171; CHECK-CVT-NEXT: mov h6, v1.h[2] 1172; CHECK-CVT-NEXT: fcvt s2, h2 1173; CHECK-CVT-NEXT: fcvt s3, h3 1174; CHECK-CVT-NEXT: fcmp s3, s2 1175; CHECK-CVT-NEXT: mov h2, v0.h[2] 1176; CHECK-CVT-NEXT: mov h3, v1.h[3] 1177; CHECK-CVT-NEXT: csetm w8, gt 1178; CHECK-CVT-NEXT: fcmp s5, s4 1179; CHECK-CVT-NEXT: fcvt s5, h6 1180; CHECK-CVT-NEXT: fcvt s2, h2 1181; CHECK-CVT-NEXT: mov h4, v0.h[3] 1182; CHECK-CVT-NEXT: fcvt s3, h3 1183; CHECK-CVT-NEXT: mov h6, v0.h[4] 1184; CHECK-CVT-NEXT: csetm w9, gt 1185; CHECK-CVT-NEXT: fcmp s2, s5 1186; CHECK-CVT-NEXT: fmov s2, w9 1187; CHECK-CVT-NEXT: fcvt s4, h4 1188; CHECK-CVT-NEXT: mov h5, v1.h[4] 1189; CHECK-CVT-NEXT: fcvt s6, h6 1190; CHECK-CVT-NEXT: mov v2.h[1], w8 1191; CHECK-CVT-NEXT: csetm w8, gt 1192; CHECK-CVT-NEXT: fcmp s4, s3 1193; CHECK-CVT-NEXT: mov h3, v1.h[5] 1194; CHECK-CVT-NEXT: mov h4, v0.h[5] 1195; CHECK-CVT-NEXT: fcvt s5, h5 1196; CHECK-CVT-NEXT: mov v2.h[2], w8 1197; CHECK-CVT-NEXT: csetm w8, gt 1198; CHECK-CVT-NEXT: fcvt s3, h3 1199; CHECK-CVT-NEXT: fcvt s4, h4 1200; CHECK-CVT-NEXT: fcmp s6, s5 1201; CHECK-CVT-NEXT: mov h5, v1.h[6] 1202; CHECK-CVT-NEXT: mov h6, v0.h[6] 1203; CHECK-CVT-NEXT: mov h1, v1.h[7] 1204; CHECK-CVT-NEXT: mov h0, v0.h[7] 1205; CHECK-CVT-NEXT: mov v2.h[3], w8 1206; CHECK-CVT-NEXT: csetm w8, gt 1207; CHECK-CVT-NEXT: fcmp s4, s3 1208; CHECK-CVT-NEXT: fcvt s3, h5 1209; CHECK-CVT-NEXT: fcvt s4, h6 1210; CHECK-CVT-NEXT: fcvt s1, h1 1211; CHECK-CVT-NEXT: fcvt s0, h0 1212; CHECK-CVT-NEXT: mov v2.h[4], w8 1213; CHECK-CVT-NEXT: csetm w8, gt 1214; CHECK-CVT-NEXT: fcmp s4, s3 1215; CHECK-CVT-NEXT: mov v2.h[5], w8 1216; CHECK-CVT-NEXT: csetm w8, gt 1217; CHECK-CVT-NEXT: fcmp s0, s1 1218; CHECK-CVT-NEXT: mov v2.h[6], w8 1219; CHECK-CVT-NEXT: csetm w8, gt 1220; CHECK-CVT-NEXT: mov v2.h[7], w8 1221; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1222; CHECK-CVT-NEXT: ret 1223; 1224; CHECK-FP16-LABEL: test_fcmp_ogt: 1225; CHECK-FP16: // %bb.0: 1226; CHECK-FP16-NEXT: fcmgt v0.8h, v0.8h, v1.8h 1227; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1228; CHECK-FP16-NEXT: ret 1229 %1 = fcmp ogt <8 x half> %a, %b 1230 ret <8 x i1> %1 1231} 1232 1233define <8 x i1> @test_fcmp_oge(<8 x half> %a, <8 x half> %b) #0 { 1234; CHECK-CVT-LABEL: test_fcmp_oge: 1235; CHECK-CVT: // %bb.0: 1236; CHECK-CVT-NEXT: mov h2, v1.h[1] 1237; CHECK-CVT-NEXT: mov h3, v0.h[1] 1238; CHECK-CVT-NEXT: fcvt s4, h1 1239; CHECK-CVT-NEXT: fcvt s5, h0 1240; CHECK-CVT-NEXT: mov h6, v1.h[2] 1241; CHECK-CVT-NEXT: fcvt s2, h2 1242; CHECK-CVT-NEXT: fcvt s3, h3 1243; CHECK-CVT-NEXT: fcmp s3, s2 1244; CHECK-CVT-NEXT: mov h2, v0.h[2] 1245; CHECK-CVT-NEXT: mov h3, v1.h[3] 1246; CHECK-CVT-NEXT: csetm w8, ge 1247; CHECK-CVT-NEXT: fcmp s5, s4 1248; CHECK-CVT-NEXT: fcvt s5, h6 1249; CHECK-CVT-NEXT: fcvt s2, h2 1250; CHECK-CVT-NEXT: mov h4, v0.h[3] 1251; CHECK-CVT-NEXT: fcvt s3, h3 1252; CHECK-CVT-NEXT: mov h6, v0.h[4] 1253; CHECK-CVT-NEXT: csetm w9, ge 1254; CHECK-CVT-NEXT: fcmp s2, s5 1255; CHECK-CVT-NEXT: fmov s2, w9 1256; CHECK-CVT-NEXT: fcvt s4, h4 1257; CHECK-CVT-NEXT: mov h5, v1.h[4] 1258; CHECK-CVT-NEXT: fcvt s6, h6 1259; CHECK-CVT-NEXT: mov v2.h[1], w8 1260; CHECK-CVT-NEXT: csetm w8, ge 1261; CHECK-CVT-NEXT: fcmp s4, s3 1262; CHECK-CVT-NEXT: mov h3, v1.h[5] 1263; CHECK-CVT-NEXT: mov h4, v0.h[5] 1264; CHECK-CVT-NEXT: fcvt s5, h5 1265; CHECK-CVT-NEXT: mov v2.h[2], w8 1266; CHECK-CVT-NEXT: csetm w8, ge 1267; CHECK-CVT-NEXT: fcvt s3, h3 1268; CHECK-CVT-NEXT: fcvt s4, h4 1269; CHECK-CVT-NEXT: fcmp s6, s5 1270; CHECK-CVT-NEXT: mov h5, v1.h[6] 1271; CHECK-CVT-NEXT: mov h6, v0.h[6] 1272; CHECK-CVT-NEXT: mov h1, v1.h[7] 1273; CHECK-CVT-NEXT: mov h0, v0.h[7] 1274; CHECK-CVT-NEXT: mov v2.h[3], w8 1275; CHECK-CVT-NEXT: csetm w8, ge 1276; CHECK-CVT-NEXT: fcmp s4, s3 1277; CHECK-CVT-NEXT: fcvt s3, h5 1278; CHECK-CVT-NEXT: fcvt s4, h6 1279; CHECK-CVT-NEXT: fcvt s1, h1 1280; CHECK-CVT-NEXT: fcvt s0, h0 1281; CHECK-CVT-NEXT: mov v2.h[4], w8 1282; CHECK-CVT-NEXT: csetm w8, ge 1283; CHECK-CVT-NEXT: fcmp s4, s3 1284; CHECK-CVT-NEXT: mov v2.h[5], w8 1285; CHECK-CVT-NEXT: csetm w8, ge 1286; CHECK-CVT-NEXT: fcmp s0, s1 1287; CHECK-CVT-NEXT: mov v2.h[6], w8 1288; CHECK-CVT-NEXT: csetm w8, ge 1289; CHECK-CVT-NEXT: mov v2.h[7], w8 1290; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1291; CHECK-CVT-NEXT: ret 1292; 1293; CHECK-FP16-LABEL: test_fcmp_oge: 1294; CHECK-FP16: // %bb.0: 1295; CHECK-FP16-NEXT: fcmge v0.8h, v0.8h, v1.8h 1296; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1297; CHECK-FP16-NEXT: ret 1298 %1 = fcmp oge <8 x half> %a, %b 1299 ret <8 x i1> %1 1300} 1301 1302define <8 x i1> @test_fcmp_olt(<8 x half> %a, <8 x half> %b) #0 { 1303; CHECK-CVT-LABEL: test_fcmp_olt: 1304; CHECK-CVT: // %bb.0: 1305; CHECK-CVT-NEXT: mov h2, v1.h[1] 1306; CHECK-CVT-NEXT: mov h3, v0.h[1] 1307; CHECK-CVT-NEXT: fcvt s4, h1 1308; CHECK-CVT-NEXT: fcvt s5, h0 1309; CHECK-CVT-NEXT: mov h6, v1.h[2] 1310; CHECK-CVT-NEXT: fcvt s2, h2 1311; CHECK-CVT-NEXT: fcvt s3, h3 1312; CHECK-CVT-NEXT: fcmp s3, s2 1313; CHECK-CVT-NEXT: mov h2, v0.h[2] 1314; CHECK-CVT-NEXT: mov h3, v1.h[3] 1315; CHECK-CVT-NEXT: csetm w8, mi 1316; CHECK-CVT-NEXT: fcmp s5, s4 1317; CHECK-CVT-NEXT: fcvt s5, h6 1318; CHECK-CVT-NEXT: fcvt s2, h2 1319; CHECK-CVT-NEXT: mov h4, v0.h[3] 1320; CHECK-CVT-NEXT: fcvt s3, h3 1321; CHECK-CVT-NEXT: mov h6, v0.h[4] 1322; CHECK-CVT-NEXT: csetm w9, mi 1323; CHECK-CVT-NEXT: fcmp s2, s5 1324; CHECK-CVT-NEXT: fmov s2, w9 1325; CHECK-CVT-NEXT: fcvt s4, h4 1326; CHECK-CVT-NEXT: mov h5, v1.h[4] 1327; CHECK-CVT-NEXT: fcvt s6, h6 1328; CHECK-CVT-NEXT: mov v2.h[1], w8 1329; CHECK-CVT-NEXT: csetm w8, mi 1330; CHECK-CVT-NEXT: fcmp s4, s3 1331; CHECK-CVT-NEXT: mov h3, v1.h[5] 1332; CHECK-CVT-NEXT: mov h4, v0.h[5] 1333; CHECK-CVT-NEXT: fcvt s5, h5 1334; CHECK-CVT-NEXT: mov v2.h[2], w8 1335; CHECK-CVT-NEXT: csetm w8, mi 1336; CHECK-CVT-NEXT: fcvt s3, h3 1337; CHECK-CVT-NEXT: fcvt s4, h4 1338; CHECK-CVT-NEXT: fcmp s6, s5 1339; CHECK-CVT-NEXT: mov h5, v1.h[6] 1340; CHECK-CVT-NEXT: mov h6, v0.h[6] 1341; CHECK-CVT-NEXT: mov h1, v1.h[7] 1342; CHECK-CVT-NEXT: mov h0, v0.h[7] 1343; CHECK-CVT-NEXT: mov v2.h[3], w8 1344; CHECK-CVT-NEXT: csetm w8, mi 1345; CHECK-CVT-NEXT: fcmp s4, s3 1346; CHECK-CVT-NEXT: fcvt s3, h5 1347; CHECK-CVT-NEXT: fcvt s4, h6 1348; CHECK-CVT-NEXT: fcvt s1, h1 1349; CHECK-CVT-NEXT: fcvt s0, h0 1350; CHECK-CVT-NEXT: mov v2.h[4], w8 1351; CHECK-CVT-NEXT: csetm w8, mi 1352; CHECK-CVT-NEXT: fcmp s4, s3 1353; CHECK-CVT-NEXT: mov v2.h[5], w8 1354; CHECK-CVT-NEXT: csetm w8, mi 1355; CHECK-CVT-NEXT: fcmp s0, s1 1356; CHECK-CVT-NEXT: mov v2.h[6], w8 1357; CHECK-CVT-NEXT: csetm w8, mi 1358; CHECK-CVT-NEXT: mov v2.h[7], w8 1359; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1360; CHECK-CVT-NEXT: ret 1361; 1362; CHECK-FP16-LABEL: test_fcmp_olt: 1363; CHECK-FP16: // %bb.0: 1364; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 1365; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1366; CHECK-FP16-NEXT: ret 1367 %1 = fcmp olt <8 x half> %a, %b 1368 ret <8 x i1> %1 1369} 1370 1371define <8 x i1> @test_fcmp_ole(<8 x half> %a, <8 x half> %b) #0 { 1372; CHECK-CVT-LABEL: test_fcmp_ole: 1373; CHECK-CVT: // %bb.0: 1374; CHECK-CVT-NEXT: mov h2, v1.h[1] 1375; CHECK-CVT-NEXT: mov h3, v0.h[1] 1376; CHECK-CVT-NEXT: fcvt s4, h1 1377; CHECK-CVT-NEXT: fcvt s5, h0 1378; CHECK-CVT-NEXT: mov h6, v1.h[2] 1379; CHECK-CVT-NEXT: fcvt s2, h2 1380; CHECK-CVT-NEXT: fcvt s3, h3 1381; CHECK-CVT-NEXT: fcmp s3, s2 1382; CHECK-CVT-NEXT: mov h2, v0.h[2] 1383; CHECK-CVT-NEXT: mov h3, v1.h[3] 1384; CHECK-CVT-NEXT: csetm w8, ls 1385; CHECK-CVT-NEXT: fcmp s5, s4 1386; CHECK-CVT-NEXT: fcvt s5, h6 1387; CHECK-CVT-NEXT: fcvt s2, h2 1388; CHECK-CVT-NEXT: mov h4, v0.h[3] 1389; CHECK-CVT-NEXT: fcvt s3, h3 1390; CHECK-CVT-NEXT: mov h6, v0.h[4] 1391; CHECK-CVT-NEXT: csetm w9, ls 1392; CHECK-CVT-NEXT: fcmp s2, s5 1393; CHECK-CVT-NEXT: fmov s2, w9 1394; CHECK-CVT-NEXT: fcvt s4, h4 1395; CHECK-CVT-NEXT: mov h5, v1.h[4] 1396; CHECK-CVT-NEXT: fcvt s6, h6 1397; CHECK-CVT-NEXT: mov v2.h[1], w8 1398; CHECK-CVT-NEXT: csetm w8, ls 1399; CHECK-CVT-NEXT: fcmp s4, s3 1400; CHECK-CVT-NEXT: mov h3, v1.h[5] 1401; CHECK-CVT-NEXT: mov h4, v0.h[5] 1402; CHECK-CVT-NEXT: fcvt s5, h5 1403; CHECK-CVT-NEXT: mov v2.h[2], w8 1404; CHECK-CVT-NEXT: csetm w8, ls 1405; CHECK-CVT-NEXT: fcvt s3, h3 1406; CHECK-CVT-NEXT: fcvt s4, h4 1407; CHECK-CVT-NEXT: fcmp s6, s5 1408; CHECK-CVT-NEXT: mov h5, v1.h[6] 1409; CHECK-CVT-NEXT: mov h6, v0.h[6] 1410; CHECK-CVT-NEXT: mov h1, v1.h[7] 1411; CHECK-CVT-NEXT: mov h0, v0.h[7] 1412; CHECK-CVT-NEXT: mov v2.h[3], w8 1413; CHECK-CVT-NEXT: csetm w8, ls 1414; CHECK-CVT-NEXT: fcmp s4, s3 1415; CHECK-CVT-NEXT: fcvt s3, h5 1416; CHECK-CVT-NEXT: fcvt s4, h6 1417; CHECK-CVT-NEXT: fcvt s1, h1 1418; CHECK-CVT-NEXT: fcvt s0, h0 1419; CHECK-CVT-NEXT: mov v2.h[4], w8 1420; CHECK-CVT-NEXT: csetm w8, ls 1421; CHECK-CVT-NEXT: fcmp s4, s3 1422; CHECK-CVT-NEXT: mov v2.h[5], w8 1423; CHECK-CVT-NEXT: csetm w8, ls 1424; CHECK-CVT-NEXT: fcmp s0, s1 1425; CHECK-CVT-NEXT: mov v2.h[6], w8 1426; CHECK-CVT-NEXT: csetm w8, ls 1427; CHECK-CVT-NEXT: mov v2.h[7], w8 1428; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1429; CHECK-CVT-NEXT: ret 1430; 1431; CHECK-FP16-LABEL: test_fcmp_ole: 1432; CHECK-FP16: // %bb.0: 1433; CHECK-FP16-NEXT: fcmge v0.8h, v1.8h, v0.8h 1434; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1435; CHECK-FP16-NEXT: ret 1436 %1 = fcmp ole <8 x half> %a, %b 1437 ret <8 x i1> %1 1438} 1439 1440define <8 x i1> @test_fcmp_ord(<8 x half> %a, <8 x half> %b) #0 { 1441; CHECK-CVT-LABEL: test_fcmp_ord: 1442; CHECK-CVT: // %bb.0: 1443; CHECK-CVT-NEXT: mov h2, v1.h[1] 1444; CHECK-CVT-NEXT: mov h3, v0.h[1] 1445; CHECK-CVT-NEXT: fcvt s4, h1 1446; CHECK-CVT-NEXT: fcvt s5, h0 1447; CHECK-CVT-NEXT: mov h6, v1.h[2] 1448; CHECK-CVT-NEXT: fcvt s2, h2 1449; CHECK-CVT-NEXT: fcvt s3, h3 1450; CHECK-CVT-NEXT: fcmp s3, s2 1451; CHECK-CVT-NEXT: mov h2, v0.h[2] 1452; CHECK-CVT-NEXT: mov h3, v1.h[3] 1453; CHECK-CVT-NEXT: csetm w8, vc 1454; CHECK-CVT-NEXT: fcmp s5, s4 1455; CHECK-CVT-NEXT: fcvt s5, h6 1456; CHECK-CVT-NEXT: fcvt s2, h2 1457; CHECK-CVT-NEXT: mov h4, v0.h[3] 1458; CHECK-CVT-NEXT: fcvt s3, h3 1459; CHECK-CVT-NEXT: mov h6, v0.h[4] 1460; CHECK-CVT-NEXT: csetm w9, vc 1461; CHECK-CVT-NEXT: fcmp s2, s5 1462; CHECK-CVT-NEXT: fmov s2, w9 1463; CHECK-CVT-NEXT: fcvt s4, h4 1464; CHECK-CVT-NEXT: mov h5, v1.h[4] 1465; CHECK-CVT-NEXT: fcvt s6, h6 1466; CHECK-CVT-NEXT: mov v2.h[1], w8 1467; CHECK-CVT-NEXT: csetm w8, vc 1468; CHECK-CVT-NEXT: fcmp s4, s3 1469; CHECK-CVT-NEXT: mov h3, v1.h[5] 1470; CHECK-CVT-NEXT: mov h4, v0.h[5] 1471; CHECK-CVT-NEXT: fcvt s5, h5 1472; CHECK-CVT-NEXT: mov v2.h[2], w8 1473; CHECK-CVT-NEXT: csetm w8, vc 1474; CHECK-CVT-NEXT: fcvt s3, h3 1475; CHECK-CVT-NEXT: fcvt s4, h4 1476; CHECK-CVT-NEXT: fcmp s6, s5 1477; CHECK-CVT-NEXT: mov h5, v1.h[6] 1478; CHECK-CVT-NEXT: mov h6, v0.h[6] 1479; CHECK-CVT-NEXT: mov h1, v1.h[7] 1480; CHECK-CVT-NEXT: mov h0, v0.h[7] 1481; CHECK-CVT-NEXT: mov v2.h[3], w8 1482; CHECK-CVT-NEXT: csetm w8, vc 1483; CHECK-CVT-NEXT: fcmp s4, s3 1484; CHECK-CVT-NEXT: fcvt s3, h5 1485; CHECK-CVT-NEXT: fcvt s4, h6 1486; CHECK-CVT-NEXT: fcvt s1, h1 1487; CHECK-CVT-NEXT: fcvt s0, h0 1488; CHECK-CVT-NEXT: mov v2.h[4], w8 1489; CHECK-CVT-NEXT: csetm w8, vc 1490; CHECK-CVT-NEXT: fcmp s4, s3 1491; CHECK-CVT-NEXT: mov v2.h[5], w8 1492; CHECK-CVT-NEXT: csetm w8, vc 1493; CHECK-CVT-NEXT: fcmp s0, s1 1494; CHECK-CVT-NEXT: mov v2.h[6], w8 1495; CHECK-CVT-NEXT: csetm w8, vc 1496; CHECK-CVT-NEXT: mov v2.h[7], w8 1497; CHECK-CVT-NEXT: xtn v0.8b, v2.8h 1498; CHECK-CVT-NEXT: ret 1499; 1500; CHECK-FP16-LABEL: test_fcmp_ord: 1501; CHECK-FP16: // %bb.0: 1502; CHECK-FP16-NEXT: fcmge v2.8h, v0.8h, v1.8h 1503; CHECK-FP16-NEXT: fcmgt v0.8h, v1.8h, v0.8h 1504; CHECK-FP16-NEXT: orr v0.16b, v0.16b, v2.16b 1505; CHECK-FP16-NEXT: xtn v0.8b, v0.8h 1506; CHECK-FP16-NEXT: ret 1507 %1 = fcmp ord <8 x half> %a, %b 1508 ret <8 x i1> %1 1509} 1510 1511attributes #0 = { nounwind } 1512