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