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