1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-linux | FileCheck %s --check-prefix=X86-X87 3; RUN: llc < %s -mtriple=i686-linux -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE 4; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64 5 6; 7; 32-bit float to unsigned integer 8; 9 10declare i1 @llvm.fptoui.sat.i1.f32 (float) 11declare i8 @llvm.fptoui.sat.i8.f32 (float) 12declare i13 @llvm.fptoui.sat.i13.f32 (float) 13declare i16 @llvm.fptoui.sat.i16.f32 (float) 14declare i19 @llvm.fptoui.sat.i19.f32 (float) 15declare i32 @llvm.fptoui.sat.i32.f32 (float) 16declare i50 @llvm.fptoui.sat.i50.f32 (float) 17declare i64 @llvm.fptoui.sat.i64.f32 (float) 18declare i100 @llvm.fptoui.sat.i100.f32(float) 19declare i128 @llvm.fptoui.sat.i128.f32(float) 20 21define i1 @test_unsigned_i1_f32(float %f) nounwind { 22; X86-X87-LABEL: test_unsigned_i1_f32: 23; X86-X87: # %bb.0: 24; X86-X87-NEXT: subl $8, %esp 25; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 26; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 27; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 28; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 29; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 30; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 31; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 32; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 33; X86-X87-NEXT: fldz 34; X86-X87-NEXT: fxch %st(1) 35; X86-X87-NEXT: fucom %st(1) 36; X86-X87-NEXT: fstp %st(1) 37; X86-X87-NEXT: fnstsw %ax 38; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 39; X86-X87-NEXT: sahf 40; X86-X87-NEXT: jb .LBB0_1 41; X86-X87-NEXT: # %bb.2: 42; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 43; X86-X87-NEXT: jmp .LBB0_3 44; X86-X87-NEXT: .LBB0_1: 45; X86-X87-NEXT: xorl %ecx, %ecx 46; X86-X87-NEXT: .LBB0_3: 47; X86-X87-NEXT: fld1 48; X86-X87-NEXT: fxch %st(1) 49; X86-X87-NEXT: fucompp 50; X86-X87-NEXT: fnstsw %ax 51; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 52; X86-X87-NEXT: sahf 53; X86-X87-NEXT: movb $1, %al 54; X86-X87-NEXT: ja .LBB0_5 55; X86-X87-NEXT: # %bb.4: 56; X86-X87-NEXT: movl %ecx, %eax 57; X86-X87-NEXT: .LBB0_5: 58; X86-X87-NEXT: addl $8, %esp 59; X86-X87-NEXT: retl 60; 61; X86-SSE-LABEL: test_unsigned_i1_f32: 62; X86-SSE: # %bb.0: 63; X86-SSE-NEXT: xorps %xmm0, %xmm0 64; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 65; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 66; X86-SSE-NEXT: minss %xmm0, %xmm1 67; X86-SSE-NEXT: cvttss2si %xmm1, %eax 68; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 69; X86-SSE-NEXT: retl 70; 71; X64-LABEL: test_unsigned_i1_f32: 72; X64: # %bb.0: 73; X64-NEXT: xorps %xmm1, %xmm1 74; X64-NEXT: maxss %xmm0, %xmm1 75; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 76; X64-NEXT: minss %xmm1, %xmm0 77; X64-NEXT: cvttss2si %xmm0, %eax 78; X64-NEXT: # kill: def $al killed $al killed $eax 79; X64-NEXT: retq 80 %x = call i1 @llvm.fptoui.sat.i1.f32(float %f) 81 ret i1 %x 82} 83 84define i8 @test_unsigned_i8_f32(float %f) nounwind { 85; X86-X87-LABEL: test_unsigned_i8_f32: 86; X86-X87: # %bb.0: 87; X86-X87-NEXT: subl $8, %esp 88; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 89; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 90; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 91; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 92; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 93; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 94; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 95; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 96; X86-X87-NEXT: fldz 97; X86-X87-NEXT: fxch %st(1) 98; X86-X87-NEXT: fucom %st(1) 99; X86-X87-NEXT: fstp %st(1) 100; X86-X87-NEXT: fnstsw %ax 101; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 102; X86-X87-NEXT: sahf 103; X86-X87-NEXT: jb .LBB1_1 104; X86-X87-NEXT: # %bb.2: 105; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 106; X86-X87-NEXT: jmp .LBB1_3 107; X86-X87-NEXT: .LBB1_1: 108; X86-X87-NEXT: xorl %ecx, %ecx 109; X86-X87-NEXT: .LBB1_3: 110; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 111; X86-X87-NEXT: fxch %st(1) 112; X86-X87-NEXT: fucompp 113; X86-X87-NEXT: fnstsw %ax 114; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 115; X86-X87-NEXT: sahf 116; X86-X87-NEXT: movb $-1, %al 117; X86-X87-NEXT: ja .LBB1_5 118; X86-X87-NEXT: # %bb.4: 119; X86-X87-NEXT: movl %ecx, %eax 120; X86-X87-NEXT: .LBB1_5: 121; X86-X87-NEXT: addl $8, %esp 122; X86-X87-NEXT: retl 123; 124; X86-SSE-LABEL: test_unsigned_i8_f32: 125; X86-SSE: # %bb.0: 126; X86-SSE-NEXT: xorps %xmm0, %xmm0 127; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 128; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 129; X86-SSE-NEXT: minss %xmm0, %xmm1 130; X86-SSE-NEXT: cvttss2si %xmm1, %eax 131; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 132; X86-SSE-NEXT: retl 133; 134; X64-LABEL: test_unsigned_i8_f32: 135; X64: # %bb.0: 136; X64-NEXT: xorps %xmm1, %xmm1 137; X64-NEXT: maxss %xmm0, %xmm1 138; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 139; X64-NEXT: minss %xmm1, %xmm0 140; X64-NEXT: cvttss2si %xmm0, %eax 141; X64-NEXT: # kill: def $al killed $al killed $eax 142; X64-NEXT: retq 143 %x = call i8 @llvm.fptoui.sat.i8.f32(float %f) 144 ret i8 %x 145} 146 147define i13 @test_unsigned_i13_f32(float %f) nounwind { 148; X86-X87-LABEL: test_unsigned_i13_f32: 149; X86-X87: # %bb.0: 150; X86-X87-NEXT: subl $8, %esp 151; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 152; X86-X87-NEXT: fnstcw (%esp) 153; X86-X87-NEXT: movzwl (%esp), %eax 154; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 155; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 156; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 157; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 158; X86-X87-NEXT: fldcw (%esp) 159; X86-X87-NEXT: fldz 160; X86-X87-NEXT: fxch %st(1) 161; X86-X87-NEXT: fucom %st(1) 162; X86-X87-NEXT: fstp %st(1) 163; X86-X87-NEXT: fnstsw %ax 164; X86-X87-NEXT: xorl %ecx, %ecx 165; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 166; X86-X87-NEXT: sahf 167; X86-X87-NEXT: jb .LBB2_2 168; X86-X87-NEXT: # %bb.1: 169; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 170; X86-X87-NEXT: .LBB2_2: 171; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 172; X86-X87-NEXT: fxch %st(1) 173; X86-X87-NEXT: fucompp 174; X86-X87-NEXT: fnstsw %ax 175; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 176; X86-X87-NEXT: sahf 177; X86-X87-NEXT: movl $8191, %eax # imm = 0x1FFF 178; X86-X87-NEXT: ja .LBB2_4 179; X86-X87-NEXT: # %bb.3: 180; X86-X87-NEXT: movl %ecx, %eax 181; X86-X87-NEXT: .LBB2_4: 182; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 183; X86-X87-NEXT: addl $8, %esp 184; X86-X87-NEXT: retl 185; 186; X86-SSE-LABEL: test_unsigned_i13_f32: 187; X86-SSE: # %bb.0: 188; X86-SSE-NEXT: xorps %xmm0, %xmm0 189; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 190; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 191; X86-SSE-NEXT: minss %xmm0, %xmm1 192; X86-SSE-NEXT: cvttss2si %xmm1, %eax 193; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 194; X86-SSE-NEXT: retl 195; 196; X64-LABEL: test_unsigned_i13_f32: 197; X64: # %bb.0: 198; X64-NEXT: xorps %xmm1, %xmm1 199; X64-NEXT: maxss %xmm0, %xmm1 200; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 201; X64-NEXT: minss %xmm1, %xmm0 202; X64-NEXT: cvttss2si %xmm0, %eax 203; X64-NEXT: # kill: def $ax killed $ax killed $eax 204; X64-NEXT: retq 205 %x = call i13 @llvm.fptoui.sat.i13.f32(float %f) 206 ret i13 %x 207} 208 209define i16 @test_unsigned_i16_f32(float %f) nounwind { 210; X86-X87-LABEL: test_unsigned_i16_f32: 211; X86-X87: # %bb.0: 212; X86-X87-NEXT: subl $8, %esp 213; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 214; X86-X87-NEXT: fnstcw (%esp) 215; X86-X87-NEXT: movzwl (%esp), %eax 216; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 217; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 218; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 219; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 220; X86-X87-NEXT: fldcw (%esp) 221; X86-X87-NEXT: fldz 222; X86-X87-NEXT: fxch %st(1) 223; X86-X87-NEXT: fucom %st(1) 224; X86-X87-NEXT: fstp %st(1) 225; X86-X87-NEXT: fnstsw %ax 226; X86-X87-NEXT: xorl %ecx, %ecx 227; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 228; X86-X87-NEXT: sahf 229; X86-X87-NEXT: jb .LBB3_2 230; X86-X87-NEXT: # %bb.1: 231; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 232; X86-X87-NEXT: .LBB3_2: 233; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 234; X86-X87-NEXT: fxch %st(1) 235; X86-X87-NEXT: fucompp 236; X86-X87-NEXT: fnstsw %ax 237; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 238; X86-X87-NEXT: sahf 239; X86-X87-NEXT: movl $65535, %eax # imm = 0xFFFF 240; X86-X87-NEXT: ja .LBB3_4 241; X86-X87-NEXT: # %bb.3: 242; X86-X87-NEXT: movl %ecx, %eax 243; X86-X87-NEXT: .LBB3_4: 244; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 245; X86-X87-NEXT: addl $8, %esp 246; X86-X87-NEXT: retl 247; 248; X86-SSE-LABEL: test_unsigned_i16_f32: 249; X86-SSE: # %bb.0: 250; X86-SSE-NEXT: xorps %xmm0, %xmm0 251; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 252; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 253; X86-SSE-NEXT: minss %xmm0, %xmm1 254; X86-SSE-NEXT: cvttss2si %xmm1, %eax 255; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 256; X86-SSE-NEXT: retl 257; 258; X64-LABEL: test_unsigned_i16_f32: 259; X64: # %bb.0: 260; X64-NEXT: xorps %xmm1, %xmm1 261; X64-NEXT: maxss %xmm0, %xmm1 262; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 263; X64-NEXT: minss %xmm1, %xmm0 264; X64-NEXT: cvttss2si %xmm0, %eax 265; X64-NEXT: # kill: def $ax killed $ax killed $eax 266; X64-NEXT: retq 267 %x = call i16 @llvm.fptoui.sat.i16.f32(float %f) 268 ret i16 %x 269} 270 271define i19 @test_unsigned_i19_f32(float %f) nounwind { 272; X86-X87-LABEL: test_unsigned_i19_f32: 273; X86-X87: # %bb.0: 274; X86-X87-NEXT: subl $20, %esp 275; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 276; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 277; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 278; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 279; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 280; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 281; X86-X87-NEXT: fld %st(0) 282; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 283; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 284; X86-X87-NEXT: fldz 285; X86-X87-NEXT: fxch %st(1) 286; X86-X87-NEXT: fucom %st(1) 287; X86-X87-NEXT: fstp %st(1) 288; X86-X87-NEXT: fnstsw %ax 289; X86-X87-NEXT: xorl %ecx, %ecx 290; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 291; X86-X87-NEXT: sahf 292; X86-X87-NEXT: jb .LBB4_2 293; X86-X87-NEXT: # %bb.1: 294; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 295; X86-X87-NEXT: .LBB4_2: 296; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 297; X86-X87-NEXT: fxch %st(1) 298; X86-X87-NEXT: fucompp 299; X86-X87-NEXT: fnstsw %ax 300; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 301; X86-X87-NEXT: sahf 302; X86-X87-NEXT: movl $524287, %eax # imm = 0x7FFFF 303; X86-X87-NEXT: ja .LBB4_4 304; X86-X87-NEXT: # %bb.3: 305; X86-X87-NEXT: movl %ecx, %eax 306; X86-X87-NEXT: .LBB4_4: 307; X86-X87-NEXT: addl $20, %esp 308; X86-X87-NEXT: retl 309; 310; X86-SSE-LABEL: test_unsigned_i19_f32: 311; X86-SSE: # %bb.0: 312; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 313; X86-SSE-NEXT: xorps %xmm1, %xmm1 314; X86-SSE-NEXT: maxss %xmm1, %xmm0 315; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 316; X86-SSE-NEXT: cvttss2si %xmm0, %eax 317; X86-SSE-NEXT: retl 318; 319; X64-LABEL: test_unsigned_i19_f32: 320; X64: # %bb.0: 321; X64-NEXT: xorps %xmm1, %xmm1 322; X64-NEXT: maxss %xmm1, %xmm0 323; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 324; X64-NEXT: cvttss2si %xmm0, %eax 325; X64-NEXT: retq 326 %x = call i19 @llvm.fptoui.sat.i19.f32(float %f) 327 ret i19 %x 328} 329 330define i32 @test_unsigned_i32_f32(float %f) nounwind { 331; X86-X87-LABEL: test_unsigned_i32_f32: 332; X86-X87: # %bb.0: 333; X86-X87-NEXT: subl $20, %esp 334; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 335; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 336; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 337; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 338; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 339; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 340; X86-X87-NEXT: fld %st(0) 341; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 342; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 343; X86-X87-NEXT: fldz 344; X86-X87-NEXT: fxch %st(1) 345; X86-X87-NEXT: fucom %st(1) 346; X86-X87-NEXT: fstp %st(1) 347; X86-X87-NEXT: fnstsw %ax 348; X86-X87-NEXT: xorl %ecx, %ecx 349; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 350; X86-X87-NEXT: sahf 351; X86-X87-NEXT: jb .LBB5_2 352; X86-X87-NEXT: # %bb.1: 353; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 354; X86-X87-NEXT: .LBB5_2: 355; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 356; X86-X87-NEXT: fxch %st(1) 357; X86-X87-NEXT: fucompp 358; X86-X87-NEXT: fnstsw %ax 359; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 360; X86-X87-NEXT: sahf 361; X86-X87-NEXT: movl $-1, %eax 362; X86-X87-NEXT: ja .LBB5_4 363; X86-X87-NEXT: # %bb.3: 364; X86-X87-NEXT: movl %ecx, %eax 365; X86-X87-NEXT: .LBB5_4: 366; X86-X87-NEXT: addl $20, %esp 367; X86-X87-NEXT: retl 368; 369; X86-SSE-LABEL: test_unsigned_i32_f32: 370; X86-SSE: # %bb.0: 371; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 372; X86-SSE-NEXT: cvttss2si %xmm0, %eax 373; X86-SSE-NEXT: movl %eax, %ecx 374; X86-SSE-NEXT: sarl $31, %ecx 375; X86-SSE-NEXT: movaps %xmm0, %xmm1 376; X86-SSE-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 377; X86-SSE-NEXT: cvttss2si %xmm1, %edx 378; X86-SSE-NEXT: andl %ecx, %edx 379; X86-SSE-NEXT: orl %eax, %edx 380; X86-SSE-NEXT: xorl %ecx, %ecx 381; X86-SSE-NEXT: xorps %xmm1, %xmm1 382; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 383; X86-SSE-NEXT: cmovael %edx, %ecx 384; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 385; X86-SSE-NEXT: movl $-1, %eax 386; X86-SSE-NEXT: cmovbel %ecx, %eax 387; X86-SSE-NEXT: retl 388; 389; X64-LABEL: test_unsigned_i32_f32: 390; X64: # %bb.0: 391; X64-NEXT: cvttss2si %xmm0, %rax 392; X64-NEXT: xorl %ecx, %ecx 393; X64-NEXT: xorps %xmm1, %xmm1 394; X64-NEXT: ucomiss %xmm1, %xmm0 395; X64-NEXT: cmovael %eax, %ecx 396; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 397; X64-NEXT: movl $-1, %eax 398; X64-NEXT: cmovbel %ecx, %eax 399; X64-NEXT: retq 400 %x = call i32 @llvm.fptoui.sat.i32.f32(float %f) 401 ret i32 %x 402} 403 404define i50 @test_unsigned_i50_f32(float %f) nounwind { 405; X86-X87-LABEL: test_unsigned_i50_f32: 406; X86-X87: # %bb.0: 407; X86-X87-NEXT: pushl %esi 408; X86-X87-NEXT: subl $16, %esp 409; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 410; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 411; X86-X87-NEXT: fucom %st(1) 412; X86-X87-NEXT: fnstsw %ax 413; X86-X87-NEXT: xorl %ecx, %ecx 414; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 415; X86-X87-NEXT: sahf 416; X86-X87-NEXT: setbe %al 417; X86-X87-NEXT: fldz 418; X86-X87-NEXT: jbe .LBB6_2 419; X86-X87-NEXT: # %bb.1: 420; X86-X87-NEXT: fstp %st(1) 421; X86-X87-NEXT: fld %st(0) 422; X86-X87-NEXT: fxch %st(1) 423; X86-X87-NEXT: .LBB6_2: 424; X86-X87-NEXT: fxch %st(1) 425; X86-X87-NEXT: fsubr %st(2), %st 426; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 427; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 428; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 429; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 430; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 431; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 432; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 433; X86-X87-NEXT: movb %al, %cl 434; X86-X87-NEXT: shll $31, %ecx 435; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 436; X86-X87-NEXT: fxch %st(1) 437; X86-X87-NEXT: fucom %st(1) 438; X86-X87-NEXT: fstp %st(1) 439; X86-X87-NEXT: fnstsw %ax 440; X86-X87-NEXT: xorl %edx, %edx 441; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 442; X86-X87-NEXT: sahf 443; X86-X87-NEXT: movl $0, %esi 444; X86-X87-NEXT: jb .LBB6_4 445; X86-X87-NEXT: # %bb.3: 446; X86-X87-NEXT: movl %ecx, %esi 447; X86-X87-NEXT: .LBB6_4: 448; X86-X87-NEXT: jb .LBB6_6 449; X86-X87-NEXT: # %bb.5: 450; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 451; X86-X87-NEXT: .LBB6_6: 452; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 453; X86-X87-NEXT: fxch %st(1) 454; X86-X87-NEXT: fucompp 455; X86-X87-NEXT: fnstsw %ax 456; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 457; X86-X87-NEXT: sahf 458; X86-X87-NEXT: movl $-1, %eax 459; X86-X87-NEXT: ja .LBB6_8 460; X86-X87-NEXT: # %bb.7: 461; X86-X87-NEXT: movl %edx, %eax 462; X86-X87-NEXT: .LBB6_8: 463; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF 464; X86-X87-NEXT: ja .LBB6_10 465; X86-X87-NEXT: # %bb.9: 466; X86-X87-NEXT: movl %esi, %edx 467; X86-X87-NEXT: .LBB6_10: 468; X86-X87-NEXT: addl $16, %esp 469; X86-X87-NEXT: popl %esi 470; X86-X87-NEXT: retl 471; 472; X86-SSE-LABEL: test_unsigned_i50_f32: 473; X86-SSE: # %bb.0: 474; X86-SSE-NEXT: pushl %esi 475; X86-SSE-NEXT: subl $16, %esp 476; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 477; X86-SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 478; X86-SSE-NEXT: ucomiss %xmm0, %xmm2 479; X86-SSE-NEXT: xorps %xmm1, %xmm1 480; X86-SSE-NEXT: jbe .LBB6_2 481; X86-SSE-NEXT: # %bb.1: 482; X86-SSE-NEXT: xorps %xmm2, %xmm2 483; X86-SSE-NEXT: .LBB6_2: 484; X86-SSE-NEXT: movaps %xmm0, %xmm3 485; X86-SSE-NEXT: subss %xmm2, %xmm3 486; X86-SSE-NEXT: movss %xmm3, {{[0-9]+}}(%esp) 487; X86-SSE-NEXT: setbe %cl 488; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) 489; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 490; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 491; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 492; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 493; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 494; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 495; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 496; X86-SSE-NEXT: xorl %eax, %eax 497; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 498; X86-SSE-NEXT: movl $0, %esi 499; X86-SSE-NEXT: jb .LBB6_4 500; X86-SSE-NEXT: # %bb.3: 501; X86-SSE-NEXT: movzbl %cl, %eax 502; X86-SSE-NEXT: shll $31, %eax 503; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax 504; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 505; X86-SSE-NEXT: .LBB6_4: 506; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 507; X86-SSE-NEXT: movl $262143, %edx # imm = 0x3FFFF 508; X86-SSE-NEXT: cmovbel %eax, %edx 509; X86-SSE-NEXT: movl $-1, %eax 510; X86-SSE-NEXT: cmovbel %esi, %eax 511; X86-SSE-NEXT: addl $16, %esp 512; X86-SSE-NEXT: popl %esi 513; X86-SSE-NEXT: retl 514; 515; X64-LABEL: test_unsigned_i50_f32: 516; X64: # %bb.0: 517; X64-NEXT: cvttss2si %xmm0, %rax 518; X64-NEXT: xorl %ecx, %ecx 519; X64-NEXT: xorps %xmm1, %xmm1 520; X64-NEXT: ucomiss %xmm1, %xmm0 521; X64-NEXT: cmovaeq %rax, %rcx 522; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 523; X64-NEXT: movabsq $1125899906842623, %rax # imm = 0x3FFFFFFFFFFFF 524; X64-NEXT: cmovbeq %rcx, %rax 525; X64-NEXT: retq 526 %x = call i50 @llvm.fptoui.sat.i50.f32(float %f) 527 ret i50 %x 528} 529 530define i64 @test_unsigned_i64_f32(float %f) nounwind { 531; X86-X87-LABEL: test_unsigned_i64_f32: 532; X86-X87: # %bb.0: 533; X86-X87-NEXT: pushl %edi 534; X86-X87-NEXT: pushl %esi 535; X86-X87-NEXT: subl $20, %esp 536; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 537; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 538; X86-X87-NEXT: fucom %st(1) 539; X86-X87-NEXT: fnstsw %ax 540; X86-X87-NEXT: xorl %ecx, %ecx 541; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 542; X86-X87-NEXT: sahf 543; X86-X87-NEXT: setbe %al 544; X86-X87-NEXT: fldz 545; X86-X87-NEXT: jbe .LBB7_2 546; X86-X87-NEXT: # %bb.1: 547; X86-X87-NEXT: fstp %st(1) 548; X86-X87-NEXT: fld %st(0) 549; X86-X87-NEXT: fxch %st(1) 550; X86-X87-NEXT: .LBB7_2: 551; X86-X87-NEXT: fxch %st(1) 552; X86-X87-NEXT: fsubr %st(2), %st 553; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 554; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 555; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 556; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 557; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 558; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 559; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 560; X86-X87-NEXT: movb %al, %cl 561; X86-X87-NEXT: shll $31, %ecx 562; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 563; X86-X87-NEXT: fxch %st(1) 564; X86-X87-NEXT: fucom %st(1) 565; X86-X87-NEXT: fstp %st(1) 566; X86-X87-NEXT: fnstsw %ax 567; X86-X87-NEXT: xorl %esi, %esi 568; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 569; X86-X87-NEXT: sahf 570; X86-X87-NEXT: movl $0, %edi 571; X86-X87-NEXT: jb .LBB7_4 572; X86-X87-NEXT: # %bb.3: 573; X86-X87-NEXT: movl %ecx, %edi 574; X86-X87-NEXT: .LBB7_4: 575; X86-X87-NEXT: jb .LBB7_6 576; X86-X87-NEXT: # %bb.5: 577; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 578; X86-X87-NEXT: .LBB7_6: 579; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 580; X86-X87-NEXT: fxch %st(1) 581; X86-X87-NEXT: fucompp 582; X86-X87-NEXT: fnstsw %ax 583; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 584; X86-X87-NEXT: sahf 585; X86-X87-NEXT: movl $-1, %eax 586; X86-X87-NEXT: movl $-1, %edx 587; X86-X87-NEXT: ja .LBB7_8 588; X86-X87-NEXT: # %bb.7: 589; X86-X87-NEXT: movl %esi, %eax 590; X86-X87-NEXT: movl %edi, %edx 591; X86-X87-NEXT: .LBB7_8: 592; X86-X87-NEXT: addl $20, %esp 593; X86-X87-NEXT: popl %esi 594; X86-X87-NEXT: popl %edi 595; X86-X87-NEXT: retl 596; 597; X86-SSE-LABEL: test_unsigned_i64_f32: 598; X86-SSE: # %bb.0: 599; X86-SSE-NEXT: subl $20, %esp 600; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 601; X86-SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 602; X86-SSE-NEXT: ucomiss %xmm0, %xmm2 603; X86-SSE-NEXT: xorps %xmm1, %xmm1 604; X86-SSE-NEXT: jbe .LBB7_2 605; X86-SSE-NEXT: # %bb.1: 606; X86-SSE-NEXT: xorps %xmm2, %xmm2 607; X86-SSE-NEXT: .LBB7_2: 608; X86-SSE-NEXT: movaps %xmm0, %xmm3 609; X86-SSE-NEXT: subss %xmm2, %xmm3 610; X86-SSE-NEXT: movss %xmm3, {{[0-9]+}}(%esp) 611; X86-SSE-NEXT: setbe %cl 612; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) 613; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 614; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 615; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 616; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 617; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 618; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 619; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 620; X86-SSE-NEXT: xorl %edx, %edx 621; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 622; X86-SSE-NEXT: movl $0, %eax 623; X86-SSE-NEXT: jb .LBB7_4 624; X86-SSE-NEXT: # %bb.3: 625; X86-SSE-NEXT: movzbl %cl, %edx 626; X86-SSE-NEXT: shll $31, %edx 627; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %edx 628; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 629; X86-SSE-NEXT: .LBB7_4: 630; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 631; X86-SSE-NEXT: movl $-1, %ecx 632; X86-SSE-NEXT: cmoval %ecx, %edx 633; X86-SSE-NEXT: cmoval %ecx, %eax 634; X86-SSE-NEXT: addl $20, %esp 635; X86-SSE-NEXT: retl 636; 637; X64-LABEL: test_unsigned_i64_f32: 638; X64: # %bb.0: 639; X64-NEXT: cvttss2si %xmm0, %rax 640; X64-NEXT: movq %rax, %rcx 641; X64-NEXT: sarq $63, %rcx 642; X64-NEXT: movaps %xmm0, %xmm1 643; X64-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 644; X64-NEXT: cvttss2si %xmm1, %rdx 645; X64-NEXT: andq %rcx, %rdx 646; X64-NEXT: orq %rax, %rdx 647; X64-NEXT: xorl %ecx, %ecx 648; X64-NEXT: xorps %xmm1, %xmm1 649; X64-NEXT: ucomiss %xmm1, %xmm0 650; X64-NEXT: cmovaeq %rdx, %rcx 651; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 652; X64-NEXT: movq $-1, %rax 653; X64-NEXT: cmovbeq %rcx, %rax 654; X64-NEXT: retq 655 %x = call i64 @llvm.fptoui.sat.i64.f32(float %f) 656 ret i64 %x 657} 658 659define i100 @test_unsigned_i100_f32(float %f) nounwind { 660; X86-X87-LABEL: test_unsigned_i100_f32: 661; X86-X87: # %bb.0: 662; X86-X87-NEXT: pushl %ebp 663; X86-X87-NEXT: pushl %ebx 664; X86-X87-NEXT: pushl %edi 665; X86-X87-NEXT: pushl %esi 666; X86-X87-NEXT: subl $44, %esp 667; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 668; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) 669; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 670; X86-X87-NEXT: movl %eax, (%esp) 671; X86-X87-NEXT: fldz 672; X86-X87-NEXT: fxch %st(1) 673; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill 674; X86-X87-NEXT: fucompp 675; X86-X87-NEXT: fnstsw %ax 676; X86-X87-NEXT: movl %eax, %ebx 677; X86-X87-NEXT: calll __fixunssfti 678; X86-X87-NEXT: subl $4, %esp 679; X86-X87-NEXT: xorl %edi, %edi 680; X86-X87-NEXT: movb %bh, %ah 681; X86-X87-NEXT: sahf 682; X86-X87-NEXT: movl $0, %eax 683; X86-X87-NEXT: jb .LBB8_2 684; X86-X87-NEXT: # %bb.1: 685; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 686; X86-X87-NEXT: .LBB8_2: 687; X86-X87-NEXT: movl $0, %esi 688; X86-X87-NEXT: movl $0, %ebx 689; X86-X87-NEXT: jb .LBB8_4 690; X86-X87-NEXT: # %bb.3: 691; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 692; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 693; X86-X87-NEXT: .LBB8_4: 694; X86-X87-NEXT: jb .LBB8_6 695; X86-X87-NEXT: # %bb.5: 696; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi 697; X86-X87-NEXT: .LBB8_6: 698; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 699; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 700; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 701; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 702; X86-X87-NEXT: fucompp 703; X86-X87-NEXT: fnstsw %ax 704; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 705; X86-X87-NEXT: sahf 706; X86-X87-NEXT: movl $15, %eax 707; X86-X87-NEXT: ja .LBB8_8 708; X86-X87-NEXT: # %bb.7: 709; X86-X87-NEXT: movl %edi, %eax 710; X86-X87-NEXT: .LBB8_8: 711; X86-X87-NEXT: movl $-1, %edi 712; X86-X87-NEXT: movl $-1, %ebp 713; X86-X87-NEXT: movl $-1, %edx 714; X86-X87-NEXT: ja .LBB8_10 715; X86-X87-NEXT: # %bb.9: 716; X86-X87-NEXT: movl %ebx, %edi 717; X86-X87-NEXT: movl %esi, %ebp 718; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 719; X86-X87-NEXT: .LBB8_10: 720; X86-X87-NEXT: movl %edx, 8(%ecx) 721; X86-X87-NEXT: movl %ebp, 4(%ecx) 722; X86-X87-NEXT: movl %edi, (%ecx) 723; X86-X87-NEXT: andl $15, %eax 724; X86-X87-NEXT: movb %al, 12(%ecx) 725; X86-X87-NEXT: movl %ecx, %eax 726; X86-X87-NEXT: addl $44, %esp 727; X86-X87-NEXT: popl %esi 728; X86-X87-NEXT: popl %edi 729; X86-X87-NEXT: popl %ebx 730; X86-X87-NEXT: popl %ebp 731; X86-X87-NEXT: retl $4 732; 733; X86-SSE-LABEL: test_unsigned_i100_f32: 734; X86-SSE: # %bb.0: 735; X86-SSE-NEXT: pushl %ebx 736; X86-SSE-NEXT: pushl %edi 737; X86-SSE-NEXT: pushl %esi 738; X86-SSE-NEXT: subl $32, %esp 739; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 740; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 741; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 742; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 743; X86-SSE-NEXT: movl %eax, (%esp) 744; X86-SSE-NEXT: calll __fixunssfti 745; X86-SSE-NEXT: subl $4, %esp 746; X86-SSE-NEXT: xorl %eax, %eax 747; X86-SSE-NEXT: xorps %xmm0, %xmm0 748; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 749; X86-SSE-NEXT: ucomiss %xmm0, %xmm1 750; X86-SSE-NEXT: movaps %xmm1, %xmm0 751; X86-SSE-NEXT: movl $0, %ecx 752; X86-SSE-NEXT: movl $0, %edx 753; X86-SSE-NEXT: movl $0, %edi 754; X86-SSE-NEXT: jb .LBB8_2 755; X86-SSE-NEXT: # %bb.1: 756; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 757; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 758; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 759; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 760; X86-SSE-NEXT: .LBB8_2: 761; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 762; X86-SSE-NEXT: movl $15, %ebx 763; X86-SSE-NEXT: cmovbel %edi, %ebx 764; X86-SSE-NEXT: movl $-1, %edi 765; X86-SSE-NEXT: cmoval %edi, %edx 766; X86-SSE-NEXT: cmoval %edi, %ecx 767; X86-SSE-NEXT: cmoval %edi, %eax 768; X86-SSE-NEXT: movl %eax, 8(%esi) 769; X86-SSE-NEXT: movl %ecx, 4(%esi) 770; X86-SSE-NEXT: movl %edx, (%esi) 771; X86-SSE-NEXT: andl $15, %ebx 772; X86-SSE-NEXT: movb %bl, 12(%esi) 773; X86-SSE-NEXT: movl %esi, %eax 774; X86-SSE-NEXT: addl $32, %esp 775; X86-SSE-NEXT: popl %esi 776; X86-SSE-NEXT: popl %edi 777; X86-SSE-NEXT: popl %ebx 778; X86-SSE-NEXT: retl $4 779; 780; X64-LABEL: test_unsigned_i100_f32: 781; X64: # %bb.0: 782; X64-NEXT: pushq %rax 783; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 784; X64-NEXT: callq __fixunssfti@PLT 785; X64-NEXT: xorl %ecx, %ecx 786; X64-NEXT: xorps %xmm0, %xmm0 787; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload 788; X64-NEXT: # xmm1 = mem[0],zero,zero,zero 789; X64-NEXT: ucomiss %xmm0, %xmm1 790; X64-NEXT: cmovbq %rcx, %rdx 791; X64-NEXT: cmovbq %rcx, %rax 792; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 793; X64-NEXT: movq $-1, %rcx 794; X64-NEXT: cmovaq %rcx, %rax 795; X64-NEXT: movabsq $68719476735, %rcx # imm = 0xFFFFFFFFF 796; X64-NEXT: cmovaq %rcx, %rdx 797; X64-NEXT: popq %rcx 798; X64-NEXT: retq 799 %x = call i100 @llvm.fptoui.sat.i100.f32(float %f) 800 ret i100 %x 801} 802 803define i128 @test_unsigned_i128_f32(float %f) nounwind { 804; X86-X87-LABEL: test_unsigned_i128_f32: 805; X86-X87: # %bb.0: 806; X86-X87-NEXT: pushl %ebp 807; X86-X87-NEXT: pushl %ebx 808; X86-X87-NEXT: pushl %edi 809; X86-X87-NEXT: pushl %esi 810; X86-X87-NEXT: subl $44, %esp 811; X86-X87-NEXT: flds {{[0-9]+}}(%esp) 812; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) 813; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 814; X86-X87-NEXT: movl %eax, (%esp) 815; X86-X87-NEXT: fldz 816; X86-X87-NEXT: fxch %st(1) 817; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill 818; X86-X87-NEXT: fucompp 819; X86-X87-NEXT: fnstsw %ax 820; X86-X87-NEXT: movl %eax, %ebx 821; X86-X87-NEXT: calll __fixunssfti 822; X86-X87-NEXT: subl $4, %esp 823; X86-X87-NEXT: xorl %edx, %edx 824; X86-X87-NEXT: movb %bh, %ah 825; X86-X87-NEXT: sahf 826; X86-X87-NEXT: movl $0, %eax 827; X86-X87-NEXT: jb .LBB9_2 828; X86-X87-NEXT: # %bb.1: 829; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 830; X86-X87-NEXT: .LBB9_2: 831; X86-X87-NEXT: movl $0, %ecx 832; X86-X87-NEXT: jb .LBB9_4 833; X86-X87-NEXT: # %bb.3: 834; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 835; X86-X87-NEXT: .LBB9_4: 836; X86-X87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 837; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 838; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 839; X86-X87-NEXT: movl $0, %ebx 840; X86-X87-NEXT: jb .LBB9_6 841; X86-X87-NEXT: # %bb.5: 842; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 843; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 844; X86-X87-NEXT: .LBB9_6: 845; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 846; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 847; X86-X87-NEXT: fucompp 848; X86-X87-NEXT: fnstsw %ax 849; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 850; X86-X87-NEXT: sahf 851; X86-X87-NEXT: movl $-1, %eax 852; X86-X87-NEXT: movl $-1, %ebp 853; X86-X87-NEXT: movl $-1, %edi 854; X86-X87-NEXT: movl $-1, %esi 855; X86-X87-NEXT: ja .LBB9_8 856; X86-X87-NEXT: # %bb.7: 857; X86-X87-NEXT: movl %ebx, %eax 858; X86-X87-NEXT: movl %edx, %ebp 859; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload 860; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload 861; X86-X87-NEXT: .LBB9_8: 862; X86-X87-NEXT: movl %esi, 12(%ecx) 863; X86-X87-NEXT: movl %edi, 8(%ecx) 864; X86-X87-NEXT: movl %ebp, 4(%ecx) 865; X86-X87-NEXT: movl %eax, (%ecx) 866; X86-X87-NEXT: movl %ecx, %eax 867; X86-X87-NEXT: addl $44, %esp 868; X86-X87-NEXT: popl %esi 869; X86-X87-NEXT: popl %edi 870; X86-X87-NEXT: popl %ebx 871; X86-X87-NEXT: popl %ebp 872; X86-X87-NEXT: retl $4 873; 874; X86-SSE-LABEL: test_unsigned_i128_f32: 875; X86-SSE: # %bb.0: 876; X86-SSE-NEXT: pushl %ebx 877; X86-SSE-NEXT: pushl %edi 878; X86-SSE-NEXT: pushl %esi 879; X86-SSE-NEXT: subl $32, %esp 880; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 881; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 882; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 883; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 884; X86-SSE-NEXT: movl %eax, (%esp) 885; X86-SSE-NEXT: calll __fixunssfti 886; X86-SSE-NEXT: subl $4, %esp 887; X86-SSE-NEXT: xorl %eax, %eax 888; X86-SSE-NEXT: xorps %xmm0, %xmm0 889; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 890; X86-SSE-NEXT: ucomiss %xmm0, %xmm1 891; X86-SSE-NEXT: movaps %xmm1, %xmm0 892; X86-SSE-NEXT: movl $0, %ecx 893; X86-SSE-NEXT: movl $0, %edx 894; X86-SSE-NEXT: movl $0, %edi 895; X86-SSE-NEXT: jb .LBB9_2 896; X86-SSE-NEXT: # %bb.1: 897; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 898; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 899; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 900; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 901; X86-SSE-NEXT: .LBB9_2: 902; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 903; X86-SSE-NEXT: movl $-1, %ebx 904; X86-SSE-NEXT: cmoval %ebx, %edi 905; X86-SSE-NEXT: cmoval %ebx, %edx 906; X86-SSE-NEXT: cmoval %ebx, %ecx 907; X86-SSE-NEXT: cmoval %ebx, %eax 908; X86-SSE-NEXT: movl %eax, 12(%esi) 909; X86-SSE-NEXT: movl %ecx, 8(%esi) 910; X86-SSE-NEXT: movl %edx, 4(%esi) 911; X86-SSE-NEXT: movl %edi, (%esi) 912; X86-SSE-NEXT: movl %esi, %eax 913; X86-SSE-NEXT: addl $32, %esp 914; X86-SSE-NEXT: popl %esi 915; X86-SSE-NEXT: popl %edi 916; X86-SSE-NEXT: popl %ebx 917; X86-SSE-NEXT: retl $4 918; 919; X64-LABEL: test_unsigned_i128_f32: 920; X64: # %bb.0: 921; X64-NEXT: pushq %rax 922; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 923; X64-NEXT: callq __fixunssfti@PLT 924; X64-NEXT: xorl %ecx, %ecx 925; X64-NEXT: xorps %xmm0, %xmm0 926; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload 927; X64-NEXT: # xmm1 = mem[0],zero,zero,zero 928; X64-NEXT: ucomiss %xmm0, %xmm1 929; X64-NEXT: cmovbq %rcx, %rdx 930; X64-NEXT: cmovbq %rcx, %rax 931; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 932; X64-NEXT: movq $-1, %rcx 933; X64-NEXT: cmovaq %rcx, %rax 934; X64-NEXT: cmovaq %rcx, %rdx 935; X64-NEXT: popq %rcx 936; X64-NEXT: retq 937 %x = call i128 @llvm.fptoui.sat.i128.f32(float %f) 938 ret i128 %x 939} 940 941; 942; 64-bit float to unsigned integer 943; 944 945declare i1 @llvm.fptoui.sat.i1.f64 (double) 946declare i8 @llvm.fptoui.sat.i8.f64 (double) 947declare i13 @llvm.fptoui.sat.i13.f64 (double) 948declare i16 @llvm.fptoui.sat.i16.f64 (double) 949declare i19 @llvm.fptoui.sat.i19.f64 (double) 950declare i32 @llvm.fptoui.sat.i32.f64 (double) 951declare i50 @llvm.fptoui.sat.i50.f64 (double) 952declare i64 @llvm.fptoui.sat.i64.f64 (double) 953declare i100 @llvm.fptoui.sat.i100.f64(double) 954declare i128 @llvm.fptoui.sat.i128.f64(double) 955 956define i1 @test_unsigned_i1_f64(double %f) nounwind { 957; X86-X87-LABEL: test_unsigned_i1_f64: 958; X86-X87: # %bb.0: 959; X86-X87-NEXT: subl $8, %esp 960; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 961; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 962; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 963; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 964; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 965; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 966; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 967; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 968; X86-X87-NEXT: fldz 969; X86-X87-NEXT: fxch %st(1) 970; X86-X87-NEXT: fucom %st(1) 971; X86-X87-NEXT: fstp %st(1) 972; X86-X87-NEXT: fnstsw %ax 973; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 974; X86-X87-NEXT: sahf 975; X86-X87-NEXT: jb .LBB10_1 976; X86-X87-NEXT: # %bb.2: 977; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 978; X86-X87-NEXT: jmp .LBB10_3 979; X86-X87-NEXT: .LBB10_1: 980; X86-X87-NEXT: xorl %ecx, %ecx 981; X86-X87-NEXT: .LBB10_3: 982; X86-X87-NEXT: fld1 983; X86-X87-NEXT: fxch %st(1) 984; X86-X87-NEXT: fucompp 985; X86-X87-NEXT: fnstsw %ax 986; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 987; X86-X87-NEXT: sahf 988; X86-X87-NEXT: movb $1, %al 989; X86-X87-NEXT: ja .LBB10_5 990; X86-X87-NEXT: # %bb.4: 991; X86-X87-NEXT: movl %ecx, %eax 992; X86-X87-NEXT: .LBB10_5: 993; X86-X87-NEXT: addl $8, %esp 994; X86-X87-NEXT: retl 995; 996; X86-SSE-LABEL: test_unsigned_i1_f64: 997; X86-SSE: # %bb.0: 998; X86-SSE-NEXT: xorpd %xmm0, %xmm0 999; X86-SSE-NEXT: maxsd {{[0-9]+}}(%esp), %xmm0 1000; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1001; X86-SSE-NEXT: minsd %xmm0, %xmm1 1002; X86-SSE-NEXT: cvttsd2si %xmm1, %eax 1003; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 1004; X86-SSE-NEXT: retl 1005; 1006; X64-LABEL: test_unsigned_i1_f64: 1007; X64: # %bb.0: 1008; X64-NEXT: xorpd %xmm1, %xmm1 1009; X64-NEXT: maxsd %xmm0, %xmm1 1010; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1011; X64-NEXT: minsd %xmm1, %xmm0 1012; X64-NEXT: cvttsd2si %xmm0, %eax 1013; X64-NEXT: # kill: def $al killed $al killed $eax 1014; X64-NEXT: retq 1015 %x = call i1 @llvm.fptoui.sat.i1.f64(double %f) 1016 ret i1 %x 1017} 1018 1019define i8 @test_unsigned_i8_f64(double %f) nounwind { 1020; X86-X87-LABEL: test_unsigned_i8_f64: 1021; X86-X87: # %bb.0: 1022; X86-X87-NEXT: subl $8, %esp 1023; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1024; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1025; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1026; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1027; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1028; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1029; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 1030; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1031; X86-X87-NEXT: fldz 1032; X86-X87-NEXT: fxch %st(1) 1033; X86-X87-NEXT: fucom %st(1) 1034; X86-X87-NEXT: fstp %st(1) 1035; X86-X87-NEXT: fnstsw %ax 1036; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1037; X86-X87-NEXT: sahf 1038; X86-X87-NEXT: jb .LBB11_1 1039; X86-X87-NEXT: # %bb.2: 1040; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 1041; X86-X87-NEXT: jmp .LBB11_3 1042; X86-X87-NEXT: .LBB11_1: 1043; X86-X87-NEXT: xorl %ecx, %ecx 1044; X86-X87-NEXT: .LBB11_3: 1045; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1046; X86-X87-NEXT: fxch %st(1) 1047; X86-X87-NEXT: fucompp 1048; X86-X87-NEXT: fnstsw %ax 1049; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1050; X86-X87-NEXT: sahf 1051; X86-X87-NEXT: movb $-1, %al 1052; X86-X87-NEXT: ja .LBB11_5 1053; X86-X87-NEXT: # %bb.4: 1054; X86-X87-NEXT: movl %ecx, %eax 1055; X86-X87-NEXT: .LBB11_5: 1056; X86-X87-NEXT: addl $8, %esp 1057; X86-X87-NEXT: retl 1058; 1059; X86-SSE-LABEL: test_unsigned_i8_f64: 1060; X86-SSE: # %bb.0: 1061; X86-SSE-NEXT: xorpd %xmm0, %xmm0 1062; X86-SSE-NEXT: maxsd {{[0-9]+}}(%esp), %xmm0 1063; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1064; X86-SSE-NEXT: minsd %xmm0, %xmm1 1065; X86-SSE-NEXT: cvttsd2si %xmm1, %eax 1066; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 1067; X86-SSE-NEXT: retl 1068; 1069; X64-LABEL: test_unsigned_i8_f64: 1070; X64: # %bb.0: 1071; X64-NEXT: xorpd %xmm1, %xmm1 1072; X64-NEXT: maxsd %xmm0, %xmm1 1073; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1074; X64-NEXT: minsd %xmm1, %xmm0 1075; X64-NEXT: cvttsd2si %xmm0, %eax 1076; X64-NEXT: # kill: def $al killed $al killed $eax 1077; X64-NEXT: retq 1078 %x = call i8 @llvm.fptoui.sat.i8.f64(double %f) 1079 ret i8 %x 1080} 1081 1082define i13 @test_unsigned_i13_f64(double %f) nounwind { 1083; X86-X87-LABEL: test_unsigned_i13_f64: 1084; X86-X87: # %bb.0: 1085; X86-X87-NEXT: subl $8, %esp 1086; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1087; X86-X87-NEXT: fnstcw (%esp) 1088; X86-X87-NEXT: movzwl (%esp), %eax 1089; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1090; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1091; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1092; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 1093; X86-X87-NEXT: fldcw (%esp) 1094; X86-X87-NEXT: fldz 1095; X86-X87-NEXT: fxch %st(1) 1096; X86-X87-NEXT: fucom %st(1) 1097; X86-X87-NEXT: fstp %st(1) 1098; X86-X87-NEXT: fnstsw %ax 1099; X86-X87-NEXT: xorl %ecx, %ecx 1100; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1101; X86-X87-NEXT: sahf 1102; X86-X87-NEXT: jb .LBB12_2 1103; X86-X87-NEXT: # %bb.1: 1104; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1105; X86-X87-NEXT: .LBB12_2: 1106; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1107; X86-X87-NEXT: fxch %st(1) 1108; X86-X87-NEXT: fucompp 1109; X86-X87-NEXT: fnstsw %ax 1110; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1111; X86-X87-NEXT: sahf 1112; X86-X87-NEXT: movl $8191, %eax # imm = 0x1FFF 1113; X86-X87-NEXT: ja .LBB12_4 1114; X86-X87-NEXT: # %bb.3: 1115; X86-X87-NEXT: movl %ecx, %eax 1116; X86-X87-NEXT: .LBB12_4: 1117; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 1118; X86-X87-NEXT: addl $8, %esp 1119; X86-X87-NEXT: retl 1120; 1121; X86-SSE-LABEL: test_unsigned_i13_f64: 1122; X86-SSE: # %bb.0: 1123; X86-SSE-NEXT: xorpd %xmm0, %xmm0 1124; X86-SSE-NEXT: maxsd {{[0-9]+}}(%esp), %xmm0 1125; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1126; X86-SSE-NEXT: minsd %xmm0, %xmm1 1127; X86-SSE-NEXT: cvttsd2si %xmm1, %eax 1128; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 1129; X86-SSE-NEXT: retl 1130; 1131; X64-LABEL: test_unsigned_i13_f64: 1132; X64: # %bb.0: 1133; X64-NEXT: xorpd %xmm1, %xmm1 1134; X64-NEXT: maxsd %xmm0, %xmm1 1135; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1136; X64-NEXT: minsd %xmm1, %xmm0 1137; X64-NEXT: cvttsd2si %xmm0, %eax 1138; X64-NEXT: # kill: def $ax killed $ax killed $eax 1139; X64-NEXT: retq 1140 %x = call i13 @llvm.fptoui.sat.i13.f64(double %f) 1141 ret i13 %x 1142} 1143 1144define i16 @test_unsigned_i16_f64(double %f) nounwind { 1145; X86-X87-LABEL: test_unsigned_i16_f64: 1146; X86-X87: # %bb.0: 1147; X86-X87-NEXT: subl $8, %esp 1148; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1149; X86-X87-NEXT: fnstcw (%esp) 1150; X86-X87-NEXT: movzwl (%esp), %eax 1151; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1152; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1153; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1154; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 1155; X86-X87-NEXT: fldcw (%esp) 1156; X86-X87-NEXT: fldz 1157; X86-X87-NEXT: fxch %st(1) 1158; X86-X87-NEXT: fucom %st(1) 1159; X86-X87-NEXT: fstp %st(1) 1160; X86-X87-NEXT: fnstsw %ax 1161; X86-X87-NEXT: xorl %ecx, %ecx 1162; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1163; X86-X87-NEXT: sahf 1164; X86-X87-NEXT: jb .LBB13_2 1165; X86-X87-NEXT: # %bb.1: 1166; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1167; X86-X87-NEXT: .LBB13_2: 1168; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1169; X86-X87-NEXT: fxch %st(1) 1170; X86-X87-NEXT: fucompp 1171; X86-X87-NEXT: fnstsw %ax 1172; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1173; X86-X87-NEXT: sahf 1174; X86-X87-NEXT: movl $65535, %eax # imm = 0xFFFF 1175; X86-X87-NEXT: ja .LBB13_4 1176; X86-X87-NEXT: # %bb.3: 1177; X86-X87-NEXT: movl %ecx, %eax 1178; X86-X87-NEXT: .LBB13_4: 1179; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 1180; X86-X87-NEXT: addl $8, %esp 1181; X86-X87-NEXT: retl 1182; 1183; X86-SSE-LABEL: test_unsigned_i16_f64: 1184; X86-SSE: # %bb.0: 1185; X86-SSE-NEXT: xorpd %xmm0, %xmm0 1186; X86-SSE-NEXT: maxsd {{[0-9]+}}(%esp), %xmm0 1187; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1188; X86-SSE-NEXT: minsd %xmm0, %xmm1 1189; X86-SSE-NEXT: cvttsd2si %xmm1, %eax 1190; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 1191; X86-SSE-NEXT: retl 1192; 1193; X64-LABEL: test_unsigned_i16_f64: 1194; X64: # %bb.0: 1195; X64-NEXT: xorpd %xmm1, %xmm1 1196; X64-NEXT: maxsd %xmm0, %xmm1 1197; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1198; X64-NEXT: minsd %xmm1, %xmm0 1199; X64-NEXT: cvttsd2si %xmm0, %eax 1200; X64-NEXT: # kill: def $ax killed $ax killed $eax 1201; X64-NEXT: retq 1202 %x = call i16 @llvm.fptoui.sat.i16.f64(double %f) 1203 ret i16 %x 1204} 1205 1206define i19 @test_unsigned_i19_f64(double %f) nounwind { 1207; X86-X87-LABEL: test_unsigned_i19_f64: 1208; X86-X87: # %bb.0: 1209; X86-X87-NEXT: subl $20, %esp 1210; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1211; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1212; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1213; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1214; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1215; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1216; X86-X87-NEXT: fld %st(0) 1217; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 1218; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1219; X86-X87-NEXT: fldz 1220; X86-X87-NEXT: fxch %st(1) 1221; X86-X87-NEXT: fucom %st(1) 1222; X86-X87-NEXT: fstp %st(1) 1223; X86-X87-NEXT: fnstsw %ax 1224; X86-X87-NEXT: xorl %ecx, %ecx 1225; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1226; X86-X87-NEXT: sahf 1227; X86-X87-NEXT: jb .LBB14_2 1228; X86-X87-NEXT: # %bb.1: 1229; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1230; X86-X87-NEXT: .LBB14_2: 1231; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1232; X86-X87-NEXT: fxch %st(1) 1233; X86-X87-NEXT: fucompp 1234; X86-X87-NEXT: fnstsw %ax 1235; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1236; X86-X87-NEXT: sahf 1237; X86-X87-NEXT: movl $524287, %eax # imm = 0x7FFFF 1238; X86-X87-NEXT: ja .LBB14_4 1239; X86-X87-NEXT: # %bb.3: 1240; X86-X87-NEXT: movl %ecx, %eax 1241; X86-X87-NEXT: .LBB14_4: 1242; X86-X87-NEXT: addl $20, %esp 1243; X86-X87-NEXT: retl 1244; 1245; X86-SSE-LABEL: test_unsigned_i19_f64: 1246; X86-SSE: # %bb.0: 1247; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1248; X86-SSE-NEXT: xorpd %xmm1, %xmm1 1249; X86-SSE-NEXT: maxsd %xmm1, %xmm0 1250; X86-SSE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1251; X86-SSE-NEXT: cvttsd2si %xmm0, %eax 1252; X86-SSE-NEXT: retl 1253; 1254; X64-LABEL: test_unsigned_i19_f64: 1255; X64: # %bb.0: 1256; X64-NEXT: xorpd %xmm1, %xmm1 1257; X64-NEXT: maxsd %xmm1, %xmm0 1258; X64-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1259; X64-NEXT: cvttsd2si %xmm0, %eax 1260; X64-NEXT: retq 1261 %x = call i19 @llvm.fptoui.sat.i19.f64(double %f) 1262 ret i19 %x 1263} 1264 1265define i32 @test_unsigned_i32_f64(double %f) nounwind { 1266; X86-X87-LABEL: test_unsigned_i32_f64: 1267; X86-X87: # %bb.0: 1268; X86-X87-NEXT: subl $20, %esp 1269; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1270; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1271; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1272; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1273; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1274; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1275; X86-X87-NEXT: fld %st(0) 1276; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 1277; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1278; X86-X87-NEXT: fldz 1279; X86-X87-NEXT: fxch %st(1) 1280; X86-X87-NEXT: fucom %st(1) 1281; X86-X87-NEXT: fstp %st(1) 1282; X86-X87-NEXT: fnstsw %ax 1283; X86-X87-NEXT: xorl %ecx, %ecx 1284; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1285; X86-X87-NEXT: sahf 1286; X86-X87-NEXT: jb .LBB15_2 1287; X86-X87-NEXT: # %bb.1: 1288; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1289; X86-X87-NEXT: .LBB15_2: 1290; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 1291; X86-X87-NEXT: fxch %st(1) 1292; X86-X87-NEXT: fucompp 1293; X86-X87-NEXT: fnstsw %ax 1294; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1295; X86-X87-NEXT: sahf 1296; X86-X87-NEXT: movl $-1, %eax 1297; X86-X87-NEXT: ja .LBB15_4 1298; X86-X87-NEXT: # %bb.3: 1299; X86-X87-NEXT: movl %ecx, %eax 1300; X86-X87-NEXT: .LBB15_4: 1301; X86-X87-NEXT: addl $20, %esp 1302; X86-X87-NEXT: retl 1303; 1304; X86-SSE-LABEL: test_unsigned_i32_f64: 1305; X86-SSE: # %bb.0: 1306; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1307; X86-SSE-NEXT: xorpd %xmm1, %xmm1 1308; X86-SSE-NEXT: maxsd %xmm1, %xmm0 1309; X86-SSE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1310; X86-SSE-NEXT: cvttsd2si %xmm0, %ecx 1311; X86-SSE-NEXT: movl %ecx, %edx 1312; X86-SSE-NEXT: sarl $31, %edx 1313; X86-SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1314; X86-SSE-NEXT: cvttsd2si %xmm0, %eax 1315; X86-SSE-NEXT: andl %edx, %eax 1316; X86-SSE-NEXT: orl %ecx, %eax 1317; X86-SSE-NEXT: retl 1318; 1319; X64-LABEL: test_unsigned_i32_f64: 1320; X64: # %bb.0: 1321; X64-NEXT: xorpd %xmm1, %xmm1 1322; X64-NEXT: maxsd %xmm0, %xmm1 1323; X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1324; X64-NEXT: minsd %xmm1, %xmm0 1325; X64-NEXT: cvttsd2si %xmm0, %rax 1326; X64-NEXT: # kill: def $eax killed $eax killed $rax 1327; X64-NEXT: retq 1328 %x = call i32 @llvm.fptoui.sat.i32.f64(double %f) 1329 ret i32 %x 1330} 1331 1332define i50 @test_unsigned_i50_f64(double %f) nounwind { 1333; X86-X87-LABEL: test_unsigned_i50_f64: 1334; X86-X87: # %bb.0: 1335; X86-X87-NEXT: pushl %esi 1336; X86-X87-NEXT: subl $16, %esp 1337; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1338; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1339; X86-X87-NEXT: fucom %st(1) 1340; X86-X87-NEXT: fnstsw %ax 1341; X86-X87-NEXT: xorl %ecx, %ecx 1342; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1343; X86-X87-NEXT: sahf 1344; X86-X87-NEXT: setbe %al 1345; X86-X87-NEXT: fldz 1346; X86-X87-NEXT: jbe .LBB16_2 1347; X86-X87-NEXT: # %bb.1: 1348; X86-X87-NEXT: fstp %st(1) 1349; X86-X87-NEXT: fld %st(0) 1350; X86-X87-NEXT: fxch %st(1) 1351; X86-X87-NEXT: .LBB16_2: 1352; X86-X87-NEXT: fxch %st(1) 1353; X86-X87-NEXT: fsubr %st(2), %st 1354; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1355; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 1356; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 1357; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 1358; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1359; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 1360; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1361; X86-X87-NEXT: movb %al, %cl 1362; X86-X87-NEXT: shll $31, %ecx 1363; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 1364; X86-X87-NEXT: fxch %st(1) 1365; X86-X87-NEXT: fucom %st(1) 1366; X86-X87-NEXT: fstp %st(1) 1367; X86-X87-NEXT: fnstsw %ax 1368; X86-X87-NEXT: xorl %edx, %edx 1369; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1370; X86-X87-NEXT: sahf 1371; X86-X87-NEXT: movl $0, %esi 1372; X86-X87-NEXT: jb .LBB16_4 1373; X86-X87-NEXT: # %bb.3: 1374; X86-X87-NEXT: movl %ecx, %esi 1375; X86-X87-NEXT: .LBB16_4: 1376; X86-X87-NEXT: jb .LBB16_6 1377; X86-X87-NEXT: # %bb.5: 1378; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 1379; X86-X87-NEXT: .LBB16_6: 1380; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 1381; X86-X87-NEXT: fxch %st(1) 1382; X86-X87-NEXT: fucompp 1383; X86-X87-NEXT: fnstsw %ax 1384; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1385; X86-X87-NEXT: sahf 1386; X86-X87-NEXT: movl $-1, %eax 1387; X86-X87-NEXT: ja .LBB16_8 1388; X86-X87-NEXT: # %bb.7: 1389; X86-X87-NEXT: movl %edx, %eax 1390; X86-X87-NEXT: .LBB16_8: 1391; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF 1392; X86-X87-NEXT: ja .LBB16_10 1393; X86-X87-NEXT: # %bb.9: 1394; X86-X87-NEXT: movl %esi, %edx 1395; X86-X87-NEXT: .LBB16_10: 1396; X86-X87-NEXT: addl $16, %esp 1397; X86-X87-NEXT: popl %esi 1398; X86-X87-NEXT: retl 1399; 1400; X86-SSE-LABEL: test_unsigned_i50_f64: 1401; X86-SSE: # %bb.0: 1402; X86-SSE-NEXT: pushl %esi 1403; X86-SSE-NEXT: subl $16, %esp 1404; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1405; X86-SSE-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero 1406; X86-SSE-NEXT: ucomisd %xmm0, %xmm2 1407; X86-SSE-NEXT: xorpd %xmm1, %xmm1 1408; X86-SSE-NEXT: jbe .LBB16_2 1409; X86-SSE-NEXT: # %bb.1: 1410; X86-SSE-NEXT: xorpd %xmm2, %xmm2 1411; X86-SSE-NEXT: .LBB16_2: 1412; X86-SSE-NEXT: movapd %xmm0, %xmm3 1413; X86-SSE-NEXT: subsd %xmm2, %xmm3 1414; X86-SSE-NEXT: movsd %xmm3, {{[0-9]+}}(%esp) 1415; X86-SSE-NEXT: setbe %cl 1416; X86-SSE-NEXT: fldl {{[0-9]+}}(%esp) 1417; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 1418; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1419; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 1420; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 1421; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 1422; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 1423; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 1424; X86-SSE-NEXT: xorl %eax, %eax 1425; X86-SSE-NEXT: ucomisd %xmm1, %xmm0 1426; X86-SSE-NEXT: movl $0, %esi 1427; X86-SSE-NEXT: jb .LBB16_4 1428; X86-SSE-NEXT: # %bb.3: 1429; X86-SSE-NEXT: movzbl %cl, %eax 1430; X86-SSE-NEXT: shll $31, %eax 1431; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax 1432; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 1433; X86-SSE-NEXT: .LBB16_4: 1434; X86-SSE-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1435; X86-SSE-NEXT: movl $262143, %edx # imm = 0x3FFFF 1436; X86-SSE-NEXT: cmovbel %eax, %edx 1437; X86-SSE-NEXT: movl $-1, %eax 1438; X86-SSE-NEXT: cmovbel %esi, %eax 1439; X86-SSE-NEXT: addl $16, %esp 1440; X86-SSE-NEXT: popl %esi 1441; X86-SSE-NEXT: retl 1442; 1443; X64-LABEL: test_unsigned_i50_f64: 1444; X64: # %bb.0: 1445; X64-NEXT: xorpd %xmm1, %xmm1 1446; X64-NEXT: maxsd %xmm1, %xmm0 1447; X64-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1448; X64-NEXT: cvttsd2si %xmm0, %rax 1449; X64-NEXT: retq 1450 %x = call i50 @llvm.fptoui.sat.i50.f64(double %f) 1451 ret i50 %x 1452} 1453 1454define i64 @test_unsigned_i64_f64(double %f) nounwind { 1455; X86-X87-LABEL: test_unsigned_i64_f64: 1456; X86-X87: # %bb.0: 1457; X86-X87-NEXT: pushl %edi 1458; X86-X87-NEXT: pushl %esi 1459; X86-X87-NEXT: subl $20, %esp 1460; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1461; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1462; X86-X87-NEXT: fucom %st(1) 1463; X86-X87-NEXT: fnstsw %ax 1464; X86-X87-NEXT: xorl %ecx, %ecx 1465; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1466; X86-X87-NEXT: sahf 1467; X86-X87-NEXT: setbe %al 1468; X86-X87-NEXT: fldz 1469; X86-X87-NEXT: jbe .LBB17_2 1470; X86-X87-NEXT: # %bb.1: 1471; X86-X87-NEXT: fstp %st(1) 1472; X86-X87-NEXT: fld %st(0) 1473; X86-X87-NEXT: fxch %st(1) 1474; X86-X87-NEXT: .LBB17_2: 1475; X86-X87-NEXT: fxch %st(1) 1476; X86-X87-NEXT: fsubr %st(2), %st 1477; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1478; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 1479; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 1480; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 1481; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1482; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 1483; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1484; X86-X87-NEXT: movb %al, %cl 1485; X86-X87-NEXT: shll $31, %ecx 1486; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 1487; X86-X87-NEXT: fxch %st(1) 1488; X86-X87-NEXT: fucom %st(1) 1489; X86-X87-NEXT: fstp %st(1) 1490; X86-X87-NEXT: fnstsw %ax 1491; X86-X87-NEXT: xorl %esi, %esi 1492; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1493; X86-X87-NEXT: sahf 1494; X86-X87-NEXT: movl $0, %edi 1495; X86-X87-NEXT: jb .LBB17_4 1496; X86-X87-NEXT: # %bb.3: 1497; X86-X87-NEXT: movl %ecx, %edi 1498; X86-X87-NEXT: .LBB17_4: 1499; X86-X87-NEXT: jb .LBB17_6 1500; X86-X87-NEXT: # %bb.5: 1501; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 1502; X86-X87-NEXT: .LBB17_6: 1503; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 1504; X86-X87-NEXT: fxch %st(1) 1505; X86-X87-NEXT: fucompp 1506; X86-X87-NEXT: fnstsw %ax 1507; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1508; X86-X87-NEXT: sahf 1509; X86-X87-NEXT: movl $-1, %eax 1510; X86-X87-NEXT: movl $-1, %edx 1511; X86-X87-NEXT: ja .LBB17_8 1512; X86-X87-NEXT: # %bb.7: 1513; X86-X87-NEXT: movl %esi, %eax 1514; X86-X87-NEXT: movl %edi, %edx 1515; X86-X87-NEXT: .LBB17_8: 1516; X86-X87-NEXT: addl $20, %esp 1517; X86-X87-NEXT: popl %esi 1518; X86-X87-NEXT: popl %edi 1519; X86-X87-NEXT: retl 1520; 1521; X86-SSE-LABEL: test_unsigned_i64_f64: 1522; X86-SSE: # %bb.0: 1523; X86-SSE-NEXT: subl $20, %esp 1524; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1525; X86-SSE-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero 1526; X86-SSE-NEXT: ucomisd %xmm0, %xmm2 1527; X86-SSE-NEXT: xorpd %xmm1, %xmm1 1528; X86-SSE-NEXT: jbe .LBB17_2 1529; X86-SSE-NEXT: # %bb.1: 1530; X86-SSE-NEXT: xorpd %xmm2, %xmm2 1531; X86-SSE-NEXT: .LBB17_2: 1532; X86-SSE-NEXT: movapd %xmm0, %xmm3 1533; X86-SSE-NEXT: subsd %xmm2, %xmm3 1534; X86-SSE-NEXT: movsd %xmm3, {{[0-9]+}}(%esp) 1535; X86-SSE-NEXT: setbe %cl 1536; X86-SSE-NEXT: fldl {{[0-9]+}}(%esp) 1537; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 1538; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1539; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 1540; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 1541; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 1542; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 1543; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 1544; X86-SSE-NEXT: xorl %edx, %edx 1545; X86-SSE-NEXT: ucomisd %xmm1, %xmm0 1546; X86-SSE-NEXT: movl $0, %eax 1547; X86-SSE-NEXT: jb .LBB17_4 1548; X86-SSE-NEXT: # %bb.3: 1549; X86-SSE-NEXT: movzbl %cl, %edx 1550; X86-SSE-NEXT: shll $31, %edx 1551; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %edx 1552; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 1553; X86-SSE-NEXT: .LBB17_4: 1554; X86-SSE-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1555; X86-SSE-NEXT: movl $-1, %ecx 1556; X86-SSE-NEXT: cmoval %ecx, %edx 1557; X86-SSE-NEXT: cmoval %ecx, %eax 1558; X86-SSE-NEXT: addl $20, %esp 1559; X86-SSE-NEXT: retl 1560; 1561; X64-LABEL: test_unsigned_i64_f64: 1562; X64: # %bb.0: 1563; X64-NEXT: cvttsd2si %xmm0, %rax 1564; X64-NEXT: movq %rax, %rcx 1565; X64-NEXT: sarq $63, %rcx 1566; X64-NEXT: movapd %xmm0, %xmm1 1567; X64-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1568; X64-NEXT: cvttsd2si %xmm1, %rdx 1569; X64-NEXT: andq %rcx, %rdx 1570; X64-NEXT: orq %rax, %rdx 1571; X64-NEXT: xorl %ecx, %ecx 1572; X64-NEXT: xorpd %xmm1, %xmm1 1573; X64-NEXT: ucomisd %xmm1, %xmm0 1574; X64-NEXT: cmovaeq %rdx, %rcx 1575; X64-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1576; X64-NEXT: movq $-1, %rax 1577; X64-NEXT: cmovbeq %rcx, %rax 1578; X64-NEXT: retq 1579 %x = call i64 @llvm.fptoui.sat.i64.f64(double %f) 1580 ret i64 %x 1581} 1582 1583define i100 @test_unsigned_i100_f64(double %f) nounwind { 1584; X86-X87-LABEL: test_unsigned_i100_f64: 1585; X86-X87: # %bb.0: 1586; X86-X87-NEXT: pushl %ebp 1587; X86-X87-NEXT: pushl %ebx 1588; X86-X87-NEXT: pushl %edi 1589; X86-X87-NEXT: pushl %esi 1590; X86-X87-NEXT: subl $44, %esp 1591; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1592; X86-X87-NEXT: fstl {{[0-9]+}}(%esp) 1593; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 1594; X86-X87-NEXT: movl %eax, (%esp) 1595; X86-X87-NEXT: fldz 1596; X86-X87-NEXT: fxch %st(1) 1597; X86-X87-NEXT: fstl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill 1598; X86-X87-NEXT: fucompp 1599; X86-X87-NEXT: fnstsw %ax 1600; X86-X87-NEXT: movl %eax, %ebx 1601; X86-X87-NEXT: calll __fixunsdfti 1602; X86-X87-NEXT: subl $4, %esp 1603; X86-X87-NEXT: xorl %edi, %edi 1604; X86-X87-NEXT: movb %bh, %ah 1605; X86-X87-NEXT: sahf 1606; X86-X87-NEXT: movl $0, %eax 1607; X86-X87-NEXT: jb .LBB18_2 1608; X86-X87-NEXT: # %bb.1: 1609; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 1610; X86-X87-NEXT: .LBB18_2: 1611; X86-X87-NEXT: movl $0, %esi 1612; X86-X87-NEXT: movl $0, %ebx 1613; X86-X87-NEXT: jb .LBB18_4 1614; X86-X87-NEXT: # %bb.3: 1615; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 1616; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 1617; X86-X87-NEXT: .LBB18_4: 1618; X86-X87-NEXT: jb .LBB18_6 1619; X86-X87-NEXT: # %bb.5: 1620; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi 1621; X86-X87-NEXT: .LBB18_6: 1622; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 1623; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1624; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 1625; X86-X87-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload 1626; X86-X87-NEXT: fucompp 1627; X86-X87-NEXT: fnstsw %ax 1628; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1629; X86-X87-NEXT: sahf 1630; X86-X87-NEXT: movl $15, %eax 1631; X86-X87-NEXT: ja .LBB18_8 1632; X86-X87-NEXT: # %bb.7: 1633; X86-X87-NEXT: movl %edi, %eax 1634; X86-X87-NEXT: .LBB18_8: 1635; X86-X87-NEXT: movl $-1, %edi 1636; X86-X87-NEXT: movl $-1, %ebp 1637; X86-X87-NEXT: movl $-1, %edx 1638; X86-X87-NEXT: ja .LBB18_10 1639; X86-X87-NEXT: # %bb.9: 1640; X86-X87-NEXT: movl %ebx, %edi 1641; X86-X87-NEXT: movl %esi, %ebp 1642; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 1643; X86-X87-NEXT: .LBB18_10: 1644; X86-X87-NEXT: movl %edx, 8(%ecx) 1645; X86-X87-NEXT: movl %ebp, 4(%ecx) 1646; X86-X87-NEXT: movl %edi, (%ecx) 1647; X86-X87-NEXT: andl $15, %eax 1648; X86-X87-NEXT: movb %al, 12(%ecx) 1649; X86-X87-NEXT: movl %ecx, %eax 1650; X86-X87-NEXT: addl $44, %esp 1651; X86-X87-NEXT: popl %esi 1652; X86-X87-NEXT: popl %edi 1653; X86-X87-NEXT: popl %ebx 1654; X86-X87-NEXT: popl %ebp 1655; X86-X87-NEXT: retl $4 1656; 1657; X86-SSE-LABEL: test_unsigned_i100_f64: 1658; X86-SSE: # %bb.0: 1659; X86-SSE-NEXT: pushl %ebx 1660; X86-SSE-NEXT: pushl %edi 1661; X86-SSE-NEXT: pushl %esi 1662; X86-SSE-NEXT: subl $32, %esp 1663; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 1664; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1665; X86-SSE-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 1666; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 1667; X86-SSE-NEXT: movl %eax, (%esp) 1668; X86-SSE-NEXT: calll __fixunsdfti 1669; X86-SSE-NEXT: subl $4, %esp 1670; X86-SSE-NEXT: xorl %eax, %eax 1671; X86-SSE-NEXT: xorpd %xmm0, %xmm0 1672; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1673; X86-SSE-NEXT: ucomisd %xmm0, %xmm1 1674; X86-SSE-NEXT: movapd %xmm1, %xmm0 1675; X86-SSE-NEXT: movl $0, %ecx 1676; X86-SSE-NEXT: movl $0, %edx 1677; X86-SSE-NEXT: movl $0, %edi 1678; X86-SSE-NEXT: jb .LBB18_2 1679; X86-SSE-NEXT: # %bb.1: 1680; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 1681; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 1682; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 1683; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 1684; X86-SSE-NEXT: .LBB18_2: 1685; X86-SSE-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1686; X86-SSE-NEXT: movl $15, %ebx 1687; X86-SSE-NEXT: cmovbel %edi, %ebx 1688; X86-SSE-NEXT: movl $-1, %edi 1689; X86-SSE-NEXT: cmoval %edi, %edx 1690; X86-SSE-NEXT: cmoval %edi, %ecx 1691; X86-SSE-NEXT: cmoval %edi, %eax 1692; X86-SSE-NEXT: movl %eax, 8(%esi) 1693; X86-SSE-NEXT: movl %ecx, 4(%esi) 1694; X86-SSE-NEXT: movl %edx, (%esi) 1695; X86-SSE-NEXT: andl $15, %ebx 1696; X86-SSE-NEXT: movb %bl, 12(%esi) 1697; X86-SSE-NEXT: movl %esi, %eax 1698; X86-SSE-NEXT: addl $32, %esp 1699; X86-SSE-NEXT: popl %esi 1700; X86-SSE-NEXT: popl %edi 1701; X86-SSE-NEXT: popl %ebx 1702; X86-SSE-NEXT: retl $4 1703; 1704; X64-LABEL: test_unsigned_i100_f64: 1705; X64: # %bb.0: 1706; X64-NEXT: pushq %rax 1707; X64-NEXT: movsd %xmm0, (%rsp) # 8-byte Spill 1708; X64-NEXT: callq __fixunsdfti@PLT 1709; X64-NEXT: xorl %ecx, %ecx 1710; X64-NEXT: xorpd %xmm0, %xmm0 1711; X64-NEXT: movsd (%rsp), %xmm1 # 8-byte Reload 1712; X64-NEXT: # xmm1 = mem[0],zero 1713; X64-NEXT: ucomisd %xmm0, %xmm1 1714; X64-NEXT: cmovbq %rcx, %rdx 1715; X64-NEXT: cmovbq %rcx, %rax 1716; X64-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1717; X64-NEXT: movq $-1, %rcx 1718; X64-NEXT: cmovaq %rcx, %rax 1719; X64-NEXT: movabsq $68719476735, %rcx # imm = 0xFFFFFFFFF 1720; X64-NEXT: cmovaq %rcx, %rdx 1721; X64-NEXT: popq %rcx 1722; X64-NEXT: retq 1723 %x = call i100 @llvm.fptoui.sat.i100.f64(double %f) 1724 ret i100 %x 1725} 1726 1727define i128 @test_unsigned_i128_f64(double %f) nounwind { 1728; X86-X87-LABEL: test_unsigned_i128_f64: 1729; X86-X87: # %bb.0: 1730; X86-X87-NEXT: pushl %ebp 1731; X86-X87-NEXT: pushl %ebx 1732; X86-X87-NEXT: pushl %edi 1733; X86-X87-NEXT: pushl %esi 1734; X86-X87-NEXT: subl $60, %esp 1735; X86-X87-NEXT: fldl {{[0-9]+}}(%esp) 1736; X86-X87-NEXT: fstl {{[0-9]+}}(%esp) 1737; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 1738; X86-X87-NEXT: movl %eax, (%esp) 1739; X86-X87-NEXT: fldz 1740; X86-X87-NEXT: fxch %st(1) 1741; X86-X87-NEXT: fstl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill 1742; X86-X87-NEXT: fucompp 1743; X86-X87-NEXT: fnstsw %ax 1744; X86-X87-NEXT: movl %eax, %ebx 1745; X86-X87-NEXT: calll __fixunsdfti 1746; X86-X87-NEXT: subl $4, %esp 1747; X86-X87-NEXT: xorl %edx, %edx 1748; X86-X87-NEXT: movb %bh, %ah 1749; X86-X87-NEXT: sahf 1750; X86-X87-NEXT: movl $0, %eax 1751; X86-X87-NEXT: jb .LBB19_2 1752; X86-X87-NEXT: # %bb.1: 1753; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 1754; X86-X87-NEXT: .LBB19_2: 1755; X86-X87-NEXT: movl $0, %ecx 1756; X86-X87-NEXT: jb .LBB19_4 1757; X86-X87-NEXT: # %bb.3: 1758; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1759; X86-X87-NEXT: .LBB19_4: 1760; X86-X87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 1761; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 1762; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 1763; X86-X87-NEXT: movl $0, %ebx 1764; X86-X87-NEXT: jb .LBB19_6 1765; X86-X87-NEXT: # %bb.5: 1766; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 1767; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 1768; X86-X87-NEXT: .LBB19_6: 1769; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 1770; X86-X87-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload 1771; X86-X87-NEXT: fucompp 1772; X86-X87-NEXT: fnstsw %ax 1773; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1774; X86-X87-NEXT: sahf 1775; X86-X87-NEXT: movl $-1, %eax 1776; X86-X87-NEXT: movl $-1, %ebp 1777; X86-X87-NEXT: movl $-1, %edi 1778; X86-X87-NEXT: movl $-1, %esi 1779; X86-X87-NEXT: ja .LBB19_8 1780; X86-X87-NEXT: # %bb.7: 1781; X86-X87-NEXT: movl %ebx, %eax 1782; X86-X87-NEXT: movl %edx, %ebp 1783; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload 1784; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload 1785; X86-X87-NEXT: .LBB19_8: 1786; X86-X87-NEXT: movl %esi, 12(%ecx) 1787; X86-X87-NEXT: movl %edi, 8(%ecx) 1788; X86-X87-NEXT: movl %ebp, 4(%ecx) 1789; X86-X87-NEXT: movl %eax, (%ecx) 1790; X86-X87-NEXT: movl %ecx, %eax 1791; X86-X87-NEXT: addl $60, %esp 1792; X86-X87-NEXT: popl %esi 1793; X86-X87-NEXT: popl %edi 1794; X86-X87-NEXT: popl %ebx 1795; X86-X87-NEXT: popl %ebp 1796; X86-X87-NEXT: retl $4 1797; 1798; X86-SSE-LABEL: test_unsigned_i128_f64: 1799; X86-SSE: # %bb.0: 1800; X86-SSE-NEXT: pushl %ebx 1801; X86-SSE-NEXT: pushl %edi 1802; X86-SSE-NEXT: pushl %esi 1803; X86-SSE-NEXT: subl $32, %esp 1804; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 1805; X86-SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 1806; X86-SSE-NEXT: movsd %xmm0, {{[0-9]+}}(%esp) 1807; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 1808; X86-SSE-NEXT: movl %eax, (%esp) 1809; X86-SSE-NEXT: calll __fixunsdfti 1810; X86-SSE-NEXT: subl $4, %esp 1811; X86-SSE-NEXT: xorl %eax, %eax 1812; X86-SSE-NEXT: xorpd %xmm0, %xmm0 1813; X86-SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero 1814; X86-SSE-NEXT: ucomisd %xmm0, %xmm1 1815; X86-SSE-NEXT: movapd %xmm1, %xmm0 1816; X86-SSE-NEXT: movl $0, %ecx 1817; X86-SSE-NEXT: movl $0, %edx 1818; X86-SSE-NEXT: movl $0, %edi 1819; X86-SSE-NEXT: jb .LBB19_2 1820; X86-SSE-NEXT: # %bb.1: 1821; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 1822; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 1823; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 1824; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 1825; X86-SSE-NEXT: .LBB19_2: 1826; X86-SSE-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 1827; X86-SSE-NEXT: movl $-1, %ebx 1828; X86-SSE-NEXT: cmoval %ebx, %edi 1829; X86-SSE-NEXT: cmoval %ebx, %edx 1830; X86-SSE-NEXT: cmoval %ebx, %ecx 1831; X86-SSE-NEXT: cmoval %ebx, %eax 1832; X86-SSE-NEXT: movl %eax, 12(%esi) 1833; X86-SSE-NEXT: movl %ecx, 8(%esi) 1834; X86-SSE-NEXT: movl %edx, 4(%esi) 1835; X86-SSE-NEXT: movl %edi, (%esi) 1836; X86-SSE-NEXT: movl %esi, %eax 1837; X86-SSE-NEXT: addl $32, %esp 1838; X86-SSE-NEXT: popl %esi 1839; X86-SSE-NEXT: popl %edi 1840; X86-SSE-NEXT: popl %ebx 1841; X86-SSE-NEXT: retl $4 1842; 1843; X64-LABEL: test_unsigned_i128_f64: 1844; X64: # %bb.0: 1845; X64-NEXT: pushq %rax 1846; X64-NEXT: movsd %xmm0, (%rsp) # 8-byte Spill 1847; X64-NEXT: callq __fixunsdfti@PLT 1848; X64-NEXT: xorl %ecx, %ecx 1849; X64-NEXT: xorpd %xmm0, %xmm0 1850; X64-NEXT: movsd (%rsp), %xmm1 # 8-byte Reload 1851; X64-NEXT: # xmm1 = mem[0],zero 1852; X64-NEXT: ucomisd %xmm0, %xmm1 1853; X64-NEXT: cmovbq %rcx, %rdx 1854; X64-NEXT: cmovbq %rcx, %rax 1855; X64-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 1856; X64-NEXT: movq $-1, %rcx 1857; X64-NEXT: cmovaq %rcx, %rax 1858; X64-NEXT: cmovaq %rcx, %rdx 1859; X64-NEXT: popq %rcx 1860; X64-NEXT: retq 1861 %x = call i128 @llvm.fptoui.sat.i128.f64(double %f) 1862 ret i128 %x 1863} 1864 1865; 1866; 16-bit float to unsigned integer 1867; 1868 1869declare i1 @llvm.fptoui.sat.i1.f16 (half) 1870declare i8 @llvm.fptoui.sat.i8.f16 (half) 1871declare i13 @llvm.fptoui.sat.i13.f16 (half) 1872declare i16 @llvm.fptoui.sat.i16.f16 (half) 1873declare i19 @llvm.fptoui.sat.i19.f16 (half) 1874declare i32 @llvm.fptoui.sat.i32.f16 (half) 1875declare i50 @llvm.fptoui.sat.i50.f16 (half) 1876declare i64 @llvm.fptoui.sat.i64.f16 (half) 1877declare i100 @llvm.fptoui.sat.i100.f16(half) 1878declare i128 @llvm.fptoui.sat.i128.f16(half) 1879 1880define i1 @test_unsigned_i1_f16(half %f) nounwind { 1881; X86-X87-LABEL: test_unsigned_i1_f16: 1882; X86-X87: # %bb.0: 1883; X86-X87-NEXT: subl $12, %esp 1884; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1885; X86-X87-NEXT: movl %eax, (%esp) 1886; X86-X87-NEXT: calll __gnu_h2f_ieee 1887; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1888; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1889; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1890; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1891; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1892; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 1893; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1894; X86-X87-NEXT: fldz 1895; X86-X87-NEXT: fxch %st(1) 1896; X86-X87-NEXT: fucom %st(1) 1897; X86-X87-NEXT: fstp %st(1) 1898; X86-X87-NEXT: fnstsw %ax 1899; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1900; X86-X87-NEXT: sahf 1901; X86-X87-NEXT: jb .LBB20_1 1902; X86-X87-NEXT: # %bb.2: 1903; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 1904; X86-X87-NEXT: jmp .LBB20_3 1905; X86-X87-NEXT: .LBB20_1: 1906; X86-X87-NEXT: xorl %ecx, %ecx 1907; X86-X87-NEXT: .LBB20_3: 1908; X86-X87-NEXT: fld1 1909; X86-X87-NEXT: fxch %st(1) 1910; X86-X87-NEXT: fucompp 1911; X86-X87-NEXT: fnstsw %ax 1912; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1913; X86-X87-NEXT: sahf 1914; X86-X87-NEXT: movb $1, %al 1915; X86-X87-NEXT: ja .LBB20_5 1916; X86-X87-NEXT: # %bb.4: 1917; X86-X87-NEXT: movl %ecx, %eax 1918; X86-X87-NEXT: .LBB20_5: 1919; X86-X87-NEXT: addl $12, %esp 1920; X86-X87-NEXT: retl 1921; 1922; X86-SSE-LABEL: test_unsigned_i1_f16: 1923; X86-SSE: # %bb.0: 1924; X86-SSE-NEXT: subl $12, %esp 1925; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1926; X86-SSE-NEXT: movl %eax, (%esp) 1927; X86-SSE-NEXT: calll __gnu_h2f_ieee 1928; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 1929; X86-SSE-NEXT: xorps %xmm0, %xmm0 1930; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 1931; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 1932; X86-SSE-NEXT: minss %xmm0, %xmm1 1933; X86-SSE-NEXT: cvttss2si %xmm1, %eax 1934; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 1935; X86-SSE-NEXT: addl $12, %esp 1936; X86-SSE-NEXT: retl 1937; 1938; X64-LABEL: test_unsigned_i1_f16: 1939; X64: # %bb.0: 1940; X64-NEXT: pushq %rax 1941; X64-NEXT: movzwl %di, %edi 1942; X64-NEXT: callq __gnu_h2f_ieee@PLT 1943; X64-NEXT: xorps %xmm1, %xmm1 1944; X64-NEXT: maxss %xmm0, %xmm1 1945; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 1946; X64-NEXT: minss %xmm1, %xmm0 1947; X64-NEXT: cvttss2si %xmm0, %eax 1948; X64-NEXT: # kill: def $al killed $al killed $eax 1949; X64-NEXT: popq %rcx 1950; X64-NEXT: retq 1951 %x = call i1 @llvm.fptoui.sat.i1.f16(half %f) 1952 ret i1 %x 1953} 1954 1955define i8 @test_unsigned_i8_f16(half %f) nounwind { 1956; X86-X87-LABEL: test_unsigned_i8_f16: 1957; X86-X87: # %bb.0: 1958; X86-X87-NEXT: subl $12, %esp 1959; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1960; X86-X87-NEXT: movl %eax, (%esp) 1961; X86-X87-NEXT: calll __gnu_h2f_ieee 1962; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 1963; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 1964; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 1965; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 1966; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1967; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 1968; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 1969; X86-X87-NEXT: fldz 1970; X86-X87-NEXT: fxch %st(1) 1971; X86-X87-NEXT: fucom %st(1) 1972; X86-X87-NEXT: fstp %st(1) 1973; X86-X87-NEXT: fnstsw %ax 1974; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1975; X86-X87-NEXT: sahf 1976; X86-X87-NEXT: jb .LBB21_1 1977; X86-X87-NEXT: # %bb.2: 1978; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 1979; X86-X87-NEXT: jmp .LBB21_3 1980; X86-X87-NEXT: .LBB21_1: 1981; X86-X87-NEXT: xorl %ecx, %ecx 1982; X86-X87-NEXT: .LBB21_3: 1983; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 1984; X86-X87-NEXT: fxch %st(1) 1985; X86-X87-NEXT: fucompp 1986; X86-X87-NEXT: fnstsw %ax 1987; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 1988; X86-X87-NEXT: sahf 1989; X86-X87-NEXT: movb $-1, %al 1990; X86-X87-NEXT: ja .LBB21_5 1991; X86-X87-NEXT: # %bb.4: 1992; X86-X87-NEXT: movl %ecx, %eax 1993; X86-X87-NEXT: .LBB21_5: 1994; X86-X87-NEXT: addl $12, %esp 1995; X86-X87-NEXT: retl 1996; 1997; X86-SSE-LABEL: test_unsigned_i8_f16: 1998; X86-SSE: # %bb.0: 1999; X86-SSE-NEXT: subl $12, %esp 2000; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2001; X86-SSE-NEXT: movl %eax, (%esp) 2002; X86-SSE-NEXT: calll __gnu_h2f_ieee 2003; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2004; X86-SSE-NEXT: xorps %xmm0, %xmm0 2005; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 2006; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 2007; X86-SSE-NEXT: minss %xmm0, %xmm1 2008; X86-SSE-NEXT: cvttss2si %xmm1, %eax 2009; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 2010; X86-SSE-NEXT: addl $12, %esp 2011; X86-SSE-NEXT: retl 2012; 2013; X64-LABEL: test_unsigned_i8_f16: 2014; X64: # %bb.0: 2015; X64-NEXT: pushq %rax 2016; X64-NEXT: movzwl %di, %edi 2017; X64-NEXT: callq __gnu_h2f_ieee@PLT 2018; X64-NEXT: xorps %xmm1, %xmm1 2019; X64-NEXT: maxss %xmm0, %xmm1 2020; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2021; X64-NEXT: minss %xmm1, %xmm0 2022; X64-NEXT: cvttss2si %xmm0, %eax 2023; X64-NEXT: # kill: def $al killed $al killed $eax 2024; X64-NEXT: popq %rcx 2025; X64-NEXT: retq 2026 %x = call i8 @llvm.fptoui.sat.i8.f16(half %f) 2027 ret i8 %x 2028} 2029 2030define i13 @test_unsigned_i13_f16(half %f) nounwind { 2031; X86-X87-LABEL: test_unsigned_i13_f16: 2032; X86-X87: # %bb.0: 2033; X86-X87-NEXT: subl $12, %esp 2034; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2035; X86-X87-NEXT: movl %eax, (%esp) 2036; X86-X87-NEXT: calll __gnu_h2f_ieee 2037; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2038; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2039; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 2040; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 2041; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2042; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 2043; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2044; X86-X87-NEXT: fldz 2045; X86-X87-NEXT: fxch %st(1) 2046; X86-X87-NEXT: fucom %st(1) 2047; X86-X87-NEXT: fstp %st(1) 2048; X86-X87-NEXT: fnstsw %ax 2049; X86-X87-NEXT: xorl %ecx, %ecx 2050; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2051; X86-X87-NEXT: sahf 2052; X86-X87-NEXT: jb .LBB22_2 2053; X86-X87-NEXT: # %bb.1: 2054; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2055; X86-X87-NEXT: .LBB22_2: 2056; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2057; X86-X87-NEXT: fxch %st(1) 2058; X86-X87-NEXT: fucompp 2059; X86-X87-NEXT: fnstsw %ax 2060; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2061; X86-X87-NEXT: sahf 2062; X86-X87-NEXT: movl $8191, %eax # imm = 0x1FFF 2063; X86-X87-NEXT: ja .LBB22_4 2064; X86-X87-NEXT: # %bb.3: 2065; X86-X87-NEXT: movl %ecx, %eax 2066; X86-X87-NEXT: .LBB22_4: 2067; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 2068; X86-X87-NEXT: addl $12, %esp 2069; X86-X87-NEXT: retl 2070; 2071; X86-SSE-LABEL: test_unsigned_i13_f16: 2072; X86-SSE: # %bb.0: 2073; X86-SSE-NEXT: subl $12, %esp 2074; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2075; X86-SSE-NEXT: movl %eax, (%esp) 2076; X86-SSE-NEXT: calll __gnu_h2f_ieee 2077; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2078; X86-SSE-NEXT: xorps %xmm0, %xmm0 2079; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 2080; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 2081; X86-SSE-NEXT: minss %xmm0, %xmm1 2082; X86-SSE-NEXT: cvttss2si %xmm1, %eax 2083; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 2084; X86-SSE-NEXT: addl $12, %esp 2085; X86-SSE-NEXT: retl 2086; 2087; X64-LABEL: test_unsigned_i13_f16: 2088; X64: # %bb.0: 2089; X64-NEXT: pushq %rax 2090; X64-NEXT: movzwl %di, %edi 2091; X64-NEXT: callq __gnu_h2f_ieee@PLT 2092; X64-NEXT: xorps %xmm1, %xmm1 2093; X64-NEXT: maxss %xmm0, %xmm1 2094; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2095; X64-NEXT: minss %xmm1, %xmm0 2096; X64-NEXT: cvttss2si %xmm0, %eax 2097; X64-NEXT: # kill: def $ax killed $ax killed $eax 2098; X64-NEXT: popq %rcx 2099; X64-NEXT: retq 2100 %x = call i13 @llvm.fptoui.sat.i13.f16(half %f) 2101 ret i13 %x 2102} 2103 2104define i16 @test_unsigned_i16_f16(half %f) nounwind { 2105; X86-X87-LABEL: test_unsigned_i16_f16: 2106; X86-X87: # %bb.0: 2107; X86-X87-NEXT: subl $12, %esp 2108; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2109; X86-X87-NEXT: movl %eax, (%esp) 2110; X86-X87-NEXT: calll __gnu_h2f_ieee 2111; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2112; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2113; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 2114; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 2115; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2116; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 2117; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2118; X86-X87-NEXT: fldz 2119; X86-X87-NEXT: fxch %st(1) 2120; X86-X87-NEXT: fucom %st(1) 2121; X86-X87-NEXT: fstp %st(1) 2122; X86-X87-NEXT: fnstsw %ax 2123; X86-X87-NEXT: xorl %ecx, %ecx 2124; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2125; X86-X87-NEXT: sahf 2126; X86-X87-NEXT: jb .LBB23_2 2127; X86-X87-NEXT: # %bb.1: 2128; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2129; X86-X87-NEXT: .LBB23_2: 2130; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2131; X86-X87-NEXT: fxch %st(1) 2132; X86-X87-NEXT: fucompp 2133; X86-X87-NEXT: fnstsw %ax 2134; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2135; X86-X87-NEXT: sahf 2136; X86-X87-NEXT: movl $65535, %eax # imm = 0xFFFF 2137; X86-X87-NEXT: ja .LBB23_4 2138; X86-X87-NEXT: # %bb.3: 2139; X86-X87-NEXT: movl %ecx, %eax 2140; X86-X87-NEXT: .LBB23_4: 2141; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 2142; X86-X87-NEXT: addl $12, %esp 2143; X86-X87-NEXT: retl 2144; 2145; X86-SSE-LABEL: test_unsigned_i16_f16: 2146; X86-SSE: # %bb.0: 2147; X86-SSE-NEXT: subl $12, %esp 2148; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2149; X86-SSE-NEXT: movl %eax, (%esp) 2150; X86-SSE-NEXT: calll __gnu_h2f_ieee 2151; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2152; X86-SSE-NEXT: xorps %xmm0, %xmm0 2153; X86-SSE-NEXT: maxss {{[0-9]+}}(%esp), %xmm0 2154; X86-SSE-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero 2155; X86-SSE-NEXT: minss %xmm0, %xmm1 2156; X86-SSE-NEXT: cvttss2si %xmm1, %eax 2157; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 2158; X86-SSE-NEXT: addl $12, %esp 2159; X86-SSE-NEXT: retl 2160; 2161; X64-LABEL: test_unsigned_i16_f16: 2162; X64: # %bb.0: 2163; X64-NEXT: pushq %rax 2164; X64-NEXT: movzwl %di, %edi 2165; X64-NEXT: callq __gnu_h2f_ieee@PLT 2166; X64-NEXT: xorps %xmm1, %xmm1 2167; X64-NEXT: maxss %xmm0, %xmm1 2168; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2169; X64-NEXT: minss %xmm1, %xmm0 2170; X64-NEXT: cvttss2si %xmm0, %eax 2171; X64-NEXT: # kill: def $ax killed $ax killed $eax 2172; X64-NEXT: popq %rcx 2173; X64-NEXT: retq 2174 %x = call i16 @llvm.fptoui.sat.i16.f16(half %f) 2175 ret i16 %x 2176} 2177 2178define i19 @test_unsigned_i19_f16(half %f) nounwind { 2179; X86-X87-LABEL: test_unsigned_i19_f16: 2180; X86-X87: # %bb.0: 2181; X86-X87-NEXT: subl $28, %esp 2182; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2183; X86-X87-NEXT: movl %eax, (%esp) 2184; X86-X87-NEXT: calll __gnu_h2f_ieee 2185; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2186; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2187; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 2188; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 2189; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2190; X86-X87-NEXT: fld %st(0) 2191; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 2192; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2193; X86-X87-NEXT: fldz 2194; X86-X87-NEXT: fxch %st(1) 2195; X86-X87-NEXT: fucom %st(1) 2196; X86-X87-NEXT: fstp %st(1) 2197; X86-X87-NEXT: fnstsw %ax 2198; X86-X87-NEXT: xorl %ecx, %ecx 2199; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2200; X86-X87-NEXT: sahf 2201; X86-X87-NEXT: jb .LBB24_2 2202; X86-X87-NEXT: # %bb.1: 2203; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2204; X86-X87-NEXT: .LBB24_2: 2205; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2206; X86-X87-NEXT: fxch %st(1) 2207; X86-X87-NEXT: fucompp 2208; X86-X87-NEXT: fnstsw %ax 2209; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2210; X86-X87-NEXT: sahf 2211; X86-X87-NEXT: movl $524287, %eax # imm = 0x7FFFF 2212; X86-X87-NEXT: ja .LBB24_4 2213; X86-X87-NEXT: # %bb.3: 2214; X86-X87-NEXT: movl %ecx, %eax 2215; X86-X87-NEXT: .LBB24_4: 2216; X86-X87-NEXT: addl $28, %esp 2217; X86-X87-NEXT: retl 2218; 2219; X86-SSE-LABEL: test_unsigned_i19_f16: 2220; X86-SSE: # %bb.0: 2221; X86-SSE-NEXT: subl $12, %esp 2222; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2223; X86-SSE-NEXT: movl %eax, (%esp) 2224; X86-SSE-NEXT: calll __gnu_h2f_ieee 2225; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2226; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2227; X86-SSE-NEXT: xorps %xmm1, %xmm1 2228; X86-SSE-NEXT: maxss %xmm1, %xmm0 2229; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2230; X86-SSE-NEXT: cvttss2si %xmm0, %eax 2231; X86-SSE-NEXT: addl $12, %esp 2232; X86-SSE-NEXT: retl 2233; 2234; X64-LABEL: test_unsigned_i19_f16: 2235; X64: # %bb.0: 2236; X64-NEXT: pushq %rax 2237; X64-NEXT: movzwl %di, %edi 2238; X64-NEXT: callq __gnu_h2f_ieee@PLT 2239; X64-NEXT: xorps %xmm1, %xmm1 2240; X64-NEXT: maxss %xmm1, %xmm0 2241; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2242; X64-NEXT: cvttss2si %xmm0, %eax 2243; X64-NEXT: popq %rcx 2244; X64-NEXT: retq 2245 %x = call i19 @llvm.fptoui.sat.i19.f16(half %f) 2246 ret i19 %x 2247} 2248 2249define i32 @test_unsigned_i32_f16(half %f) nounwind { 2250; X86-X87-LABEL: test_unsigned_i32_f16: 2251; X86-X87: # %bb.0: 2252; X86-X87-NEXT: subl $28, %esp 2253; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2254; X86-X87-NEXT: movl %eax, (%esp) 2255; X86-X87-NEXT: calll __gnu_h2f_ieee 2256; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2257; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2258; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 2259; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 2260; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2261; X86-X87-NEXT: fld %st(0) 2262; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 2263; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2264; X86-X87-NEXT: fldz 2265; X86-X87-NEXT: fxch %st(1) 2266; X86-X87-NEXT: fucom %st(1) 2267; X86-X87-NEXT: fstp %st(1) 2268; X86-X87-NEXT: fnstsw %ax 2269; X86-X87-NEXT: xorl %ecx, %ecx 2270; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2271; X86-X87-NEXT: sahf 2272; X86-X87-NEXT: jb .LBB25_2 2273; X86-X87-NEXT: # %bb.1: 2274; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2275; X86-X87-NEXT: .LBB25_2: 2276; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2277; X86-X87-NEXT: fxch %st(1) 2278; X86-X87-NEXT: fucompp 2279; X86-X87-NEXT: fnstsw %ax 2280; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2281; X86-X87-NEXT: sahf 2282; X86-X87-NEXT: movl $-1, %eax 2283; X86-X87-NEXT: ja .LBB25_4 2284; X86-X87-NEXT: # %bb.3: 2285; X86-X87-NEXT: movl %ecx, %eax 2286; X86-X87-NEXT: .LBB25_4: 2287; X86-X87-NEXT: addl $28, %esp 2288; X86-X87-NEXT: retl 2289; 2290; X86-SSE-LABEL: test_unsigned_i32_f16: 2291; X86-SSE: # %bb.0: 2292; X86-SSE-NEXT: subl $12, %esp 2293; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2294; X86-SSE-NEXT: movl %eax, (%esp) 2295; X86-SSE-NEXT: calll __gnu_h2f_ieee 2296; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2297; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2298; X86-SSE-NEXT: cvttss2si %xmm0, %eax 2299; X86-SSE-NEXT: movl %eax, %ecx 2300; X86-SSE-NEXT: sarl $31, %ecx 2301; X86-SSE-NEXT: movaps %xmm0, %xmm1 2302; X86-SSE-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 2303; X86-SSE-NEXT: cvttss2si %xmm1, %edx 2304; X86-SSE-NEXT: andl %ecx, %edx 2305; X86-SSE-NEXT: orl %eax, %edx 2306; X86-SSE-NEXT: xorl %ecx, %ecx 2307; X86-SSE-NEXT: xorps %xmm1, %xmm1 2308; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 2309; X86-SSE-NEXT: cmovael %edx, %ecx 2310; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2311; X86-SSE-NEXT: movl $-1, %eax 2312; X86-SSE-NEXT: cmovbel %ecx, %eax 2313; X86-SSE-NEXT: addl $12, %esp 2314; X86-SSE-NEXT: retl 2315; 2316; X64-LABEL: test_unsigned_i32_f16: 2317; X64: # %bb.0: 2318; X64-NEXT: pushq %rax 2319; X64-NEXT: movzwl %di, %edi 2320; X64-NEXT: callq __gnu_h2f_ieee@PLT 2321; X64-NEXT: cvttss2si %xmm0, %rax 2322; X64-NEXT: xorl %ecx, %ecx 2323; X64-NEXT: xorps %xmm1, %xmm1 2324; X64-NEXT: ucomiss %xmm1, %xmm0 2325; X64-NEXT: cmovael %eax, %ecx 2326; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2327; X64-NEXT: movl $-1, %eax 2328; X64-NEXT: cmovbel %ecx, %eax 2329; X64-NEXT: popq %rcx 2330; X64-NEXT: retq 2331 %x = call i32 @llvm.fptoui.sat.i32.f16(half %f) 2332 ret i32 %x 2333} 2334 2335define i50 @test_unsigned_i50_f16(half %f) nounwind { 2336; X86-X87-LABEL: test_unsigned_i50_f16: 2337; X86-X87: # %bb.0: 2338; X86-X87-NEXT: pushl %esi 2339; X86-X87-NEXT: subl $24, %esp 2340; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2341; X86-X87-NEXT: movl %eax, (%esp) 2342; X86-X87-NEXT: calll __gnu_h2f_ieee 2343; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2344; X86-X87-NEXT: fxch %st(1) 2345; X86-X87-NEXT: fucom %st(1) 2346; X86-X87-NEXT: fnstsw %ax 2347; X86-X87-NEXT: xorl %ecx, %ecx 2348; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2349; X86-X87-NEXT: sahf 2350; X86-X87-NEXT: setae %al 2351; X86-X87-NEXT: fldz 2352; X86-X87-NEXT: jae .LBB26_2 2353; X86-X87-NEXT: # %bb.1: 2354; X86-X87-NEXT: fstp %st(2) 2355; X86-X87-NEXT: fld %st(1) 2356; X86-X87-NEXT: fxch %st(2) 2357; X86-X87-NEXT: .LBB26_2: 2358; X86-X87-NEXT: fxch %st(2) 2359; X86-X87-NEXT: fsubr %st(1), %st 2360; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2361; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 2362; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 2363; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 2364; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2365; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 2366; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2367; X86-X87-NEXT: movb %al, %cl 2368; X86-X87-NEXT: shll $31, %ecx 2369; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 2370; X86-X87-NEXT: fucom %st(1) 2371; X86-X87-NEXT: fstp %st(1) 2372; X86-X87-NEXT: fnstsw %ax 2373; X86-X87-NEXT: xorl %edx, %edx 2374; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2375; X86-X87-NEXT: sahf 2376; X86-X87-NEXT: movl $0, %esi 2377; X86-X87-NEXT: jb .LBB26_4 2378; X86-X87-NEXT: # %bb.3: 2379; X86-X87-NEXT: movl %ecx, %esi 2380; X86-X87-NEXT: .LBB26_4: 2381; X86-X87-NEXT: jb .LBB26_6 2382; X86-X87-NEXT: # %bb.5: 2383; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 2384; X86-X87-NEXT: .LBB26_6: 2385; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2386; X86-X87-NEXT: fxch %st(1) 2387; X86-X87-NEXT: fucompp 2388; X86-X87-NEXT: fnstsw %ax 2389; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2390; X86-X87-NEXT: sahf 2391; X86-X87-NEXT: movl $-1, %eax 2392; X86-X87-NEXT: ja .LBB26_8 2393; X86-X87-NEXT: # %bb.7: 2394; X86-X87-NEXT: movl %edx, %eax 2395; X86-X87-NEXT: .LBB26_8: 2396; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF 2397; X86-X87-NEXT: ja .LBB26_10 2398; X86-X87-NEXT: # %bb.9: 2399; X86-X87-NEXT: movl %esi, %edx 2400; X86-X87-NEXT: .LBB26_10: 2401; X86-X87-NEXT: addl $24, %esp 2402; X86-X87-NEXT: popl %esi 2403; X86-X87-NEXT: retl 2404; 2405; X86-SSE-LABEL: test_unsigned_i50_f16: 2406; X86-SSE: # %bb.0: 2407; X86-SSE-NEXT: pushl %esi 2408; X86-SSE-NEXT: subl $24, %esp 2409; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2410; X86-SSE-NEXT: movl %eax, (%esp) 2411; X86-SSE-NEXT: calll __gnu_h2f_ieee 2412; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2413; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2414; X86-SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 2415; X86-SSE-NEXT: ucomiss %xmm2, %xmm0 2416; X86-SSE-NEXT: xorps %xmm1, %xmm1 2417; X86-SSE-NEXT: jae .LBB26_2 2418; X86-SSE-NEXT: # %bb.1: 2419; X86-SSE-NEXT: xorps %xmm2, %xmm2 2420; X86-SSE-NEXT: .LBB26_2: 2421; X86-SSE-NEXT: movaps %xmm0, %xmm3 2422; X86-SSE-NEXT: subss %xmm2, %xmm3 2423; X86-SSE-NEXT: movss %xmm3, {{[0-9]+}}(%esp) 2424; X86-SSE-NEXT: setae %cl 2425; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) 2426; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 2427; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2428; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 2429; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 2430; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2431; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 2432; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2433; X86-SSE-NEXT: xorl %eax, %eax 2434; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 2435; X86-SSE-NEXT: movl $0, %esi 2436; X86-SSE-NEXT: jb .LBB26_4 2437; X86-SSE-NEXT: # %bb.3: 2438; X86-SSE-NEXT: movzbl %cl, %eax 2439; X86-SSE-NEXT: shll $31, %eax 2440; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax 2441; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 2442; X86-SSE-NEXT: .LBB26_4: 2443; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2444; X86-SSE-NEXT: movl $262143, %edx # imm = 0x3FFFF 2445; X86-SSE-NEXT: cmovbel %eax, %edx 2446; X86-SSE-NEXT: movl $-1, %eax 2447; X86-SSE-NEXT: cmovbel %esi, %eax 2448; X86-SSE-NEXT: addl $24, %esp 2449; X86-SSE-NEXT: popl %esi 2450; X86-SSE-NEXT: retl 2451; 2452; X64-LABEL: test_unsigned_i50_f16: 2453; X64: # %bb.0: 2454; X64-NEXT: pushq %rax 2455; X64-NEXT: movzwl %di, %edi 2456; X64-NEXT: callq __gnu_h2f_ieee@PLT 2457; X64-NEXT: cvttss2si %xmm0, %rax 2458; X64-NEXT: xorl %ecx, %ecx 2459; X64-NEXT: xorps %xmm1, %xmm1 2460; X64-NEXT: ucomiss %xmm1, %xmm0 2461; X64-NEXT: cmovaeq %rax, %rcx 2462; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2463; X64-NEXT: movabsq $1125899906842623, %rax # imm = 0x3FFFFFFFFFFFF 2464; X64-NEXT: cmovbeq %rcx, %rax 2465; X64-NEXT: popq %rcx 2466; X64-NEXT: retq 2467 %x = call i50 @llvm.fptoui.sat.i50.f16(half %f) 2468 ret i50 %x 2469} 2470 2471define i64 @test_unsigned_i64_f16(half %f) nounwind { 2472; X86-X87-LABEL: test_unsigned_i64_f16: 2473; X86-X87: # %bb.0: 2474; X86-X87-NEXT: pushl %edi 2475; X86-X87-NEXT: pushl %esi 2476; X86-X87-NEXT: subl $20, %esp 2477; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2478; X86-X87-NEXT: movl %eax, (%esp) 2479; X86-X87-NEXT: calll __gnu_h2f_ieee 2480; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2481; X86-X87-NEXT: fxch %st(1) 2482; X86-X87-NEXT: fucom %st(1) 2483; X86-X87-NEXT: fnstsw %ax 2484; X86-X87-NEXT: xorl %ecx, %ecx 2485; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2486; X86-X87-NEXT: sahf 2487; X86-X87-NEXT: setae %al 2488; X86-X87-NEXT: fldz 2489; X86-X87-NEXT: jae .LBB27_2 2490; X86-X87-NEXT: # %bb.1: 2491; X86-X87-NEXT: fstp %st(2) 2492; X86-X87-NEXT: fld %st(1) 2493; X86-X87-NEXT: fxch %st(2) 2494; X86-X87-NEXT: .LBB27_2: 2495; X86-X87-NEXT: fxch %st(2) 2496; X86-X87-NEXT: fsubr %st(1), %st 2497; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2498; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 2499; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 2500; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 2501; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2502; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 2503; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2504; X86-X87-NEXT: movb %al, %cl 2505; X86-X87-NEXT: shll $31, %ecx 2506; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 2507; X86-X87-NEXT: fucom %st(1) 2508; X86-X87-NEXT: fstp %st(1) 2509; X86-X87-NEXT: fnstsw %ax 2510; X86-X87-NEXT: xorl %esi, %esi 2511; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2512; X86-X87-NEXT: sahf 2513; X86-X87-NEXT: movl $0, %edi 2514; X86-X87-NEXT: jb .LBB27_4 2515; X86-X87-NEXT: # %bb.3: 2516; X86-X87-NEXT: movl %ecx, %edi 2517; X86-X87-NEXT: .LBB27_4: 2518; X86-X87-NEXT: jb .LBB27_6 2519; X86-X87-NEXT: # %bb.5: 2520; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 2521; X86-X87-NEXT: .LBB27_6: 2522; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2523; X86-X87-NEXT: fxch %st(1) 2524; X86-X87-NEXT: fucompp 2525; X86-X87-NEXT: fnstsw %ax 2526; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2527; X86-X87-NEXT: sahf 2528; X86-X87-NEXT: movl $-1, %eax 2529; X86-X87-NEXT: movl $-1, %edx 2530; X86-X87-NEXT: ja .LBB27_8 2531; X86-X87-NEXT: # %bb.7: 2532; X86-X87-NEXT: movl %esi, %eax 2533; X86-X87-NEXT: movl %edi, %edx 2534; X86-X87-NEXT: .LBB27_8: 2535; X86-X87-NEXT: addl $20, %esp 2536; X86-X87-NEXT: popl %esi 2537; X86-X87-NEXT: popl %edi 2538; X86-X87-NEXT: retl 2539; 2540; X86-SSE-LABEL: test_unsigned_i64_f16: 2541; X86-SSE: # %bb.0: 2542; X86-SSE-NEXT: subl $28, %esp 2543; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2544; X86-SSE-NEXT: movl %eax, (%esp) 2545; X86-SSE-NEXT: calll __gnu_h2f_ieee 2546; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2547; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2548; X86-SSE-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero 2549; X86-SSE-NEXT: ucomiss %xmm2, %xmm0 2550; X86-SSE-NEXT: xorps %xmm1, %xmm1 2551; X86-SSE-NEXT: jae .LBB27_2 2552; X86-SSE-NEXT: # %bb.1: 2553; X86-SSE-NEXT: xorps %xmm2, %xmm2 2554; X86-SSE-NEXT: .LBB27_2: 2555; X86-SSE-NEXT: movaps %xmm0, %xmm3 2556; X86-SSE-NEXT: subss %xmm2, %xmm3 2557; X86-SSE-NEXT: movss %xmm3, {{[0-9]+}}(%esp) 2558; X86-SSE-NEXT: setae %cl 2559; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) 2560; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 2561; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2562; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 2563; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 2564; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2565; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 2566; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2567; X86-SSE-NEXT: xorl %edx, %edx 2568; X86-SSE-NEXT: ucomiss %xmm1, %xmm0 2569; X86-SSE-NEXT: movl $0, %eax 2570; X86-SSE-NEXT: jb .LBB27_4 2571; X86-SSE-NEXT: # %bb.3: 2572; X86-SSE-NEXT: movzbl %cl, %edx 2573; X86-SSE-NEXT: shll $31, %edx 2574; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %edx 2575; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 2576; X86-SSE-NEXT: .LBB27_4: 2577; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2578; X86-SSE-NEXT: movl $-1, %ecx 2579; X86-SSE-NEXT: cmoval %ecx, %edx 2580; X86-SSE-NEXT: cmoval %ecx, %eax 2581; X86-SSE-NEXT: addl $28, %esp 2582; X86-SSE-NEXT: retl 2583; 2584; X64-LABEL: test_unsigned_i64_f16: 2585; X64: # %bb.0: 2586; X64-NEXT: pushq %rax 2587; X64-NEXT: movzwl %di, %edi 2588; X64-NEXT: callq __gnu_h2f_ieee@PLT 2589; X64-NEXT: cvttss2si %xmm0, %rax 2590; X64-NEXT: movq %rax, %rcx 2591; X64-NEXT: sarq $63, %rcx 2592; X64-NEXT: movaps %xmm0, %xmm1 2593; X64-NEXT: subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2594; X64-NEXT: cvttss2si %xmm1, %rdx 2595; X64-NEXT: andq %rcx, %rdx 2596; X64-NEXT: orq %rax, %rdx 2597; X64-NEXT: xorl %ecx, %ecx 2598; X64-NEXT: xorps %xmm1, %xmm1 2599; X64-NEXT: ucomiss %xmm1, %xmm0 2600; X64-NEXT: cmovaeq %rdx, %rcx 2601; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 2602; X64-NEXT: movq $-1, %rax 2603; X64-NEXT: cmovbeq %rcx, %rax 2604; X64-NEXT: popq %rcx 2605; X64-NEXT: retq 2606 %x = call i64 @llvm.fptoui.sat.i64.f16(half %f) 2607 ret i64 %x 2608} 2609 2610define i100 @test_unsigned_i100_f16(half %f) nounwind { 2611; X86-X87-LABEL: test_unsigned_i100_f16: 2612; X86-X87: # %bb.0: 2613; X86-X87-NEXT: pushl %ebp 2614; X86-X87-NEXT: pushl %ebx 2615; X86-X87-NEXT: pushl %edi 2616; X86-X87-NEXT: pushl %esi 2617; X86-X87-NEXT: subl $44, %esp 2618; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2619; X86-X87-NEXT: movl %eax, (%esp) 2620; X86-X87-NEXT: calll __gnu_h2f_ieee 2621; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 2622; X86-X87-NEXT: movl %eax, (%esp) 2623; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) 2624; X86-X87-NEXT: fldz 2625; X86-X87-NEXT: fxch %st(1) 2626; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill 2627; X86-X87-NEXT: fucompp 2628; X86-X87-NEXT: fnstsw %ax 2629; X86-X87-NEXT: movl %eax, %ebx 2630; X86-X87-NEXT: calll __fixunssfti 2631; X86-X87-NEXT: subl $4, %esp 2632; X86-X87-NEXT: xorl %edi, %edi 2633; X86-X87-NEXT: movb %bh, %ah 2634; X86-X87-NEXT: sahf 2635; X86-X87-NEXT: movl $0, %eax 2636; X86-X87-NEXT: jb .LBB28_2 2637; X86-X87-NEXT: # %bb.1: 2638; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 2639; X86-X87-NEXT: .LBB28_2: 2640; X86-X87-NEXT: movl $0, %esi 2641; X86-X87-NEXT: movl $0, %ebx 2642; X86-X87-NEXT: jb .LBB28_4 2643; X86-X87-NEXT: # %bb.3: 2644; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 2645; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 2646; X86-X87-NEXT: .LBB28_4: 2647; X86-X87-NEXT: jb .LBB28_6 2648; X86-X87-NEXT: # %bb.5: 2649; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi 2650; X86-X87-NEXT: .LBB28_6: 2651; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 2652; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2653; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2654; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 2655; X86-X87-NEXT: fucompp 2656; X86-X87-NEXT: fnstsw %ax 2657; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2658; X86-X87-NEXT: sahf 2659; X86-X87-NEXT: movl $15, %eax 2660; X86-X87-NEXT: ja .LBB28_8 2661; X86-X87-NEXT: # %bb.7: 2662; X86-X87-NEXT: movl %edi, %eax 2663; X86-X87-NEXT: .LBB28_8: 2664; X86-X87-NEXT: movl $-1, %edi 2665; X86-X87-NEXT: movl $-1, %ebp 2666; X86-X87-NEXT: movl $-1, %edx 2667; X86-X87-NEXT: ja .LBB28_10 2668; X86-X87-NEXT: # %bb.9: 2669; X86-X87-NEXT: movl %ebx, %edi 2670; X86-X87-NEXT: movl %esi, %ebp 2671; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 2672; X86-X87-NEXT: .LBB28_10: 2673; X86-X87-NEXT: movl %edx, 8(%ecx) 2674; X86-X87-NEXT: movl %ebp, 4(%ecx) 2675; X86-X87-NEXT: movl %edi, (%ecx) 2676; X86-X87-NEXT: andl $15, %eax 2677; X86-X87-NEXT: movb %al, 12(%ecx) 2678; X86-X87-NEXT: movl %ecx, %eax 2679; X86-X87-NEXT: addl $44, %esp 2680; X86-X87-NEXT: popl %esi 2681; X86-X87-NEXT: popl %edi 2682; X86-X87-NEXT: popl %ebx 2683; X86-X87-NEXT: popl %ebp 2684; X86-X87-NEXT: retl $4 2685; 2686; X86-SSE-LABEL: test_unsigned_i100_f16: 2687; X86-SSE: # %bb.0: 2688; X86-SSE-NEXT: pushl %ebx 2689; X86-SSE-NEXT: pushl %edi 2690; X86-SSE-NEXT: pushl %esi 2691; X86-SSE-NEXT: subl $32, %esp 2692; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 2693; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2694; X86-SSE-NEXT: movl %eax, (%esp) 2695; X86-SSE-NEXT: calll __gnu_h2f_ieee 2696; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 2697; X86-SSE-NEXT: movl %eax, (%esp) 2698; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2699; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2700; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 2701; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 2702; X86-SSE-NEXT: calll __fixunssfti 2703; X86-SSE-NEXT: subl $4, %esp 2704; X86-SSE-NEXT: xorl %eax, %eax 2705; X86-SSE-NEXT: xorps %xmm0, %xmm0 2706; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 4-byte Reload 2707; X86-SSE-NEXT: # xmm1 = mem[0],zero,zero,zero 2708; X86-SSE-NEXT: ucomiss %xmm0, %xmm1 2709; X86-SSE-NEXT: movaps %xmm1, %xmm0 2710; X86-SSE-NEXT: movl $0, %ecx 2711; X86-SSE-NEXT: movl $0, %edx 2712; X86-SSE-NEXT: movl $0, %edi 2713; X86-SSE-NEXT: jb .LBB28_2 2714; X86-SSE-NEXT: # %bb.1: 2715; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 2716; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 2717; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 2718; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 2719; X86-SSE-NEXT: .LBB28_2: 2720; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2721; X86-SSE-NEXT: movl $15, %ebx 2722; X86-SSE-NEXT: cmovbel %edi, %ebx 2723; X86-SSE-NEXT: movl $-1, %edi 2724; X86-SSE-NEXT: cmoval %edi, %edx 2725; X86-SSE-NEXT: cmoval %edi, %ecx 2726; X86-SSE-NEXT: cmoval %edi, %eax 2727; X86-SSE-NEXT: movl %eax, 8(%esi) 2728; X86-SSE-NEXT: movl %ecx, 4(%esi) 2729; X86-SSE-NEXT: movl %edx, (%esi) 2730; X86-SSE-NEXT: andl $15, %ebx 2731; X86-SSE-NEXT: movb %bl, 12(%esi) 2732; X86-SSE-NEXT: movl %esi, %eax 2733; X86-SSE-NEXT: addl $32, %esp 2734; X86-SSE-NEXT: popl %esi 2735; X86-SSE-NEXT: popl %edi 2736; X86-SSE-NEXT: popl %ebx 2737; X86-SSE-NEXT: retl $4 2738; 2739; X64-LABEL: test_unsigned_i100_f16: 2740; X64: # %bb.0: 2741; X64-NEXT: pushq %rax 2742; X64-NEXT: movzwl %di, %edi 2743; X64-NEXT: callq __gnu_h2f_ieee@PLT 2744; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 2745; X64-NEXT: callq __fixunssfti@PLT 2746; X64-NEXT: xorl %ecx, %ecx 2747; X64-NEXT: xorps %xmm0, %xmm0 2748; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload 2749; X64-NEXT: # xmm1 = mem[0],zero,zero,zero 2750; X64-NEXT: ucomiss %xmm0, %xmm1 2751; X64-NEXT: cmovbq %rcx, %rdx 2752; X64-NEXT: cmovbq %rcx, %rax 2753; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2754; X64-NEXT: movq $-1, %rcx 2755; X64-NEXT: cmovaq %rcx, %rax 2756; X64-NEXT: movabsq $68719476735, %rcx # imm = 0xFFFFFFFFF 2757; X64-NEXT: cmovaq %rcx, %rdx 2758; X64-NEXT: popq %rcx 2759; X64-NEXT: retq 2760 %x = call i100 @llvm.fptoui.sat.i100.f16(half %f) 2761 ret i100 %x 2762} 2763 2764define i128 @test_unsigned_i128_f16(half %f) nounwind { 2765; X86-X87-LABEL: test_unsigned_i128_f16: 2766; X86-X87: # %bb.0: 2767; X86-X87-NEXT: pushl %ebp 2768; X86-X87-NEXT: pushl %ebx 2769; X86-X87-NEXT: pushl %edi 2770; X86-X87-NEXT: pushl %esi 2771; X86-X87-NEXT: subl $44, %esp 2772; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2773; X86-X87-NEXT: movl %eax, (%esp) 2774; X86-X87-NEXT: calll __gnu_h2f_ieee 2775; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 2776; X86-X87-NEXT: movl %eax, (%esp) 2777; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) 2778; X86-X87-NEXT: fldz 2779; X86-X87-NEXT: fxch %st(1) 2780; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill 2781; X86-X87-NEXT: fucompp 2782; X86-X87-NEXT: fnstsw %ax 2783; X86-X87-NEXT: movl %eax, %ebx 2784; X86-X87-NEXT: calll __fixunssfti 2785; X86-X87-NEXT: subl $4, %esp 2786; X86-X87-NEXT: xorl %edx, %edx 2787; X86-X87-NEXT: movb %bh, %ah 2788; X86-X87-NEXT: sahf 2789; X86-X87-NEXT: movl $0, %eax 2790; X86-X87-NEXT: jb .LBB29_2 2791; X86-X87-NEXT: # %bb.1: 2792; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 2793; X86-X87-NEXT: .LBB29_2: 2794; X86-X87-NEXT: movl $0, %ecx 2795; X86-X87-NEXT: jb .LBB29_4 2796; X86-X87-NEXT: # %bb.3: 2797; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2798; X86-X87-NEXT: .LBB29_4: 2799; X86-X87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 2800; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 2801; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 2802; X86-X87-NEXT: movl $0, %ebx 2803; X86-X87-NEXT: jb .LBB29_6 2804; X86-X87-NEXT: # %bb.5: 2805; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 2806; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 2807; X86-X87-NEXT: .LBB29_6: 2808; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 2809; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload 2810; X86-X87-NEXT: fucompp 2811; X86-X87-NEXT: fnstsw %ax 2812; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2813; X86-X87-NEXT: sahf 2814; X86-X87-NEXT: movl $-1, %eax 2815; X86-X87-NEXT: movl $-1, %ebp 2816; X86-X87-NEXT: movl $-1, %edi 2817; X86-X87-NEXT: movl $-1, %esi 2818; X86-X87-NEXT: ja .LBB29_8 2819; X86-X87-NEXT: # %bb.7: 2820; X86-X87-NEXT: movl %ebx, %eax 2821; X86-X87-NEXT: movl %edx, %ebp 2822; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload 2823; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload 2824; X86-X87-NEXT: .LBB29_8: 2825; X86-X87-NEXT: movl %esi, 12(%ecx) 2826; X86-X87-NEXT: movl %edi, 8(%ecx) 2827; X86-X87-NEXT: movl %ebp, 4(%ecx) 2828; X86-X87-NEXT: movl %eax, (%ecx) 2829; X86-X87-NEXT: movl %ecx, %eax 2830; X86-X87-NEXT: addl $44, %esp 2831; X86-X87-NEXT: popl %esi 2832; X86-X87-NEXT: popl %edi 2833; X86-X87-NEXT: popl %ebx 2834; X86-X87-NEXT: popl %ebp 2835; X86-X87-NEXT: retl $4 2836; 2837; X86-SSE-LABEL: test_unsigned_i128_f16: 2838; X86-SSE: # %bb.0: 2839; X86-SSE-NEXT: pushl %ebx 2840; X86-SSE-NEXT: pushl %edi 2841; X86-SSE-NEXT: pushl %esi 2842; X86-SSE-NEXT: subl $32, %esp 2843; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 2844; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2845; X86-SSE-NEXT: movl %eax, (%esp) 2846; X86-SSE-NEXT: calll __gnu_h2f_ieee 2847; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 2848; X86-SSE-NEXT: movl %eax, (%esp) 2849; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) 2850; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero 2851; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 2852; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) 2853; X86-SSE-NEXT: calll __fixunssfti 2854; X86-SSE-NEXT: subl $4, %esp 2855; X86-SSE-NEXT: xorl %eax, %eax 2856; X86-SSE-NEXT: xorps %xmm0, %xmm0 2857; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 4-byte Reload 2858; X86-SSE-NEXT: # xmm1 = mem[0],zero,zero,zero 2859; X86-SSE-NEXT: ucomiss %xmm0, %xmm1 2860; X86-SSE-NEXT: movaps %xmm1, %xmm0 2861; X86-SSE-NEXT: movl $0, %ecx 2862; X86-SSE-NEXT: movl $0, %edx 2863; X86-SSE-NEXT: movl $0, %edi 2864; X86-SSE-NEXT: jb .LBB29_2 2865; X86-SSE-NEXT: # %bb.1: 2866; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 2867; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 2868; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 2869; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 2870; X86-SSE-NEXT: .LBB29_2: 2871; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 2872; X86-SSE-NEXT: movl $-1, %ebx 2873; X86-SSE-NEXT: cmoval %ebx, %edi 2874; X86-SSE-NEXT: cmoval %ebx, %edx 2875; X86-SSE-NEXT: cmoval %ebx, %ecx 2876; X86-SSE-NEXT: cmoval %ebx, %eax 2877; X86-SSE-NEXT: movl %eax, 12(%esi) 2878; X86-SSE-NEXT: movl %ecx, 8(%esi) 2879; X86-SSE-NEXT: movl %edx, 4(%esi) 2880; X86-SSE-NEXT: movl %edi, (%esi) 2881; X86-SSE-NEXT: movl %esi, %eax 2882; X86-SSE-NEXT: addl $32, %esp 2883; X86-SSE-NEXT: popl %esi 2884; X86-SSE-NEXT: popl %edi 2885; X86-SSE-NEXT: popl %ebx 2886; X86-SSE-NEXT: retl $4 2887; 2888; X64-LABEL: test_unsigned_i128_f16: 2889; X64: # %bb.0: 2890; X64-NEXT: pushq %rax 2891; X64-NEXT: movzwl %di, %edi 2892; X64-NEXT: callq __gnu_h2f_ieee@PLT 2893; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill 2894; X64-NEXT: callq __fixunssfti@PLT 2895; X64-NEXT: xorl %ecx, %ecx 2896; X64-NEXT: xorps %xmm0, %xmm0 2897; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload 2898; X64-NEXT: # xmm1 = mem[0],zero,zero,zero 2899; X64-NEXT: ucomiss %xmm0, %xmm1 2900; X64-NEXT: cmovbq %rcx, %rdx 2901; X64-NEXT: cmovbq %rcx, %rax 2902; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 2903; X64-NEXT: movq $-1, %rcx 2904; X64-NEXT: cmovaq %rcx, %rax 2905; X64-NEXT: cmovaq %rcx, %rdx 2906; X64-NEXT: popq %rcx 2907; X64-NEXT: retq 2908 %x = call i128 @llvm.fptoui.sat.i128.f16(half %f) 2909 ret i128 %x 2910} 2911 2912; 2913; 80-bit float to unsigned integer 2914; 2915 2916declare i1 @llvm.fptoui.sat.i1.f80 (x86_fp80) 2917declare i8 @llvm.fptoui.sat.i8.f80 (x86_fp80) 2918declare i13 @llvm.fptoui.sat.i13.f80 (x86_fp80) 2919declare i16 @llvm.fptoui.sat.i16.f80 (x86_fp80) 2920declare i19 @llvm.fptoui.sat.i19.f80 (x86_fp80) 2921declare i32 @llvm.fptoui.sat.i32.f80 (x86_fp80) 2922declare i50 @llvm.fptoui.sat.i50.f80 (x86_fp80) 2923declare i64 @llvm.fptoui.sat.i64.f80 (x86_fp80) 2924declare i100 @llvm.fptoui.sat.i100.f80(x86_fp80) 2925declare i128 @llvm.fptoui.sat.i128.f80(x86_fp80) 2926 2927define i1 @test_unsigned_i1_f80(x86_fp80 %f) nounwind { 2928; X86-X87-LABEL: test_unsigned_i1_f80: 2929; X86-X87: # %bb.0: 2930; X86-X87-NEXT: subl $8, %esp 2931; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 2932; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 2933; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2934; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 2935; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 2936; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2937; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 2938; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 2939; X86-X87-NEXT: fldz 2940; X86-X87-NEXT: fxch %st(1) 2941; X86-X87-NEXT: fucom %st(1) 2942; X86-X87-NEXT: fstp %st(1) 2943; X86-X87-NEXT: fnstsw %ax 2944; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2945; X86-X87-NEXT: sahf 2946; X86-X87-NEXT: jb .LBB30_1 2947; X86-X87-NEXT: # %bb.2: 2948; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 2949; X86-X87-NEXT: jmp .LBB30_3 2950; X86-X87-NEXT: .LBB30_1: 2951; X86-X87-NEXT: xorl %ecx, %ecx 2952; X86-X87-NEXT: .LBB30_3: 2953; X86-X87-NEXT: fld1 2954; X86-X87-NEXT: fxch %st(1) 2955; X86-X87-NEXT: fucompp 2956; X86-X87-NEXT: fnstsw %ax 2957; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 2958; X86-X87-NEXT: sahf 2959; X86-X87-NEXT: movb $1, %al 2960; X86-X87-NEXT: ja .LBB30_5 2961; X86-X87-NEXT: # %bb.4: 2962; X86-X87-NEXT: movl %ecx, %eax 2963; X86-X87-NEXT: .LBB30_5: 2964; X86-X87-NEXT: addl $8, %esp 2965; X86-X87-NEXT: retl 2966; 2967; X86-SSE-LABEL: test_unsigned_i1_f80: 2968; X86-SSE: # %bb.0: 2969; X86-SSE-NEXT: subl $8, %esp 2970; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 2971; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 2972; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 2973; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 2974; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 2975; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2976; X86-SSE-NEXT: fists {{[0-9]+}}(%esp) 2977; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 2978; X86-SSE-NEXT: movzbl {{[0-9]+}}(%esp), %eax 2979; X86-SSE-NEXT: xorl %ecx, %ecx 2980; X86-SSE-NEXT: fldz 2981; X86-SSE-NEXT: fxch %st(1) 2982; X86-SSE-NEXT: fucomi %st(1), %st 2983; X86-SSE-NEXT: fstp %st(1) 2984; X86-SSE-NEXT: cmovael %eax, %ecx 2985; X86-SSE-NEXT: fld1 2986; X86-SSE-NEXT: fxch %st(1) 2987; X86-SSE-NEXT: fucompi %st(1), %st 2988; X86-SSE-NEXT: fstp %st(0) 2989; X86-SSE-NEXT: movl $1, %eax 2990; X86-SSE-NEXT: cmovbel %ecx, %eax 2991; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 2992; X86-SSE-NEXT: addl $8, %esp 2993; X86-SSE-NEXT: retl 2994; 2995; X64-LABEL: test_unsigned_i1_f80: 2996; X64: # %bb.0: 2997; X64-NEXT: fldt {{[0-9]+}}(%rsp) 2998; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 2999; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3000; X64-NEXT: orl $3072, %eax # imm = 0xC00 3001; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3002; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3003; X64-NEXT: fists -{{[0-9]+}}(%rsp) 3004; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3005; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 3006; X64-NEXT: xorl %ecx, %ecx 3007; X64-NEXT: fldz 3008; X64-NEXT: fxch %st(1) 3009; X64-NEXT: fucomi %st(1), %st 3010; X64-NEXT: fstp %st(1) 3011; X64-NEXT: cmovael %eax, %ecx 3012; X64-NEXT: fld1 3013; X64-NEXT: fxch %st(1) 3014; X64-NEXT: fucompi %st(1), %st 3015; X64-NEXT: fstp %st(0) 3016; X64-NEXT: movl $1, %eax 3017; X64-NEXT: cmovbel %ecx, %eax 3018; X64-NEXT: # kill: def $al killed $al killed $eax 3019; X64-NEXT: retq 3020 %x = call i1 @llvm.fptoui.sat.i1.f80(x86_fp80 %f) 3021 ret i1 %x 3022} 3023 3024define i8 @test_unsigned_i8_f80(x86_fp80 %f) nounwind { 3025; X86-X87-LABEL: test_unsigned_i8_f80: 3026; X86-X87: # %bb.0: 3027; X86-X87-NEXT: subl $8, %esp 3028; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3029; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 3030; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3031; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 3032; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 3033; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3034; X86-X87-NEXT: fists {{[0-9]+}}(%esp) 3035; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3036; X86-X87-NEXT: fldz 3037; X86-X87-NEXT: fxch %st(1) 3038; X86-X87-NEXT: fucom %st(1) 3039; X86-X87-NEXT: fstp %st(1) 3040; X86-X87-NEXT: fnstsw %ax 3041; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3042; X86-X87-NEXT: sahf 3043; X86-X87-NEXT: jb .LBB31_1 3044; X86-X87-NEXT: # %bb.2: 3045; X86-X87-NEXT: movb {{[0-9]+}}(%esp), %cl 3046; X86-X87-NEXT: jmp .LBB31_3 3047; X86-X87-NEXT: .LBB31_1: 3048; X86-X87-NEXT: xorl %ecx, %ecx 3049; X86-X87-NEXT: .LBB31_3: 3050; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3051; X86-X87-NEXT: fxch %st(1) 3052; X86-X87-NEXT: fucompp 3053; X86-X87-NEXT: fnstsw %ax 3054; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3055; X86-X87-NEXT: sahf 3056; X86-X87-NEXT: movb $-1, %al 3057; X86-X87-NEXT: ja .LBB31_5 3058; X86-X87-NEXT: # %bb.4: 3059; X86-X87-NEXT: movl %ecx, %eax 3060; X86-X87-NEXT: .LBB31_5: 3061; X86-X87-NEXT: addl $8, %esp 3062; X86-X87-NEXT: retl 3063; 3064; X86-SSE-LABEL: test_unsigned_i8_f80: 3065; X86-SSE: # %bb.0: 3066; X86-SSE-NEXT: subl $8, %esp 3067; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3068; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 3069; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3070; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3071; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3072; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3073; X86-SSE-NEXT: fists {{[0-9]+}}(%esp) 3074; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3075; X86-SSE-NEXT: movzbl {{[0-9]+}}(%esp), %eax 3076; X86-SSE-NEXT: xorl %ecx, %ecx 3077; X86-SSE-NEXT: fldz 3078; X86-SSE-NEXT: fxch %st(1) 3079; X86-SSE-NEXT: fucomi %st(1), %st 3080; X86-SSE-NEXT: fstp %st(1) 3081; X86-SSE-NEXT: cmovael %eax, %ecx 3082; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3083; X86-SSE-NEXT: fxch %st(1) 3084; X86-SSE-NEXT: fucompi %st(1), %st 3085; X86-SSE-NEXT: fstp %st(0) 3086; X86-SSE-NEXT: movl $255, %eax 3087; X86-SSE-NEXT: cmovbel %ecx, %eax 3088; X86-SSE-NEXT: # kill: def $al killed $al killed $eax 3089; X86-SSE-NEXT: addl $8, %esp 3090; X86-SSE-NEXT: retl 3091; 3092; X64-LABEL: test_unsigned_i8_f80: 3093; X64: # %bb.0: 3094; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3095; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3096; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3097; X64-NEXT: orl $3072, %eax # imm = 0xC00 3098; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3099; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3100; X64-NEXT: fists -{{[0-9]+}}(%rsp) 3101; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3102; X64-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 3103; X64-NEXT: xorl %ecx, %ecx 3104; X64-NEXT: fldz 3105; X64-NEXT: fxch %st(1) 3106; X64-NEXT: fucomi %st(1), %st 3107; X64-NEXT: fstp %st(1) 3108; X64-NEXT: cmovael %eax, %ecx 3109; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3110; X64-NEXT: fxch %st(1) 3111; X64-NEXT: fucompi %st(1), %st 3112; X64-NEXT: fstp %st(0) 3113; X64-NEXT: movl $255, %eax 3114; X64-NEXT: cmovbel %ecx, %eax 3115; X64-NEXT: # kill: def $al killed $al killed $eax 3116; X64-NEXT: retq 3117 %x = call i8 @llvm.fptoui.sat.i8.f80(x86_fp80 %f) 3118 ret i8 %x 3119} 3120 3121define i13 @test_unsigned_i13_f80(x86_fp80 %f) nounwind { 3122; X86-X87-LABEL: test_unsigned_i13_f80: 3123; X86-X87: # %bb.0: 3124; X86-X87-NEXT: subl $8, %esp 3125; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3126; X86-X87-NEXT: fnstcw (%esp) 3127; X86-X87-NEXT: movzwl (%esp), %eax 3128; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 3129; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 3130; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3131; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 3132; X86-X87-NEXT: fldcw (%esp) 3133; X86-X87-NEXT: fldz 3134; X86-X87-NEXT: fxch %st(1) 3135; X86-X87-NEXT: fucom %st(1) 3136; X86-X87-NEXT: fstp %st(1) 3137; X86-X87-NEXT: fnstsw %ax 3138; X86-X87-NEXT: xorl %ecx, %ecx 3139; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3140; X86-X87-NEXT: sahf 3141; X86-X87-NEXT: jb .LBB32_2 3142; X86-X87-NEXT: # %bb.1: 3143; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 3144; X86-X87-NEXT: .LBB32_2: 3145; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3146; X86-X87-NEXT: fxch %st(1) 3147; X86-X87-NEXT: fucompp 3148; X86-X87-NEXT: fnstsw %ax 3149; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3150; X86-X87-NEXT: sahf 3151; X86-X87-NEXT: movl $8191, %eax # imm = 0x1FFF 3152; X86-X87-NEXT: ja .LBB32_4 3153; X86-X87-NEXT: # %bb.3: 3154; X86-X87-NEXT: movl %ecx, %eax 3155; X86-X87-NEXT: .LBB32_4: 3156; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 3157; X86-X87-NEXT: addl $8, %esp 3158; X86-X87-NEXT: retl 3159; 3160; X86-SSE-LABEL: test_unsigned_i13_f80: 3161; X86-SSE: # %bb.0: 3162; X86-SSE-NEXT: subl $8, %esp 3163; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3164; X86-SSE-NEXT: fnstcw (%esp) 3165; X86-SSE-NEXT: movzwl (%esp), %eax 3166; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3167; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3168; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3169; X86-SSE-NEXT: fistl {{[0-9]+}}(%esp) 3170; X86-SSE-NEXT: fldcw (%esp) 3171; X86-SSE-NEXT: xorl %ecx, %ecx 3172; X86-SSE-NEXT: fldz 3173; X86-SSE-NEXT: fxch %st(1) 3174; X86-SSE-NEXT: fucomi %st(1), %st 3175; X86-SSE-NEXT: fstp %st(1) 3176; X86-SSE-NEXT: jb .LBB32_2 3177; X86-SSE-NEXT: # %bb.1: 3178; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 3179; X86-SSE-NEXT: .LBB32_2: 3180; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3181; X86-SSE-NEXT: fxch %st(1) 3182; X86-SSE-NEXT: fucompi %st(1), %st 3183; X86-SSE-NEXT: fstp %st(0) 3184; X86-SSE-NEXT: movl $8191, %eax # imm = 0x1FFF 3185; X86-SSE-NEXT: cmovbel %ecx, %eax 3186; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 3187; X86-SSE-NEXT: addl $8, %esp 3188; X86-SSE-NEXT: retl 3189; 3190; X64-LABEL: test_unsigned_i13_f80: 3191; X64: # %bb.0: 3192; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3193; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3194; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3195; X64-NEXT: orl $3072, %eax # imm = 0xC00 3196; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3197; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3198; X64-NEXT: fistl -{{[0-9]+}}(%rsp) 3199; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3200; X64-NEXT: xorl %ecx, %ecx 3201; X64-NEXT: fldz 3202; X64-NEXT: fxch %st(1) 3203; X64-NEXT: fucomi %st(1), %st 3204; X64-NEXT: fstp %st(1) 3205; X64-NEXT: jb .LBB32_2 3206; X64-NEXT: # %bb.1: 3207; X64-NEXT: movl -{{[0-9]+}}(%rsp), %ecx 3208; X64-NEXT: .LBB32_2: 3209; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3210; X64-NEXT: fxch %st(1) 3211; X64-NEXT: fucompi %st(1), %st 3212; X64-NEXT: fstp %st(0) 3213; X64-NEXT: movl $8191, %eax # imm = 0x1FFF 3214; X64-NEXT: cmovbel %ecx, %eax 3215; X64-NEXT: # kill: def $ax killed $ax killed $eax 3216; X64-NEXT: retq 3217 %x = call i13 @llvm.fptoui.sat.i13.f80(x86_fp80 %f) 3218 ret i13 %x 3219} 3220 3221define i16 @test_unsigned_i16_f80(x86_fp80 %f) nounwind { 3222; X86-X87-LABEL: test_unsigned_i16_f80: 3223; X86-X87: # %bb.0: 3224; X86-X87-NEXT: subl $8, %esp 3225; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3226; X86-X87-NEXT: fnstcw (%esp) 3227; X86-X87-NEXT: movzwl (%esp), %eax 3228; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 3229; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 3230; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3231; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) 3232; X86-X87-NEXT: fldcw (%esp) 3233; X86-X87-NEXT: fldz 3234; X86-X87-NEXT: fxch %st(1) 3235; X86-X87-NEXT: fucom %st(1) 3236; X86-X87-NEXT: fstp %st(1) 3237; X86-X87-NEXT: fnstsw %ax 3238; X86-X87-NEXT: xorl %ecx, %ecx 3239; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3240; X86-X87-NEXT: sahf 3241; X86-X87-NEXT: jb .LBB33_2 3242; X86-X87-NEXT: # %bb.1: 3243; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 3244; X86-X87-NEXT: .LBB33_2: 3245; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3246; X86-X87-NEXT: fxch %st(1) 3247; X86-X87-NEXT: fucompp 3248; X86-X87-NEXT: fnstsw %ax 3249; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3250; X86-X87-NEXT: sahf 3251; X86-X87-NEXT: movl $65535, %eax # imm = 0xFFFF 3252; X86-X87-NEXT: ja .LBB33_4 3253; X86-X87-NEXT: # %bb.3: 3254; X86-X87-NEXT: movl %ecx, %eax 3255; X86-X87-NEXT: .LBB33_4: 3256; X86-X87-NEXT: # kill: def $ax killed $ax killed $eax 3257; X86-X87-NEXT: addl $8, %esp 3258; X86-X87-NEXT: retl 3259; 3260; X86-SSE-LABEL: test_unsigned_i16_f80: 3261; X86-SSE: # %bb.0: 3262; X86-SSE-NEXT: subl $8, %esp 3263; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3264; X86-SSE-NEXT: fnstcw (%esp) 3265; X86-SSE-NEXT: movzwl (%esp), %eax 3266; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3267; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3268; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3269; X86-SSE-NEXT: fistl {{[0-9]+}}(%esp) 3270; X86-SSE-NEXT: fldcw (%esp) 3271; X86-SSE-NEXT: xorl %ecx, %ecx 3272; X86-SSE-NEXT: fldz 3273; X86-SSE-NEXT: fxch %st(1) 3274; X86-SSE-NEXT: fucomi %st(1), %st 3275; X86-SSE-NEXT: fstp %st(1) 3276; X86-SSE-NEXT: jb .LBB33_2 3277; X86-SSE-NEXT: # %bb.1: 3278; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 3279; X86-SSE-NEXT: .LBB33_2: 3280; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3281; X86-SSE-NEXT: fxch %st(1) 3282; X86-SSE-NEXT: fucompi %st(1), %st 3283; X86-SSE-NEXT: fstp %st(0) 3284; X86-SSE-NEXT: movl $65535, %eax # imm = 0xFFFF 3285; X86-SSE-NEXT: cmovbel %ecx, %eax 3286; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax 3287; X86-SSE-NEXT: addl $8, %esp 3288; X86-SSE-NEXT: retl 3289; 3290; X64-LABEL: test_unsigned_i16_f80: 3291; X64: # %bb.0: 3292; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3293; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3294; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3295; X64-NEXT: orl $3072, %eax # imm = 0xC00 3296; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3297; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3298; X64-NEXT: fistl -{{[0-9]+}}(%rsp) 3299; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3300; X64-NEXT: xorl %ecx, %ecx 3301; X64-NEXT: fldz 3302; X64-NEXT: fxch %st(1) 3303; X64-NEXT: fucomi %st(1), %st 3304; X64-NEXT: fstp %st(1) 3305; X64-NEXT: jb .LBB33_2 3306; X64-NEXT: # %bb.1: 3307; X64-NEXT: movl -{{[0-9]+}}(%rsp), %ecx 3308; X64-NEXT: .LBB33_2: 3309; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3310; X64-NEXT: fxch %st(1) 3311; X64-NEXT: fucompi %st(1), %st 3312; X64-NEXT: fstp %st(0) 3313; X64-NEXT: movl $65535, %eax # imm = 0xFFFF 3314; X64-NEXT: cmovbel %ecx, %eax 3315; X64-NEXT: # kill: def $ax killed $ax killed $eax 3316; X64-NEXT: retq 3317 %x = call i16 @llvm.fptoui.sat.i16.f80(x86_fp80 %f) 3318 ret i16 %x 3319} 3320 3321define i19 @test_unsigned_i19_f80(x86_fp80 %f) nounwind { 3322; X86-X87-LABEL: test_unsigned_i19_f80: 3323; X86-X87: # %bb.0: 3324; X86-X87-NEXT: subl $20, %esp 3325; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3326; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 3327; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3328; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 3329; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 3330; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3331; X86-X87-NEXT: fld %st(0) 3332; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 3333; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3334; X86-X87-NEXT: fldz 3335; X86-X87-NEXT: fxch %st(1) 3336; X86-X87-NEXT: fucom %st(1) 3337; X86-X87-NEXT: fstp %st(1) 3338; X86-X87-NEXT: fnstsw %ax 3339; X86-X87-NEXT: xorl %ecx, %ecx 3340; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3341; X86-X87-NEXT: sahf 3342; X86-X87-NEXT: jb .LBB34_2 3343; X86-X87-NEXT: # %bb.1: 3344; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 3345; X86-X87-NEXT: .LBB34_2: 3346; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3347; X86-X87-NEXT: fxch %st(1) 3348; X86-X87-NEXT: fucompp 3349; X86-X87-NEXT: fnstsw %ax 3350; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3351; X86-X87-NEXT: sahf 3352; X86-X87-NEXT: movl $524287, %eax # imm = 0x7FFFF 3353; X86-X87-NEXT: ja .LBB34_4 3354; X86-X87-NEXT: # %bb.3: 3355; X86-X87-NEXT: movl %ecx, %eax 3356; X86-X87-NEXT: .LBB34_4: 3357; X86-X87-NEXT: addl $20, %esp 3358; X86-X87-NEXT: retl 3359; 3360; X86-SSE-LABEL: test_unsigned_i19_f80: 3361; X86-SSE: # %bb.0: 3362; X86-SSE-NEXT: subl $20, %esp 3363; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3364; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 3365; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3366; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3367; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3368; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3369; X86-SSE-NEXT: fld %st(0) 3370; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 3371; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3372; X86-SSE-NEXT: xorl %ecx, %ecx 3373; X86-SSE-NEXT: fldz 3374; X86-SSE-NEXT: fxch %st(1) 3375; X86-SSE-NEXT: fucomi %st(1), %st 3376; X86-SSE-NEXT: fstp %st(1) 3377; X86-SSE-NEXT: jb .LBB34_2 3378; X86-SSE-NEXT: # %bb.1: 3379; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 3380; X86-SSE-NEXT: .LBB34_2: 3381; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3382; X86-SSE-NEXT: fxch %st(1) 3383; X86-SSE-NEXT: fucompi %st(1), %st 3384; X86-SSE-NEXT: fstp %st(0) 3385; X86-SSE-NEXT: movl $524287, %eax # imm = 0x7FFFF 3386; X86-SSE-NEXT: cmovbel %ecx, %eax 3387; X86-SSE-NEXT: addl $20, %esp 3388; X86-SSE-NEXT: retl 3389; 3390; X64-LABEL: test_unsigned_i19_f80: 3391; X64: # %bb.0: 3392; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3393; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3394; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3395; X64-NEXT: orl $3072, %eax # imm = 0xC00 3396; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3397; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3398; X64-NEXT: fld %st(0) 3399; X64-NEXT: fistpll -{{[0-9]+}}(%rsp) 3400; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3401; X64-NEXT: xorl %ecx, %ecx 3402; X64-NEXT: fldz 3403; X64-NEXT: fxch %st(1) 3404; X64-NEXT: fucomi %st(1), %st 3405; X64-NEXT: fstp %st(1) 3406; X64-NEXT: jb .LBB34_2 3407; X64-NEXT: # %bb.1: 3408; X64-NEXT: movl -{{[0-9]+}}(%rsp), %ecx 3409; X64-NEXT: .LBB34_2: 3410; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3411; X64-NEXT: fxch %st(1) 3412; X64-NEXT: fucompi %st(1), %st 3413; X64-NEXT: fstp %st(0) 3414; X64-NEXT: movl $524287, %eax # imm = 0x7FFFF 3415; X64-NEXT: cmovbel %ecx, %eax 3416; X64-NEXT: retq 3417 %x = call i19 @llvm.fptoui.sat.i19.f80(x86_fp80 %f) 3418 ret i19 %x 3419} 3420 3421define i32 @test_unsigned_i32_f80(x86_fp80 %f) nounwind { 3422; X86-X87-LABEL: test_unsigned_i32_f80: 3423; X86-X87: # %bb.0: 3424; X86-X87-NEXT: subl $20, %esp 3425; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3426; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 3427; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3428; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 3429; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) 3430; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3431; X86-X87-NEXT: fld %st(0) 3432; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 3433; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3434; X86-X87-NEXT: fldz 3435; X86-X87-NEXT: fxch %st(1) 3436; X86-X87-NEXT: fucom %st(1) 3437; X86-X87-NEXT: fstp %st(1) 3438; X86-X87-NEXT: fnstsw %ax 3439; X86-X87-NEXT: xorl %ecx, %ecx 3440; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3441; X86-X87-NEXT: sahf 3442; X86-X87-NEXT: jb .LBB35_2 3443; X86-X87-NEXT: # %bb.1: 3444; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 3445; X86-X87-NEXT: .LBB35_2: 3446; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 3447; X86-X87-NEXT: fxch %st(1) 3448; X86-X87-NEXT: fucompp 3449; X86-X87-NEXT: fnstsw %ax 3450; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3451; X86-X87-NEXT: sahf 3452; X86-X87-NEXT: movl $-1, %eax 3453; X86-X87-NEXT: ja .LBB35_4 3454; X86-X87-NEXT: # %bb.3: 3455; X86-X87-NEXT: movl %ecx, %eax 3456; X86-X87-NEXT: .LBB35_4: 3457; X86-X87-NEXT: addl $20, %esp 3458; X86-X87-NEXT: retl 3459; 3460; X86-SSE-LABEL: test_unsigned_i32_f80: 3461; X86-SSE: # %bb.0: 3462; X86-SSE-NEXT: subl $20, %esp 3463; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3464; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 3465; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3466; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3467; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3468; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3469; X86-SSE-NEXT: fld %st(0) 3470; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 3471; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3472; X86-SSE-NEXT: xorl %ecx, %ecx 3473; X86-SSE-NEXT: fldz 3474; X86-SSE-NEXT: fxch %st(1) 3475; X86-SSE-NEXT: fucomi %st(1), %st 3476; X86-SSE-NEXT: fstp %st(1) 3477; X86-SSE-NEXT: jb .LBB35_2 3478; X86-SSE-NEXT: # %bb.1: 3479; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 3480; X86-SSE-NEXT: .LBB35_2: 3481; X86-SSE-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 3482; X86-SSE-NEXT: fxch %st(1) 3483; X86-SSE-NEXT: fucompi %st(1), %st 3484; X86-SSE-NEXT: fstp %st(0) 3485; X86-SSE-NEXT: movl $-1, %eax 3486; X86-SSE-NEXT: cmovbel %ecx, %eax 3487; X86-SSE-NEXT: addl $20, %esp 3488; X86-SSE-NEXT: retl 3489; 3490; X64-LABEL: test_unsigned_i32_f80: 3491; X64: # %bb.0: 3492; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3493; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3494; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %eax 3495; X64-NEXT: orl $3072, %eax # imm = 0xC00 3496; X64-NEXT: movw %ax, -{{[0-9]+}}(%rsp) 3497; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3498; X64-NEXT: fld %st(0) 3499; X64-NEXT: fistpll -{{[0-9]+}}(%rsp) 3500; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3501; X64-NEXT: xorl %ecx, %ecx 3502; X64-NEXT: fldz 3503; X64-NEXT: fxch %st(1) 3504; X64-NEXT: fucomi %st(1), %st 3505; X64-NEXT: fstp %st(1) 3506; X64-NEXT: jb .LBB35_2 3507; X64-NEXT: # %bb.1: 3508; X64-NEXT: movl -{{[0-9]+}}(%rsp), %ecx 3509; X64-NEXT: .LBB35_2: 3510; X64-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3511; X64-NEXT: fxch %st(1) 3512; X64-NEXT: fucompi %st(1), %st 3513; X64-NEXT: fstp %st(0) 3514; X64-NEXT: movl $-1, %eax 3515; X64-NEXT: cmovbel %ecx, %eax 3516; X64-NEXT: retq 3517 %x = call i32 @llvm.fptoui.sat.i32.f80(x86_fp80 %f) 3518 ret i32 %x 3519} 3520 3521define i50 @test_unsigned_i50_f80(x86_fp80 %f) nounwind { 3522; X86-X87-LABEL: test_unsigned_i50_f80: 3523; X86-X87: # %bb.0: 3524; X86-X87-NEXT: pushl %esi 3525; X86-X87-NEXT: subl $16, %esp 3526; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3527; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3528; X86-X87-NEXT: fucom %st(1) 3529; X86-X87-NEXT: fnstsw %ax 3530; X86-X87-NEXT: xorl %ecx, %ecx 3531; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3532; X86-X87-NEXT: sahf 3533; X86-X87-NEXT: setbe %al 3534; X86-X87-NEXT: fldz 3535; X86-X87-NEXT: jbe .LBB36_2 3536; X86-X87-NEXT: # %bb.1: 3537; X86-X87-NEXT: fstp %st(1) 3538; X86-X87-NEXT: fld %st(0) 3539; X86-X87-NEXT: fxch %st(1) 3540; X86-X87-NEXT: .LBB36_2: 3541; X86-X87-NEXT: fxch %st(1) 3542; X86-X87-NEXT: fsubr %st(2), %st 3543; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 3544; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 3545; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 3546; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 3547; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3548; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 3549; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3550; X86-X87-NEXT: movb %al, %cl 3551; X86-X87-NEXT: shll $31, %ecx 3552; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 3553; X86-X87-NEXT: fxch %st(1) 3554; X86-X87-NEXT: fucom %st(1) 3555; X86-X87-NEXT: fstp %st(1) 3556; X86-X87-NEXT: fnstsw %ax 3557; X86-X87-NEXT: xorl %edx, %edx 3558; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3559; X86-X87-NEXT: sahf 3560; X86-X87-NEXT: movl $0, %esi 3561; X86-X87-NEXT: jb .LBB36_4 3562; X86-X87-NEXT: # %bb.3: 3563; X86-X87-NEXT: movl %ecx, %esi 3564; X86-X87-NEXT: .LBB36_4: 3565; X86-X87-NEXT: jb .LBB36_6 3566; X86-X87-NEXT: # %bb.5: 3567; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 3568; X86-X87-NEXT: .LBB36_6: 3569; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 3570; X86-X87-NEXT: fxch %st(1) 3571; X86-X87-NEXT: fucompp 3572; X86-X87-NEXT: fnstsw %ax 3573; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3574; X86-X87-NEXT: sahf 3575; X86-X87-NEXT: movl $-1, %eax 3576; X86-X87-NEXT: ja .LBB36_8 3577; X86-X87-NEXT: # %bb.7: 3578; X86-X87-NEXT: movl %edx, %eax 3579; X86-X87-NEXT: .LBB36_8: 3580; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF 3581; X86-X87-NEXT: ja .LBB36_10 3582; X86-X87-NEXT: # %bb.9: 3583; X86-X87-NEXT: movl %esi, %edx 3584; X86-X87-NEXT: .LBB36_10: 3585; X86-X87-NEXT: addl $16, %esp 3586; X86-X87-NEXT: popl %esi 3587; X86-X87-NEXT: retl 3588; 3589; X86-SSE-LABEL: test_unsigned_i50_f80: 3590; X86-SSE: # %bb.0: 3591; X86-SSE-NEXT: pushl %esi 3592; X86-SSE-NEXT: subl $16, %esp 3593; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3594; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3595; X86-SSE-NEXT: xorl %eax, %eax 3596; X86-SSE-NEXT: fucomi %st(1), %st 3597; X86-SSE-NEXT: setbe %cl 3598; X86-SSE-NEXT: fldz 3599; X86-SSE-NEXT: fld %st(0) 3600; X86-SSE-NEXT: fcmovbe %st(2), %st 3601; X86-SSE-NEXT: fstp %st(2) 3602; X86-SSE-NEXT: fxch %st(1) 3603; X86-SSE-NEXT: fsubr %st(2), %st 3604; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 3605; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %edx 3606; X86-SSE-NEXT: orl $3072, %edx # imm = 0xC00 3607; X86-SSE-NEXT: movw %dx, {{[0-9]+}}(%esp) 3608; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3609; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 3610; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3611; X86-SSE-NEXT: xorl %esi, %esi 3612; X86-SSE-NEXT: fxch %st(1) 3613; X86-SSE-NEXT: fucomi %st(1), %st 3614; X86-SSE-NEXT: fstp %st(1) 3615; X86-SSE-NEXT: movl $0, %edx 3616; X86-SSE-NEXT: jb .LBB36_2 3617; X86-SSE-NEXT: # %bb.1: 3618; X86-SSE-NEXT: movb %cl, %al 3619; X86-SSE-NEXT: shll $31, %eax 3620; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax 3621; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 3622; X86-SSE-NEXT: movl %eax, %esi 3623; X86-SSE-NEXT: .LBB36_2: 3624; X86-SSE-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} 3625; X86-SSE-NEXT: fxch %st(1) 3626; X86-SSE-NEXT: fucompi %st(1), %st 3627; X86-SSE-NEXT: fstp %st(0) 3628; X86-SSE-NEXT: movl $-1, %eax 3629; X86-SSE-NEXT: cmovbel %edx, %eax 3630; X86-SSE-NEXT: movl $262143, %edx # imm = 0x3FFFF 3631; X86-SSE-NEXT: cmovbel %esi, %edx 3632; X86-SSE-NEXT: addl $16, %esp 3633; X86-SSE-NEXT: popl %esi 3634; X86-SSE-NEXT: retl 3635; 3636; X64-LABEL: test_unsigned_i50_f80: 3637; X64: # %bb.0: 3638; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3639; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3640; X64-NEXT: xorl %eax, %eax 3641; X64-NEXT: fucomi %st(1), %st 3642; X64-NEXT: setbe %al 3643; X64-NEXT: fldz 3644; X64-NEXT: fld %st(0) 3645; X64-NEXT: fcmovbe %st(2), %st 3646; X64-NEXT: fstp %st(2) 3647; X64-NEXT: fxch %st(1) 3648; X64-NEXT: fsubr %st(2), %st 3649; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3650; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %ecx 3651; X64-NEXT: orl $3072, %ecx # imm = 0xC00 3652; X64-NEXT: movw %cx, -{{[0-9]+}}(%rsp) 3653; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3654; X64-NEXT: fistpll -{{[0-9]+}}(%rsp) 3655; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3656; X64-NEXT: shlq $63, %rax 3657; X64-NEXT: xorq -{{[0-9]+}}(%rsp), %rax 3658; X64-NEXT: xorl %ecx, %ecx 3659; X64-NEXT: fxch %st(1) 3660; X64-NEXT: fucomi %st(1), %st 3661; X64-NEXT: fstp %st(1) 3662; X64-NEXT: cmovaeq %rax, %rcx 3663; X64-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3664; X64-NEXT: fxch %st(1) 3665; X64-NEXT: fucompi %st(1), %st 3666; X64-NEXT: fstp %st(0) 3667; X64-NEXT: movabsq $1125899906842623, %rax # imm = 0x3FFFFFFFFFFFF 3668; X64-NEXT: cmovbeq %rcx, %rax 3669; X64-NEXT: retq 3670 %x = call i50 @llvm.fptoui.sat.i50.f80(x86_fp80 %f) 3671 ret i50 %x 3672} 3673 3674define i64 @test_unsigned_i64_f80(x86_fp80 %f) nounwind { 3675; X86-X87-LABEL: test_unsigned_i64_f80: 3676; X86-X87: # %bb.0: 3677; X86-X87-NEXT: pushl %edi 3678; X86-X87-NEXT: pushl %esi 3679; X86-X87-NEXT: subl $20, %esp 3680; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3681; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3682; X86-X87-NEXT: fucom %st(1) 3683; X86-X87-NEXT: fnstsw %ax 3684; X86-X87-NEXT: xorl %ecx, %ecx 3685; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3686; X86-X87-NEXT: sahf 3687; X86-X87-NEXT: setbe %al 3688; X86-X87-NEXT: fldz 3689; X86-X87-NEXT: jbe .LBB37_2 3690; X86-X87-NEXT: # %bb.1: 3691; X86-X87-NEXT: fstp %st(1) 3692; X86-X87-NEXT: fld %st(0) 3693; X86-X87-NEXT: fxch %st(1) 3694; X86-X87-NEXT: .LBB37_2: 3695; X86-X87-NEXT: fxch %st(1) 3696; X86-X87-NEXT: fsubr %st(2), %st 3697; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) 3698; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %edx 3699; X86-X87-NEXT: orl $3072, %edx # imm = 0xC00 3700; X86-X87-NEXT: movw %dx, {{[0-9]+}}(%esp) 3701; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3702; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) 3703; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) 3704; X86-X87-NEXT: movb %al, %cl 3705; X86-X87-NEXT: shll $31, %ecx 3706; X86-X87-NEXT: xorl {{[0-9]+}}(%esp), %ecx 3707; X86-X87-NEXT: fxch %st(1) 3708; X86-X87-NEXT: fucom %st(1) 3709; X86-X87-NEXT: fstp %st(1) 3710; X86-X87-NEXT: fnstsw %ax 3711; X86-X87-NEXT: xorl %esi, %esi 3712; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3713; X86-X87-NEXT: sahf 3714; X86-X87-NEXT: movl $0, %edi 3715; X86-X87-NEXT: jb .LBB37_4 3716; X86-X87-NEXT: # %bb.3: 3717; X86-X87-NEXT: movl %ecx, %edi 3718; X86-X87-NEXT: .LBB37_4: 3719; X86-X87-NEXT: jb .LBB37_6 3720; X86-X87-NEXT: # %bb.5: 3721; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 3722; X86-X87-NEXT: .LBB37_6: 3723; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 3724; X86-X87-NEXT: fxch %st(1) 3725; X86-X87-NEXT: fucompp 3726; X86-X87-NEXT: fnstsw %ax 3727; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3728; X86-X87-NEXT: sahf 3729; X86-X87-NEXT: movl $-1, %eax 3730; X86-X87-NEXT: movl $-1, %edx 3731; X86-X87-NEXT: ja .LBB37_8 3732; X86-X87-NEXT: # %bb.7: 3733; X86-X87-NEXT: movl %esi, %eax 3734; X86-X87-NEXT: movl %edi, %edx 3735; X86-X87-NEXT: .LBB37_8: 3736; X86-X87-NEXT: addl $20, %esp 3737; X86-X87-NEXT: popl %esi 3738; X86-X87-NEXT: popl %edi 3739; X86-X87-NEXT: retl 3740; 3741; X86-SSE-LABEL: test_unsigned_i64_f80: 3742; X86-SSE: # %bb.0: 3743; X86-SSE-NEXT: pushl %ebx 3744; X86-SSE-NEXT: subl $16, %esp 3745; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3746; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} 3747; X86-SSE-NEXT: xorl %ecx, %ecx 3748; X86-SSE-NEXT: fucomi %st(1), %st 3749; X86-SSE-NEXT: setbe %bl 3750; X86-SSE-NEXT: fldz 3751; X86-SSE-NEXT: fld %st(0) 3752; X86-SSE-NEXT: fcmovbe %st(2), %st 3753; X86-SSE-NEXT: fstp %st(2) 3754; X86-SSE-NEXT: fxch %st(1) 3755; X86-SSE-NEXT: fsubr %st(2), %st 3756; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) 3757; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax 3758; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 3759; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) 3760; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3761; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) 3762; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) 3763; X86-SSE-NEXT: xorl %edx, %edx 3764; X86-SSE-NEXT: fxch %st(1) 3765; X86-SSE-NEXT: fucomi %st(1), %st 3766; X86-SSE-NEXT: fstp %st(1) 3767; X86-SSE-NEXT: movl $0, %eax 3768; X86-SSE-NEXT: jb .LBB37_2 3769; X86-SSE-NEXT: # %bb.1: 3770; X86-SSE-NEXT: movb %bl, %cl 3771; X86-SSE-NEXT: shll $31, %ecx 3772; X86-SSE-NEXT: xorl {{[0-9]+}}(%esp), %ecx 3773; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 3774; X86-SSE-NEXT: movl %ecx, %edx 3775; X86-SSE-NEXT: .LBB37_2: 3776; X86-SSE-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 3777; X86-SSE-NEXT: fxch %st(1) 3778; X86-SSE-NEXT: fucompi %st(1), %st 3779; X86-SSE-NEXT: fstp %st(0) 3780; X86-SSE-NEXT: movl $-1, %ecx 3781; X86-SSE-NEXT: cmoval %ecx, %eax 3782; X86-SSE-NEXT: cmoval %ecx, %edx 3783; X86-SSE-NEXT: addl $16, %esp 3784; X86-SSE-NEXT: popl %ebx 3785; X86-SSE-NEXT: retl 3786; 3787; X64-LABEL: test_unsigned_i64_f80: 3788; X64: # %bb.0: 3789; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3790; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3791; X64-NEXT: xorl %eax, %eax 3792; X64-NEXT: fucomi %st(1), %st 3793; X64-NEXT: setbe %al 3794; X64-NEXT: fldz 3795; X64-NEXT: fld %st(0) 3796; X64-NEXT: fcmovbe %st(2), %st 3797; X64-NEXT: fstp %st(2) 3798; X64-NEXT: fxch %st(1) 3799; X64-NEXT: fsubr %st(2), %st 3800; X64-NEXT: fnstcw -{{[0-9]+}}(%rsp) 3801; X64-NEXT: movzwl -{{[0-9]+}}(%rsp), %ecx 3802; X64-NEXT: orl $3072, %ecx # imm = 0xC00 3803; X64-NEXT: movw %cx, -{{[0-9]+}}(%rsp) 3804; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3805; X64-NEXT: fistpll -{{[0-9]+}}(%rsp) 3806; X64-NEXT: fldcw -{{[0-9]+}}(%rsp) 3807; X64-NEXT: shlq $63, %rax 3808; X64-NEXT: xorq -{{[0-9]+}}(%rsp), %rax 3809; X64-NEXT: xorl %ecx, %ecx 3810; X64-NEXT: fxch %st(1) 3811; X64-NEXT: fucomi %st(1), %st 3812; X64-NEXT: fstp %st(1) 3813; X64-NEXT: cmovaeq %rax, %rcx 3814; X64-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3815; X64-NEXT: fxch %st(1) 3816; X64-NEXT: fucompi %st(1), %st 3817; X64-NEXT: fstp %st(0) 3818; X64-NEXT: movq $-1, %rax 3819; X64-NEXT: cmovbeq %rcx, %rax 3820; X64-NEXT: retq 3821 %x = call i64 @llvm.fptoui.sat.i64.f80(x86_fp80 %f) 3822 ret i64 %x 3823} 3824 3825define i100 @test_unsigned_i100_f80(x86_fp80 %f) nounwind { 3826; X86-X87-LABEL: test_unsigned_i100_f80: 3827; X86-X87: # %bb.0: 3828; X86-X87-NEXT: pushl %ebp 3829; X86-X87-NEXT: pushl %ebx 3830; X86-X87-NEXT: pushl %edi 3831; X86-X87-NEXT: pushl %esi 3832; X86-X87-NEXT: subl $60, %esp 3833; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3834; X86-X87-NEXT: fld %st(0) 3835; X86-X87-NEXT: fstpt {{[0-9]+}}(%esp) 3836; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 3837; X86-X87-NEXT: movl %eax, (%esp) 3838; X86-X87-NEXT: fldz 3839; X86-X87-NEXT: fld %st(1) 3840; X86-X87-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill 3841; X86-X87-NEXT: fxch %st(1) 3842; X86-X87-NEXT: fucompp 3843; X86-X87-NEXT: fnstsw %ax 3844; X86-X87-NEXT: movl %eax, %ebx 3845; X86-X87-NEXT: calll __fixunsxfti 3846; X86-X87-NEXT: subl $4, %esp 3847; X86-X87-NEXT: xorl %edi, %edi 3848; X86-X87-NEXT: movb %bh, %ah 3849; X86-X87-NEXT: sahf 3850; X86-X87-NEXT: movl $0, %eax 3851; X86-X87-NEXT: jb .LBB38_2 3852; X86-X87-NEXT: # %bb.1: 3853; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 3854; X86-X87-NEXT: .LBB38_2: 3855; X86-X87-NEXT: movl $0, %esi 3856; X86-X87-NEXT: movl $0, %ebx 3857; X86-X87-NEXT: jb .LBB38_4 3858; X86-X87-NEXT: # %bb.3: 3859; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 3860; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %esi 3861; X86-X87-NEXT: .LBB38_4: 3862; X86-X87-NEXT: jb .LBB38_6 3863; X86-X87-NEXT: # %bb.5: 3864; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi 3865; X86-X87-NEXT: .LBB38_6: 3866; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 3867; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 3868; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 3869; X86-X87-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload 3870; X86-X87-NEXT: fucompp 3871; X86-X87-NEXT: fnstsw %ax 3872; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 3873; X86-X87-NEXT: sahf 3874; X86-X87-NEXT: movl $15, %eax 3875; X86-X87-NEXT: ja .LBB38_8 3876; X86-X87-NEXT: # %bb.7: 3877; X86-X87-NEXT: movl %edi, %eax 3878; X86-X87-NEXT: .LBB38_8: 3879; X86-X87-NEXT: movl $-1, %edi 3880; X86-X87-NEXT: movl $-1, %ebp 3881; X86-X87-NEXT: movl $-1, %edx 3882; X86-X87-NEXT: ja .LBB38_10 3883; X86-X87-NEXT: # %bb.9: 3884; X86-X87-NEXT: movl %ebx, %edi 3885; X86-X87-NEXT: movl %esi, %ebp 3886; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload 3887; X86-X87-NEXT: .LBB38_10: 3888; X86-X87-NEXT: movl %edx, 8(%ecx) 3889; X86-X87-NEXT: movl %ebp, 4(%ecx) 3890; X86-X87-NEXT: movl %edi, (%ecx) 3891; X86-X87-NEXT: andl $15, %eax 3892; X86-X87-NEXT: movb %al, 12(%ecx) 3893; X86-X87-NEXT: movl %ecx, %eax 3894; X86-X87-NEXT: addl $60, %esp 3895; X86-X87-NEXT: popl %esi 3896; X86-X87-NEXT: popl %edi 3897; X86-X87-NEXT: popl %ebx 3898; X86-X87-NEXT: popl %ebp 3899; X86-X87-NEXT: retl $4 3900; 3901; X86-SSE-LABEL: test_unsigned_i100_f80: 3902; X86-SSE: # %bb.0: 3903; X86-SSE-NEXT: pushl %ebx 3904; X86-SSE-NEXT: pushl %edi 3905; X86-SSE-NEXT: pushl %esi 3906; X86-SSE-NEXT: subl $48, %esp 3907; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 3908; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 3909; X86-SSE-NEXT: fld %st(0) 3910; X86-SSE-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill 3911; X86-SSE-NEXT: fstpt {{[0-9]+}}(%esp) 3912; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 3913; X86-SSE-NEXT: movl %eax, (%esp) 3914; X86-SSE-NEXT: calll __fixunsxfti 3915; X86-SSE-NEXT: subl $4, %esp 3916; X86-SSE-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload 3917; X86-SSE-NEXT: xorl %eax, %eax 3918; X86-SSE-NEXT: fldz 3919; X86-SSE-NEXT: fxch %st(1) 3920; X86-SSE-NEXT: fucomi %st(1), %st 3921; X86-SSE-NEXT: fstp %st(1) 3922; X86-SSE-NEXT: movl $0, %ecx 3923; X86-SSE-NEXT: movl $0, %edx 3924; X86-SSE-NEXT: movl $0, %edi 3925; X86-SSE-NEXT: jb .LBB38_2 3926; X86-SSE-NEXT: # %bb.1: 3927; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 3928; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 3929; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 3930; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 3931; X86-SSE-NEXT: .LBB38_2: 3932; X86-SSE-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 3933; X86-SSE-NEXT: fxch %st(1) 3934; X86-SSE-NEXT: fucompi %st(1), %st 3935; X86-SSE-NEXT: fstp %st(0) 3936; X86-SSE-NEXT: movl $15, %ebx 3937; X86-SSE-NEXT: cmovbel %edi, %ebx 3938; X86-SSE-NEXT: movl $-1, %edi 3939; X86-SSE-NEXT: cmoval %edi, %edx 3940; X86-SSE-NEXT: cmoval %edi, %ecx 3941; X86-SSE-NEXT: cmoval %edi, %eax 3942; X86-SSE-NEXT: movl %eax, 8(%esi) 3943; X86-SSE-NEXT: movl %ecx, 4(%esi) 3944; X86-SSE-NEXT: movl %edx, (%esi) 3945; X86-SSE-NEXT: andl $15, %ebx 3946; X86-SSE-NEXT: movb %bl, 12(%esi) 3947; X86-SSE-NEXT: movl %esi, %eax 3948; X86-SSE-NEXT: addl $48, %esp 3949; X86-SSE-NEXT: popl %esi 3950; X86-SSE-NEXT: popl %edi 3951; X86-SSE-NEXT: popl %ebx 3952; X86-SSE-NEXT: retl $4 3953; 3954; X64-LABEL: test_unsigned_i100_f80: 3955; X64: # %bb.0: 3956; X64-NEXT: subq $40, %rsp 3957; X64-NEXT: fldt {{[0-9]+}}(%rsp) 3958; X64-NEXT: fld %st(0) 3959; X64-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Spill 3960; X64-NEXT: fstpt (%rsp) 3961; X64-NEXT: callq __fixunsxfti@PLT 3962; X64-NEXT: xorl %ecx, %ecx 3963; X64-NEXT: fldz 3964; X64-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Reload 3965; X64-NEXT: fucomi %st(1), %st 3966; X64-NEXT: fstp %st(1) 3967; X64-NEXT: cmovbq %rcx, %rdx 3968; X64-NEXT: cmovbq %rcx, %rax 3969; X64-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 3970; X64-NEXT: fxch %st(1) 3971; X64-NEXT: fucompi %st(1), %st 3972; X64-NEXT: fstp %st(0) 3973; X64-NEXT: movq $-1, %rcx 3974; X64-NEXT: cmovaq %rcx, %rax 3975; X64-NEXT: movabsq $68719476735, %rcx # imm = 0xFFFFFFFFF 3976; X64-NEXT: cmovaq %rcx, %rdx 3977; X64-NEXT: addq $40, %rsp 3978; X64-NEXT: retq 3979 %x = call i100 @llvm.fptoui.sat.i100.f80(x86_fp80 %f) 3980 ret i100 %x 3981} 3982 3983define i128 @test_unsigned_i128_f80(x86_fp80 %f) nounwind { 3984; X86-X87-LABEL: test_unsigned_i128_f80: 3985; X86-X87: # %bb.0: 3986; X86-X87-NEXT: pushl %ebp 3987; X86-X87-NEXT: pushl %ebx 3988; X86-X87-NEXT: pushl %edi 3989; X86-X87-NEXT: pushl %esi 3990; X86-X87-NEXT: subl $60, %esp 3991; X86-X87-NEXT: fldt {{[0-9]+}}(%esp) 3992; X86-X87-NEXT: fld %st(0) 3993; X86-X87-NEXT: fstpt {{[0-9]+}}(%esp) 3994; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax 3995; X86-X87-NEXT: movl %eax, (%esp) 3996; X86-X87-NEXT: fldz 3997; X86-X87-NEXT: fld %st(1) 3998; X86-X87-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill 3999; X86-X87-NEXT: fxch %st(1) 4000; X86-X87-NEXT: fucompp 4001; X86-X87-NEXT: fnstsw %ax 4002; X86-X87-NEXT: movl %eax, %ebx 4003; X86-X87-NEXT: calll __fixunsxfti 4004; X86-X87-NEXT: subl $4, %esp 4005; X86-X87-NEXT: xorl %edx, %edx 4006; X86-X87-NEXT: movb %bh, %ah 4007; X86-X87-NEXT: sahf 4008; X86-X87-NEXT: movl $0, %eax 4009; X86-X87-NEXT: jb .LBB39_2 4010; X86-X87-NEXT: # %bb.1: 4011; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax 4012; X86-X87-NEXT: .LBB39_2: 4013; X86-X87-NEXT: movl $0, %ecx 4014; X86-X87-NEXT: jb .LBB39_4 4015; X86-X87-NEXT: # %bb.3: 4016; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 4017; X86-X87-NEXT: .LBB39_4: 4018; X86-X87-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 4019; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 4020; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx 4021; X86-X87-NEXT: movl $0, %ebx 4022; X86-X87-NEXT: jb .LBB39_6 4023; X86-X87-NEXT: # %bb.5: 4024; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx 4025; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx 4026; X86-X87-NEXT: .LBB39_6: 4027; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 4028; X86-X87-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload 4029; X86-X87-NEXT: fucompp 4030; X86-X87-NEXT: fnstsw %ax 4031; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax 4032; X86-X87-NEXT: sahf 4033; X86-X87-NEXT: movl $-1, %eax 4034; X86-X87-NEXT: movl $-1, %ebp 4035; X86-X87-NEXT: movl $-1, %edi 4036; X86-X87-NEXT: movl $-1, %esi 4037; X86-X87-NEXT: ja .LBB39_8 4038; X86-X87-NEXT: # %bb.7: 4039; X86-X87-NEXT: movl %ebx, %eax 4040; X86-X87-NEXT: movl %edx, %ebp 4041; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload 4042; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload 4043; X86-X87-NEXT: .LBB39_8: 4044; X86-X87-NEXT: movl %esi, 12(%ecx) 4045; X86-X87-NEXT: movl %edi, 8(%ecx) 4046; X86-X87-NEXT: movl %ebp, 4(%ecx) 4047; X86-X87-NEXT: movl %eax, (%ecx) 4048; X86-X87-NEXT: movl %ecx, %eax 4049; X86-X87-NEXT: addl $60, %esp 4050; X86-X87-NEXT: popl %esi 4051; X86-X87-NEXT: popl %edi 4052; X86-X87-NEXT: popl %ebx 4053; X86-X87-NEXT: popl %ebp 4054; X86-X87-NEXT: retl $4 4055; 4056; X86-SSE-LABEL: test_unsigned_i128_f80: 4057; X86-SSE: # %bb.0: 4058; X86-SSE-NEXT: pushl %ebx 4059; X86-SSE-NEXT: pushl %edi 4060; X86-SSE-NEXT: pushl %esi 4061; X86-SSE-NEXT: subl $48, %esp 4062; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi 4063; X86-SSE-NEXT: fldt {{[0-9]+}}(%esp) 4064; X86-SSE-NEXT: fld %st(0) 4065; X86-SSE-NEXT: fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill 4066; X86-SSE-NEXT: fstpt {{[0-9]+}}(%esp) 4067; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax 4068; X86-SSE-NEXT: movl %eax, (%esp) 4069; X86-SSE-NEXT: calll __fixunsxfti 4070; X86-SSE-NEXT: subl $4, %esp 4071; X86-SSE-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload 4072; X86-SSE-NEXT: xorl %eax, %eax 4073; X86-SSE-NEXT: fldz 4074; X86-SSE-NEXT: fxch %st(1) 4075; X86-SSE-NEXT: fucomi %st(1), %st 4076; X86-SSE-NEXT: fstp %st(1) 4077; X86-SSE-NEXT: movl $0, %ecx 4078; X86-SSE-NEXT: movl $0, %edx 4079; X86-SSE-NEXT: movl $0, %edi 4080; X86-SSE-NEXT: jb .LBB39_2 4081; X86-SSE-NEXT: # %bb.1: 4082; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax 4083; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx 4084; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx 4085; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi 4086; X86-SSE-NEXT: .LBB39_2: 4087; X86-SSE-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} 4088; X86-SSE-NEXT: fxch %st(1) 4089; X86-SSE-NEXT: fucompi %st(1), %st 4090; X86-SSE-NEXT: fstp %st(0) 4091; X86-SSE-NEXT: movl $-1, %ebx 4092; X86-SSE-NEXT: cmoval %ebx, %edi 4093; X86-SSE-NEXT: cmoval %ebx, %edx 4094; X86-SSE-NEXT: cmoval %ebx, %ecx 4095; X86-SSE-NEXT: cmoval %ebx, %eax 4096; X86-SSE-NEXT: movl %eax, 12(%esi) 4097; X86-SSE-NEXT: movl %ecx, 8(%esi) 4098; X86-SSE-NEXT: movl %edx, 4(%esi) 4099; X86-SSE-NEXT: movl %edi, (%esi) 4100; X86-SSE-NEXT: movl %esi, %eax 4101; X86-SSE-NEXT: addl $48, %esp 4102; X86-SSE-NEXT: popl %esi 4103; X86-SSE-NEXT: popl %edi 4104; X86-SSE-NEXT: popl %ebx 4105; X86-SSE-NEXT: retl $4 4106; 4107; X64-LABEL: test_unsigned_i128_f80: 4108; X64: # %bb.0: 4109; X64-NEXT: subq $40, %rsp 4110; X64-NEXT: fldt {{[0-9]+}}(%rsp) 4111; X64-NEXT: fld %st(0) 4112; X64-NEXT: fstpt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Spill 4113; X64-NEXT: fstpt (%rsp) 4114; X64-NEXT: callq __fixunsxfti@PLT 4115; X64-NEXT: xorl %ecx, %ecx 4116; X64-NEXT: fldz 4117; X64-NEXT: fldt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Reload 4118; X64-NEXT: fucomi %st(1), %st 4119; X64-NEXT: fstp %st(1) 4120; X64-NEXT: cmovbq %rcx, %rdx 4121; X64-NEXT: cmovbq %rcx, %rax 4122; X64-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip) 4123; X64-NEXT: fxch %st(1) 4124; X64-NEXT: fucompi %st(1), %st 4125; X64-NEXT: fstp %st(0) 4126; X64-NEXT: movq $-1, %rcx 4127; X64-NEXT: cmovaq %rcx, %rax 4128; X64-NEXT: cmovaq %rcx, %rdx 4129; X64-NEXT: addq $40, %rsp 4130; X64-NEXT: retq 4131 %x = call i128 @llvm.fptoui.sat.i128.f80(x86_fp80 %f) 4132 ret i128 %x 4133} 4134