1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s 3; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s 4 5define i1 @isnan_f(float %x) { 6; CHECK-LABEL: isnan_f: 7; CHECK: # %bb.0: # %entry 8; CHECK-NEXT: fclass.s $fa0, $fa0 9; CHECK-NEXT: movfr2gr.s $a0, $fa0 10; CHECK-NEXT: andi $a0, $a0, 3 11; CHECK-NEXT: sltu $a0, $zero, $a0 12; CHECK-NEXT: ret 13entry: 14 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 3) ; "nan" 15 ret i1 %0 16} 17 18define i1 @isnot_nan_f(float %x) { 19; CHECK-LABEL: isnot_nan_f: 20; CHECK: # %bb.0: # %entry 21; CHECK-NEXT: fclass.s $fa0, $fa0 22; CHECK-NEXT: movfr2gr.s $a0, $fa0 23; CHECK-NEXT: andi $a0, $a0, 1020 24; CHECK-NEXT: sltu $a0, $zero, $a0 25; CHECK-NEXT: ret 26entry: 27 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1020) ; 0x3fc = "zero|subnormal|normal|inf" 28 ret i1 %0 29} 30 31define i1 @issignaling_f(float %x) { 32; CHECK-LABEL: issignaling_f: 33; CHECK: # %bb.0: # %entry 34; CHECK-NEXT: fclass.s $fa0, $fa0 35; CHECK-NEXT: movfr2gr.s $a0, $fa0 36; CHECK-NEXT: andi $a0, $a0, 1 37; CHECK-NEXT: sltu $a0, $zero, $a0 38; CHECK-NEXT: ret 39entry: 40 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1) ; "snan" 41 ret i1 %0 42} 43 44define i1 @not_issignaling_f(float %x) { 45; CHECK-LABEL: not_issignaling_f: 46; CHECK: # %bb.0: # %entry 47; CHECK-NEXT: fclass.s $fa0, $fa0 48; CHECK-NEXT: movfr2gr.s $a0, $fa0 49; CHECK-NEXT: andi $a0, $a0, 1022 50; CHECK-NEXT: sltu $a0, $zero, $a0 51; CHECK-NEXT: ret 52entry: 53 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1022) ; ~"snan" 54 ret i1 %0 55} 56 57define i1 @isquiet_f(float %x) { 58; CHECK-LABEL: isquiet_f: 59; CHECK: # %bb.0: # %entry 60; CHECK-NEXT: fclass.s $fa0, $fa0 61; CHECK-NEXT: movfr2gr.s $a0, $fa0 62; CHECK-NEXT: andi $a0, $a0, 2 63; CHECK-NEXT: sltu $a0, $zero, $a0 64; CHECK-NEXT: ret 65entry: 66 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 2) ; "qnan" 67 ret i1 %0 68} 69 70define i1 @not_isquiet_f(float %x) { 71; CHECK-LABEL: not_isquiet_f: 72; CHECK: # %bb.0: # %entry 73; CHECK-NEXT: fclass.s $fa0, $fa0 74; CHECK-NEXT: movfr2gr.s $a0, $fa0 75; CHECK-NEXT: andi $a0, $a0, 1021 76; CHECK-NEXT: sltu $a0, $zero, $a0 77; CHECK-NEXT: ret 78entry: 79 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1021) ; ~"qnan" 80 ret i1 %0 81} 82 83define i1 @isinf_f(float %x) { 84; CHECK-LABEL: isinf_f: 85; CHECK: # %bb.0: # %entry 86; CHECK-NEXT: fclass.s $fa0, $fa0 87; CHECK-NEXT: movfr2gr.s $a0, $fa0 88; CHECK-NEXT: andi $a0, $a0, 68 89; CHECK-NEXT: sltu $a0, $zero, $a0 90; CHECK-NEXT: ret 91entry: 92 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516) ; 0x204 = "inf" 93 ret i1 %0 94} 95 96define i1 @not_isinf_f(float %x) { 97; CHECK-LABEL: not_isinf_f: 98; CHECK: # %bb.0: # %entry 99; CHECK-NEXT: fclass.s $fa0, $fa0 100; CHECK-NEXT: movfr2gr.s $a0, $fa0 101; CHECK-NEXT: andi $a0, $a0, 955 102; CHECK-NEXT: sltu $a0, $zero, $a0 103; CHECK-NEXT: ret 104entry: 105 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507) ; ~0x204 = "~inf" 106 ret i1 %0 107} 108 109define i1 @is_plus_inf_f(float %x) { 110; CHECK-LABEL: is_plus_inf_f: 111; CHECK: # %bb.0: # %entry 112; CHECK-NEXT: fclass.s $fa0, $fa0 113; CHECK-NEXT: movfr2gr.s $a0, $fa0 114; CHECK-NEXT: andi $a0, $a0, 64 115; CHECK-NEXT: sltu $a0, $zero, $a0 116; CHECK-NEXT: ret 117entry: 118 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512) ; 0x200 = "+inf" 119 ret i1 %0 120} 121 122define i1 @is_minus_inf_f(float %x) { 123; CHECK-LABEL: is_minus_inf_f: 124; CHECK: # %bb.0: # %entry 125; CHECK-NEXT: fclass.s $fa0, $fa0 126; CHECK-NEXT: movfr2gr.s $a0, $fa0 127; CHECK-NEXT: andi $a0, $a0, 4 128; CHECK-NEXT: sltu $a0, $zero, $a0 129; CHECK-NEXT: ret 130entry: 131 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4) ; "-inf" 132 ret i1 %0 133} 134 135define i1 @not_is_minus_inf_f(float %x) { 136; CHECK-LABEL: not_is_minus_inf_f: 137; CHECK: # %bb.0: # %entry 138; CHECK-NEXT: fclass.s $fa0, $fa0 139; CHECK-NEXT: movfr2gr.s $a0, $fa0 140; CHECK-NEXT: andi $a0, $a0, 1019 141; CHECK-NEXT: sltu $a0, $zero, $a0 142; CHECK-NEXT: ret 143entry: 144 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019) ; ~"-inf" 145 ret i1 %0 146} 147 148define i1 @isfinite_f(float %x) { 149; CHECK-LABEL: isfinite_f: 150; CHECK: # %bb.0: # %entry 151; CHECK-NEXT: fclass.s $fa0, $fa0 152; CHECK-NEXT: movfr2gr.s $a0, $fa0 153; CHECK-NEXT: andi $a0, $a0, 952 154; CHECK-NEXT: sltu $a0, $zero, $a0 155; CHECK-NEXT: ret 156entry: 157 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; 0x1f8 = "finite" 158 ret i1 %0 159} 160 161define i1 @not_isfinite_f(float %x) { 162; CHECK-LABEL: not_isfinite_f: 163; CHECK: # %bb.0: # %entry 164; CHECK-NEXT: fclass.s $fa0, $fa0 165; CHECK-NEXT: movfr2gr.s $a0, $fa0 166; CHECK-NEXT: andi $a0, $a0, 71 167; CHECK-NEXT: sltu $a0, $zero, $a0 168; CHECK-NEXT: ret 169entry: 170 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; ~0x1f8 = "~finite" 171 ret i1 %0 172} 173 174define i1 @is_plus_finite_f(float %x) { 175; CHECK-LABEL: is_plus_finite_f: 176; CHECK: # %bb.0: # %entry 177; CHECK-NEXT: fclass.s $fa0, $fa0 178; CHECK-NEXT: movfr2gr.s $a0, $fa0 179; CHECK-NEXT: andi $a0, $a0, 896 180; CHECK-NEXT: sltu $a0, $zero, $a0 181; CHECK-NEXT: ret 182entry: 183 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 448) ; 0x1c0 = "+finite" 184 ret i1 %0 185} 186 187define i1 @not_is_plus_finite_f(float %x) { 188; CHECK-LABEL: not_is_plus_finite_f: 189; CHECK: # %bb.0: # %entry 190; CHECK-NEXT: fclass.s $fa0, $fa0 191; CHECK-NEXT: movfr2gr.s $a0, $fa0 192; CHECK-NEXT: andi $a0, $a0, 127 193; CHECK-NEXT: sltu $a0, $zero, $a0 194; CHECK-NEXT: ret 195entry: 196 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 575) ; ~0x1c0 = ~"+finite" 197 ret i1 %0 198} 199 200define i1 @is_minus_finite_f(float %x) { 201; CHECK-LABEL: is_minus_finite_f: 202; CHECK: # %bb.0: # %entry 203; CHECK-NEXT: fclass.s $fa0, $fa0 204; CHECK-NEXT: movfr2gr.s $a0, $fa0 205; CHECK-NEXT: andi $a0, $a0, 56 206; CHECK-NEXT: sltu $a0, $zero, $a0 207; CHECK-NEXT: ret 208entry: 209 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 56) ; 0x38 = "-finite" 210 ret i1 %0 211} 212 213define i1 @not_is_minus_finite_f(float %x) { 214; CHECK-LABEL: not_is_minus_finite_f: 215; CHECK: # %bb.0: # %entry 216; CHECK-NEXT: fclass.s $fa0, $fa0 217; CHECK-NEXT: movfr2gr.s $a0, $fa0 218; CHECK-NEXT: andi $a0, $a0, 967 219; CHECK-NEXT: sltu $a0, $zero, $a0 220; CHECK-NEXT: ret 221entry: 222 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 967) ; ~0x38 = ~"-finite" 223 ret i1 %0 224} 225 226define i1 @isnormal_f(float %x) { 227; CHECK-LABEL: isnormal_f: 228; CHECK: # %bb.0: # %entry 229; CHECK-NEXT: fclass.s $fa0, $fa0 230; CHECK-NEXT: movfr2gr.s $a0, $fa0 231; CHECK-NEXT: andi $a0, $a0, 136 232; CHECK-NEXT: sltu $a0, $zero, $a0 233; CHECK-NEXT: ret 234entry: 235 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 264) ; 0x108 = "normal" 236 ret i1 %0 237} 238 239define i1 @not_isnormal_f(float %x) { 240; CHECK-LABEL: not_isnormal_f: 241; CHECK: # %bb.0: # %entry 242; CHECK-NEXT: fclass.s $fa0, $fa0 243; CHECK-NEXT: movfr2gr.s $a0, $fa0 244; CHECK-NEXT: andi $a0, $a0, 887 245; CHECK-NEXT: sltu $a0, $zero, $a0 246; CHECK-NEXT: ret 247entry: 248 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 759) ; ~0x108 = "~normal" 249 ret i1 %0 250} 251 252define i1 @is_plus_normal_f(float %x) { 253; CHECK-LABEL: is_plus_normal_f: 254; CHECK: # %bb.0: # %entry 255; CHECK-NEXT: fclass.s $fa0, $fa0 256; CHECK-NEXT: movfr2gr.s $a0, $fa0 257; CHECK-NEXT: andi $a0, $a0, 128 258; CHECK-NEXT: sltu $a0, $zero, $a0 259; CHECK-NEXT: ret 260entry: 261 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 256) ; 0x100 = "+normal" 262 ret i1 %0 263} 264 265define i1 @issubnormal_f(float %x) { 266; CHECK-LABEL: issubnormal_f: 267; CHECK: # %bb.0: # %entry 268; CHECK-NEXT: fclass.s $fa0, $fa0 269; CHECK-NEXT: movfr2gr.s $a0, $fa0 270; CHECK-NEXT: andi $a0, $a0, 272 271; CHECK-NEXT: sltu $a0, $zero, $a0 272; CHECK-NEXT: ret 273entry: 274 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144) ; 0x90 = "subnormal" 275 ret i1 %0 276} 277 278define i1 @not_issubnormal_f(float %x) { 279; CHECK-LABEL: not_issubnormal_f: 280; CHECK: # %bb.0: # %entry 281; CHECK-NEXT: fclass.s $fa0, $fa0 282; CHECK-NEXT: movfr2gr.s $a0, $fa0 283; CHECK-NEXT: andi $a0, $a0, 751 284; CHECK-NEXT: sltu $a0, $zero, $a0 285; CHECK-NEXT: ret 286entry: 287 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879) ; ~0x90 = "~subnormal" 288 ret i1 %0 289} 290 291define i1 @is_plus_subnormal_f(float %x) { 292; CHECK-LABEL: is_plus_subnormal_f: 293; CHECK: # %bb.0: # %entry 294; CHECK-NEXT: fclass.s $fa0, $fa0 295; CHECK-NEXT: movfr2gr.s $a0, $fa0 296; CHECK-NEXT: andi $a0, $a0, 256 297; CHECK-NEXT: sltu $a0, $zero, $a0 298; CHECK-NEXT: ret 299entry: 300 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 128) ; 0x80 = "+subnormal" 301 ret i1 %0 302} 303 304define i1 @not_is_plus_subnormal_f(float %x) { 305; CHECK-LABEL: not_is_plus_subnormal_f: 306; CHECK: # %bb.0: # %entry 307; CHECK-NEXT: fclass.s $fa0, $fa0 308; CHECK-NEXT: movfr2gr.s $a0, $fa0 309; CHECK-NEXT: andi $a0, $a0, 767 310; CHECK-NEXT: sltu $a0, $zero, $a0 311; CHECK-NEXT: ret 312entry: 313 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 895) ; ~0x80 = ~"+subnormal" 314 ret i1 %0 315} 316 317define i1 @is_minus_subnormal_f(float %x) { 318; CHECK-LABEL: is_minus_subnormal_f: 319; CHECK: # %bb.0: # %entry 320; CHECK-NEXT: fclass.s $fa0, $fa0 321; CHECK-NEXT: movfr2gr.s $a0, $fa0 322; CHECK-NEXT: andi $a0, $a0, 16 323; CHECK-NEXT: sltu $a0, $zero, $a0 324; CHECK-NEXT: ret 325entry: 326 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 16) ; 0x10 = "-subnormal" 327 ret i1 %0 328} 329 330define i1 @not_is_minus_subnormal_f(float %x) { 331; CHECK-LABEL: not_is_minus_subnormal_f: 332; CHECK: # %bb.0: # %entry 333; CHECK-NEXT: fclass.s $fa0, $fa0 334; CHECK-NEXT: movfr2gr.s $a0, $fa0 335; CHECK-NEXT: andi $a0, $a0, 1007 336; CHECK-NEXT: sltu $a0, $zero, $a0 337; CHECK-NEXT: ret 338entry: 339 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1007) ; ~0x10 = ~"-subnormal" 340 ret i1 %0 341} 342 343define i1 @iszero_f(float %x) { 344; CHECK-LABEL: iszero_f: 345; CHECK: # %bb.0: # %entry 346; CHECK-NEXT: fclass.s $fa0, $fa0 347; CHECK-NEXT: movfr2gr.s $a0, $fa0 348; CHECK-NEXT: andi $a0, $a0, 544 349; CHECK-NEXT: sltu $a0, $zero, $a0 350; CHECK-NEXT: ret 351entry: 352 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96) ; 0x60 = "zero" 353 ret i1 %0 354} 355 356define i1 @not_iszero_f(float %x) { 357; CHECK-LABEL: not_iszero_f: 358; CHECK: # %bb.0: # %entry 359; CHECK-NEXT: fclass.s $fa0, $fa0 360; CHECK-NEXT: movfr2gr.s $a0, $fa0 361; CHECK-NEXT: andi $a0, $a0, 479 362; CHECK-NEXT: sltu $a0, $zero, $a0 363; CHECK-NEXT: ret 364entry: 365 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927) ; ~0x60 = "~zero" 366 ret i1 %0 367} 368 369define i1 @issubnormal_or_zero_f(float %x) { 370; CHECK-LABEL: issubnormal_or_zero_f: 371; CHECK: # %bb.0: # %entry 372; CHECK-NEXT: fclass.s $fa0, $fa0 373; CHECK-NEXT: movfr2gr.s $a0, $fa0 374; CHECK-NEXT: andi $a0, $a0, 816 375; CHECK-NEXT: sltu $a0, $zero, $a0 376; CHECK-NEXT: ret 377entry: 378 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240) ; 0xf0 = "subnormal|zero" 379 ret i1 %0 380} 381 382define i1 @not_issubnormal_or_zero_f(float %x) { 383; CHECK-LABEL: not_issubnormal_or_zero_f: 384; CHECK: # %bb.0: # %entry 385; CHECK-NEXT: fclass.s $fa0, $fa0 386; CHECK-NEXT: movfr2gr.s $a0, $fa0 387; CHECK-NEXT: andi $a0, $a0, 207 388; CHECK-NEXT: sltu $a0, $zero, $a0 389; CHECK-NEXT: ret 390entry: 391 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783) ; ~0xf0 = "~(subnormal|zero)" 392 ret i1 %0 393} 394 395define i1 @is_plus_zero_f(float %x) { 396; CHECK-LABEL: is_plus_zero_f: 397; CHECK: # %bb.0: # %entry 398; CHECK-NEXT: fclass.s $fa0, $fa0 399; CHECK-NEXT: movfr2gr.s $a0, $fa0 400; CHECK-NEXT: andi $a0, $a0, 512 401; CHECK-NEXT: sltu $a0, $zero, $a0 402; CHECK-NEXT: ret 403entry: 404 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 64) ; 0x40 = "+zero" 405 ret i1 %0 406} 407 408define i1 @not_is_plus_zero_f(float %x) { 409; CHECK-LABEL: not_is_plus_zero_f: 410; CHECK: # %bb.0: # %entry 411; CHECK-NEXT: fclass.s $fa0, $fa0 412; CHECK-NEXT: movfr2gr.s $a0, $fa0 413; CHECK-NEXT: andi $a0, $a0, 511 414; CHECK-NEXT: sltu $a0, $zero, $a0 415; CHECK-NEXT: ret 416entry: 417 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 959) ; ~0x40 = ~"+zero" 418 ret i1 %0 419} 420 421define i1 @is_minus_zero_f(float %x) { 422; CHECK-LABEL: is_minus_zero_f: 423; CHECK: # %bb.0: # %entry 424; CHECK-NEXT: fclass.s $fa0, $fa0 425; CHECK-NEXT: movfr2gr.s $a0, $fa0 426; CHECK-NEXT: andi $a0, $a0, 32 427; CHECK-NEXT: sltu $a0, $zero, $a0 428; CHECK-NEXT: ret 429entry: 430 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 32) ; 0x20 = "-zero" 431 ret i1 %0 432} 433 434define i1 @not_is_minus_zero_f(float %x) { 435; CHECK-LABEL: not_is_minus_zero_f: 436; CHECK: # %bb.0: # %entry 437; CHECK-NEXT: fclass.s $fa0, $fa0 438; CHECK-NEXT: movfr2gr.s $a0, $fa0 439; CHECK-NEXT: andi $a0, $a0, 991 440; CHECK-NEXT: sltu $a0, $zero, $a0 441; CHECK-NEXT: ret 442entry: 443 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 991) ; ~0x20 = ~"-zero" 444 ret i1 %0 445} 446 447define i1 @isnone_f(float %x) { 448; CHECK-LABEL: isnone_f: 449; CHECK: # %bb.0: # %entry 450; CHECK-NEXT: fclass.s $fa0, $fa0 451; CHECK-NEXT: movfr2gr.s $a0, $fa0 452; CHECK-NEXT: andi $a0, $a0, 0 453; CHECK-NEXT: sltu $a0, $zero, $a0 454; CHECK-NEXT: ret 455entry: 456 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 0) 457 ret i1 %0 458} 459 460define i1 @isany_f(float %x) { 461; CHECK-LABEL: isany_f: 462; CHECK: # %bb.0: # %entry 463; CHECK-NEXT: fclass.s $fa0, $fa0 464; CHECK-NEXT: movfr2gr.s $a0, $fa0 465; CHECK-NEXT: andi $a0, $a0, 1023 466; CHECK-NEXT: sltu $a0, $zero, $a0 467; CHECK-NEXT: ret 468entry: 469 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1023) 470 ret i1 %0 471} 472 473define i1 @iszero_or_nan_f(float %x) { 474; CHECK-LABEL: iszero_or_nan_f: 475; CHECK: # %bb.0: # %entry 476; CHECK-NEXT: fclass.s $fa0, $fa0 477; CHECK-NEXT: movfr2gr.s $a0, $fa0 478; CHECK-NEXT: andi $a0, $a0, 547 479; CHECK-NEXT: sltu $a0, $zero, $a0 480; CHECK-NEXT: ret 481entry: 482 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99) ; 0x60|0x3 = "zero|nan" 483 ret i1 %0 484} 485 486define i1 @not_iszero_or_nan_f(float %x) { 487; CHECK-LABEL: not_iszero_or_nan_f: 488; CHECK: # %bb.0: # %entry 489; CHECK-NEXT: fclass.s $fa0, $fa0 490; CHECK-NEXT: movfr2gr.s $a0, $fa0 491; CHECK-NEXT: andi $a0, $a0, 476 492; CHECK-NEXT: sltu $a0, $zero, $a0 493; CHECK-NEXT: ret 494entry: 495 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924) ; ~0x60 = "~(zero|nan)" 496 ret i1 %0 497} 498 499define i1 @iszero_or_qnan_f(float %x) { 500; CHECK-LABEL: iszero_or_qnan_f: 501; CHECK: # %bb.0: # %entry 502; CHECK-NEXT: fclass.s $fa0, $fa0 503; CHECK-NEXT: movfr2gr.s $a0, $fa0 504; CHECK-NEXT: andi $a0, $a0, 546 505; CHECK-NEXT: sltu $a0, $zero, $a0 506; CHECK-NEXT: ret 507entry: 508 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 98) ; 0x60|0x2 = "zero|qnan" 509 ret i1 %0 510} 511 512define i1 @iszero_or_snan_f(float %x) { 513; CHECK-LABEL: iszero_or_snan_f: 514; CHECK: # %bb.0: # %entry 515; CHECK-NEXT: fclass.s $fa0, $fa0 516; CHECK-NEXT: movfr2gr.s $a0, $fa0 517; CHECK-NEXT: andi $a0, $a0, 545 518; CHECK-NEXT: sltu $a0, $zero, $a0 519; CHECK-NEXT: ret 520entry: 521 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 97) ; 0x60|0x1 = "zero|snan" 522 ret i1 %0 523} 524 525define i1 @not_iszero_or_qnan_f(float %x) { 526; CHECK-LABEL: not_iszero_or_qnan_f: 527; CHECK: # %bb.0: # %entry 528; CHECK-NEXT: fclass.s $fa0, $fa0 529; CHECK-NEXT: movfr2gr.s $a0, $fa0 530; CHECK-NEXT: andi $a0, $a0, 477 531; CHECK-NEXT: sltu $a0, $zero, $a0 532; CHECK-NEXT: ret 533entry: 534 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 925) ; ~(0x60|0x2) = "~(zero|qnan)" 535 ret i1 %0 536} 537 538define i1 @not_iszero_or_snan_f(float %x) { 539; CHECK-LABEL: not_iszero_or_snan_f: 540; CHECK: # %bb.0: # %entry 541; CHECK-NEXT: fclass.s $fa0, $fa0 542; CHECK-NEXT: movfr2gr.s $a0, $fa0 543; CHECK-NEXT: andi $a0, $a0, 478 544; CHECK-NEXT: sltu $a0, $zero, $a0 545; CHECK-NEXT: ret 546entry: 547 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 926) ; ~(0x60|0x1) = "~(zero|snan)" 548 ret i1 %0 549} 550 551define i1 @isinf_or_nan_f(float %x) { 552; CHECK-LABEL: isinf_or_nan_f: 553; CHECK: # %bb.0: # %entry 554; CHECK-NEXT: fclass.s $fa0, $fa0 555; CHECK-NEXT: movfr2gr.s $a0, $fa0 556; CHECK-NEXT: andi $a0, $a0, 71 557; CHECK-NEXT: sltu $a0, $zero, $a0 558; CHECK-NEXT: ret 559entry: 560 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; 0x204|0x3 = "inf|nan" 561 ret i1 %0 562} 563 564define i1 @not_isinf_or_nan_f(float %x) { 565; CHECK-LABEL: not_isinf_or_nan_f: 566; CHECK: # %bb.0: # %entry 567; CHECK-NEXT: fclass.s $fa0, $fa0 568; CHECK-NEXT: movfr2gr.s $a0, $fa0 569; CHECK-NEXT: andi $a0, $a0, 952 570; CHECK-NEXT: sltu $a0, $zero, $a0 571; CHECK-NEXT: ret 572entry: 573 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; ~(0x204|0x3) = "~(inf|nan)" 574 ret i1 %0 575} 576 577define i1 @isfinite_or_nan_f(float %x) { 578; CHECK-LABEL: isfinite_or_nan_f: 579; CHECK: # %bb.0: # %entry 580; CHECK-NEXT: fclass.s $fa0, $fa0 581; CHECK-NEXT: movfr2gr.s $a0, $fa0 582; CHECK-NEXT: andi $a0, $a0, 955 583; CHECK-NEXT: sltu $a0, $zero, $a0 584; CHECK-NEXT: ret 585entry: 586 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507) ; 0x1f8|0x3 = "finite|nan" 587 ret i1 %0 588} 589 590define i1 @not_isfinite_or_nan_f(float %x) { 591; CHECK-LABEL: not_isfinite_or_nan_f: 592; CHECK: # %bb.0: # %entry 593; CHECK-NEXT: fclass.s $fa0, $fa0 594; CHECK-NEXT: movfr2gr.s $a0, $fa0 595; CHECK-NEXT: andi $a0, $a0, 68 596; CHECK-NEXT: sltu $a0, $zero, $a0 597; CHECK-NEXT: ret 598entry: 599 %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516) ; ~(0x1f8|0x3) = "~(finite|nan)" 600 ret i1 %0 601} 602 603define i1 @is_plus_inf_or_nan_f(float %x) { 604; CHECK-LABEL: is_plus_inf_or_nan_f: 605; CHECK: # %bb.0: 606; CHECK-NEXT: fclass.s $fa0, $fa0 607; CHECK-NEXT: movfr2gr.s $a0, $fa0 608; CHECK-NEXT: andi $a0, $a0, 67 609; CHECK-NEXT: sltu $a0, $zero, $a0 610; CHECK-NEXT: ret 611 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 515) ; 0x200|0x3 = "+inf|nan" 612 ret i1 %class 613} 614 615define i1 @is_minus_inf_or_nan_f(float %x) { 616; CHECK-LABEL: is_minus_inf_or_nan_f: 617; CHECK: # %bb.0: 618; CHECK-NEXT: fclass.s $fa0, $fa0 619; CHECK-NEXT: movfr2gr.s $a0, $fa0 620; CHECK-NEXT: andi $a0, $a0, 7 621; CHECK-NEXT: sltu $a0, $zero, $a0 622; CHECK-NEXT: ret 623 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 7) ; "-inf|nan" 624 ret i1 %class 625} 626 627define i1 @not_is_plus_inf_or_nan_f(float %x) { 628; CHECK-LABEL: not_is_plus_inf_or_nan_f: 629; CHECK: # %bb.0: 630; CHECK-NEXT: fclass.s $fa0, $fa0 631; CHECK-NEXT: movfr2gr.s $a0, $fa0 632; CHECK-NEXT: andi $a0, $a0, 956 633; CHECK-NEXT: sltu $a0, $zero, $a0 634; CHECK-NEXT: ret 635 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 508) ; ~(0x200|0x3) = "~(+inf|nan)" 636 ret i1 %class 637} 638 639define i1 @not_is_minus_inf_or_nan_f(float %x) { 640; CHECK-LABEL: not_is_minus_inf_or_nan_f: 641; CHECK: # %bb.0: 642; CHECK-NEXT: fclass.s $fa0, $fa0 643; CHECK-NEXT: movfr2gr.s $a0, $fa0 644; CHECK-NEXT: andi $a0, $a0, 1016 645; CHECK-NEXT: sltu $a0, $zero, $a0 646; CHECK-NEXT: ret 647 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1016) ; "~(-inf|nan)" 648 ret i1 %class 649} 650 651define i1 @is_plus_inf_or_snan_f(float %x) { 652; CHECK-LABEL: is_plus_inf_or_snan_f: 653; CHECK: # %bb.0: 654; CHECK-NEXT: fclass.s $fa0, $fa0 655; CHECK-NEXT: movfr2gr.s $a0, $fa0 656; CHECK-NEXT: andi $a0, $a0, 65 657; CHECK-NEXT: sltu $a0, $zero, $a0 658; CHECK-NEXT: ret 659 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 513) ; 0x200|0x1 = "+inf|snan" 660 ret i1 %class 661} 662 663define i1 @is_plus_inf_or_qnan_f(float %x) { 664; CHECK-LABEL: is_plus_inf_or_qnan_f: 665; CHECK: # %bb.0: 666; CHECK-NEXT: fclass.s $fa0, $fa0 667; CHECK-NEXT: movfr2gr.s $a0, $fa0 668; CHECK-NEXT: andi $a0, $a0, 66 669; CHECK-NEXT: sltu $a0, $zero, $a0 670; CHECK-NEXT: ret 671 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 514) ; 0x200|0x1 = "+inf|qnan" 672 ret i1 %class 673} 674 675define i1 @not_is_plus_inf_or_snan_f(float %x) { 676; CHECK-LABEL: not_is_plus_inf_or_snan_f: 677; CHECK: # %bb.0: 678; CHECK-NEXT: fclass.s $fa0, $fa0 679; CHECK-NEXT: movfr2gr.s $a0, $fa0 680; CHECK-NEXT: andi $a0, $a0, 958 681; CHECK-NEXT: sltu $a0, $zero, $a0 682; CHECK-NEXT: ret 683 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 510) ; ~(+inf|snan) 684 ret i1 %class 685} 686 687define i1 @not_is_plus_inf_or_qnan_f(float %x) { 688; CHECK-LABEL: not_is_plus_inf_or_qnan_f: 689; CHECK: # %bb.0: 690; CHECK-NEXT: fclass.s $fa0, $fa0 691; CHECK-NEXT: movfr2gr.s $a0, $fa0 692; CHECK-NEXT: andi $a0, $a0, 957 693; CHECK-NEXT: sltu $a0, $zero, $a0 694; CHECK-NEXT: ret 695 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 509) ; ~(+inf|qnan) 696 ret i1 %class 697} 698 699define i1 @is_minus_inf_or_snan_f(float %x) { 700; CHECK-LABEL: is_minus_inf_or_snan_f: 701; CHECK: # %bb.0: 702; CHECK-NEXT: fclass.s $fa0, $fa0 703; CHECK-NEXT: movfr2gr.s $a0, $fa0 704; CHECK-NEXT: andi $a0, $a0, 5 705; CHECK-NEXT: sltu $a0, $zero, $a0 706; CHECK-NEXT: ret 707 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 5) ; "-inf|snan" 708 ret i1 %class 709} 710 711define i1 @is_minus_inf_or_qnan_f(float %x) { 712; CHECK-LABEL: is_minus_inf_or_qnan_f: 713; CHECK: # %bb.0: 714; CHECK-NEXT: fclass.s $fa0, $fa0 715; CHECK-NEXT: movfr2gr.s $a0, $fa0 716; CHECK-NEXT: andi $a0, $a0, 6 717; CHECK-NEXT: sltu $a0, $zero, $a0 718; CHECK-NEXT: ret 719 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 6) ; "-inf|qnan" 720 ret i1 %class 721} 722 723define i1 @not_is_minus_inf_or_snan_f(float %x) { 724; CHECK-LABEL: not_is_minus_inf_or_snan_f: 725; CHECK: # %bb.0: 726; CHECK-NEXT: fclass.s $fa0, $fa0 727; CHECK-NEXT: movfr2gr.s $a0, $fa0 728; CHECK-NEXT: andi $a0, $a0, 1018 729; CHECK-NEXT: sltu $a0, $zero, $a0 730; CHECK-NEXT: ret 731 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1018) ; "~(-inf|snan)" 732 ret i1 %class 733} 734 735define i1 @not_is_minus_inf_or_qnan_f(float %x) { 736; CHECK-LABEL: not_is_minus_inf_or_qnan_f: 737; CHECK: # %bb.0: 738; CHECK-NEXT: fclass.s $fa0, $fa0 739; CHECK-NEXT: movfr2gr.s $a0, $fa0 740; CHECK-NEXT: andi $a0, $a0, 1017 741; CHECK-NEXT: sltu $a0, $zero, $a0 742; CHECK-NEXT: ret 743 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1017) ; "-inf|qnan" 744 ret i1 %class 745} 746 747define i1 @issubnormal_or_nan_f(float %x) { 748; CHECK-LABEL: issubnormal_or_nan_f: 749; CHECK: # %bb.0: 750; CHECK-NEXT: fclass.s $fa0, $fa0 751; CHECK-NEXT: movfr2gr.s $a0, $fa0 752; CHECK-NEXT: andi $a0, $a0, 275 753; CHECK-NEXT: sltu $a0, $zero, $a0 754; CHECK-NEXT: ret 755 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 147) ; 0x90|0x3 = "subnormal|nan" 756 ret i1 %class 757} 758 759define i1 @issubnormal_or_zero_or_nan_f(float %x) { 760; CHECK-LABEL: issubnormal_or_zero_or_nan_f: 761; CHECK: # %bb.0: 762; CHECK-NEXT: fclass.s $fa0, $fa0 763; CHECK-NEXT: movfr2gr.s $a0, $fa0 764; CHECK-NEXT: andi $a0, $a0, 819 765; CHECK-NEXT: sltu $a0, $zero, $a0 766; CHECK-NEXT: ret 767 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 243) ; 0xf0|0x3 = "subnormal|zero|nan" 768 ret i1 %class 769} 770 771define i1 @issubnormal_or_zero_or_snan_f(float %x) { 772; CHECK-LABEL: issubnormal_or_zero_or_snan_f: 773; CHECK: # %bb.0: 774; CHECK-NEXT: fclass.s $fa0, $fa0 775; CHECK-NEXT: movfr2gr.s $a0, $fa0 776; CHECK-NEXT: andi $a0, $a0, 817 777; CHECK-NEXT: sltu $a0, $zero, $a0 778; CHECK-NEXT: ret 779 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 241) ; 0x90|0x1 = "subnormal|snan" 780 ret i1 %class 781} 782 783define i1 @issubnormal_or_zero_or_qnan_f(float %x) { 784; CHECK-LABEL: issubnormal_or_zero_or_qnan_f: 785; CHECK: # %bb.0: 786; CHECK-NEXT: fclass.s $fa0, $fa0 787; CHECK-NEXT: movfr2gr.s $a0, $fa0 788; CHECK-NEXT: andi $a0, $a0, 818 789; CHECK-NEXT: sltu $a0, $zero, $a0 790; CHECK-NEXT: ret 791 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 242) ; 0x90|0x2 = "subnormal|qnan" 792 ret i1 %class 793} 794 795define i1 @not_issubnormal_or_nan_f(float %x) { 796; CHECK-LABEL: not_issubnormal_or_nan_f: 797; CHECK: # %bb.0: 798; CHECK-NEXT: fclass.s $fa0, $fa0 799; CHECK-NEXT: movfr2gr.s $a0, $fa0 800; CHECK-NEXT: andi $a0, $a0, 748 801; CHECK-NEXT: sltu $a0, $zero, $a0 802; CHECK-NEXT: ret 803 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 876) ; ~(0x90|0x3) = ~"subnormal|nan" 804 ret i1 %class 805} 806 807define i1 @not_issubnormal_or_zero_or_nan_f(float %x) { 808; CHECK-LABEL: not_issubnormal_or_zero_or_nan_f: 809; CHECK: # %bb.0: 810; CHECK-NEXT: fclass.s $fa0, $fa0 811; CHECK-NEXT: movfr2gr.s $a0, $fa0 812; CHECK-NEXT: andi $a0, $a0, 204 813; CHECK-NEXT: sltu $a0, $zero, $a0 814; CHECK-NEXT: ret 815 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 780) ; ~(0xf0|0x3) = ~"subnormal|zero|nan" 816 ret i1 %class 817} 818 819define i1 @not_issubnormal_or_zero_or_snan_f(float %x) { 820; CHECK-LABEL: not_issubnormal_or_zero_or_snan_f: 821; CHECK: # %bb.0: 822; CHECK-NEXT: fclass.s $fa0, $fa0 823; CHECK-NEXT: movfr2gr.s $a0, $fa0 824; CHECK-NEXT: andi $a0, $a0, 206 825; CHECK-NEXT: sltu $a0, $zero, $a0 826; CHECK-NEXT: ret 827 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 782) ; ~(0x90|0x1) = ~"subnormal|snan" 828 ret i1 %class 829} 830 831define i1 @not_issubnormal_or_zero_or_qnan_f(float %x) { 832; CHECK-LABEL: not_issubnormal_or_zero_or_qnan_f: 833; CHECK: # %bb.0: 834; CHECK-NEXT: fclass.s $fa0, $fa0 835; CHECK-NEXT: movfr2gr.s $a0, $fa0 836; CHECK-NEXT: andi $a0, $a0, 205 837; CHECK-NEXT: sltu $a0, $zero, $a0 838; CHECK-NEXT: ret 839 %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 781) ; ~(0x90|0x2) = ~"subnormal|qnan" 840 ret i1 %class 841} 842 843declare i1 @llvm.is.fpclass.f32(float, i32) 844