1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -march=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-qfloat < %s | FileCheck %s 3; RUN: llc -march=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-ieee-fp < %s | FileCheck %s 4 5; --- Half 6 7define <64 x half> @test_00(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 8; CHECK-LABEL: test_00: 9; CHECK: // %bb.0: 10; CHECK-NEXT: { 11; CHECK-NEXT: q0 = vcmp.eq(v0.h,v1.h) 12; CHECK-NEXT: } 13; CHECK-NEXT: { 14; CHECK-NEXT: v0 = vmux(q0,v1,v2) 15; CHECK-NEXT: jumpr r31 16; CHECK-NEXT: } 17 %t0 = fcmp oeq <64 x half> %v0, %v1 18 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 19 ret <64 x half> %t1 20} 21 22define <64 x half> @test_01(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 23; CHECK-LABEL: test_01: 24; CHECK: // %bb.0: 25; CHECK-NEXT: { 26; CHECK-NEXT: q0 = vcmp.eq(v0.h,v1.h) 27; CHECK-NEXT: } 28; CHECK-NEXT: { 29; CHECK-NEXT: v0 = vmux(q0,v2,v1) 30; CHECK-NEXT: jumpr r31 31; CHECK-NEXT: } 32 %t0 = fcmp one <64 x half> %v0, %v1 33 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 34 ret <64 x half> %t1 35} 36 37define <64 x half> @test_02(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 38; CHECK-LABEL: test_02: 39; CHECK: // %bb.0: 40; CHECK-NEXT: { 41; CHECK-NEXT: q0 = vcmp.gt(v1.hf,v0.hf) 42; CHECK-NEXT: } 43; CHECK-NEXT: { 44; CHECK-NEXT: v0 = vmux(q0,v1,v2) 45; CHECK-NEXT: jumpr r31 46; CHECK-NEXT: } 47 %t0 = fcmp olt <64 x half> %v0, %v1 48 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 49 ret <64 x half> %t1 50} 51 52define <64 x half> @test_03(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 53; CHECK-LABEL: test_03: 54; CHECK: // %bb.0: 55; CHECK-NEXT: { 56; CHECK-NEXT: q0 = vcmp.gt(v0.hf,v1.hf) 57; CHECK-NEXT: } 58; CHECK-NEXT: { 59; CHECK-NEXT: v0 = vmux(q0,v2,v1) 60; CHECK-NEXT: jumpr r31 61; CHECK-NEXT: } 62 %t0 = fcmp ole <64 x half> %v0, %v1 63 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 64 ret <64 x half> %t1 65} 66 67define <64 x half> @test_04(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 68; CHECK-LABEL: test_04: 69; CHECK: // %bb.0: 70; CHECK-NEXT: { 71; CHECK-NEXT: q0 = vcmp.gt(v0.hf,v1.hf) 72; CHECK-NEXT: } 73; CHECK-NEXT: { 74; CHECK-NEXT: v0 = vmux(q0,v1,v2) 75; CHECK-NEXT: jumpr r31 76; CHECK-NEXT: } 77 %t0 = fcmp ogt <64 x half> %v0, %v1 78 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 79 ret <64 x half> %t1 80} 81 82define <64 x half> @test_05(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 { 83; CHECK-LABEL: test_05: 84; CHECK: // %bb.0: 85; CHECK-NEXT: { 86; CHECK-NEXT: q0 = vcmp.gt(v1.hf,v0.hf) 87; CHECK-NEXT: } 88; CHECK-NEXT: { 89; CHECK-NEXT: v0 = vmux(q0,v2,v1) 90; CHECK-NEXT: jumpr r31 91; CHECK-NEXT: } 92 %t0 = fcmp oge <64 x half> %v0, %v1 93 %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2 94 ret <64 x half> %t1 95} 96 97define <64 x half> @test_0a(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 98; CHECK-LABEL: test_0a: 99; CHECK: // %bb.0: 100; CHECK-NEXT: { 101; CHECK-NEXT: r0 = ##16843009 102; CHECK-NEXT: } 103; CHECK-NEXT: { 104; CHECK-NEXT: q0 = vand(v2,r0) 105; CHECK-NEXT: } 106; CHECK-NEXT: { 107; CHECK-NEXT: q0 &= vcmp.eq(v0.h,v1.h) 108; CHECK-NEXT: } 109; CHECK-NEXT: { 110; CHECK-NEXT: v0 = vmux(q0,v0,v1) 111; CHECK-NEXT: jumpr r31 112; CHECK-NEXT: } 113 %q0 = fcmp oeq <64 x half> %v0, %v1 114 %q1 = trunc <64 x i16> %v2 to <64 x i1> 115 %q2 = and <64 x i1> %q0, %q1 116 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 117 ret <64 x half> %t1 118} 119 120define <64 x half> @test_0b(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 121; CHECK-LABEL: test_0b: 122; CHECK: // %bb.0: 123; CHECK-NEXT: { 124; CHECK-NEXT: r0 = ##16843009 125; CHECK-NEXT: } 126; CHECK-NEXT: { 127; CHECK-NEXT: q0 = vand(v2,r0) 128; CHECK-NEXT: } 129; CHECK-NEXT: { 130; CHECK-NEXT: q0 |= vcmp.eq(v0.h,v1.h) 131; CHECK-NEXT: } 132; CHECK-NEXT: { 133; CHECK-NEXT: v0 = vmux(q0,v0,v1) 134; CHECK-NEXT: jumpr r31 135; CHECK-NEXT: } 136 %q0 = fcmp oeq <64 x half> %v0, %v1 137 %q1 = trunc <64 x i16> %v2 to <64 x i1> 138 %q2 = or <64 x i1> %q0, %q1 139 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 140 ret <64 x half> %t1 141} 142 143define <64 x half> @test_0c(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 144; CHECK-LABEL: test_0c: 145; CHECK: // %bb.0: 146; CHECK-NEXT: { 147; CHECK-NEXT: r0 = ##16843009 148; CHECK-NEXT: } 149; CHECK-NEXT: { 150; CHECK-NEXT: q0 = vand(v2,r0) 151; CHECK-NEXT: } 152; CHECK-NEXT: { 153; CHECK-NEXT: q0 ^= vcmp.eq(v0.h,v1.h) 154; CHECK-NEXT: } 155; CHECK-NEXT: { 156; CHECK-NEXT: v0 = vmux(q0,v0,v1) 157; CHECK-NEXT: jumpr r31 158; CHECK-NEXT: } 159 %q0 = fcmp oeq <64 x half> %v0, %v1 160 %q1 = trunc <64 x i16> %v2 to <64 x i1> 161 %q2 = xor <64 x i1> %q0, %q1 162 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 163 ret <64 x half> %t1 164} 165 166define <64 x half> @test_0d(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 167; CHECK-LABEL: test_0d: 168; CHECK: // %bb.0: 169; CHECK-NEXT: { 170; CHECK-NEXT: r0 = ##16843009 171; CHECK-NEXT: } 172; CHECK-NEXT: { 173; CHECK-NEXT: q0 = vand(v2,r0) 174; CHECK-NEXT: } 175; CHECK-NEXT: { 176; CHECK-NEXT: q0 &= vcmp.gt(v0.hf,v1.hf) 177; CHECK-NEXT: } 178; CHECK-NEXT: { 179; CHECK-NEXT: v0 = vmux(q0,v0,v1) 180; CHECK-NEXT: jumpr r31 181; CHECK-NEXT: } 182 %q0 = fcmp ogt <64 x half> %v0, %v1 183 %q1 = trunc <64 x i16> %v2 to <64 x i1> 184 %q2 = and <64 x i1> %q0, %q1 185 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 186 ret <64 x half> %t1 187} 188 189define <64 x half> @test_0e(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 190; CHECK-LABEL: test_0e: 191; CHECK: // %bb.0: 192; CHECK-NEXT: { 193; CHECK-NEXT: r0 = ##16843009 194; CHECK-NEXT: } 195; CHECK-NEXT: { 196; CHECK-NEXT: q0 = vand(v2,r0) 197; CHECK-NEXT: } 198; CHECK-NEXT: { 199; CHECK-NEXT: q0 |= vcmp.gt(v0.hf,v1.hf) 200; CHECK-NEXT: } 201; CHECK-NEXT: { 202; CHECK-NEXT: v0 = vmux(q0,v0,v1) 203; CHECK-NEXT: jumpr r31 204; CHECK-NEXT: } 205 %q0 = fcmp ogt <64 x half> %v0, %v1 206 %q1 = trunc <64 x i16> %v2 to <64 x i1> 207 %q2 = or <64 x i1> %q0, %q1 208 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 209 ret <64 x half> %t1 210} 211 212define <64 x half> @test_0f(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 { 213; CHECK-LABEL: test_0f: 214; CHECK: // %bb.0: 215; CHECK-NEXT: { 216; CHECK-NEXT: r0 = ##16843009 217; CHECK-NEXT: } 218; CHECK-NEXT: { 219; CHECK-NEXT: q0 = vand(v2,r0) 220; CHECK-NEXT: } 221; CHECK-NEXT: { 222; CHECK-NEXT: q0 ^= vcmp.gt(v0.hf,v1.hf) 223; CHECK-NEXT: } 224; CHECK-NEXT: { 225; CHECK-NEXT: v0 = vmux(q0,v0,v1) 226; CHECK-NEXT: jumpr r31 227; CHECK-NEXT: } 228 %q0 = fcmp ogt <64 x half> %v0, %v1 229 %q1 = trunc <64 x i16> %v2 to <64 x i1> 230 %q2 = xor <64 x i1> %q0, %q1 231 %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1 232 ret <64 x half> %t1 233} 234 235 236; --- Single 237 238define <32 x float> @test_10(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 239; CHECK-LABEL: test_10: 240; CHECK: // %bb.0: 241; CHECK-NEXT: { 242; CHECK-NEXT: q0 = vcmp.eq(v0.w,v1.w) 243; CHECK-NEXT: } 244; CHECK-NEXT: { 245; CHECK-NEXT: v0 = vmux(q0,v1,v2) 246; CHECK-NEXT: jumpr r31 247; CHECK-NEXT: } 248 %t0 = fcmp oeq <32 x float> %v0, %v1 249 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 250 ret <32 x float> %t1 251} 252 253define <32 x float> @test_11(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 254; CHECK-LABEL: test_11: 255; CHECK: // %bb.0: 256; CHECK-NEXT: { 257; CHECK-NEXT: q0 = vcmp.eq(v0.w,v1.w) 258; CHECK-NEXT: } 259; CHECK-NEXT: { 260; CHECK-NEXT: v0 = vmux(q0,v2,v1) 261; CHECK-NEXT: jumpr r31 262; CHECK-NEXT: } 263 %t0 = fcmp one <32 x float> %v0, %v1 264 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 265 ret <32 x float> %t1 266} 267 268define <32 x float> @test_12(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 269; CHECK-LABEL: test_12: 270; CHECK: // %bb.0: 271; CHECK-NEXT: { 272; CHECK-NEXT: q0 = vcmp.gt(v1.sf,v0.sf) 273; CHECK-NEXT: } 274; CHECK-NEXT: { 275; CHECK-NEXT: v0 = vmux(q0,v1,v2) 276; CHECK-NEXT: jumpr r31 277; CHECK-NEXT: } 278 %t0 = fcmp olt <32 x float> %v0, %v1 279 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 280 ret <32 x float> %t1 281} 282 283define <32 x float> @test_13(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 284; CHECK-LABEL: test_13: 285; CHECK: // %bb.0: 286; CHECK-NEXT: { 287; CHECK-NEXT: q0 = vcmp.gt(v0.sf,v1.sf) 288; CHECK-NEXT: } 289; CHECK-NEXT: { 290; CHECK-NEXT: v0 = vmux(q0,v2,v1) 291; CHECK-NEXT: jumpr r31 292; CHECK-NEXT: } 293 %t0 = fcmp ole <32 x float> %v0, %v1 294 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 295 ret <32 x float> %t1 296} 297 298define <32 x float> @test_14(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 299; CHECK-LABEL: test_14: 300; CHECK: // %bb.0: 301; CHECK-NEXT: { 302; CHECK-NEXT: q0 = vcmp.gt(v0.sf,v1.sf) 303; CHECK-NEXT: } 304; CHECK-NEXT: { 305; CHECK-NEXT: v0 = vmux(q0,v1,v2) 306; CHECK-NEXT: jumpr r31 307; CHECK-NEXT: } 308 %t0 = fcmp ogt <32 x float> %v0, %v1 309 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 310 ret <32 x float> %t1 311} 312 313define <32 x float> @test_15(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 { 314; CHECK-LABEL: test_15: 315; CHECK: // %bb.0: 316; CHECK-NEXT: { 317; CHECK-NEXT: q0 = vcmp.gt(v1.sf,v0.sf) 318; CHECK-NEXT: } 319; CHECK-NEXT: { 320; CHECK-NEXT: v0 = vmux(q0,v2,v1) 321; CHECK-NEXT: jumpr r31 322; CHECK-NEXT: } 323 %t0 = fcmp oge <32 x float> %v0, %v1 324 %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2 325 ret <32 x float> %t1 326} 327 328define <32 x float> @test_1a(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 329; CHECK-LABEL: test_1a: 330; CHECK: // %bb.0: 331; CHECK-NEXT: { 332; CHECK-NEXT: r0 = ##16843009 333; CHECK-NEXT: } 334; CHECK-NEXT: { 335; CHECK-NEXT: q0 = vand(v2,r0) 336; CHECK-NEXT: } 337; CHECK-NEXT: { 338; CHECK-NEXT: q0 &= vcmp.eq(v0.w,v1.w) 339; CHECK-NEXT: } 340; CHECK-NEXT: { 341; CHECK-NEXT: v0 = vmux(q0,v0,v1) 342; CHECK-NEXT: jumpr r31 343; CHECK-NEXT: } 344 %q0 = fcmp oeq <32 x float> %v0, %v1 345 %q1 = trunc <32 x i32> %v2 to <32 x i1> 346 %q2 = and <32 x i1> %q0, %q1 347 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 348 ret <32 x float> %t1 349} 350 351define <32 x float> @test_1b(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 352; CHECK-LABEL: test_1b: 353; CHECK: // %bb.0: 354; CHECK-NEXT: { 355; CHECK-NEXT: r0 = ##16843009 356; CHECK-NEXT: } 357; CHECK-NEXT: { 358; CHECK-NEXT: q0 = vand(v2,r0) 359; CHECK-NEXT: } 360; CHECK-NEXT: { 361; CHECK-NEXT: q0 |= vcmp.eq(v0.w,v1.w) 362; CHECK-NEXT: } 363; CHECK-NEXT: { 364; CHECK-NEXT: v0 = vmux(q0,v0,v1) 365; CHECK-NEXT: jumpr r31 366; CHECK-NEXT: } 367 %q0 = fcmp oeq <32 x float> %v0, %v1 368 %q1 = trunc <32 x i32> %v2 to <32 x i1> 369 %q2 = or <32 x i1> %q0, %q1 370 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 371 ret <32 x float> %t1 372} 373 374define <32 x float> @test_1c(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 375; CHECK-LABEL: test_1c: 376; CHECK: // %bb.0: 377; CHECK-NEXT: { 378; CHECK-NEXT: r0 = ##16843009 379; CHECK-NEXT: } 380; CHECK-NEXT: { 381; CHECK-NEXT: q0 = vand(v2,r0) 382; CHECK-NEXT: } 383; CHECK-NEXT: { 384; CHECK-NEXT: q0 ^= vcmp.eq(v0.w,v1.w) 385; CHECK-NEXT: } 386; CHECK-NEXT: { 387; CHECK-NEXT: v0 = vmux(q0,v0,v1) 388; CHECK-NEXT: jumpr r31 389; CHECK-NEXT: } 390 %q0 = fcmp oeq <32 x float> %v0, %v1 391 %q1 = trunc <32 x i32> %v2 to <32 x i1> 392 %q2 = xor <32 x i1> %q0, %q1 393 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 394 ret <32 x float> %t1 395} 396 397define <32 x float> @test_1d(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 398; CHECK-LABEL: test_1d: 399; CHECK: // %bb.0: 400; CHECK-NEXT: { 401; CHECK-NEXT: r0 = ##16843009 402; CHECK-NEXT: } 403; CHECK-NEXT: { 404; CHECK-NEXT: q0 = vand(v2,r0) 405; CHECK-NEXT: } 406; CHECK-NEXT: { 407; CHECK-NEXT: q0 &= vcmp.gt(v0.sf,v1.sf) 408; CHECK-NEXT: } 409; CHECK-NEXT: { 410; CHECK-NEXT: v0 = vmux(q0,v0,v1) 411; CHECK-NEXT: jumpr r31 412; CHECK-NEXT: } 413 %q0 = fcmp ogt <32 x float> %v0, %v1 414 %q1 = trunc <32 x i32> %v2 to <32 x i1> 415 %q2 = and <32 x i1> %q0, %q1 416 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 417 ret <32 x float> %t1 418} 419 420define <32 x float> @test_1e(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 421; CHECK-LABEL: test_1e: 422; CHECK: // %bb.0: 423; CHECK-NEXT: { 424; CHECK-NEXT: r0 = ##16843009 425; CHECK-NEXT: } 426; CHECK-NEXT: { 427; CHECK-NEXT: q0 = vand(v2,r0) 428; CHECK-NEXT: } 429; CHECK-NEXT: { 430; CHECK-NEXT: q0 |= vcmp.gt(v0.sf,v1.sf) 431; CHECK-NEXT: } 432; CHECK-NEXT: { 433; CHECK-NEXT: v0 = vmux(q0,v0,v1) 434; CHECK-NEXT: jumpr r31 435; CHECK-NEXT: } 436 %q0 = fcmp ogt <32 x float> %v0, %v1 437 %q1 = trunc <32 x i32> %v2 to <32 x i1> 438 %q2 = or <32 x i1> %q0, %q1 439 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 440 ret <32 x float> %t1 441} 442 443define <32 x float> @test_1f(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 { 444; CHECK-LABEL: test_1f: 445; CHECK: // %bb.0: 446; CHECK-NEXT: { 447; CHECK-NEXT: r0 = ##16843009 448; CHECK-NEXT: } 449; CHECK-NEXT: { 450; CHECK-NEXT: q0 = vand(v2,r0) 451; CHECK-NEXT: } 452; CHECK-NEXT: { 453; CHECK-NEXT: q0 ^= vcmp.gt(v0.sf,v1.sf) 454; CHECK-NEXT: } 455; CHECK-NEXT: { 456; CHECK-NEXT: v0 = vmux(q0,v0,v1) 457; CHECK-NEXT: jumpr r31 458; CHECK-NEXT: } 459 %q0 = fcmp ogt <32 x float> %v0, %v1 460 %q1 = trunc <32 x i32> %v2 to <32 x i1> 461 %q2 = xor <32 x i1> %q0, %q1 462 %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1 463 ret <32 x float> %t1 464} 465 466attributes #0 = { nounwind readnone "target-cpu"="hexagonv69" } 467