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 4 5define i1 @is_nan_f80(x86_fp80 %x) nounwind { 6; X86-LABEL: is_nan_f80: 7; X86: # %bb.0: # %entry 8; X86-NEXT: fldt {{[0-9]+}}(%esp) 9; X86-NEXT: fucomp %st(0) 10; X86-NEXT: fnstsw %ax 11; X86-NEXT: # kill: def $ah killed $ah killed $ax 12; X86-NEXT: sahf 13; X86-NEXT: setp %al 14; X86-NEXT: retl 15; 16; X64-LABEL: is_nan_f80: 17; X64: # %bb.0: # %entry 18; X64-NEXT: fldt {{[0-9]+}}(%rsp) 19; X64-NEXT: fucompi %st(0), %st 20; X64-NEXT: setp %al 21; X64-NEXT: retq 22entry: 23 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3) ; "nan" 24 ret i1 %0 25} 26 27define i1 @is_nan_f80_strict(x86_fp80 %x) nounwind strictfp { 28; X86-LABEL: is_nan_f80_strict: 29; X86: # %bb.0: # %entry 30; X86-NEXT: pushl %esi 31; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 32; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 33; X86-NEXT: andl $32767, %ecx # imm = 0x7FFF 34; X86-NEXT: xorl %edx, %edx 35; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edx 36; X86-NEXT: movl $-2147483648, %esi # imm = 0x80000000 37; X86-NEXT: sbbl %eax, %esi 38; X86-NEXT: movl $32767, %esi # imm = 0x7FFF 39; X86-NEXT: sbbl %ecx, %esi 40; X86-NEXT: sbbl %edx, %edx 41; X86-NEXT: setl %dl 42; X86-NEXT: testl %ecx, %ecx 43; X86-NEXT: sete %cl 44; X86-NEXT: shrl $31, %eax 45; X86-NEXT: xorb %cl, %al 46; X86-NEXT: xorb $1, %al 47; X86-NEXT: orb %dl, %al 48; X86-NEXT: # kill: def $al killed $al killed $eax 49; X86-NEXT: popl %esi 50; X86-NEXT: retl 51; 52; X64-LABEL: is_nan_f80_strict: 53; X64: # %bb.0: # %entry 54; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 55; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx 56; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 57; X64-NEXT: movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000 58; X64-NEXT: cmpq %rcx, %rdx 59; X64-NEXT: movl $32767, %edx # imm = 0x7FFF 60; X64-NEXT: sbbq %rax, %rdx 61; X64-NEXT: setl %dl 62; X64-NEXT: shrq $63, %rcx 63; X64-NEXT: testq %rax, %rax 64; X64-NEXT: sete %al 65; X64-NEXT: xorb %cl, %al 66; X64-NEXT: xorb $1, %al 67; X64-NEXT: orb %dl, %al 68; X64-NEXT: retq 69entry: 70 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3) strictfp ; "nan" 71 ret i1 %0 72} 73 74define i1 @is_snan_f80(x86_fp80 %x) nounwind { 75; X86-LABEL: is_snan_f80: 76; X86: # %bb.0: # %entry 77; X86-NEXT: pushl %ebx 78; X86-NEXT: pushl %esi 79; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 80; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 81; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 82; X86-NEXT: xorl %ecx, %ecx 83; X86-NEXT: cmpl {{[0-9]+}}(%esp), %ecx 84; X86-NEXT: movl $-2147483648, %esi # imm = 0x80000000 85; X86-NEXT: sbbl %edx, %esi 86; X86-NEXT: movl $32767, %esi # imm = 0x7FFF 87; X86-NEXT: sbbl %eax, %esi 88; X86-NEXT: movl $0, %esi 89; X86-NEXT: sbbl %esi, %esi 90; X86-NEXT: setl %bl 91; X86-NEXT: cmpl $-1073741824, %edx # imm = 0xC0000000 92; X86-NEXT: sbbl $32767, %eax # imm = 0x7FFF 93; X86-NEXT: sbbl %ecx, %ecx 94; X86-NEXT: setl %al 95; X86-NEXT: andb %bl, %al 96; X86-NEXT: popl %esi 97; X86-NEXT: popl %ebx 98; X86-NEXT: retl 99; 100; X64-LABEL: is_snan_f80: 101; X64: # %bb.0: # %entry 102; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 103; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx 104; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 105; X64-NEXT: movabsq $-4611686018427387904, %rdx # imm = 0xC000000000000000 106; X64-NEXT: cmpq %rdx, %rcx 107; X64-NEXT: movq %rax, %rdx 108; X64-NEXT: sbbq $32767, %rdx # imm = 0x7FFF 109; X64-NEXT: setl %dl 110; X64-NEXT: movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000 111; X64-NEXT: cmpq %rcx, %rsi 112; X64-NEXT: movl $32767, %ecx # imm = 0x7FFF 113; X64-NEXT: sbbq %rax, %rcx 114; X64-NEXT: setl %al 115; X64-NEXT: andb %dl, %al 116; X64-NEXT: retq 117entry: 118 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 1) ; "snan" 119 ret i1 %0 120} 121 122define i1 @is_qnan_f80(x86_fp80 %x) nounwind { 123; X86-LABEL: is_qnan_f80: 124; X86: # %bb.0: # %entry 125; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 126; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 127; X86-NEXT: xorl %ecx, %ecx 128; X86-NEXT: movl $-1073741825, %edx # imm = 0xBFFFFFFF 129; X86-NEXT: cmpl {{[0-9]+}}(%esp), %edx 130; X86-NEXT: movl $32767, %edx # imm = 0x7FFF 131; X86-NEXT: sbbl %eax, %edx 132; X86-NEXT: sbbl %ecx, %ecx 133; X86-NEXT: setl %al 134; X86-NEXT: retl 135; 136; X64-LABEL: is_qnan_f80: 137; X64: # %bb.0: # %entry 138; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 139; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 140; X64-NEXT: movabsq $-4611686018427387905, %rcx # imm = 0xBFFFFFFFFFFFFFFF 141; X64-NEXT: cmpq {{[0-9]+}}(%rsp), %rcx 142; X64-NEXT: movl $32767, %ecx # imm = 0x7FFF 143; X64-NEXT: sbbq %rax, %rcx 144; X64-NEXT: setl %al 145; X64-NEXT: retq 146entry: 147 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 2) ; "qnan" 148 ret i1 %0 149} 150 151define i1 @is_zero_f80(x86_fp80 %x) nounwind { 152; X86-LABEL: is_zero_f80: 153; X86: # %bb.0: # %entry 154; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 155; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 156; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 157; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 158; X86-NEXT: sete %al 159; X86-NEXT: retl 160; 161; X64-LABEL: is_zero_f80: 162; X64: # %bb.0: # %entry 163; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 164; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 165; X64-NEXT: orq {{[0-9]+}}(%rsp), %rax 166; X64-NEXT: sete %al 167; X64-NEXT: retq 168entry: 169 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96) ; 0x60 = "zero" 170 ret i1 %0 171} 172 173define i1 @is_zero_f80_strict(x86_fp80 %x) nounwind strictfp { 174; X86-LABEL: is_zero_f80_strict: 175; X86: # %bb.0: # %entry 176; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 177; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 178; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 179; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 180; X86-NEXT: sete %al 181; X86-NEXT: retl 182; 183; X64-LABEL: is_zero_f80_strict: 184; X64: # %bb.0: # %entry 185; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 186; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 187; X64-NEXT: orq {{[0-9]+}}(%rsp), %rax 188; X64-NEXT: sete %al 189; X64-NEXT: retq 190entry: 191 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96) strictfp ; 0x60 = "zero" 192 ret i1 %0 193} 194 195define i1 @is_poszero_f80(x86_fp80 %x) nounwind { 196; X86-LABEL: is_poszero_f80: 197; X86: # %bb.0: # %entry 198; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 199; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 200; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 201; X86-NEXT: sete %al 202; X86-NEXT: retl 203; 204; X64-LABEL: is_poszero_f80: 205; X64: # %bb.0: # %entry 206; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 207; X64-NEXT: orq {{[0-9]+}}(%rsp), %rax 208; X64-NEXT: sete %al 209; X64-NEXT: retq 210entry: 211 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 64) ; 0x40 = "+zero" 212 ret i1 %0 213} 214 215define i1 @is_negzero_f80(x86_fp80 %x) nounwind { 216; X86-LABEL: is_negzero_f80: 217; X86: # %bb.0: # %entry 218; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 219; X86-NEXT: xorl $32768, %eax # imm = 0x8000 220; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 221; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 222; X86-NEXT: sete %al 223; X86-NEXT: retl 224; 225; X64-LABEL: is_negzero_f80: 226; X64: # %bb.0: # %entry 227; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 228; X64-NEXT: xorq $32768, %rax # imm = 0x8000 229; X64-NEXT: orq {{[0-9]+}}(%rsp), %rax 230; X64-NEXT: sete %al 231; X64-NEXT: retq 232entry: 233 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 32) ; 0x20 = "-zero" 234 ret i1 %0 235} 236 237define i1 @is_inf_f80(x86_fp80 %x) nounwind { 238; X86-LABEL: is_inf_f80: 239; X86: # %bb.0: # %entry 240; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 241; X86-NEXT: notl %eax 242; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 243; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx 244; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 245; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 246; X86-NEXT: orl %ecx, %eax 247; X86-NEXT: sete %al 248; X86-NEXT: retl 249; 250; X64-LABEL: is_inf_f80: 251; X64: # %bb.0: # %entry 252; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax 253; X64-NEXT: notl %eax 254; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 255; X64-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 256; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 257; X64-NEXT: orq %rcx, %rax 258; X64-NEXT: sete %al 259; X64-NEXT: retq 260entry: 261 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 516) ; 0x204 = "inf" 262 ret i1 %0 263} 264 265define i1 @is_posinf_f80(x86_fp80 %x) nounwind { 266; X86-LABEL: is_posinf_f80: 267; X86: # %bb.0: # %entry 268; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 269; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 270; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx 271; X86-NEXT: xorl $32767, %eax # imm = 0x7FFF 272; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 273; X86-NEXT: orl %ecx, %eax 274; X86-NEXT: sete %al 275; X86-NEXT: retl 276; 277; X64-LABEL: is_posinf_f80: 278; X64: # %bb.0: # %entry 279; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 280; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 281; X64-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 282; X64-NEXT: xorq $32767, %rax # imm = 0x7FFF 283; X64-NEXT: orq %rcx, %rax 284; X64-NEXT: sete %al 285; X64-NEXT: retq 286entry: 287 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 512) ; 0x200 = "+inf" 288 ret i1 %0 289} 290 291define i1 @is_neginf_f80(x86_fp80 %x) nounwind { 292; X86-LABEL: is_neginf_f80: 293; X86: # %bb.0: # %entry 294; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 295; X86-NEXT: xorl $65535, %eax # imm = 0xFFFF 296; X86-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 297; X86-NEXT: xorl {{[0-9]+}}(%esp), %ecx 298; X86-NEXT: orl {{[0-9]+}}(%esp), %eax 299; X86-NEXT: orl %ecx, %eax 300; X86-NEXT: sete %al 301; X86-NEXT: retl 302; 303; X64-LABEL: is_neginf_f80: 304; X64: # %bb.0: # %entry 305; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 306; X64-NEXT: xorq $65535, %rax # imm = 0xFFFF 307; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 308; X64-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 309; X64-NEXT: orq %rax, %rcx 310; X64-NEXT: sete %al 311; X64-NEXT: retq 312entry: 313 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 4) ; "-inf" 314 ret i1 %0 315} 316 317define i1 @is_normal_f80(x86_fp80 %x) nounwind { 318; X86-LABEL: is_normal_f80: 319; X86: # %bb.0: # %entry 320; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 321; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 322; X86-NEXT: andl $32767, %ecx # imm = 0x7FFF 323; X86-NEXT: decl %ecx 324; X86-NEXT: movzwl %cx, %ecx 325; X86-NEXT: xorl %edx, %edx 326; X86-NEXT: cmpl $32766, %ecx # imm = 0x7FFE 327; X86-NEXT: sbbl %edx, %edx 328; X86-NEXT: setb %cl 329; X86-NEXT: shrl $31, %eax 330; X86-NEXT: andb %cl, %al 331; X86-NEXT: # kill: def $al killed $al killed $eax 332; X86-NEXT: retl 333; 334; X64-LABEL: is_normal_f80: 335; X64: # %bb.0: # %entry 336; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 337; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx 338; X64-NEXT: shrq $63, %rcx 339; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 340; X64-NEXT: decl %eax 341; X64-NEXT: movzwl %ax, %eax 342; X64-NEXT: cmpl $32766, %eax # imm = 0x7FFE 343; X64-NEXT: setb %al 344; X64-NEXT: andb %cl, %al 345; X64-NEXT: retq 346entry: 347 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 264) ; 0x108 = "normal" 348 ret i1 %0 349} 350 351define i1 @is_posnormal_f80(x86_fp80 %x) nounwind { 352; X86-LABEL: is_posnormal_f80: 353; X86: # %bb.0: # %entry 354; X86-NEXT: pushl %esi 355; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 356; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 357; X86-NEXT: movl %ecx, %edx 358; X86-NEXT: andl $32767, %edx # imm = 0x7FFF 359; X86-NEXT: decl %edx 360; X86-NEXT: movzwl %dx, %edx 361; X86-NEXT: xorl %esi, %esi 362; X86-NEXT: cmpl $32766, %edx # imm = 0x7FFE 363; X86-NEXT: sbbl %esi, %esi 364; X86-NEXT: setb %dl 365; X86-NEXT: testl $32768, %ecx # imm = 0x8000 366; X86-NEXT: sete %cl 367; X86-NEXT: shrl $31, %eax 368; X86-NEXT: andb %cl, %al 369; X86-NEXT: andb %dl, %al 370; X86-NEXT: # kill: def $al killed $al killed $eax 371; X86-NEXT: popl %esi 372; X86-NEXT: retl 373; 374; X64-LABEL: is_posnormal_f80: 375; X64: # %bb.0: # %entry 376; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax 377; X64-NEXT: movswq {{[0-9]+}}(%rsp), %rcx 378; X64-NEXT: testq %rcx, %rcx 379; X64-NEXT: setns %dl 380; X64-NEXT: andl $32767, %ecx # imm = 0x7FFF 381; X64-NEXT: decl %ecx 382; X64-NEXT: movzwl %cx, %ecx 383; X64-NEXT: cmpl $32766, %ecx # imm = 0x7FFE 384; X64-NEXT: setb %cl 385; X64-NEXT: shrq $63, %rax 386; X64-NEXT: andb %dl, %al 387; X64-NEXT: andb %cl, %al 388; X64-NEXT: # kill: def $al killed $al killed $rax 389; X64-NEXT: retq 390entry: 391 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 256) ; 0x100 = "+normal" 392 ret i1 %0 393} 394 395define i1 @is_negnormal_f80(x86_fp80 %x) nounwind { 396; X86-LABEL: is_negnormal_f80: 397; X86: # %bb.0: # %entry 398; X86-NEXT: pushl %esi 399; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 400; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 401; X86-NEXT: movl %ecx, %edx 402; X86-NEXT: andl $32767, %edx # imm = 0x7FFF 403; X86-NEXT: decl %edx 404; X86-NEXT: movzwl %dx, %edx 405; X86-NEXT: xorl %esi, %esi 406; X86-NEXT: cmpl $32766, %edx # imm = 0x7FFE 407; X86-NEXT: sbbl %esi, %esi 408; X86-NEXT: setb %dl 409; X86-NEXT: testl $32768, %ecx # imm = 0x8000 410; X86-NEXT: setne %cl 411; X86-NEXT: shrl $31, %eax 412; X86-NEXT: andb %cl, %al 413; X86-NEXT: andb %dl, %al 414; X86-NEXT: # kill: def $al killed $al killed $eax 415; X86-NEXT: popl %esi 416; X86-NEXT: retl 417; 418; X64-LABEL: is_negnormal_f80: 419; X64: # %bb.0: # %entry 420; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax 421; X64-NEXT: movswq {{[0-9]+}}(%rsp), %rcx 422; X64-NEXT: testq %rcx, %rcx 423; X64-NEXT: sets %dl 424; X64-NEXT: andl $32767, %ecx # imm = 0x7FFF 425; X64-NEXT: decl %ecx 426; X64-NEXT: movzwl %cx, %ecx 427; X64-NEXT: cmpl $32766, %ecx # imm = 0x7FFE 428; X64-NEXT: setb %cl 429; X64-NEXT: shrq $63, %rax 430; X64-NEXT: andb %dl, %al 431; X64-NEXT: andb %cl, %al 432; X64-NEXT: # kill: def $al killed $al killed $rax 433; X64-NEXT: retq 434entry: 435 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 8) ; "-normal" 436 ret i1 %0 437} 438 439define i1 @is_subnormal_f80(x86_fp80 %x) nounwind { 440; X86-LABEL: is_subnormal_f80: 441; X86: # %bb.0: # %entry 442; X86-NEXT: pushl %esi 443; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 444; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 445; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 446; X86-NEXT: andl $32767, %eax # imm = 0x7FFF 447; X86-NEXT: xorl %edx, %edx 448; X86-NEXT: addl $-1, %esi 449; X86-NEXT: adcl $-1, %ecx 450; X86-NEXT: adcl $-1, %eax 451; X86-NEXT: adcl $-1, %edx 452; X86-NEXT: cmpl $-1, %esi 453; X86-NEXT: sbbl $2147483647, %ecx # imm = 0x7FFFFFFF 454; X86-NEXT: sbbl $0, %eax 455; X86-NEXT: sbbl $0, %edx 456; X86-NEXT: setb %al 457; X86-NEXT: popl %esi 458; X86-NEXT: retl 459; 460; X64-LABEL: is_subnormal_f80: 461; X64: # %bb.0: # %entry 462; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 463; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx 464; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 465; X64-NEXT: addq $-1, %rcx 466; X64-NEXT: adcq $-1, %rax 467; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 468; X64-NEXT: cmpq %rdx, %rcx 469; X64-NEXT: sbbq $0, %rax 470; X64-NEXT: setb %al 471; X64-NEXT: retq 472entry: 473 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 144) ; 0x90 = "subnormal" 474 ret i1 %0 475} 476 477define i1 @is_possubnormal_f80(x86_fp80 %x) nounwind { 478; X86-LABEL: is_possubnormal_f80: 479; X86: # %bb.0: # %entry 480; X86-NEXT: pushl %esi 481; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 482; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 483; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 484; X86-NEXT: addl $-1, %ecx 485; X86-NEXT: adcl $-1, %edx 486; X86-NEXT: adcl $-1, %eax 487; X86-NEXT: movzwl %ax, %eax 488; X86-NEXT: xorl %esi, %esi 489; X86-NEXT: cmpl $-1, %ecx 490; X86-NEXT: sbbl $2147483647, %edx # imm = 0x7FFFFFFF 491; X86-NEXT: sbbl $0, %eax 492; X86-NEXT: sbbl %esi, %esi 493; X86-NEXT: setb %al 494; X86-NEXT: popl %esi 495; X86-NEXT: retl 496; 497; X64-LABEL: is_possubnormal_f80: 498; X64: # %bb.0: # %entry 499; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax 500; X64-NEXT: movq {{[0-9]+}}(%rsp), %rcx 501; X64-NEXT: addq $-1, %rcx 502; X64-NEXT: adcq $-1, %rax 503; X64-NEXT: movzwl %ax, %eax 504; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF 505; X64-NEXT: cmpq %rdx, %rcx 506; X64-NEXT: sbbq $0, %rax 507; X64-NEXT: setb %al 508; X64-NEXT: retq 509entry: 510 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 128) ; 0x80 = "+subnormal" 511 ret i1 %0 512} 513 514define i1 @is_negsubnormal_f80(x86_fp80 %x) nounwind { 515; X86-LABEL: is_negsubnormal_f80: 516; X86: # %bb.0: # %entry 517; X86-NEXT: pushl %edi 518; X86-NEXT: pushl %esi 519; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 520; X86-NEXT: movl {{[0-9]+}}(%esp), %edx 521; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax 522; X86-NEXT: movl %eax, %ecx 523; X86-NEXT: andl $32767, %ecx # imm = 0x7FFF 524; X86-NEXT: xorl %esi, %esi 525; X86-NEXT: addl $-1, %edi 526; X86-NEXT: adcl $-1, %edx 527; X86-NEXT: adcl $-1, %ecx 528; X86-NEXT: adcl $-1, %esi 529; X86-NEXT: cmpl $-1, %edi 530; X86-NEXT: sbbl $2147483647, %edx # imm = 0x7FFFFFFF 531; X86-NEXT: sbbl $0, %ecx 532; X86-NEXT: sbbl $0, %esi 533; X86-NEXT: setb %cl 534; X86-NEXT: testl $32768, %eax # imm = 0x8000 535; X86-NEXT: setne %al 536; X86-NEXT: andb %cl, %al 537; X86-NEXT: popl %esi 538; X86-NEXT: popl %edi 539; X86-NEXT: retl 540; 541; X64-LABEL: is_negsubnormal_f80: 542; X64: # %bb.0: # %entry 543; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax 544; X64-NEXT: movswq %ax, %rcx 545; X64-NEXT: movq {{[0-9]+}}(%rsp), %rdx 546; X64-NEXT: andl $32767, %eax # imm = 0x7FFF 547; X64-NEXT: addq $-1, %rdx 548; X64-NEXT: adcq $-1, %rax 549; X64-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF 550; X64-NEXT: cmpq %rsi, %rdx 551; X64-NEXT: sbbq $0, %rax 552; X64-NEXT: setb %dl 553; X64-NEXT: testq %rcx, %rcx 554; X64-NEXT: sets %al 555; X64-NEXT: andb %dl, %al 556; X64-NEXT: retq 557entry: 558 %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 16) ; 0x10 = "-subnormal" 559 ret i1 %0 560} 561 562declare i1 @llvm.is.fpclass.f80(x86_fp80, i32) 563